镶木地板字符串到配置单元中的时间戳转换

Parquet String to timestamp conversion in hive

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

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

实际上,时间戳字段在 parquet 中存储为字符串,但我的配置单元 table 字段是时间戳类型。我认为这是导致问题的原因,但正确的方法是什么?

这是 Hive 中的一个未解决的错误。

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

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

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

使用上面的查询,我能够获得带有时间戳值的正确日期。

注意: 您将需要转换包含时间戳数据的每一列。

这是我唯一能想到的技巧。我希望这可以帮助你或其他人!