使用Python编写Parquet文件的方法?

44

我在寻找一种能够使用Python编写Parquet文件的库,最好还能与Snappy或类似的压缩机制结合使用。

目前我找到的唯一方法是使用Spark的pyspark.sql.DataFrame Parquet支持。

我有一些脚本需要写入Parquet文件,但这些脚本不是Spark作业。是否存在不涉及pyspark.sql的Python编写Parquet文件的方法?


似乎Parquet格式有thrift定义文件,你不能利用它来访问吗? - Srgrn
7个回答

24

更新(2017年3月):目前有2个库可以写入Parquet文件:

  1. fastparquet
  2. pyarrow

两者似乎仍在积极开发中,并附带一些免责声明(例如不支持嵌套数据),因此您将需要检查它们是否支持您需要的所有功能。

旧答案:

截至2016年2月,似乎没有纯Python库能够写入Parquet文件。

如果您只需要读取Parquet文件,则可以使用python-parquet

作为解决方法,您将需要依赖其他一些进程,例如pyspark.sql(它使用Py4J并在JVM上运行,因此无法直接从您平均的CPython程序中使用)。


1
如果您需要能够将数据附加到现有文件中,例如批量写入多个dfs,则fastparquet可以胜任。我在pyarrow中找不到任何有关追加的提及,并且似乎代码还没有准备好(2017年3月)。 - Kieleth

9

fastparquet支持写入操作,以下是写入数据到文件的代码片段:

from fastparquet import write
write('outfile.parq', df)

9

将 Pandas 数据框简单写入 Parquet 的方法

假设 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.parquetparquet 文件中。

# Parquet with Brotli compression
pq.write_table(table, 'file_name.parquet')

注意: 写入parquet文件时可以进一步压缩。以下是流行的压缩格式。

  • Snappy (默认值,无需参数)
  • Gzip
  • Brotli

使用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')

不同格式的Parquet实现的比较分析

enter image description here

参考来源: https://tech.jda.com/efficient-dataframe-storage-with-apache-parquet/


请注意,压缩取决于内容。Brotli在代码/英文方面特别高效,因为它是根据HTML代码示例进行调整的,使用了固定的字典。 - undefined

6
我已经写了一份全面的Python和Parquet指南,重点在于利用Parquet的三个主要优化:列存储、列压缩和数据分区。还有第四个优化,行组,但它们并不常用。在Python中处理Parquet的方式有pandas、PyArrow、fastparquet、PySpark、Dask和AWS Data Wrangler。请查看这篇文章:Python和Parquet性能在Pandas、PyArrow、fastparquet、AWS Data Wrangler、PySpark和Dask中的比较。链接:Python和Parquet性能在Pandas、PyArrow、fastparquet、AWS Data Wrangler、PySpark和Dask中的比较

5

使用fastparquet,您可以按以下方式使用snappygzip压缩将pandas df写入到parquet文件中:

请确保已安装以下软件:

$ conda install python-snappy
$ conda install fastparquet

引入依赖

import pandas as pd 
import snappy
import fastparquet

假设您有以下Pandas 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

2

pyspark 目前似乎是使用 Python 写出 parquet 格式的最佳选择。虽然这看起来像是用剑代替针,但目前就是这样。

  • 它支持大多数压缩类型,如 lzo、snappy。Zstd 支持很快就会加入其中。
  • 完全支持模式(嵌套、结构等)

只需执行 pip install pyspark 即可开始使用。

https://spark.apache.org/docs/latest/sql-data-sources-parquet.html


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接