如何设置动态分区,其中列键将是分区

时间:2016-10-28 00:51:30

标签: hadoop apache-spark dynamic hive partition

所以我有一个表A和表B,其中表A数据是从表B中插入的。 本质上表A与表B相同,唯一的区别是表A有一个表B没有的date_partition列。 表格架构是这样的: ID int school_bg_dt字符串 log_on_count int active_count int

表B架构是: ID int school_bg_dt bigint log_on_count int active_count int date_partition string

这是我将表B插入表A的查询,其中有一个错误我想知道:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE A PARTITION(date_partition=school_bg_dt)
SELECT ID, cast(school_bg_dt as BIGINT), log_on_count, active_count FROM table
B;

然而,我得到的错误是inpurt无法识别date_partition附近的操作。 不确定在这里做什么,请帮忙...... 所以设计它是将每个school_bg_dt键作为一个分区,因为它有许多与该键有关的唯一数据。

1 个答案:

答案 0 :(得分:0)

来自here

  

在动态分区插入中,用户可以提供部分分区规范,这意味着只需在PARTITION子句中指定分区列名称列表。列值是可选的。如果给出了分区列值,我们将其称为静态分区,否则它是动态分区。每个动态分区列都有一个来自select语句的相应输入列。这意味着动态分区创建由输入列的值确定。动态分区列必须在SELECT语句的列中最后指定,并且与它们在PARTITION()子句中出现的顺序相同。

所以,试试:

FROM B
INSERT OVERWRITE TABLE A PARTITION(date_partition)
SELECT ID, cast(school_bg_dt as BIGINT), log_on_count, active_count, school_bg_dt as date_partition;

另请注意,如果您要创建多个分区,则应更新以下配置设置:

  • hive.exec.max.dynamic.partitions.pernode - 最大动态数 允许在每个映射器/缩减器节点中创建分区(默认值= 100)
  • hive.exec.max.dynamic.partitions - 最大动态数 允许创建的分区总数(默认值= 1000)
  • hive.exec.max.created.files - MapReduce作业中所有映射器/缩减器创建的HDFS文件的最大数量(默认值= 100000)