我有多个小
parquet
文件作为 hive ql 作业的输出生成,我想将输出文件合并到单个镶木地板文件中?
使用一些
hdfs or linux commands
来做到这一点的最佳方法是什么?
我们曾经使用
cat
命令合并文本文件,但这也适用于镶木地板吗?
在编写输出文件时,我们可以使用 HiveQL
本身来完成此操作,就像我们在 repartition
中使用 coalesc
或 spark
方法一样吗?
根据此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
这样的工具
使用duckdb:
import duckdb
duckdb.execute("""
COPY (SELECT * FROM '*.parquet') TO 'merge.parquet' (FORMAT 'parquet');
""")
如果您的执行引擎是
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 中阅读有关此设置的更多信息。
尝试一下 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的库作者。