来自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
有人可以为此提供帮助吗?
答案 0 :(得分:1)
您可以直接转换为日期的唯一格式是yyyy-mm-dd
任何从其他格式转换的尝试都会导致NULL,因此您的所有记录都会转到默认分区。
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