web-dev-qa-db-fra.com

Filtrer la colonne de structure de données Pyspark avec la valeur None

J'essaie de filtrer une base de données PySpark contenant None comme valeur de ligne:

df.select('dt_mvmt').distinct().collect()

[Row(dt_mvmt=u'2016-03-27'),
 Row(dt_mvmt=u'2016-03-28'),
 Row(dt_mvmt=u'2016-03-29'),
 Row(dt_mvmt=None),
 Row(dt_mvmt=u'2016-03-30'),
 Row(dt_mvmt=u'2016-03-31')]

et je peux filtrer correctement avec une valeur de chaîne:

df[df.dt_mvmt == '2016-03-31']
# some results here

mais cela échoue:

df[df.dt_mvmt == None].count()
0
df[df.dt_mvmt != None].count()
0

Mais il y a bien des valeurs pour chaque catégorie. Que se passe-t-il?

70
Ivan

Vous pouvez utiliser Column.isNull/Column.isNotNull:

df.where(col("dt_mvmt").isNull())

df.where(col("dt_mvmt").isNotNull())

Si vous voulez simplement supprimer les valeurs NULL, vous pouvez utiliser na.drop avec l'argument subset:

df.na.drop(subset=["dt_mvmt"])

Les comparaisons basées sur l'égalité avec NULL ne fonctionneront pas car en SQL NULL n'est pas défini, toute tentative de comparaison avec une autre valeur retourne donc NULL:

sqlContext.sql("SELECT NULL = NULL").show()
## +-------------+
## |(NULL = NULL)|
## +-------------+
## |         null|
## +-------------+


sqlContext.sql("SELECT NULL != NULL").show()
## +-------------------+
## |(NOT (NULL = NULL))|
## +-------------------+
## |               null|
## +-------------------+

La seule méthode valide pour comparer les valeurs avec NULL est IS/IS NOT, qui sont équivalentes aux appels de méthode isNull/isNotNull.

139
zero323

Essayez simplement d'utiliser isNotNull function.

df.filter(df.dt_mvmt.isNotNull()).count()
24
Anthony

Pour obtenir des entrées dont les valeurs dans la colonne dt_mvmt ne sont pas nulles, nous avons

df.filter("dt_mvmt is not NULL")

et pour les entrées qui sont nulles nous avons

df.filter("dt_mvmt is NULL")
10
timctran

si colonne = aucune

COLUMN_OLD_VALUE
----------------
None
1
None
100
20
------------------

Utilisez create a tentable on data frame:

sqlContext.sql("select * from tempTable where column_old_value='None' ").show()

Donc utilisez: column_old_value='None'

1
user10238559

PySpark fournit diverses options de filtrage basées sur des conditions arithmétiques, logiques et autres. La présence de valeurs NULL peut entraver d'autres processus. Les supprimer ou les imputer statistiquement pourrait être un choix.

Les codes ci-dessous peuvent être considérés:

# Dataset is df
# Column name is dt_mvmt
# Before filtering make sure you have the right count of the dataset
df.count() # Some number

# Filter here
df = df.filter(df.dt_mvmt.isNotNull())

# Check the count to ensure there are NULL values present (This is important when dealing with large dataset)
df.count() # Count should be reduced if NULL values are present

Je voudrais aussi essayer:

df = df.dropna(subset=["dt_mvmt"])

Si vous souhaitez filtrer les enregistrements ayant une valeur None dans la colonne, reportez-vous à l'exemple ci-dessous:

df=spark.createDataFrame([[123,"abc"],[234,"fre"],[345,None]],["a","b"])

Filtrez maintenant les enregistrements NULL:

df=df.filter(df.b.isNotNull())

df.show()

Si vous souhaitez supprimer ces enregistrements de DF, voir ci-dessous:

df1=df.na.drop(subset=['b'])

df1.show()
0
yogesh