我正在尝试将这样的 Dataframe 写入 Parquet:
| foo | bar |
|-----|-------------------|
| 1 | {"a": 1, "b": 10} |
| 2 | {"a": 2, "b": 20} |
| 3 | {"a": 3, "b": 30} |
我正在使用 Pandas 和 Fastparquet:
df = pd.DataFrame({
"foo": [1, 2, 3],
"bar": [{"a": 1, "b": 10}, {"a": 2, "b": 20}, {"a": 3, "b": 30}]
})
import fastparquet
fastparquet.write('/my/parquet/location/toy-fastparquet.parq', df)
我想在 (py)Spark 中加载 Parquet,并使用 Spark SQL 查询数据,例如:
df = spark.read.parquet("/my/parquet/location/")
df.registerTempTable('my_toy_table')
result = spark.sql("SELECT * FROM my_toy_table WHERE bar.b > 15")
我的问题是,即使fastparquet
可以正确读取其 Parquet 文件(该bar
字段被正确反序列化为 Struct),在 Spark 中,bar
也被读取为 String 类型的列,它只包含原始结构的JSON 表示:
In [2]: df.head()
Out[2]: Row(foo=1, bar='{"a": 1, "b": 10}')
我尝试从 PyArrow 编写 Parquet,但没有运气:ArrowNotImplementedError: Level generation for Struct not supported yet
. 我也尝试过传递file_scheme='hive'
给 Fastparquet,但我得到了相同的结果。将 Fastparquet 序列化更改为 BSON ( object_encoding='bson'
) 会产生不可读的二进制字段。
[编辑]我看到以下方法:
- [已回答]从 Spark 编写 Parquet
- [open]找到一个 Python 库,它实现了Parquet 的嵌套类型规范,并且与 Spark 读取它们的方式兼容
- [已回答]使用特定的 JSON 反序列化读取 Spark 中的 Fastparquet 文件(我想这会对性能产生影响)
- 不要完全使用嵌套结构