web-dev-qa-db-ger.com

Filtern Sie die Pyspark-Datenrahmenspalte mit dem Wert None

Ich versuche, einen PySpark-Datenrahmen mit None als Zeilenwert zu filtern:

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

und ich kann mit einem String-Wert richtig filtern:

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

aber das schlägt fehl:

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

Aber es gibt definitiv Werte für jede Kategorie. Was ist los?

70
Ivan

Sie können Column.isNull/Column.isNotNull:

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

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

Wenn Sie einfach NULL Werte löschen möchten, können Sie na.drop mit subset Argument:

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

Gleichheitsbasierte Vergleiche mit NULL funktionieren nicht, da in SQL NULL undefiniert ist. Jeder Vergleich mit einem anderen Wert gibt NULL zurück:

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


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

Die einzige gültige Methode zum Vergleichen von Werten mit NULL ist IS/IS NOT, die den Methodenaufrufen isNull/isNotNull entsprechen.

139
zero323

Versuchen Sie einfach, die Funktion isNotNull zu verwenden.

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

Um Einträge zu erhalten, deren Werte im dt_mvmt Spalte sind nicht null wir haben

df.filter("dt_mvmt is not NULL")

und für Einträge, die null sind, haben wir

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

if column = None

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

Erstellen Sie eine temporäre Tabelle für den Datenrahmen:

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

Also benutze: column_old_value='None'

1
user10238559

PySpark bietet verschiedene Filteroptionen basierend auf arithmetischen, logischen und anderen Bedingungen. Das Vorhandensein von NULL-Werten kann weitere Prozesse behindern. Sie zu entfernen oder statistisch zu unterstellen, könnte eine Wahl sein.

Die folgende Codemenge kann berücksichtigt werden:

# 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

Ich würde auch versuchen:

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

Wenn Sie Datensätze mit dem Wert None in der Spalte herausfiltern möchten, sehen Sie sich das folgende Beispiel an:

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

Filtern Sie nun Nullwertdatensätze heraus:

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

df.show()

Wenn Sie diese Datensätze aus DF entfernen möchten, siehe unten:

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

df1.show()
0
yogesh