Apache spark 从列表创建空数据帧比从emptyRDD()创建空数据帧慢x4倍

Apache spark 从列表创建空数据帧比从emptyRDD()创建空数据帧慢x4倍,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我们希望在代码中的某个点创建一个空数据帧。我们发现了这个奇怪的问题 从空列表创建时,这会降低程序的速度,并导致程序中以后的每个spark操作(例如df.write())的速度降低4倍: spark.createDataFrame([],模式) 经过大量调试,我发现以下方法可以解决此问题: spark.createDataFrame(spark.sparkContext.emptyRDD(),schema) 试图查看Spark源代码,但无法得出任何结论。 另外,df.explain()在程序中

我们希望在代码中的某个点创建一个空数据帧。我们发现了这个奇怪的问题


从空列表创建时,这会降低程序的速度,并导致程序中以后的每个spark操作(例如df.write())的速度降低4倍:

spark.createDataFrame([],模式)

经过大量调试,我发现以下方法可以解决此问题:

spark.createDataFrame(spark.sparkContext.emptyRDD(),schema)


试图查看Spark源代码,但无法得出任何结论。 另外,df.explain()在程序中对数据帧进行了修改,但计划是相同的。 我唯一的想法是,第一个选项会导致与工作节点的一些额外通信


有人知道为什么第一个选项比第二个慢得多吗?

spark.sparkContext.emptyRDD()创建一个具有零分区的RDD,而
spark.createDataFrame([],schema)
创建一个至少具有一个分区的数据帧。
开销是由空分区上的任务造成的。

spark.sparkContext.emptyRDD()创建了一个没有分区的RDD,而
spark.createDataFrame([],schema)
创建了一个至少有一个分区的数据帧。
开销是由空分区上的任务造成的。

为什么要收集?不wise@thebluephantom我的意思是,每一个导致收集的动作(写入/显示等)都要慢得多。很抱歉造成混淆,我将编辑问题“为什么收集?”?不wise@thebluephantom我的意思是,每一个导致收集的动作(写入/显示等)都要慢得多。很抱歉造成混淆,我将编辑此问题