【问题标题】:Insert into hive table with dynamic partition only writing first partition to disk and not all插入具有动态分区的配置单元表仅将第一个分区写入磁盘而不是全部
【发布时间】:2017-03-17 10:35:47
【问题描述】:

我正在尝试将数据写入配置单元表并失败。在 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');

我不确定这里发生了什么。我有一个日期范围设置,只能将这些日期作为分区。

【问题讨论】:

  • partition_dt = '2016-10-02' ?
  • 源表按天划分的分区
  • 但它也是目标分区,因为它是最后一列 - 所以您在此查询中创建一个分区。
  • 总的来说,partition_dt = '2016-10-02' AND partition_dt &lt; '2016-10-07' 没有多大意义,因为它总是partition_dt = '2016-10-02'
  • 是的,你可能想要partition_dt &gt;= '2016-10-02'

标签: sql hadoop hive partition


【解决方案1】:

来自hive documentation

在动态分区插入中,用户可以给出部分分区规范,即只在 PARTITION 子句中指定分区列名列表。列值是可选的。如果给定了一个分区列值,我们称其为静态分区,否则为动态分区。每个动态分区列都有一个来自 select 语句的相应输入列。这意味着动态分区的创建是由输入列的值决定的。动态分区列必须在 SELECT 语句中的列中最后指定,并且与它们在 PARTITION() 子句中出现的顺序相同。

因此,在您的查询中,partition_dt 是动态分区的值。但是,您施加了以下约束:(partition_dt = '2016-10-02' AND partition_dt &lt; '2016-10-07') 转换为 partition_dt = '2016-10-02' 并最终创建一个分区。

您可能想要一个日期范围:(partition_dt &gt;= '2016-10-02' AND partition_dt &lt; '2016-10-07')

【讨论】:

    猜你喜欢
    • 2019-12-10
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    相关资源
    最近更新 更多