在Hive中Parquet String到时间戳转换

时间:2019-03-22 22:10:07

标签: hadoop hive parquet

我有一些代码生成的镶木地板文件。我为该数据创建了一个DDL,在hive中添加了表格,并指向了hdfs中的木地板文件。当我尝试查询表时,所有字段看起来都很完美。但是,对于时间戳字段,hive给出了例外。

HiveException: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.hive.serde2.io.TimestampWritable

实际上,时间戳字段以字符串形式存储在镶木地板中,但是我的配置单元表字段的类型为时间戳。我认为这是造成问题的原因,但是正确的方法是什么?

2 个答案:

答案 0 :(得分:2)

我想出了解决自己问题的替代方法。我将TIMESTAMP列的列类型更改为STRING,并且在获取数据时,我使用from_unixtime方法将该特定列转换为预期的日期格式,并能够获取它。
但是,这里的问题是,如果我的日期值为2020-02-27 15:40:22,并且当我通过Hive获取此列的数据时,它正在返回EpochSeconds,即15340232000000
因此,我通过以下查询在Hive中解决了此问题:

select *, from_unixtime(cast(SOURCE_LOAD_DATE as BIGINT) DIV 1000000) as SOURCE_LOAD_DATE from table_name;   

使用上述查询,我​​可以获取带有时间戳值的正确日期。

注意 您将需要转换具有时间戳数据的每一列。

这是我能想到的唯一技巧。希望对您或其他人有帮助!

答案 1 :(得分:0)

这是Hive中的一个开放错误。

并记录在https://issues.apache.org/jira/browse/HIVE-15079