所以我有一个表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密钥作为一个分区,因为它有许多具有该密钥的唯一数据。
1条答案
按热度按时间kkih6yb81#
从这里开始:
在动态分区插入中,用户可以给出部分分区规范,这意味着只需在partition子句中指定分区列名列表。列值是可选的。如果给定了分区列值,我们称之为静态分区,否则称之为动态分区。每个动态分区列都有select语句中相应的输入列。这意味着动态分区的创建是由输入列的值决定的。动态分区列必须在select语句中列的最后一个指定,并按照它们在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)