sql—插入到配置单元表中,动态分区只将第一个分区写入磁盘,而不是全部

qyswt5oh  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(341)

我试图将数据写入配置单元表,但失败了。我在循环结束时得到一个错误,只有一个分区正在写入。今天是第一天。

set hive.auto.convert.join=true;
set hive.optimize.mapjoin.mapreduce=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partition=true; 
set mapred.map.tasks = 100;

Insert into table dynamic.dynamic_test_avro_v1 partition(cycle_dt)
Select date_time as CYCLE_TS, case when evar1 is not null or length(trim(evar1)) > 0 then cast(unbase64(substring(evar1,6,12)) as string) end NRNM ,
prop14 as state, evar8 as FLOW_TYPE, prop25 as KEY, pagename PAGE_NM,
partition_dt as cycle_dt from source.std_avro_v1 WHERE
(partition_dt = '2016-10-02' AND  partition_dt < '2016-10-07')
AND (
evar8='google');

我不确定这是怎么回事。我有一个日期范围设置,只得到这些日期的分区。

a7qyws3x

a7qyws3x1#

从配置单元文档:
在动态分区插入中,用户可以给出部分分区规范,这意味着只需在partition子句中指定分区列名列表。列值是可选的。如果给定了分区列值,我们称之为静态分区,否则称之为动态分区。每个动态分区列都有select语句中相应的输入列。这意味着动态分区的创建是由输入列的值决定的。动态分区列必须在select语句中列的最后一个指定,并按照它们在partition()子句中出现的顺序指定。
所以,在你的询问中, partition_dt 是动态分区的值。但是,您会施加以下约束: (partition_dt = '2016-10-02' AND partition_dt < '2016-10-07') 翻译成 partition_dt = '2016-10-02' 最终它会创建一个单独的分区。
你可能想要一系列的约会: (partition_dt >= '2016-10-02' AND partition_dt < '2016-10-07')

相关问题