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

Methods for writing Parquet files using Python?

我找不到允许使用 Python 编写 Parquet 文件的库。如果我可以结合使用 Snappy 或类似的压缩机制,则加分。

到目前为止,我发现的唯一方法是使用支持 pyspark.sql.DataFrame Parquet 的 Spark。

我有一些脚本需要编写不是 Spark 作业的 Parquet 文件。有没有什么方法可以在 Python 中编写不涉及 pyspark.sql 的 Parquet 文件?

更新(2017 年 3 月): 目前有 2 个库能够 编写 Parquet文件:

  1. fastparquet
  2. pyarrow

它们似乎都仍在大力开发中,并且它们带有许多免责声明(例如不支持嵌套数据),因此您必须检查它们是否支持您需要的一切。

旧答案:

截至 2.2016,似乎没有 python-only 库能够编写 Parquet 文件。

如果您只需要读取 Parquet 文件,那么有python-parquet.

作为解决方法,您将不得不依赖其他一些流程,例如pyspark.sql(它使用 Py4J 并在 JVM 上运行,因此不能直接从普通的 CPython 程序中使用)。

fastparquet 确实有写入支持,这里是将数据写入文件的片段

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

使用fastparquet,您可以使用snappygzip压缩编写pandas df镶木地板,如下所示:

确保您已安装以下内容:

$ 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 压缩

df.to_parquet('df.snap.parquet',compression='snappy')

发送 df 到镶木地板 gzip 压缩

df.to_parquet('df.gzip.parquet',compression='gzip')

检查:

将镶木地板读回 pandas df

pd.read_parquet('df.snap.parquet')

pd.read_parquet('df.gzip.parquet')

输出:

   col1 col2
0   1    3
1   2    4

pyspark 似乎是目前用 python 写出镶木地板的最佳选择。看似以刀代针,但现在就是这样。

  • 它支持大多数压缩类型,如 lzo、snappy。 Zstd 支持应该很快就会出现。
  • 具有完整的模式支持(嵌套、结构等)

简单地做,pip install pyspark就可以了。

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

将 pandas 数据帧写入 parquet 的简单方法。

假设,df 是 pandas 数据帧。我们需要导入以下库。

import pyarrow as pa
import pyarrow.parquet as pq

首先,将dataframe df写入pyarrow table.

# Convert DataFrame to Apache Arrow Table
table = pa.Table.from_pandas(df_image_0)

其次,将table写入parquet文件说file_name.parquet

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

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

  • Snappy(默认,不需要参数)
  • Gzip
  • 布罗特里

采用 Snappy 压缩的 Parquet

 pq.write_table(table, 'file_name.parquet')

使用 GZIP 压缩的 Parquet

pq.write_table(table, 'file_name.parquet', compression='GZIP')

使用 Brotli 压缩的 Parquet

pq.write_table(table, 'file_name.parquet', compression='BROTLI')

不同格式parquet实现的对比

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

我写了一份关于 Python 和 Parquet 的综合指南,重点介绍如何利用 Parquet 的三个主要优化:列式存储列压缩数据分区。还有第四种优化尚未涉及,即行组,但它们并不常用。在 Python 中使用 Parquet 的方法有 pandas、PyArrow、fastparquet、PySpark、Dask 和 AWS Data Wrangler。

在此处查看 post:Python and Parquet Performance In Pandas, PyArrow, fastparquet, AWS Data Wrangler, PySpark and Dask

另外两个 Python 用于快速 CSV => parquet 转换的库:

  1. DuckDB https://duckdb.org
  2. 极地 https://github.com/pola-rs/polars

可能没有 fastparquet 的所有花里胡哨的功能,但确实快速且易于掌握。

编辑 Polars 可以使用 Arrows 编写 parquet,它支持新的 parquet 版本和选项: https://arrow.apache.org/docs/python/generated/pyarrow.parquet.write_table.html