1
votes

Vérifiez si dataframe contient des valeurs nulles

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 .

Les opérations

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.


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser la limite pour ce

df.select("*").where(col("c").isNull()).limit(1)


0 commentaires

0
votes

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


0 commentaires

2
votes

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.


0 commentaires