我正在使用pyspark版本2.4.5和Databricks运行时6.5,并且遇到了意外的行为。我的代码如下:
import pyspark.sql.functions as F
df_A = spark.table(...)
df_B = df_A.drop(
F.col("colA")
)
df_C = df_B.filter(
F.col("colA") > 0
)
当我通过对df_B进行过滤来分配df_C时,我预计会因为“ colA”已被丢弃而引发错误。但是当我运行它时,此代码可以正常工作。这是预期的还是我缺少了什么?
Spark构造了一个有意义的解释计划,并在drop
之后应用filter
。您可以从说明计划中看到这一点,例如
spark.createDataFrame([('foo','bar')]).drop(col('_2')).filter(col('_2') == 'bar').explain()
给出:
== Physical Plan ==
*(1) Project [_1#0]
+- *(1) Filter (isnotnull(_2#1) && (_2#1 = bar))
+- Scan ExistingRDD[_1#0,_2#1]
在上述说明计划中,删除列的投影发生在过滤器之后。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句