【问题标题】:How to save spark dataframe to parquet without using INT96 format for timestamp columns?如何在不使用 INT96 格式的时间戳列的情况下将火花数据帧保存到镶木地板?
【发布时间】:2019-10-28 04:02:37
【问题描述】:

我有一个 spark 数据框,我想将它保存为 parquet,然后使用 parquet-avro 库加载它。

我的数据框中有一个时间戳列,它转换为镶木地板中的 INT96 时间戳列。然而 parquet-avro does not support INT96 格式并抛出。

有办法避免吗?在 avro 支持的东西中将时间戳写入镶木地板时,是否可以更改 Spark 使用的格式?

我现在使用

date_frame.write.parquet("path")

【问题讨论】:

    标签: apache-spark avro parquet


    【解决方案1】:

    阅读spark代码我发现spark.sql.parquet.outputTimestampTypeproperty

    spark.sql.parquet.outputTimestampType :
    设置 Spark 将数据写入 Parquet 文件时要使用的 Parquet 时间戳类型。
    INT96 是 Parquet 中非标准但常用的时间戳类型。
    TIMESTAMP_MICROS 是 Parquet 中的标准时间戳类型,它存储 Unix 纪元的微秒数。
    TIMESTAMP_MILLIS 也是标准的,但精度为毫秒,这意味着 Spark 必须截断其时间戳值的微秒部分。

    所以我可以做到以下几点:

    spark.conf.set("spark.sql.parquet.outputTimestampType", "TIMESTAMP_MICROS")
    data_frame.write.parquet("path")
    

    【讨论】:

    • 你不接受你自己的答案吗? :P 也谢谢,这很有帮助。
    • 遗憾的是,没有选择只写为字符串。奇怪的是,Spark 3.0 在 INT96 中输出时间戳而不询问......感谢您的回答,它完全符合我的要求。
    • 运行 spark 2.4 的类似问题 -- Parquet does not support date. See HIVE-6384。不幸的是,这个答案对我来说没有任何改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 2017-03-17
    • 2018-10-27
    • 1970-01-01
    相关资源
    最近更新 更多