Pyspark程序.....
df [df ["timeDiff"] <= 30]
or
df.filter(df["timeDiff"] <= 30)
两个代码都给出相同的结果。但是有人可以解释一下在Spark分布式环境中哪种方法会更有效。或参阅一些文件。我尝试在stackoverflow上搜索,但没有成功。...
答案 0 :(得分:3)
就生成的执行计划而言,两者完全相同,因此您可以使用任何您喜欢的方式-不会有任何性能差异。
但是,后一种是惯用的方法,大多数示例,教程和项目都将使用这种方法。而且它与Scala API几乎相同。因此,通常最好减少开发工作。
答案 1 :(得分:2)
加起来为@ user10954945,这是这两者的执行计划:
import pyspark
sc = pyspark.SparkContext.getOrCreate()
spark = pyspark.sql.SparkSession(sc)
df = spark.createDataFrame(((1,), (2,)), ['timeDiff'])
filtered_1 = df[df["timeDiff"] <= 30]
filtered_2 = df.filter(df["timeDiff"] <= 30)
filtered_1.explain()
== Physical Plan ==
*(1) Filter (isnotnull(timeDiff#6L) && (timeDiff#6L <= 30))
+- Scan ExistingRDD[timeDiff#6L]
filtered_2.explain()
== Physical Plan ==
*(1) Filter (isnotnull(timeDiff#6L) && (timeDiff#6L <= 30))
+- Scan ExistingRDD[timeDiff#6L]
实际上,使用SQL API可以获得相同的结果:
df.createOrReplaceTempView('df')
filtered_3 = spark.sql("SELECT * FROM df WHERE timeDiff <= 30")
filtered_3.explain()
== Physical Plan ==
*(1) Filter (isnotnull(timeDiff#6L) && (timeDiff#6L <= 30))
+- Scan ExistingRDD[timeDiff#6L]