我在寻找一种能够使用Python编写Parquet文件的库,最好还能与Snappy或类似的压缩机制结合使用。
目前我找到的唯一方法是使用Spark的pyspark.sql.DataFrame
Parquet支持。
我有一些脚本需要写入Parquet文件,但这些脚本不是Spark作业。是否存在不涉及pyspark.sql
的Python编写Parquet文件的方法?
我在寻找一种能够使用Python编写Parquet文件的库,最好还能与Snappy或类似的压缩机制结合使用。
目前我找到的唯一方法是使用Spark的pyspark.sql.DataFrame
Parquet支持。
我有一些脚本需要写入Parquet文件,但这些脚本不是Spark作业。是否存在不涉及pyspark.sql
的Python编写Parquet文件的方法?
更新(2017年3月):目前有2个库可以写入Parquet文件:
两者似乎仍在积极开发中,并附带一些免责声明(例如不支持嵌套数据),因此您将需要检查它们是否支持您需要的所有功能。
旧答案:
截至2016年2月,似乎没有纯Python库能够写入Parquet文件。
如果您只需要读取Parquet文件,则可以使用python-parquet。
作为解决方法,您将需要依赖其他一些进程,例如pyspark.sql
(它使用Py4J并在JVM上运行,因此无法直接从您平均的CPython程序中使用)。
fastparquet支持写入操作,以下是写入数据到文件的代码片段:
from fastparquet import write
write('outfile.parq', df)
假设 df
是 Pandas 数据框。我们需要导入以下库。
import pyarrow as pa
import pyarrow.parquet as pq
首先,将数据框 df
写入一个 pyarrow
表中。
# Convert DataFrame to Apache Arrow Table
table = pa.Table.from_pandas(df_image_0)
其次,将 table
写入到名为 file_name.parquet
的 parquet
文件中。
# Parquet with Brotli compression
pq.write_table(table, 'file_name.parquet')
使用Snappy压缩的Parquet
pq.write_table(table, 'file_name.parquet')
使用GZIP压缩的Parquet
pq.write_table(table, 'file_name.parquet', compression='GZIP')
Parquet与Brotli压缩
pq.write_table(table, 'file_name.parquet', compression='BROTLI')
参考来源: https://tech.jda.com/efficient-dataframe-storage-with-apache-parquet/
使用fastparquet
,您可以按以下方式使用snappy
或gzip
压缩将pandas df
写入到parquet文件中:
请确保已安装以下软件:
$ conda install python-snappy
$ conda install fastparquet
引入依赖
import pandas as pd
import snappy
import fastparquet
df
:df = pd.DataFrame(data={'col1': [1, 2], 'col2': [3, 4]})
df
使用snappy
压缩发送到parquet文件。df.to_parquet('df.snap.parquet',compression='snappy')
df
使用gzip
压缩方式保存为parquet格式。df.to_parquet('df.gzip.parquet',compression='gzip')
检查:
将parquet文件读取回pandas中的df
。
pd.read_parquet('df.snap.parquet')
或者
pd.read_parquet('df.gzip.parquet')
输出:
col1 col2
0 1 3
1 2 4
pyspark
目前似乎是使用 Python 写出 parquet 格式的最佳选择。虽然这看起来像是用剑代替针,但目前就是这样。
只需执行 pip install pyspark
即可开始使用。
https://spark.apache.org/docs/latest/sql-data-sources-parquet.html
两个Python库可以快速将CSV转换为parquet格式:
虽然可能没有fastparquet的所有功能,但它们非常快速且易于掌握。
编辑 Polars可以使用Arrows编写parquet,支持新的parquet版本和选项: https://arrow.apache.org/docs/python/generated/pyarrow.parquet.write_table.html