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

时间:2016-08-29 09:12:52

标签: hive pyspark-sql

与下面的代码一样,将数据框插入到hive表中。 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")

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

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

在我的文章中,我建议用户使用第二个参数,因为它将为执行此工作生成一个新的阶段,而第一个参数则不会,因为最后一个阶段的任务较少,因此可能导致该工作失败。

答案 1 :(得分:-1)

那是因为 SparkSQL返回的数量与火花分区的数量相对应。即使启用了动态分区配置。

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

有关详细信息,请参阅Hive architecture