【问题标题】:Hive dynamic partition in insert overwrite from select statement is not loading the data for the dynamic partition从 select 语句插入覆盖中的 Hive 动态分区未加载动态分区的数据
【发布时间】:2018-02-02 16:41:03
【问题描述】:

从 select 语句插入覆盖中的 Hive 动态分区不加载动态分区的数据,而是提供数据 HIVE_DEFAULT_PARTITION

如果我说显示分区 table2;

它只给出一个分区细节,即HIVE_DEFAULT_PARTITION

我有一个暂存表,没有任何分区,可以从序列文件中读取数据。

CREATE EXTERNAL TABLE IF NOT EXISTS table1(DS 字符串,col1 字符串,col2 字符串,col3 字符串)
以“\t”结尾的行格式分隔字段 存储为序列文件 位置'/用户/' tblproperties ("skip.header.line.count"="1");

来自文件的字段 DS 的日期格式为 m/d/yy。

然后我正在创建如下所示的生产表。

如果不存在则创建外部表 table2(col1 字符串,col2 字符串,col3 字符串)
分区依据(DS 字符串) 存储为序列文件 tblproperties ("skip.header.line.count"="1");

设置 hive.exec.dynamic.partition.mode=nonstrict;

然后插入查询如下

插入覆盖表 table2 分区 (DS) 选择 col1,col2,col3,演员(DS 作为日期) 从表 1;

当我查询表 2 时,我得到如下结果

d1 d2 d3 HIVE_DEFAULT_PARTITION d4 d5 d5 HIVE_DEFAULT_PARTITION

对于我期望分区列中的日期字段的最后一列,我得到 HIVE_DEFAULT_PARTITION

我的预期数据是这样的

d1 d2 d3 5/1/17 d4 d5 d5 5/1/17

有人可以帮忙吗?

【问题讨论】:

    标签: hive hiveql


    【解决方案1】:

    您可以直接转换为 date 的唯一格式是 yyyy-mm-dd 任何从其他格式转换的尝试都会导致 NULL,因此您的所有记录都会转到默认分区。

    • 将分区列定义为 DATE (PARTITIONED BY (DS date))
    • 使用to_date(from_unixtime(to_unix_timestamp(DS,'M/d/y')))进行转换

    演示

    hive> select cast('5/1/17' as date) as ds;
    OK
    ds
    NULL
    

    hive> select cast('2015-05-01' as date) as ds;
    OK
    ds
    2015-05-01
    

    hive> select to_date(from_unixtime(to_unix_timestamp('5/1/17','M/d/y'))) as ds;
    OK
    ds
    2017-05-01
    

    【讨论】:

    • 是否必须像您提到的那样进行分区,因为可以在任何字段上进行分区,因此值格式可能会有所不同。
    • 我没有理解这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    相关资源
    最近更新 更多