Hive分区表


发布于 2017-03-12 / 44 阅读 / 0 评论 /
认识Hive分区表,分区表也是Hive的核心概念之一。

1.分区表作用

分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过where子句中的表达式选择查询所需要的制定的分区,这样查询效率会提高很多。

2.多级分区

在很多业务场景中,单个分区往往不能把数据量降到我们所需要的级别,这时可以多增加几级分区字段,来降低每次计算时需加载的数据量。

3.关联分区表和数据

创建分区表后,我们把数据文件直接上传到HDFS上,往往无法查询到对应的数据,因为这时的表和数据时没有关联的。需要建立起分区表和数据文件的关联,才能通过sql查询到相应的数据。

创建关联有以下三种方式:

(1)执行修复命令:msck repair table student_table;

(2)上传数据后,通过add partition添加分区。

(3)创建数据文件夹后,先不要把数据放到规定的hdfs目录,而是通过load指令把数据加载到分区。

对于分区表的load,如果不指定load的分区,则HDFS上的默认分区值为“__HIVE_DEFAULT_PARTITION__”,如下图所示:

4.动态分区调整

动态分区是Hive-3.X.X的新特性。在insert或load数据时,指定了的分区字段为静态分区字段,需要根据数据来识别的是动态分区字段。

动态分区特性与以下参数相关。

参数值

默认值

参数说明

hive.exec.dynamic.partition

TRUE

是否开启动态分区功能,默认开启

hive.exec.dynamic.partition.mode

strict

设置动态分区模式。strict表示必须指定至少一个分区字段为静态分区,nonstrict表示允许所有的分区字段都可以使用动态分区。

hive.exec.dynamic.partitions

1000

所有执行MR的节点上,最大一共可以创建多少个动态分区

hive.exec.max.dynamic.partitions.pernode

100

在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。比如源数据包含一年的数据,即day字段有365个值,那么该参数就需要设置成365,如果使用默认值100,则会报错。

hive.exec.max.created.files

100000

整个MR job中,最大可以创建多少个HDFS文件

hive.error.on.empty.partition

FALSE

当有空分区生成时,是否抛出异常,默认不抛

需要注意的是,动态分区字段必须在select语句的最后出现。且与partiton子句的顺序一样。

动态分区指向分区表insert数据时,被写往的分区不由用户指定,而是由每行数据的最后一个字段的值来动态决定。使用动态分区,可只用一个insert语句将数据写入多个分区。

5.分区表相关操作

主要有以下操作。

(1)查看表的分区

show partitions student_table;

(2)创建分区,分区之间用空格分隔即可

alter table student_table add partition(day=‘20220808’);
alter table student_table add partition(day=‘20220808’) partition(day=‘20220809’) partition(day=‘20220810’);

(3)删除分区

alter table student_table drop partition(day=‘20220808’);
alter table student_table drop partition(day=‘20220808’), partition(day=‘20220809’), partition(day=‘20220810’);

分区之间必须用逗号分隔

(4)查看分区表结构

desc formatted student_table;