像下面的代码一样,在配置单元表中插入一个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")
非常感谢你的帮助。
2条答案
按热度按时间9rygscc11#
这是因为sparksql返回与spark分区数对应的文件数。即使启用了动态分区配置。
我也面临同样的问题。在我看来,上面提到的配置只适用于mapreduce引擎上的hive:在我的例子中,hiveql命令工作得很好(正在合并小文件)。
有关详细信息,请参见Hive体系结构。
mum43rcc2#
我遇到了这个问题,找到了问题-24940
使用
/*+ COALESCE(numPartitions) */
或者/*+ REPARTITION(numPartitions) */
在sparksql中,query将控制输出文件号。在我的文章中,我向用户推荐第二个parm,因为它将生成一个新的阶段来完成这项工作,而第一个parm不会,这可能会导致工作死亡,因为最后一个阶段的任务较少。