如何使用pandas保存与Hadoop Spark头一致、无需启动Spark的Parquet文件
解决方案
方案一:关闭统计信息写入(最简便)
报错触发点为旧版Spark/Hive的Parquet统计信息校验逻辑,对parquet-cpp生成的元数据格式解析失败,关闭统计信息写入即可直接绕过该问题,不影响正常数据读取。
代码实现:
import pyarrow as pa import pyarrow.parquet as pq import pandas as pd # df为读取csv等文件得到的DataFrame table = pa.Table.from_pandas(df) pq.write_table( table, "df.parquet", version='1.0', flavor='spark', write_statistics=False, compression='snappy' # 指定snappy压缩 )
该方案适合不需要Parquet统计信息做查询优化的场景,改造成本为0。
方案二:指定兼容的created_by元数据(保留统计信息)
如果需要保留统计信息以获得更好的查询性能,可以在写入时直接指定符合旧版Spark/Hive解析规则的created_by元数据值即可:
import pyarrow as pa import pyarrow.parquet as pq import pandas as pd table = pa.Table.from_pandas(df) with pq.ParquetWriter( "df.parquet", table.schema, version='1.0', flavor='spark', write_statistics=True, compression='snappy', # 配置符合旧版Parquet解析正则的created_by值 created_by="parquet-mr version 1.8.1 (build compatible)" ) as writer: writer.write_table(table)
方案三:升级PyArrow版本
如果环境允许升级依赖,将PyArrow升级到2.0及以上版本,官方已经调整了默认created_by字段的格式,兼容旧版Spark/Hive的解析规则,无需额外配置即可直接导出符合要求的Parquet文件。
注意事项
- 写入时保留
flavor='spark'配置,保证列类型和Spark/Hive的兼容性 - 如果需要写入分区格式的Parquet目录,可使用
pq.write_to_dataset方法,上述参数均可以通用
内容的提问来源于stack exchange,提问作者quantCode
相关产品推荐
相关产品推荐

