2

我必须分两步将 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)?

4

1 回答 1

8

由(长名称:Apache Arrow)编写的 Parquet 文件pyarrow与 Apache Spark 兼容。但是您必须小心将哪些数据类型写入 Parquet 文件,因为 Apache Arrow 支持的数据类型比 Apache Spark 支持的范围更广。目前有一个标志flavor=spark可以pyarrow用来自动设置一些兼容性选项,以便 Spark 可以再次读取这些文件。遗憾的是,在最新版本中,此选项还不够(预计会更改为pyarrow==0.9.0)。您应该注意使用已弃用的 INT96 类型(use_deprecated_int96_timestamps=True) 以及避免无符号整数列。对于无符号整数列,只需将它们转换为有符号整数。遗憾的是,如果您的架构中有无符号类型,而不是仅仅将它们加载为有符号类型,Spark 就会出错(它们实际上总是以有符号的形式存储,但只用一个标志标记为无符号)。考虑到这两件事,这些文件应该在 Apache Spark 和 AWS Athena(这只是 Presto 的底层)中是可读的。

于 2018-01-18T08:47:08.897 回答