web-dev-qa-db-de.com

Unterschiede zwischen null und NaN in funken? Wie man damit umgeht?

In meinem DataFrame gibt es Spalten mit Werten für null und NaN, wie zum Beispiel: 

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

+----+---+
|   a|  b|
+----+---+
|   1|NaN|
|null|1.0|
+----+---+

Gibt es da einen Unterschied? Wie können sie behandelt werden?

10
Ivan Lee

null values ​​steht für "kein Wert" oder "nichts", es ist nicht einmal eine leere Zeichenfolge oder Null. Es kann verwendet werden, um anzuzeigen, dass nichts Nützliches existiert.

NaN steht für "Not a Number" und ist normalerweise das Ergebnis einer mathematischen Operation, die keinen Sinn macht, z. 0.0/0.0.

Eine Möglichkeit, mit null Werten umzugehen, ist das Entfernen dieser Werte mit:

df.na.drop()

Oder Sie können sie in einen tatsächlichen Wert ändern (hier habe ich 0 verwendet) mit:

df.na.fill(0)

Eine andere Möglichkeit wäre, die Zeilen auszuwählen, in denen eine bestimmte Spalte null für die weitere Verarbeitung ist:

df.where(col("a").isNull())
df.where(col("a").isNotNull())

Zeilen mit NaN können auch mit der gleichwertigen Methode ausgewählt werden:

from pyspark.sql.functions import isnan
df.where(isnan(col("a")))
16
Shaido

Sie können Ihre NaN-Werte mit der Funktion isnan wie in diesem Beispiel unterscheiden

>>> df = spark.createDataFrame([(1.0, float('nan')), (float('nan'), 2.0)], ("a", "b"))
>>> df.select(isnan("a").alias("r1"), isnan(df.a).alias("r2")).collect()
[Row(r1=False, r2=False), Row(r1=True, r2=True)]

Die Differenz liegt im Typ des Objekts, das den Wert generiert. NaN (keine Zahl) ist eine altmodische Methode, um mit dem Wert "Keine Werte für eine Zahl" umzugehen. Sie können denken, dass Sie alle Zahlen (-1-2 ... 0,1,2 ...) und haben gibt es die Notwendigkeit, einen zusätzlichen Wert zu haben, für Fehlerfälle (Beispiel 1/0), möchte ich, dass 1/0 mir eine Nummer gibt, aber welche Nummer? Nun, da es eine Zahl für 1/0 gibt, wird ein neuer Wert namens NaN erstellt, der ebenfalls vom Typ Nummer ist.

None wird für die Stornierung verwendet, die Abwesenheit eines Elements ist noch abstrakter, da innerhalb des Zahlentyps neben dem NaN-Wert der None-Wert vorhanden ist. Der Wert None ist in allen Wertesätzen aller Typen vorhanden

2