我有一些代码生成的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。我认为这是问题的根源,但什么是正确的方法呢?
2条答案
按热度按时间44u64gxh1#
这是 hive 里的一只开着的虫子。
并记录在https://issues.apache.org/jira/browse/hive-15079
7cwmlq892#
我想出了一个解决自己问题的办法。我更改了
TIMESTAMP
列到STRING
在获取我使用的数据时from_unixtime
方法将该特定列强制转换为预期的日期格式,并能够获取该列。但是,这里的问题是如果我的日期值是
2020-02-27 15:40:22
当我通过hive获取此列的数据时,它正在返回EpochSeconds
即15340232000000
.所以,我通过下面的查询在hive中解决了这个问题:
使用上面的查询,我能够得到正确的日期和时间戳值。
注意:您将需要强制转换每个具有时间戳数据的列。
这是我唯一能想到的伎俩。我希望这能帮助你或其他人!