使用 pyarrow vs pyspark 创建的镶木地板文件是否兼容?
Are parquet file created with pyarrow vs pyspark compatible?
我必须分两步将 JSON 中的分析数据转换为镶木地板。对于大量现有数据,我正在编写 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)中读取。
我必须分两步将 JSON 中的分析数据转换为镶木地板。对于大量现有数据,我正在编写 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)中读取。