为什么我的列在我的pyspark数据框中被删除后仍然存在?

为什么我的列在我的pyspark数据框中被删除后仍然存在?,pyspark,databricks,Pyspark,Databricks,我使用的是pyspark 2.4.5版和Databricks runtime 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 ) 当我通过对dfu B进行过滤来分配dfu C时,我希望会抛出一个错误,因为“col

我使用的是pyspark 2.4.5版和Databricks runtime 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
)

当我通过对dfu B进行过滤来分配dfu C时,我希望会抛出一个错误,因为“colA”已被删除。但是当我运行它时,这段代码运行得很好。这是预期的还是我遗漏了什么?

Spark构建了一个有意义的解释计划,并在
过滤器之后应用
下拉列表。你可以从解释计划中看出这一点

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]
在上面的解释计划中,删除列的投影发生在过滤器之后