如何使用Linux或HDFS命令将多个Parquet文件合并为单个Parquet文件?

19

我有多个小的parquet文件,这些文件是hive ql作业的输出结果,我想将这些输出文件合并成单个parquet文件。

使用一些hdfs或linux命令最好的方法是什么?

我们以前使用cat命令合并文本文件,但对于parquet文件是否也适用呢? 在写输出文件时,我们是否可以像在spark中使用repartitioncoalesce方法那样,使用HiveQL本身来完成它?


3
不建议使用"parquet-tools merge"。Parquet将其文件切割成对应于HDFS块的row_groups。"Parquet-tools merge"仅将row_groups放置在先前的row_groups之后,而不会将它们合并。最终,您会得到相同的问题。您可以在此中找到更多的解释。您还可以在此博客中了解有关Parquet中"row_groups"的更多解释。 - Nastasia
根据@Nastasia提到的问题单,这个问题目前不会被解决。无论如何,合并工具提供的解决方案现在是发出警告(https://github.com/apache/parquet-mr/pull/433)。 - Markus
3个回答

18

4
有没有地方可以直接下载一个JAR文件?构建这个东西太麻烦了。 - samthebest
3
这能用于 AWS S3 上的文件吗? - Akarsh Gupta
1
如果您为了性能而统一文件,则应注意parquet-tools合并命令的限制:https://issues.apache.org/jira/browse/PARQUET-1115 - Avner Levy
3
如果您不想构建parquet-tools,可以在https://hub.docker.com/r/nathanhowell/parquet-tools找到一个包含它的Docker容器。 - David Bodow
1
@samthebest 是的,请点击这里的JAR链接。https://mvnrepository.com/artifact/org.apache.parquet/parquet-tools/1.11.1 - ScalaWilliam

10

使用DuckDB

import duckdb

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


5

如果您的执行引擎是mapreduce,您还可以使用HiveQL本身来完成此操作。

您可以为查询设置一个标志,这会导致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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接