【问题标题】:Apache-Drill doesn't understand Pandas datetime64[ns]Apache-Drill 不理解 Pandas datetime64[ns]
【发布时间】:2019-12-12 18:55:48
【问题描述】:

我正在使用 PyarrowPyarrow.Parquet 以及 Pandas。当我将 Pandas datetime64[ns] 系列发送到 Parquet 文件并通过钻取查询再次加载时,查询显示一个整数,例如:1467331200000000,这似乎不是 UNIX 时间戳。

查询如下所示:

SELECT workspace.id-column AS id-column, workspace.date-column AS date-column

当我再次在 Python 中打开该文件时,它会正确加载并且仍然具有 datetime64[ns] 类型。

知道出了什么问题以及如何解决这个问题吗?我希望将此值显示为常规日期。

【问题讨论】:

    标签: python parquet apache-drill pyarrow


    【解决方案1】:

    您能分享一下镶木地板架构吗?是否包含此列的 TIMESTAMP 逻辑类型?

    现在,您可以编写自定义 UDF,将 BigInt 纳秒值转换为时间戳,或使用内置函数(不确定 ns,但有很多函数接受毫秒):

    select to_timestamp(1467331200000/1000);
    +-----------------------+
    |        EXPR$0         |
    +-----------------------+
    | 2016-07-01 03:00:00.0 |
    +-----------------------+
    

    【讨论】:

    • 嘿,在这之间我找到了一个解决方案,我必须将其集成到我的CREATE VIEW 语句中:基本上我总是想创建一个包含所有可用列的视图,因为它们是纯粹的,因为它们是写成 Parquet 时已经清理干净。但其中一些会得到CAST(xyz TO_TIMESTAMP)SELECT *, CAST(xyz TO_TIMESTAMP) FROM workspace.file.paquet 不起作用。没有惊喜。但是你知道如何处理吗?
    • 请提供 parquet 模式以确定 Drill 是否应该或不应该将该值作为时间戳读取。关于您提供的查询,它应该可以工作,但正如预期的那样,它将返回原始列和转换后的列。
    【解决方案2】:

    好的,我几天前找到了一个解决方案,我想分享一下。我想我最初错过了一些东西。在将数据帧发送到 Parquet 之前,向下转换到 [ms] 以及允许截断时间戳非常重要,以便能够在 Drill 中无问题地打开它:

    pq.write_table(table, rf'{name}.parquet',
               coerce_timestamps='ms',
               allow_truncated_timestamps=True)
    

    当我在 Drill 中定义视图时,我可以根据需要将该列转换为日期或时间戳。

    【讨论】:

    • +1 我会补充一点,对于 Pandas 数据框,简写 df.to_parquet('/some/path', coerce_timestamps='ms') 就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2020-10-17
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2013-11-14
    相关资源
    最近更新 更多