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

Posted

技术标签:

【中文标题】Impala 无法从 Parquet 文件中读取无日期时间戳【英文标题】:Impala unable to read Dateless timestamp from Parquet file 【发布时间】:2018-08-30 04:12:07 【问题描述】:

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,元存储管理器也会显示该列具有值

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】:

我相信,由于您只对时间部分感兴趣,所以我建议简单地将日期部分替换为一些可接受的日期,然后 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)使用select [column names col1,2,3,..],(cast (concat("2018-11-12",split_apart(col,delim,index)))as timestamp)插入数据从临时表到原表

【讨论】:

以上是关于Impala 无法从 Parquet 文件中读取无日期时间戳的主要内容,如果未能解决你的问题,请参考以下文章

由于 parquet 文件损坏,Impala 无法创建分区表

在 Impala 中使用外部创建的 Parquet 文件

使用 SparkSQL 和 HiveContext 读取 Parquet 文件时出错

通过 Impala 的 Parquet 压缩类型

Impala:从 mysql 转储创建镶木地板

Pyspark:无法从 SparkFiles 读取镶木地板文件