web-dev-qa-db-fra.com

Différences entre null et NaN en étincelle? Comment y faire face?

Dans mon DataFrame, il y a des colonnes incluant les valeurs null et NaN respectivement, telles que: 

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

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

Y a-t-il une différence entre ceux-ci? Comment peuvent-ils être traités?

10
Ivan Lee

null values ​​représente "aucune valeur" ou "rien", ce n'est même pas une chaîne vide ou zéro. Il peut être utilisé pour représenter que rien d’utile n’existe.

NaN signifie "Pas un nombre", c’est généralement le résultat d’une opération mathématique qui n’a pas de sens, par exemple. 0.0/0.0.

Une façon possible de gérer null values ​​est de les supprimer avec:

df.na.drop()

Ou vous pouvez les remplacer par une valeur réelle (ici, j'ai utilisé 0) avec:

df.na.fill(0)

Une autre méthode consiste à sélectionner les lignes où une colonne spécifique est null pour un traitement ultérieur:

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

Les lignes avec NaN peuvent également être sélectionnées en utilisant la méthode équivalente:

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

Vous pouvez différencier vos valeurs NaN en utilisant la fonction isnan, comme dans cet exemple

>>> 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)]

La différence est dans le type de l'objet qui génère la valeur. NaN (pas un nombre) est un moyen traditionnel de traiter la "valeur Aucun pour un nombre", vous pouvez penser que vous avez tous les chiffres (-1-2 ... 0,1,2 ...) et il faut avoir une valeur supplémentaire, pour les cas d’erreurs (exemple, 1/0), je veux que 1/0 me donne un nombre, mais quel nombre? Bien, comme il existe un nombre pour 1/0, ils créent une nouvelle valeur appelée NaN, qui est également du type Number.

None est utilisé pour le vide, l'absence d'un élément, est encore plus abstrait, car à l'intérieur du type de numéro, vous avez, outre la valeur de NaN, la valeur None. La valeur None est présente dans tous les ensembles de valeurs de tous les types

2
Damian Lattenero