业务中经常会遇到这种需求:数据每天全量更新,但是要求月底将数据单独保存一份以供后期查询某月节点的信息。这时就要考虑用到Hive的分区表实现,即按照月份创建分区表,相当于新的月份数据保存在新表,进而实现保存了历史数据。
分区表创建
分区表的创建本质是在HDFS创建了一个分区字段为名称的文件夹,插入数据时根据分区字段取值插入到文件中。
静态分区表
定义:静态分区在插入数据时要指定分区名,支持load、insert两种插入方式,主要用于分区少,分区名可以确定的情况。
动态分区表
定义:动态分区在插入数据时根据指定字段取值生成分区,只能使用insert方式插入数据。在定义时如果既有静态分区字段又有动态分区字段,动态分区字段放在最后。
分区表创建
createtable tableName(
field_name1 string,
field_name2 string
)
partitioned by(p_field string,pmt string comment'年月')row format delimited
fieldsterminatedby','
STORED AS ORC
TBLPROPERTIES("orc.compress"="SNAPPY")//压缩格式,或者使用语句stored as parquet
tblproperties ("skip.header.line.count"="1");// 除去首行
数据载入
静态分区载入数据
-- 1、手动加载数据(会在所选数据库下生成/tableName/2023-10文件夹)loaddatalocal inpath '/path/xxxx.csv'intotable tableName partition(pmt='2023-10');-- 2、insert插入数据(增量插入)insertinto tableName partition(p_field='aaa',pmt='2023-10')select
field_name1,
field_name2
from
tmp_tableName
-- 3、insert插入数据(全量插入)insert overwrite table tableName partition(p_field='aaa',pmt='${date}')select
field_name1,
field_name2
from
tmp_tableName
动态分区插入数据
-- 1、动静分区-- 设置动态分区参数set hive.exec.dynamic.partition=true;//开启动态分区功能set hive.exec.dynamic.partition.mode=nonstrick;//默认参数strick也可实现动静分区insert overwrite table tableName partition(p_field='aaa',pmt)select
field_name1,
field_name2
from
tmp_tableName
-- 2、动态分区set hive.exec.dynamic.partition=true;//开启动态分区功能set hive.exec.dynamic.partition.mode=nonstrick;insert overwrite table tableName partition(p_field,pmt)select
field_name1,
field_name2
from
tmp_tableName
-- 3、相关调优参数set hive.exec.max.dynamic.partitions.pernode=1000//每个maper或reducer可以允许创建的最大动态分区个数,默认是100,超出则会报错。set hive.exec.max.dynamic.partitions =1000//一个动态分区语句可以创建的最大动态分区个数,超出报错set hive.exec.max.created.files =10000//全局可以创建的最大文件个数,超出报错。
版权归原作者 Forge_ahead 所有, 如有侵权,请联系我们删除。