Hive动态分区

xiaoxiao2021-02-28  127

关于Hive动态分区

关系型数据库(如Oracle)中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition),只不过,使用Hive的动态分区,需要进行相应的配置。

场景描述

现有非分区表 test , 分区表 test_partitioned , 需要按照month、day来插入到分区表中

test

dayurl2015-05-10url12015-05-10url22015-06-14url12015-06-14url22015-06-15url12015-06-15url2

目标表:test_partitioned

CREATE TABLE t_lxw1234_partitioned ( url STRING ) PARTITIONED BY (month STRING,day STRING) stored AS textfile;

需求

test中的数据按照月份(month)、日期(day),插入到目标表test_partitioned的相应分区中。 如果按照之前介绍的往指定一个分区中Insert数据,那么这个需求很不容易实现。 这时候就需要使用动态分区来实现.

参数设置

使用动态分区需要注意设定以下参数:

hive.exec.dynamic.partition

默认值:false 是否开启动态分区功能,默认false关闭。 使用动态分区时候,该参数必须设置成true;

hive.exec.dynamic.partition.mode

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

hive.exec.max.dynamic.partitions.pernode

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

hive.exec.max.dynamic.partitions

默认值:1000, 在所有执行MR的节点上,最大一共可以创建多少个动态分区。 同上参数解释。

hive.exec.max.created.files

默认值:100000, 整个MR Job中,最大可以创建多少个HDFS文件。 一般默认值足够了,除非你的数据量非常大,需要创建的文件数大于100000,可根据实际情况加以调整。

hive.error.on.empty.partition

默认值:false, 当有空分区生成时,是否抛出异常。 一般不需要设置。

执行代码

SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict; SET hive.exec.max.dynamic.partitions.pernode = 1000; SET hive.exec.max.dynamic.partitions=1000; INSERT overwrite TABLE t_lxw1234_partitioned PARTITION (month,day) SELECT url,substr(day,1,7) AS month,day FROM t_lxw1234;

注意事项

注意:在PARTITION (month,day)中指定分区字段名即可; 在SELECT子句的最后两个字段,必须对应前面PARTITION (month,day)中指定的分区字段,包括顺序。

转载请注明原文地址: https://www.6miu.com/read-18975.html

最新回复(0)