如何使用linux或hdfs命令将多个parquet文件合并为单个parquet文件?

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

我有多个小

parquet
文件作为 hive ql 作业的输出生成,我想将输出文件合并到单个镶木地板文件中?

使用一些

hdfs or linux commands
来做到这一点的最佳方法是什么?

我们曾经使用

cat
命令合并文本文件,但这也适用于镶木地板吗? 在编写输出文件时,我们可以使用
HiveQL
本身来完成此操作,就像我们在
repartition
中使用
coalesc
spark
方法一样吗?

hdfs parquet
4个回答
18
投票

根据此https://issues.apache.org/jira/browse/PARQUET-460 现在您可以下载源代码并编译内置于 merge 命令中的 parquet-tools。

java -jar ./target/parquet-tools-1.8.2-SNAPSHOT.jar merge /input_directory/
        /output_idr/file_name

或者使用像https://github.com/stripe/herringbone

这样的工具

10
投票

使用duckdb

import duckdb

duckdb.execute("""
COPY (SELECT * FROM '*.parquet') TO 'merge.parquet' (FORMAT 'parquet');
""")


5
投票

如果您的执行引擎是

HiveQL
,您也可以使用
mapreduce
本身来完成此操作。

您可以为查询设置一个标志,这会导致 hive 在作业结束时合并小文件:

SET hive.merge.mapredfiles=true;

SET hive.merge.mapfiles=true;

如果您的工作只是地图工作。

这将导致 hive 作业自动将许多小 parquet 文件合并为更少的大文件。您可以通过调整

hive.merge.size.per.task
设置来控制输出文件的数量。如果您只想拥有一个文件,请确保将其设置为始终大于输出大小的值。另外,请确保相应地调整
hive.merge.smallfiles.avgsize
。如果您想确保 hive 始终合并文件,请将其设置为非常低的值。您可以在 hive documentation 中阅读有关此设置的更多信息。


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.