如何合并 sparksql 保存在 hive 上的小文件?

Posted

技术标签:

【中文标题】如何合并 sparksql 保存在 hive 上的小文件?【英文标题】:How to merge small files saved on hive by sparksql? 【发布时间】:2016-08-29 09:12:52 【问题描述】:

像下面的代码一样,将数据框插入配置单元表中。 hive的输出hdfs文件小文件太多。保存在蜂巢上时如何合并它们? myDf.write.format("orc").partitionBy("datestr").insertInto("myHiveTable")

当有 100 个任务时,它会产生 100 个小文件。

在数据框上使用coalesce 是个好主意吗? myDf.coalesce(3).write.format("orc").partitionBy("datestr").insertInto("myHiveTable")

为什么 hive 配置如下不起作用? sqlContext.sql("set hive.merge.mapfiles=true") sqlContext.sql("set hive.merge.sparkfiles=false") sqlContext.sql("set hive.merge.smallfiles.avgsize=16000000") sqlContext.sql("set hive.merge.size.per.task=256000000")

非常感谢您的帮助。

【问题讨论】:

创建的 100 个小文件平均有多大? 【参考方案1】:

遇到这个问题,找到issue-24940

在 spark sql 查询中使用/*+ COALESCE(numPartitions) *//*+ REPARTITION(numPartitions) */ 将控制输出文件编号。

在我的文章中,我向用户推荐第二个参数,因为它会生成一个新的阶段来完成这项工作,而第一个参数不会,因为最后一个阶段的任务较少,这可能会导致工作死亡。

【讨论】:

【参考方案2】:

这是因为 SparkSQL 返回与 spark 分区数相对应的文件数。即使动态分区配置已打开。

我遇到了同样的问题。在我看来,上述配置仅适用于 MapReduce 引擎上的 Hive:在我的情况下,HiveQL 命令运行良好(正在合并小文件)。

更多详情请参阅Hive architecture。

【讨论】:

以上是关于如何合并 sparksql 保存在 hive 上的小文件?的主要内容,如果未能解决你的问题,请参考以下文章

sparkSQL来完成对Hive的操作

SparkSQL-数据的加载和保存

SparkSQL基础

Spark学习之路 (二十)SparkSQL的元数据[转]

Spark学习之路 (二十)SparkSQL的元数据

Hive/SparkSQL:如何将 Unix 时间戳转换为时间戳(不是字符串)?