I have parquet
读取时的数据(TIMESTAMP
列)使用 Spark 效果非常好。以下是样本记录:
scala> data.select($"BATCH_LOAD_DATE").limit(5).show()
+-------------------+
| BATCH_LOAD_DATE|
+-------------------+
|2020-02-21 07:35:27|
|2020-02-21 07:35:27|
|2020-02-21 07:35:27|
|2020-02-21 07:35:27|
|2020-02-21 07:35:27|
+-------------------+
我检查了架构,它显示TIMESTAMP
作为正确的列之一的数据类型。所以,模式也没有问题。然而,当我尝试阅读相同的内容时TIMESTAMP
通过 Hive 的列,它抛出以下异常
Error: java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassCastException: org.apache.hadoop.io.LongWritable cannot be cast to org.apache.hadoop.hive.serde2.io.TimestampWritableV2 (state=,code=0)
我可以看到从this链接表明这是 Hive 中的一个未决问题。不确定是否已经解决。有什么解决方法吗?加载数据时可以做些什么,或者加载后进行一些转换?
我找到了解决我自己问题的替代方案。我更改了列类型TIMESTAMP
列至STRING
在获取数据时我使用了from_unixtime
方法将该特定列转换为预期的日期格式并能够获取它。
但是,这里的问题是如果我的日期值是2020-02-27 15:40:22
当我通过 Hive 获取该列的数据时,它正在返回EpochSeconds
i.e 15340232000000
.
因此,我通过以下查询在 Hive 中解决了这个问题:
select *, from_unixtime(cast(SOURCE_LOAD_DATE as BIGINT) DIV 1000000) as SOURCE_LOAD_DATE from table_name;
使用上面的查询我能够获得带有时间戳值的正确日期。
Note:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)