Hive, 大数据

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模式表示允许所有的分区字段都可以使用动态分区
  • 所有执行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数据到分桶表中,避免本地文件找不到问题
    • 不要使用本地模式