Blog
hive-07 分区表和分桶表
分区表
分区表实际上就是对应一个HDFS文件系统上独立的文件夹,该文件夹下是该分区所有的数据文件
Hive中的分区就是分目录
- 增加分区
- 创建多个分区 分区间没有逗号
alter table emp add partition(dt='2021-01-01');
alter table emp add partition(dt='2021-01-01') partition(dt='2021-01-01');
- 删除分区
- 删除多个分区 分区间有逗号
alter table emp drop partition(dt='2021-01-01');
alter table emp drop partition(dt='2021-01-01'), partition(dt='2021-01-02');
查看有多少个分区
show partitions emp;
查看分区表结构
desc formatted emp;
二级分区
partitioned by (dt string, hour string)
修复分区
- 存在hdfs数据但是没有关键到表
msck repair table emp;
手动添加分区
alter table emp drop partition(dt='2021-01-01');
不指定分区会存储到_HIVE_DEFAULT_PARTITION分区中
动态分区
CREATE TABLE test(
name string,
loc string,
) partitioned by (dt string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
# 根据dt动态分区 将数据放入指定dt分区中
INSERT INTO TABLE test PARTITION(dt)
SELECT name, loc, dt FROM test1 # 默认使用最后一个字段作为动态分区字段
开启动态分区:
- 开启动态分区功能,默认true,开启
- hive.exec.dynamic.partition=true
- 设置为非严格模式,默认strict,表示必须指定至少一个分区为静态分区
- hive.exec.dynamic.partition.mode=nonstric
- hive3可以不指定 nostric和HQL语句中不指定PARTITION(dt)
- nonstrict模式表示允许所有的分区字段都可以使用动态分区
- hive.exec.dynamic.partition.mode=nonstric
- 在所有执行MR的节点上,最大一共可以创建多少个动态分区,默认1000
- hive.exec.max.dynamic.partitions=1000
- 在每个执行MR的节点上,最大可以创建多少个动态分区
- hive.exec.max.dynamic.partitions.pernode=100
- 比如数据源中包含了一年的数据,day字段有365个值,那么该参数需要设置成365
- 整个MR job中最大可以创建多少个HDFS文件,默认10万
- hive.exec.max.created.files=100000
- 当有空分区生成时,是否抛出异常。一般不需要设置,默认false
- hive.error.on.empty.partition=false
分桶表(了解)
分桶是将数据集分解成更容易管理的若干部分的另一个技术
分区针对的是数据存储路径
分桶针对的是数据文件
- 创建分桶表
- 分桶字段必须使用建表中的字段 不需要指定类型
CREATE TABLE stu_buck(id int, name string)
CLUSTERED by (id)
INTO 4 buckets
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
- 根据id分成4个文件存储
- 分通规则:
- 采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中
- 分桶注意事项
- reduce的个数设置为-1让job自行决定需要用多少个reduce或将reduce的个数设置为大于等于分桶表的桶数
- 从hdfs中load数据到分桶表中,避免本地文件找不到问题
- 不要使用本地模式