Почему мой столбец существует в моем фрейме данных pyspark после его удаления? - PullRequest
1 голос
/ 08 мая 2020

Я использую 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_ C путем фильтрации по df_B, я ожидаю, что будет выдана ошибка, поскольку «colA» было отброшено. Но этот код отлично работает, когда я его запускаю. Ожидается ли это или я что-то упускаю?

1 Ответ

1 голос
/ 10 мая 2020

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]

В приведенном выше плане объяснения проецирование отброшенного столбца происходит после фильтра.

...