Datax写入parquet类型的hive表时处理timestamp类型字段的方法

【自取】最近整理的,有需要可以领取学习:

1、 hive中的Timestamp

Hive在0.8的版本后开始支持Timestamp的格式。Hive在储存时间戳的时候会先把时间转成UTC的时间,然后再把转换后的时间存储到Parquet文件中。在读取Parquet文件的时候Hive会把时间从UTC时间再转化回成本地的时间。这样的话,如果存和读取都是用Hive的话,时间不会有任何的问题。上述说的是用Parquet文件来存取时间格式流程,如果是存成普通的文本文件的话,存取都不会进行任何时间的转换。

Parquet文件格式是当前Hadoop生态中最流行的列式存储格式。Parquet支持的类型有BOOLEAN、INT32、INT64、INT96、FLOAT、DOUBLE、BYTE_ARRAY,所以Timestamp其实是一种逻辑类型。由于Impala存储的时间精度达到纳秒的级别,所以在Parquet文件中用INT96来存储时间。其他的数据处理引擎也跟进该精度,所以也用INT96来存储,但是在时区兼容性方面做得并不好。

在datax中如果我们直接用group.append(columns.get(i).getString(Key.NAME),dataFormat.format(column.asDate()),在使用xshell读取时会报如下错误:

对于拼图类型文件的时间戳逻辑类型(注释为int96),这种时间戳编码(Int96)似乎很少,也不受支持。了解了拼图的时间戳存储原理后,这个问题就迎刃而解了。保存为Int96的时间戳由一天中的纳秒组成。

[En]

For the parquet type file’s timestamp logical type (annotated as int96), this timestamp encoding (int96) seems rare and unsupported. After understanding the timestamp storage principle of Parquet, this problem can be easily solved. The timestamp saved as Int96 consists of nanoseconds of the day.

请注意:Messagetype模式中的列使用哪种拼图类型?我们应该使用原始类型Primitivetypename.int96。

[En]

Be clear: which Parquet type is used for columns in messagetype schema? We should use the primitive type primitivetypename.int96.

保存时,需要对值进行换算

[En]

When saving, you need to convert the value

group.append(columns.get(i).getString(Key.NAME),dataFormat.format(column.asDate())

用spark sql中的这段代码作为参考,终于找到了答案

首先将需要存储的时间转换为二进制,然后存储到拼花、蜂窝中进行读取,然后自动转换为时间戳,解决了问题。

[En]

The time that needs to be stored is first converted to Binary and then stored to parquet,hive for reading, and then automatically converted to Timestamp, the problem is solved.

Original: https://www.cnblogs.com/itboys/p/13726957.html
Author: 大葱拌豆腐
Title: Datax写入parquet类型的hive表时处理timestamp类型字段的方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/6779/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

发表回复

登录后才能评论
免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部