繁体   English   中英

如何在写入Hive Orc表时合并Spark中的小文件

[英]How to merge small files in spark while writing into hive orc table

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

 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)来合并到单个文件中,但是它删除了配置单元表并再次创建了它。

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

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

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

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

有什么方法可以在没有附加文件的每个分区中以追加模式使用重分区/合并?

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

.orc()方法将数据写为文件,而不触摸元信息。 因此,它无法覆盖HIVE中的表。

如果要覆盖配置单元表中的数据,请使用方法.insertInto(hive_table_name),其中,hive_table_name是HIVE中表的全名(模式+ table_name)

根据你的例子

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM