【问题标题】:Editing Parquet files with Python causes errors to datetime format使用 Python 编辑 Parquet 文件会导致日期时间格式错误
【发布时间】:2019-09-05 04:32:40
【问题描述】:

我正在尝试编辑一组用Spark 编写的parquet 文件。我正在使用Pyarrow 将它们加载到Python 中的pandas 数据帧中。目标是用一些数据追加新行并输出一组新的 parquet 文件。

我遇到的问题是日期/时间列,在 python 中加载镶木地板文件后显示为dtype('<M8[ns]'。添加新时间的行并输出新的 parquet 文件后,我使用 Amazon Athena 来查询文件。此时,此列中的值以+50975-10-19 00:00:00.000 的格式显示。正确的格式应该是2019-01-05 00:00:00.000

这里是 python 代码的 sn-p,显示了加载、编辑和输出这些 parquet 文件的工作流程:

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
import numpy as np

df1 = pd.read_parquet('example.snappy.parquet')

df1 = df1.append({'visitor_id' : '1234' , 'visitor_attribute_1' : True} , ignore_index=True)

#entering a new time stamp for above user
df1['visit_dates'].values[131] = np.datetime64('2019-01-03T00:02:11')

#output new parquet file with new row
table1 = pa.Table.from_pandas(df1)
pq.write_table(table1, 'example.snappy.parquet', compression='SNAPPY')

对此的任何帮助将不胜感激!

【问题讨论】:

    标签: python pandas dataframe datetime parquet


    【解决方案1】:

    这里的问题是 Athena 只理解 Arrow 格式的已弃用的 INT96 时间戳,否则它不会查看列的逻辑类型,而只会看到它正在读取具有 INT64 作为物理类型的列。 TIMESTAMP_NANOS 或 TIMESTAMP_MICROS 的逻辑类型注解被忽略。

    您可以使用pyarrow.parquet 尝试两种可能性:

    1. 您可以在pyarrow.parquet.write_table 中添加flavor="spark" 以启用Spark 兼容模式并写入已弃用的时间戳类型:https://arrow.apache.org/docs/python/parquet.html#using-with-spark
      1. 您可以通过将coerce_timestamps="ms" 添加到pyarrow.parquet.write_table 来强制以毫秒精度写入时间戳:https://arrow.apache.org/docs/python/parquet.html#data-type-handling

    我会推荐后一种选择,因为它更适合未来。

    【讨论】:

    • 我还发现了这个标志,你可以在 pq.write_table 方法 use_deprecated_int96_timestamps=True 中使用它,它似乎有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    相关资源
    最近更新 更多