J'ai un dataframe et j'ai besoin de voir s'il contient des valeurs nulles. Il existe de nombreux articles sur le même sujet, mais presque tous utilisent l'action count
ou la méthode show
.
count
sont extrêmement coûteuses dans mon cas car le volume de données est important. Idem pour la méthode show
.
Est-il possible de demander à Spark de rechercher des valeurs nulles et de générer une erreur dès qu'il rencontre la première valeur nulle?
Les solutions dans d'autres articles donnent le nombre de valeurs manquantes dans chaque colonne. Je n'ai pas besoin de connaître le nombre de valeurs manquantes dans chaque colonne. Je veux juste savoir s'il y a une cellule dans le dataframe avec une valeur nulle.
3 Réponses :
Vous pouvez utiliser la limite
pour ce
df.select("*").where(col("c").isNull()).limit(1)
Si je comprends bien, votre exigence est de simplement lever le drapeau si l'une des colonnes a la valeur null. Vous n'avez pas besoin de savoir quelles sont toutes les lignes réelles qui ont une valeur nulle.
Solution: Le plus simple que je puisse penser est de créer un tempView de votre DataFrame et de cocher null sur tout le possible. Voici le pseudocode pour cela-
YourDF.createOrReplaceTempView("tempView") tempViewDF = sqlContext.sql("SELECT count(*) FROM tempView WHERE Col1 is null or Col2 is null or col3 is null") flag=flase if tempViewDF > 0: flag=true
Maintenant, utilisez le drapeau comme vous le souhaitez.
Cordialement, Anupam
Vous devez potentiellement parcourir toutes les valeurs et vérifier les valeurs nulles. Cela peut être fait en parcourant la trame de données de manière colonne ou ligne. La meilleure solution dépend des données (utilisez l'heuristique).
Traversée en ligne:
import pyspark.sql.functions as f contains_nulls = False for c in df.columns: if not df.where(f.col(c).isNull()).limit(1).collect().isEmpty: contains_nulls = True break
Traversée en colonne (empiriquement, cela devrait être plus rapide , voir le commentaire de Clock Slave): p>
import pyspark.sql.functions as f from functools import reduce df.where(reduce(lambda x, y: x | y, (f.col(x).isNull() for x in df.columns))).limit(1).collect().isEmpty
limit (1)
est utilisé pour s'arrêter lorsque la première valeur nulle est trouvée et collect (). isEmpty
pour vérifier si le dataframe est vide ou non.