【问题标题】:None/== vs Null/isNull in Pyspark?Pyspark 中的 None/== vs Null/isNull?
【发布时间】:2020-11-08 08:26:04
【问题描述】:

有什么区别:

F.when(F.col('Name').isNull())

和:

F.when(F.col('Name') == None)

它们的工作方式似乎不同。在检查列中的空值时,第一个似乎效果更好。有时第二种方法不适用于检查空名称。例如,如果我想检查空值并将为空的名称替换为“缺少名称”或其他内容,则第二种方法有时不会做任何事情。我不确定为什么它有时有效,而其他时候无效。但是第一种方法总是有效的。

【问题讨论】:

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


【解决方案1】:
F.when(F.col('Name') == None)

None 是 python 中的对象,NoneType。它与空字符串或 0 不同。对于这种情况,您可能希望使用

F.when(F.col('Name') is None)

使用==,您正在检查F.col('Name') 的值是否等于None 对象,这将把事情搞砸。

【讨论】:

  • OP 询问“isNull”与“== None”。虽然“没有”首选,但这是次要的,应该没有相关影响..可能是原始问题的错误复制?
  • 我试图用一个例子来解释 OP 的原始问题。请看一看。希望这个解释能帮助人们理解 isNull 和 == None 的区别
【解决方案2】:

参考这里:Filter Pyspark dataframe column with None value

基于等式的 NULL 比较将不起作用,因为在 SQL 中 NULL 是未定义的,因此任何将其与另一个值进行比较的尝试都会返回 NULL

【讨论】:

  • 来自 LINQ 背景,感觉就像是映射到 SQL 的历史(烦恼)限制......哦,好吧。作为参考,LINQ 通常将“== null”(代码)转换为“is NULL”,将每一层的规则分开。这是特定于 Spark 的,还是 Python 数据库 API 如何定义操作?也就是说,答案(在 Python 中)能否更一致地概括?
【解决方案3】:

在数据世界中,两个 Null 值(或者两个 None)并不相同。

因此,如果您使用两个None 值执行==!= 操作,它总是会导致False。这就是为 isNull()isNotNull() 函数构建的关键原因。

请看下面的例子以更好地理解 -

创建一个有效记录很少的dataframe 和一个None 记录

from pyspark.sql.types import *
from pyspark.sql import Row
from pyspark.sql.functions import col

lst = [(1,'sometext'),(2,''),(3, None),(4, 'someothertext')]

myrdd = sc.parallelize(lst).map(lambda x: Row(id=x[0], txt=x[1]))
mydf= sqlContext.createDataFrame(myrdd)

isNull() 为第 3 行返回 True,因此下面的语句返回一行 -

mydf.filter(col("txt").isNull()).show(truncate=False)
+---+----+
|id |txt |
+---+----+
|3  |null|
+---+----+

== 运算符为第 3 行返回 False,因此不会过滤掉任何记录。

mydf.filter(col("txt") == None).show(truncate=False)
+---+---+
|id |txt|
+---+---+
+---+---+

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 2011-11-17
    • 2017-05-22
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多