与下面的代码一样,将数据框插入到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")
非常感谢您的帮助。
答案 0 :(得分:0)
我遇到了这个问题,找到了issue-24940
在spark sql查询中使用/*+ COALESCE(numPartitions) */
或/*+ REPARTITION(numPartitions) */
将控制输出文件的编号。
在我的文章中,我建议用户使用第二个参数,因为它将为执行此工作生成一个新的阶段,而第一个参数则不会,因为最后一个阶段的任务较少,因此可能导致该工作失败。
答案 1 :(得分:-1)
那是因为 SparkSQL返回的数量与火花分区的数量相对应。即使启用了动态分区配置。
我遇到了同样的问题。在我看来,上面提到的配置仅适用于MapReduce引擎上的Hive:在我的例子中,HiveQL命令运行良好(小文件正在合并)。
有关详细信息,请参阅Hive architecture。