parquet字符串到hive中时间戳的转换

xxls0lw8  于 2021-05-27  发布在  Hadoop
关注(0)|答案(2)|浏览(452)

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

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

实际上,时间戳字段在parquet中存储为字符串,但我的配置单元表字段的类型是timestamp。我认为这是问题的根源,但什么是正确的方法呢?

44u64gxh

44u64gxh1#

这是 hive 里的一只开着的虫子。
并记录在https://issues.apache.org/jira/browse/hive-15079

7cwmlq89

7cwmlq892#

我想出了一个解决自己问题的办法。我更改了 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;

使用上面的查询,我能够得到正确的日期和时间戳值。
注意:您将需要强制转换每个具有时间戳数据的列。
这是我唯一能想到的伎俩。我希望这能帮助你或其他人!

相关问题