使用 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
,您可以使用snappy
或gzip
压缩将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 的最佳选择。这看起来像是用剑代替针,但目前就是这样。
只需这样做,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 文件的方法?的主要内容,如果未能解决你的问题,请参考以下文章
使用 AWS Lambda (Python 3) 读取存储在 S3 中的 Parquet 文件