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

siotufzp  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(327)

impalav2.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

dojqjjoe

dojqjjoe1#

我相信,由于您只对时间部分感兴趣,所以我建议您简单地用一些可接受的日期替换日期部分,然后impala提供从时间戳中提取时间的函数(您在数据之上的所有进一步查询都可以使用它),因此我认为一个可能的解决方案是
1) 创建时间戳列为字符串的临时表
2) 现在您将得到“4714-12-30 10:00:00.0”这样的值
3) 现在,你必须做一些事情,a)使用split\u sparted提取10:00:00.0 b)将提取的部分用“2018-11-12”表示,这样现在就可以得到格式为“2018-11-12 10:00:00.0”的值
4) 现在可以将上一步的结果转换为时间戳
5) 使用select[列名col1,2,3,…],(cast(concat(“2018-11-12”,splitаapart(col,delim,index)))作为时间戳)将数据从临时表插入到原始表中

相关问题