Skip to main content
 首页 » 编程设计

python之使用 pyarrow vs pyspark 创建的 Parquet 文件是否兼容

2025年05月04日33zhoujg

我必须分两步将 JSON 格式的分析数据转换为 Parquet 。对于大量现有数据,我正在编写 PySpark 作业并执行

df.repartition(*partitionby).write.partitionBy(partitionby). 
    mode("append").parquet(output,compression=codec) 

但是对于增量数据,我计划使用 AWS Lambda。可能 PySpark 对它来说太过分了,因此我计划为此使用 PyArrow(我知道它不必要地涉及 Pandas,但我找不到更好的选择)。所以,基本上:

import pyarrow.parquet as pq 
pq.write_table(table, outputPath, compression='snappy', 
    use_deprecated_int96_timestamps=True) 

我想知道 PySpark 和 PyArrow 编写的 Parquet 文件是否兼容(相对于 Athena)?

请您参考如下方法:

pyarrow(全名:Apache Arrow)编写的 Parquet 文件与 Apache Spark 兼容。但是您必须小心将哪些数据类型写入 Parquet 文件,因为 Apache Arrow 比 Apache Spark 支持更广泛的数据类型。目前在 pyarrow 中有一个标记 flavor=spark ,您可以使用它来自动设置一些兼容性选项,以便 Spark 可以再次读取这些文件。遗憾的是,在最新版本中,此选项还不够(预计会随 pyarrow==0.9.0 发生变化)。您应该注意使用已弃用的 INT96 类型 (use_deprecated_int96_timestamps=True) 写出时间戳,并避免使用无符号整数列。对于无符号整数列,只需将它们转换为有符号整数。遗憾的是,如果您的架构中有无符号类型而不是仅将它们加载为已签名类型,则 Spark 会出错(它们实际上始终存储为已签名,但仅标记为无符号标志)。考虑到这两点,文件应该可以在 Apache Spark 和 AWS Athena(这只是引擎盖下的 Presto)中读取。