因此我在PySpark DataFrame中有一列(我们将其称为X
)应该是double
,但实际上是string
。它包含["0.4", "0.0", "0.8", ...]
之类的值。
整个数据框有24,968,894行。
当我使用以下方法进行过滤时:
df.where('X > 0.0')
我得到8,350,764行
但是当我跑步时:
import pyspark.sql.functions as f
df.where(f.col('X') > 0.0)
我得到19,486,678行
我已经在这两个过滤后的数据帧之间进行了反联接,以尝试了解第一种方法中删除的行的特殊之处,但没有发现任何异常。
有人可以帮助我了解这两种方法之间的区别吗?
还要清楚一点,我实际上并不想做这种事情-我最初并没有意识到此列是一个字符串。我只是想了解为什么以这种方式使用时这两种类型的过滤是不同的。
答案 0 :(得分:1)
Spark正在将列X
转换为SQL语法的decimal(1,1)
,而将X
转换为double
语法*的f.col('X') > 0.0
。
df.where('X > 0.0').explain()
#== Physical Plan ==
#*Filter (isnotnull(X#202) && (cast(X#202 as decimal(1,1)) > 0.0))
#+- Scan ExistingRDD[X#202]
df.where(f.col("X") > 0.0).explain()
#== Physical Plan ==
#*Filter (isnotnull(X#202) && (cast(X#202 as double) > 0.0))
#+- Scan ExistingRDD[X#202]
*通常这可能并不正确,但这就是在这种情况下发生的情况。查看执行计划是调试这些类型问题的方法。