如何设置列键将成为分区的动态分区

how to set up dynamic partition where the column keys will be the partitions

所以我有一个 table A 和 table B,其中 table A 数据是从 table B 插入的。 本质上 table A 与 table B 相同,唯一的区别是 table A 有一个 date_partition 列,而 table B 没有。 table 模式是这样的: 标识整数 school_bg_dt 字符串 log_on_count 整数 active_count 整数

table B 模式是: 标识整数 school_bg_dt 大整数 log_on_count 整数 active_count 整数 date_partition 字符串

这是我将 table B 插入到 table 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;

但是,我收到错误提示,输入无法识别 date_partition 附近的操作。 不知道在这里做什么,请帮忙...... 所以设计是将每个 school_bg_dt 键作为一个分区,因为它有许多与该键相关的唯一数据。

来自here

In the dynamic partition inserts, users can give partial partition specifications, which means just specifying the list of partition column names in the PARTITION clause. The column values are optional. If a partition column value is given, we call this a static partition, otherwise it is a dynamic partition. Each dynamic partition column has a corresponding input column from the select statement. This means that the dynamic partition creation is determined by the value of the input column. The dynamic partition columns must be specified last among the columns in the SELECT statement and in the same order in which they appear in the PARTITION() clause.

所以,尝试:

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 - 最大动态数 允许在每个 mapper/reducer 节点中创建的分区(默认值 = 100)
  • hive.exec.max.dynamic.partitions - 最大动态数量 总共允许创建的分区(默认值 = 1000)
  • hive.exec.max.created.files - MapReduce 作业中所有 mappers/reducers 创建的 HDFS 文件的最大数量(默认值 = 100000)