我正在尝试将数据写入配置单元表并失败。我在Cycle_dt = null结束时得到一个错误,只写了一个分区。这是第一天。
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');
我不确定这里发生了什么。我有一个日期范围设置,只能将这些日期作为分区。
答案 0 :(得分:2)
在动态分区插入中,用户可以提供部分分区规范,这意味着只需在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')