火花中null和NaN之间的差异?怎么处理呢?

Iva*_*Lee 17 python null nan apache-spark pyspark

在我的DataFrame中,有些列分别包含null和NaN的值,例如:

df = spark.createDataFrame([(1, float('nan')), (None, 1.0)], ("a", "b"))
df.show()

+----+---+
|   a|  b|
+----+---+
|   1|NaN|
|null|1.0|
+----+---+
Run Code Online (Sandbox Code Playgroud)

那些之间有什么区别吗?他们怎么处理?

Sha*_*ica 26

null值表示"no value"或"nothing",它甚至不是空字符串或零.它可以用来表示没有任何有用的东西.

NaN代表"非数字",它通常是数学运算的结果,没有意义,例如0.0/0.0.

处理值的一种可能方法是使用以下方法删除它们:

df.na.drop()
Run Code Online (Sandbox Code Playgroud)

或者您可以将它们更改为实际值(此处我使用0):

df.na.fill(0)
Run Code Online (Sandbox Code Playgroud)

另一种方法是选择特定列为null的行以进行进一步处理:

df.where(col("a").isNull())
df.where(col("a").isNotNull())
Run Code Online (Sandbox Code Playgroud)

也可以使用等效方法选择具有NaN的行:

from pyspark.sql.functions import isnan
df.where(isnan(col("a")))
Run Code Online (Sandbox Code Playgroud)

  • 这是一个完美答案的例子,很好:) (3认同)
  • 但是当我计算 `1.0/0.0` 时,我得到的是 `null` 而不是 `NaN`。为什么? (3认同)
  • 我从@Shadio 得到了完整的答案。谢谢! (2认同)