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

xggvc2p6  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(435)

所以我有一个表a和表b,其中表a的数据是从表b插入的。从本质上说,表a和表b是一样的,唯一的区别是表a有一个date分区列,而表b没有。表a模式是这样的:id int school\u bg\u dt string log\u on\u count int active\u count int
表b模式是:id int school\u bg\u dt bigint log\u on\u count int active\u count int date\u partition string
下面是我的查询,将表b插入到表a中,表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\u分区附近的操作。。不知道该怎么办,请帮忙。。。因此,它的设计是将每个school\u bg\u dt密钥作为一个分区,因为它有许多具有该密钥的唯一数据。

kkih6yb8

kkih6yb81#

从这里开始:
在动态分区插入中,用户可以给出部分分区规范,这意味着只需在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;

另外,请注意,如果要创建多个分区,则应更新以下conf设置:
hive.exec.max.dynamic.partitions.pernode—允许在每个Map器/缩减器节点中创建的最大动态分区数(默认值=100)
hive.exec.max.dynamic.partitions—总共允许创建的最大动态分区数(默认值=1000)
hive.exec.max.created.files—mapreduce作业中所有Map器/还原器创建的最大hdfs文件数(默认值=100000)

相关问题