【问题标题】:How to merge small files saved on hive by sparksql?如何合并 sparksql 保存在 hive 上的小文件?
【发布时间】: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 个小文件平均有多大?

标签: hive pyspark-sql


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    更多详情请参阅Hive architecture

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 2017-06-24
      • 2020-06-07
      • 2018-06-09
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      相关资源
      最近更新 更多