将小型镶木地板文件合并为单个大型镶木地板文件

问题描述 投票:0回答:3

我一直在尝试合并小镶木地板文件,每个文件有 10 k 行,并且每组小文件的数量将为 60-100。因此,合并后的 parquet 文件中至少有大约 600k 行。

我一直在尝试使用 pandas concat。它可以很好地合并大约 10-15 个小文件。

但由于该集合可能由 50-100 个文件组成。运行 python 脚本时,它被杀死的进程违反了内存限制

所以我正在寻找一种内存有效的方法来合并 100 个文件集范围内任意数量的小镶木地板

使用 pandas read parquet 读取每个单独的数据帧并将它们与 pd.conact(所有数据帧)组合

除了 pandas 之外还有更好的库吗?或者如果可能的话,在 pandas 中如何高效地完成它。

时间不是限制。它也可以运行很长时间。

python pandas dataframe out-of-memory parquet
3个回答
6
投票

您可以逐一打开文件并将它们附加到 parquet 文件中。最好使用 pyarrow 来实现此目的。

import pyarrow.parquet as pq

files = ["table1.parquet", "table2.parquet"]

schema = pq.ParquetFile(files[0]).schema_arrow
with pq.ParquetWriter("output.parquet", schema=schema) as writer:
    for file in files:
        writer.write_table(pq.read_table(file, schema=schema))

0
投票

对于大数据,你绝对应该使用 PySpark 库,如果可能的话分成更小的大小,然后使用 Pandas。 PySpark 与 Pandas 非常相似。

链接


0
投票

尝试一下 joinem,可通过 PyPi 获得:

python3 -m pip install joinem

joinem 提供了一个 CLI,可使用 polars 快速、灵活地串联表格数据。 I/O 是延迟流式传输,以便在处理大量大文件时提供良好的性能。

使用示例

通过标准输入传递输入文件,并将输出文件作为参数传递。

ls -1 path/to/*.parquet | python3 -m joinem out.parquet

您可以添加

--progress
标志来获取进度条。

免安装容器化接口

如果您在 HPC 环境中工作,也可以通过 singularity/apptainer 方便地使用 joinem

ls -1 *.pqt | singularity run docker://ghcr.io/mmore500/joinem out.pqt

更多信息

joinem 还兼容 CSV、JSON 和 Feather 文件类型。 请参阅项目的 README 了解更多使用示例和完整的命令行界面 API 列表。

披露:我是joinem的库作者。

© www.soinside.com 2019 - 2024. All rights reserved.