【问题标题】:How to merge small files in spark while writing into hive orc table如何在写入 hive orc 表时合并 spark 中的小文件
【发布时间】:2018-06-09 16:37:42
【问题描述】:

我正在从 s3 读取 csv 文件并作为兽人写入配置单元表。在写入时,它正在写入很多小文件。我需要合并所有这些文件。我设置了以下属性:

 spark.sql("SET hive.merge.sparkfiles = true")
 spark.sql("SET hive.merge.mapredfiles = true")
 spark.sql("SET hive.merge.mapfiles = true")
 spark.sql("set hive.merge.smallfiles.avgsize = 128000000")
 spark.sql("set hive.merge.size.per.task = 128000000")

除了这些配置之外,我还尝试了 repartition(1) 和 coalesce(1),它们将合并到单个文件中,但它会删除 hive 表并重新创建它。

 masterFile.repartition(1).write.mode(SaveMode.Overwrite).partitionBy(<partitioncolumn>).orc(<HIVEtablePath>);

如果我使用追加模式而不是覆盖模式,它会在每个分区下创建重复文件。

  masterFile.repartition(1).write.mode(SaveMode.Append).partitionBy(<partitioncolumn>).orc(<HIVEtablePath>);

在这两种情况下,spark 作业都会运行两次,但在第二次执行时失败。

有没有什么方法可以在附加模式下使用 repartition/coalesce 而不在每个分区中复制部分文件?

【问题讨论】:

  • 您好,您的问题找到答案了吗?我也有同样的问题。

标签: hadoop apache-spark merge hive


【解决方案1】:
masterFile.repartition(1).write.mode(SaveMode.Overwrite).partitionBy(<partitioncolumn>).orc(<HIVEtablePath>)

.orc() 方法将数据写入文件,而不涉及元信息。所以它无法覆盖 HIVE 中的表。

如果您想覆盖 hive 表中的数据,请使用方法 .insertInto(hive_table_name),其中 hive_table_name 是 HIVE 中表的全名(schema + table_name)

根据你的例子

masterFile.repartition(1).write.mode(SaveMode.Overwrite).partitionBy(<partitioncolumn>).insertInto(hiveTableName)

也可以用元数据信息覆盖数据。带有覆盖修饰符的方法 .saveAsTable(hive_table_name) 也会覆盖 Metastore 中的数据。

masterFile.repartition(1).write.mode(SaveMode.Overwrite).partitionBy(<partitioncolumn>).saveAsTable(hiveTableName)

【讨论】:

    猜你喜欢
    • 2018-04-10
    • 2018-10-07
    • 2019-02-11
    • 1970-01-01
    • 2018-02-23
    • 2018-10-31
    • 1970-01-01
    • 2019-01-19
    • 2020-05-20
    相关资源
    最近更新 更多