python - 使用 Python 编辑 Parquet 文件会导致日期时间格式错误
问题描述
我正在尝试编辑一组parquet
用Spark
. 我正在将它们加载到pandas
Python 中的数据框中,使用Pyarrow
. 目标是用一些数据附加新行并输出一组新的镶木地板文件。
我遇到的问题是日期/时间列,在 python 中加载镶木地板文件后显示为dtype('<M8[ns]'
. 添加新时间的行并输出新的 parquet 文件后,我使用 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-sparkcoerce_timestamps="ms"
您可以通过添加以下内容来强制以毫秒精度写入时间戳pyarrow.parquet.write_table
:https ://arrow.apache.org/docs/python/parquet.html#data-type-handling
我会推荐后一种选择,因为它更具未来性。
推荐阅读
- haskell - 安装快速检查
- reactjs - 反应变量格式化日期
- c++ - node = node->next 与 *node = *(node->next) 之间的区别?
- mongodb - 使用 elasticsearch sink 连接器删除和编辑操作不起作用
- android - 在模块 guava-26.0-android.jar 和 guava-jdk5-17.0.jar 中发现重复的类
- tcp - ns-2 TCP window_和cwnd_关系
- python - 使用 Python 从文本文件中提取 StatusDescription
- python - python和web中的xpath查询之间的区别
- esp8266 - ds18b20.lua 任务饿死?
- angular - 角度和会话与 cookie + oauth