hive 如何从AWS Kinesis Firehose中使用int64时间戳(而不是int96)编写Parquet文件?

llycmphe  于 2022-12-23  发布在  Hive
关注(0)|答案(1)|浏览(171)

为什么int96时间戳对我不起作用?

我想用S3 Select读取 parquet 文件。根据文档,S3 Select不支持保存为int96的时间戳。另外,在 parquet 中保存为int96的时间戳是deprecated

我尝试了什么?

Firehose使用org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe序列化到parquet(AWS使用的确切配置单元版本未知)。在阅读配置单元代码时,我遇到了以下配置开关:我尝试通过更改AWS Glue表config中的Serde参数来应用此配置开关:

不幸的是,这并没有产生什么影响,我的时间戳列仍然存储为int96(通过从S3下载文件并用parq my-file.parquet --schema检查它来检查)

68bkxrlz

68bkxrlz1#

虽然我不能让Firehose写入int64时间戳,但我找到了一个变通方法,可以将S3Select查询结果返回的int96时间戳转换为有用的东西。
我使用了中介绍的方法

用JavaScript编写以下转换函数:

toDaySec = (ts) => (Number(BigInt(ts) >> 64n) - 2440588) * 86400

toTimeSec = (ts) => Number((BigInt(ts) & 0xFFFFFFFFFFFFFFFFn) / (1000n ** 3n))

tsToDate = (ts) => new Date((toDaySec(ts) + toTimeSec(ts)) * 1000)

tsFromS3Select = "45377606915595481758988800"
tsToDate(tsFromS3Select) // Result: 2022-12-11T20:58:33.000Z

注意,unlike expected,S3 Select返回的时间戳将儒略历部分存储在开头,而不是最后4个字节。纳秒时间部分存储在最后8个字节。此外,字节顺序不颠倒
(关于儒略日常数2440588:根据https://docs.oracle.com/javase/8/docs/api/java/time/temporal/JulianFields.html,在此上下文中使用2440587.5是错误的)

相关问题