使用 Python 编辑 Parquet 文件会导致日期时间格式错误
Editing Parquet files with Python causes errors to datetime format
我正在尝试编辑在 Spark
中编写的一组 parquet
文件。我正在使用 Pyarrow
将它们加载到 Python 中的 pandas
数据帧中。目标是在新行中附加一些数据并输出一组新的镶木地板文件。
我遇到的问题是 date/time 列,在 python 中加载镶木地板文件后显示为 dtype('<M8[ns]'
。添加具有新时间的行并输出新的镶木地板文件后,我使用 Amazon Athena 来查询文件。此时,此列中的值以 +50975-10-19 00:00:00.000
格式显示。正确的格式应该是2019-01-05 00:00:00.000
这里是 python 代码片段,显示了加载、编辑和输出这些 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')
如有任何帮助,我们将不胜感激!
这里的问题是 Athena 只理解 Arrow 格式中已弃用的 INT96 时间戳,否则它不会查看列的逻辑类型,而只会看到它正在读取物理类型为 INT64 的列。 TIMESTAMP_NANOS 或 TIMESTAMP_MICROS 的逻辑类型注释被忽略。
您可以尝试两种可能性 pyarrow.parquet
:
- 您可以将
flavor="spark"
添加到pyarrow.parquet.write_table
以启用Spark兼容模式并写入已弃用的时间戳类型:https://arrow.apache.org/docs/python/parquet.html#using-with-spark
- 您可以通过将
coerce_timestamps="ms"
添加到 pyarrow.parquet.write_table
来强制以毫秒精度写入时间戳:https://arrow.apache.org/docs/python/parquet.html#data-type-handling
我会推荐后一种选择,因为它更适合未来。
我正在尝试编辑在 Spark
中编写的一组 parquet
文件。我正在使用 Pyarrow
将它们加载到 Python 中的 pandas
数据帧中。目标是在新行中附加一些数据并输出一组新的镶木地板文件。
我遇到的问题是 date/time 列,在 python 中加载镶木地板文件后显示为 dtype('<M8[ns]'
。添加具有新时间的行并输出新的镶木地板文件后,我使用 Amazon Athena 来查询文件。此时,此列中的值以 +50975-10-19 00:00:00.000
格式显示。正确的格式应该是2019-01-05 00:00:00.000
这里是 python 代码片段,显示了加载、编辑和输出这些 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')
如有任何帮助,我们将不胜感激!
这里的问题是 Athena 只理解 Arrow 格式中已弃用的 INT96 时间戳,否则它不会查看列的逻辑类型,而只会看到它正在读取物理类型为 INT64 的列。 TIMESTAMP_NANOS 或 TIMESTAMP_MICROS 的逻辑类型注释被忽略。
您可以尝试两种可能性 pyarrow.parquet
:
- 您可以将
flavor="spark"
添加到pyarrow.parquet.write_table
以启用Spark兼容模式并写入已弃用的时间戳类型:https://arrow.apache.org/docs/python/parquet.html#using-with-spark- 您可以通过将
coerce_timestamps="ms"
添加到pyarrow.parquet.write_table
来强制以毫秒精度写入时间戳:https://arrow.apache.org/docs/python/parquet.html#data-type-handling
- 您可以通过将
我会推荐后一种选择,因为它更适合未来。