Spark dataFrame.colaesce(1)或dataFrame.reapartition(1)似乎对我不起作用

时间:2015-07-10 17:14:49

标签: apache-spark apache-spark-sql

您好Hive插入查询,创建新的Hive分区。我有两个名为server和date的Hive分区。现在我使用以下代码执行insert到查询并尝试保存它

DataFrame dframe = hiveContext.sql("insert into summary1 partition(server='a1',date='2015-05-22') select from sourcetbl bla bla"); 
//above query creates orc file at /user/db/a1/20-05-22 
//I want only one part-00000 file at the end of above query so I tried the following and none worked 
drame.coalesce(1).write().format("orc").mode(SaveMode.OverWrite).saveAsTable("summary1"); OR

drame.repartition(1).write().format("orc").mode(SaveMode.OverWrite).saveAsTable("summary1"); OR

drame.coalesce(1).write().format("orc").save("/user/db/a1/20-05-22",SaveMode.OverWrite); OR

drame.repartition(1).write().format("orc").save("/user/db/a1/20-05-22",SaveMode.OverWrite); OR

无论我使用coalesce还是重新定位,查询都会在/ user / db / a1 / 20-05-22位置创建大约200个大约20个MB的小文件。在使用Hive时,出于性能原因,我只想要一个part0000文件。我在想如果我打电话给coalesce(1)然后它会创建最后一个部分文件,但它似乎没有发生。我错了吗?请指导。提前谢谢。

2 个答案:

答案 0 :(得分:0)

重新分区管理在执行Spark作业时分割文件的数量,但实际保存的文件由Hadoop集群管理。

或者这就是我理解它的方式。您也可以在此处看到相同的问题:http://mail-archives.us.apache.org/mod_mbox/spark-user/201501.mbox/%3CCA+2Pv=hF5SGC-SWTwTMh6zK2JeoHF1OHPb=WG94vp2GW-vL5SQ@mail.gmail.com%3E

这应该永远不会重要,为什么你设置在一个文件? getmerge将为您编译它,如果它只适用于您自己的系统。

答案 1 :(得分:0)

df.coalesce(1)在火花2.1.1中为我工作,所以任何人看到这个页面,都不必像我一样担心。

df.coalesce(1).write.format("parquet").save("a.parquet")