Apache spark Spark dataFrame.colaesce(1)或dataFrame.reapartition(1)似乎不起作用

Apache spark Spark dataFrame.colaesce(1)或dataFrame.reapartition(1)似乎不起作用,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我将配置单元插入到创建新配置单元分区的查询中。我有两个配置单元分区,分别名为server和date。现在,我使用以下代码执行insert into查询并尝试保存它 DataFrame dframe = hiveContext.sql("insert into summary1 partition(server='a1',date='2015-05-22') select from sourcetbl bla bla"); //above query creates orc

我将配置单元插入到创建新配置单元分区的查询中。我有两个配置单元分区,分别名为server和date。现在,我使用以下代码执行insert into查询并尝试保存它

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

无论我使用合并还是重新分区,上面的查询都会在/user/db/a1/20-05-22位置创建大约200个大约20mbs的小文件。使用配置单元时,出于性能原因,我只需要一个part0000文件。我在想,如果我调用
coalesce(1)
,那么它将创建最终的一部分文件,但似乎没有发生。我错了吗?

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

或者我就是这么理解的。你也可以在这里看到同样的问题:

但这并不重要,为什么设置为单个文件?如果只是为了您自己的系统,getmerge将为您一起编译它。

df.coalesce(1)
在spark 2.1.1中为我工作,所以任何看到此页面的人都不必像我一样担心

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

但是,你得到的是什么?正如我提到的,我得到的是200个小文件,而不是像预期的那样只有一个部分文件,因为coalesce(1)嗨,我的问题在这里解释了,其中提到多个小部分文件可能会过载namenode。我也尝试过同样的方法,但看起来coalesce不减少DataFrame200的部件文件并不会降低速度。甚至2000年也没有。你很好。假设我的spark作业每天运行,它会创建10000个文件,这些文件的大小很小,比如20 mb,这将在hadoop namenode上造成不必要的负载,并且在几周内namenode将耗尽元存储空间,如果我的spark作业每天创建这么多小文件,请帮助我了解namenode如何不会耗尽内存如果我的spark job每天创建10000个小文件,你能帮我创建一些链接吗?我是Hadoop的新手,有人告诉我,你的spark job每天创建10k个小文件,这对HDFS中的namenode来说是一种过度杀伤力