从select语句插入覆盖中的Hive动态分区不会加载动态分区的数据

时间:2017-08-24 17:29:39

标签: hive hiveql

来自select语句的insert overwrite中的Hive动态分区不会加载动态分区的数据,而是提供数据 HIVE_DEFAULT_PARTITION

如果我说show partitions table2;

它只提供一个分区详细信息 HIVE_DEFAULT_PARTITION

我有一个没有任何分区的临时表,它从序列文件中读取数据。

CREATE EXTERNAL TABLE IF NOT NOT EXISTS table1(DS string,col1 string,col2 string,col3 string)
ROW FORMAT DELIMITED FIELDS终止于' \ t' 存储为序列文件 位置' / user /' tblproperties(" skip.header.line.count" =" 1");

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

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

CREATE EXTERNAL TABLE IF NOT NOT EXISTS table2(col1 string,col2 string,col3 string)
分区(DS字符串) 存储为序列文件 tblproperties(" skip.header.line.count" =" 1");

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

然后插入查询如下

INSERT OVERWRITE TABLE table2 PARTITION(DS) SELECT col1,col2,col3,cast(DS作为日期) FROM table1;

当我查询表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

有人可以为此提供帮助吗?

1 个答案:

答案 0 :(得分:1)

您可以直接转换为日期的唯一格式是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