在Spark上过滤数据框的有效方法?

时间:2019-01-23 09:22:36

标签: apache-spark pyspark apache-spark-sql

Pyspark程序.....

df [df ["timeDiff"] <= 30]
        or
df.filter(df["timeDiff"] <= 30)

两个代码都给出相同的结果。但是有人可以解释一下在Spark分布式环境中哪种方法会更有效。或参阅一些文件。我尝试在stackoverflow上搜索,但没有成功。...

2 个答案:

答案 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]