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

Posted

技术标签:

【中文标题】使用 Python 编写 Parquet 文件的方法?【英文标题】:Methods for writing Parquet files using Python? 【发布时间】:2016-01-01 15:02:09 【问题描述】:

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

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

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

【问题讨论】:

Parquet格式好像有thirft定义文件不能用这个访问吗? 【参考方案1】:

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

    fastparquet pyarrow

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

旧答案:

截至 2.2016 年,似乎没有能够编写 Parquet 文件的纯 python 库。

如果您只需要读取 Parquet 文件,则有 python-parquet。

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

【讨论】:

如果您需要能够将数据附加到现有文件,例如批量写入多个 dfs,fastparquet 就可以了。我在 pyarrow 中找不到任何关于 append 的提及,而且似乎代码还没有准备好(2017 年 3 月)。【参考方案2】:

fastparquet确实有写支持,这里是一个sn-p来写数据到文件

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

【讨论】:

【参考方案3】:

我已经编写了 Python 和 Parquet 的综合指南,重点是利用 Parquet 的三个主要优化:列存储列压缩数据分区。还有第四个优化尚未涵盖,行组,但它们并不常用。在 Python 中使用 Parquet 的方式有 pandas、PyArrow、fastparquet、PySpark、Dask 和 AWS Data Wrangler。

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

【讨论】:

【参考方案4】:

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

假设,df 是熊猫数据框。我们需要导入以下库。

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写入parquet文件说file_name.parquet

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

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

Snappy(默认,不需要参数) 压缩包 布罗特里

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

用不同格式的镶木地板进行比较

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

【讨论】:

【参考方案5】:

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

通过snappy 压缩发送df 到镶木地板

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

使用gzip 压缩发送df 到镶木地板

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

【讨论】:

【参考方案6】:

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

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

只需这样做,pip install pyspark,您就可以开始了。

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

【讨论】:

【参考方案7】:

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

    鸭数据库https://duckdb.org 极地https://github.com/pola-rs/polars

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

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

【讨论】:

以上是关于使用 Python 编写 Parquet 文件的方法?的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyspark 同时编写 parquet 文件

使用 AWS Lambda (Python 3) 读取存储在 S3 中的 Parquet 文件

在没有熊猫的情况下从 Python 编写镶木地板文件

Apache Spark 无法读取使用流式作业编写的 parquet 文件夹

从 Python 编写嵌套拼花格式

如何使用 Python 在 HDFS 中打开 parquet 文件?