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

yzuktlbb  于 2021-06-28  发布在  Hive
关注(0)|答案(2)|浏览(514)

像下面的代码一样,在配置单元表中插入一个Dataframe。配置单元的输出hdfs文件有太多的小文件。在配置单元上保存时如何合并它们? myDf.write.format("orc").partitionBy("datestr").insertInto("myHiveTable") 当有100个任务时,它将生成100个小文件。
正在使用 coalesce 在Dataframe上是个好主意? 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") 非常感谢你的帮助。

9rygscc1

9rygscc11#

这是因为sparksql返回与spark分区数对应的文件数。即使启用了动态分区配置。
我也面临同样的问题。在我看来,上面提到的配置只适用于mapreduce引擎上的hive:在我的例子中,hiveql命令工作得很好(正在合并小文件)。
有关详细信息,请参见Hive体系结构。

mum43rcc

mum43rcc2#

我遇到了这个问题,找到了问题-24940
使用 /*+ COALESCE(numPartitions) */ 或者 /*+ REPARTITION(numPartitions) */ 在sparksql中,query将控制输出文件号。
在我的文章中,我向用户推荐第二个parm,因为它将生成一个新的阶段来完成这项工作,而第一个parm不会,这可能会导致工作死亡,因为最后一个阶段的任务较少。

相关问题