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?
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
.
Essayez simplement d'utiliser isNotNull function.
df.filter(df.dt_mvmt.isNotNull()).count()
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")
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'
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()