Impala无法从Parquet文件读取无日期时间戳

时间:2018-08-30 04:12:07

标签: time timestamp parquet impala cloudera-cdh

Impala v2.11.0 +(CDH v5.11.1 +)无法从Parquet文件中读取只有时间值的时间戳。

create table TT2(t timestamp) STORED AS PARQUET;
insert into TT2 (t) values ("10:00:00");
select * from TT2;
+------+
| t    |
+------+
| NULL |
+------+
WARNINGS: Parquet file 'hdfs://localhost:20500/test-warehouse/tt2/714d741212df3180-cd4e670800000000_226739479_data.0.parq' column 't' contains an out of range timestamp. The valid date range is 1400-01-01..9999-12-31.`

https://issues.apache.org/jira/browse/IMPALA-5942

即使select语句返回null,Metastore管理器也会显示该列具有值

  

4714-12-30 10:00:00.0

我正在寻找的是一种查询数据以获取时间值的替代方法,而不是手动查找所有无日期时间戳列并将其转换为字符串。

我尝试过

SELECT cast(t as string) FROM TT2

SELECT date_part('hour', t) FROM TT2

SELECT from_timestamp(tms, "HH:mm:ss") FROM TT2

SELECT extract(tms, "hour") FROM TT2

SELECT extract(cast(tms as string), "hour") FROM TT2

1 个答案:

答案 0 :(得分:0)

我相信,由于您仅对时间部分感兴趣,因此我建议您将日期部分替换为一些可接受的日期,然后impala提供从时间戳记中拉长时间的功能(所有基于数据的进一步查询均可的使用),所以我认为一种可能的解决方案是

1)创建一个时间戳表为字符串的临时表

2)现在,您将获得“ 4714-12-30 10:00:00.0”之类的值

3)现在,您必须做些事情,     a)使用split_apart提取10:00:00.0     b)用“ 2018-11-12”连接提取的部分 所以现在您可以获取格式为“ 2018-11-12 10:00:00.0”的值

4)现在可以将上一步的结果转换为时间戳记

5)使用选择的[列名col1,2,3,..],(cast(concat(“ 2018-11-12”,split_apart(col,delim,index)))作为时间戳)插入数据从临时表变成原始表