【问题标题】:how to merge multiple parquet files to single parquet file using linux or hdfs command?如何使用 linux 或 hdfs 命令将多个 parquet 文件合并到单个 parquet 文件?
【发布时间】:2016-12-01 08:08:07
【问题描述】:

我有多个小的 parquet 文件作为 hive ql 作业的输出生成,我想将输出文件合并到单个 parquet 文件吗?

使用 hdfs or linux commands 的最佳方法是什么?

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

【问题讨论】:

  • 不推荐使用“parquet-tools merge”。 Parquet 将其文件切割成对应于 HDFS 块的 row_groups。 “Parquet-tools merge”仅将 row_groups 放在 row_groups 之后而不合并它们。最后,你会遇到同样的问题。您可以在this ticket 中找到更多解释。您还可以在此blog 中对镶木地板的“row_groups”进行更多说明。
  • 按照@Nastasia 提到的票证,这个问题不会得到解决(至少现在是这样)。无论如何,merge-tools 提供的解决方案现在是发出警告 (github.com/apache/parquet-mr/pull/433)。

标签: hdfs parquet


【解决方案1】:

据此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之类的工具

【讨论】:

【解决方案2】:

如果您的执行引擎是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 中阅读有关此设置的更多信息。

【讨论】:

    猜你喜欢
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2021-05-20
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    相关资源
    最近更新 更多