我有一些代码生成的镶木地板文件。我为该数据创建了一个DDL,在hive中添加了表格,并指向了hdfs中的木地板文件。当我尝试查询表时,所有字段看起来都很完美。但是,对于时间戳字段,hive给出了例外。
HiveException: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.hive.serde2.io.TimestampWritable
实际上,时间戳字段以字符串形式存储在镶木地板中,但是我的配置单元表字段的类型为时间戳。我认为这是造成问题的原因,但是正确的方法是什么?
答案 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中的一个开放错误。