Filtra la colonna del dataframe Pyspark con il valore Nessuno


98

Sto cercando di filtrare un dataframe PySpark che ha Nonecome valore di riga:

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

e posso filtrare correttamente con un valore stringa:

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

ma questo fallisce:

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

Ma ci sono sicuramente dei valori in ogni categoria. Cosa sta succedendo?


In realtà si desidera filtrare le righe con valori null, non una colonna con valori None. Il titolo potrebbe essere fuorviante.
Atorpat

In poche parole, un confronto che coinvolge null (o None, in questo caso) restituisce sempre false. In particolare, il confronto (null == null) restituisce false. Inoltre, il confronto (Nessuno == Nessuno) restituisce false.
Richard Gomes,

Risposte:


202

Puoi usare Column.isNull/ Column.isNotNull:

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

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

Se vuoi semplicemente rilasciare NULLvalori che puoi usare na.dropcon subsetargomento:

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

I confronti basati sull'uguaglianza con NULLnon funzioneranno perché in SQL NULLnon è definito quindi qualsiasi tentativo di confrontarlo con un altro valore restituisce NULL:

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


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

L'unico metodo valido per confrontare il valore con NULLè IS/ IS NOTche è equivalente alle chiamate al metodo isNull/ isNotNull.


2
Fantastico, grazie. Ho pensato che questi filtri sui dataframe di PySpark sarebbero stati più "pitonici", ma purtroppo non lo sono. Sto pensando di chiedere informazioni agli sviluppatori.
Ivan

1
In realtà è piuttosto pitonico. Non dovresti mai controllare __eq__con Nessuno;) E isnon funzionerebbe perché non si comporta allo stesso modo.
zero323

2
Stranamente questo funziona solo per le colonne di stringhe ... Sembra che le df.filter("dt_mvmt is not NULL")gestisca entrambe.
David Arenburg


14

Per ottenere voci i cui valori nella dt_mvmtcolonna non sono nulli abbiamo

df.filter("dt_mvmt is not NULL")

e per le voci che sono nulle abbiamo

df.filter("dt_mvmt is NULL")

2

Se vuoi mantenere la sintassi di Pandas, questo ha funzionato per me.

df = df[df.dt_mvmt.isNotNull()]

1

se colonna = Nessuno

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

Usa crea un temptable su data frame:

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

Quindi usa: column_old_value='None'


1

Esistono diversi modi per rimuovere / filtrare i valori null da una colonna in DataFrame.

Consente di creare un semplice DataFrame con il codice seguente:

date = ['2016-03-27','2016-03-28','2016-03-29', None, '2016-03-30','2016-03-31']
df = spark.createDataFrame(date, StringType())

Ora puoi provare uno dei seguenti approcci per filtrare i valori nulli.

# Approach - 1
df.filter("value is not null").show()

# Approach - 2
df.filter(col("value").isNotNull()).show()

# Approach - 3
df.filter(df["value"].isNotNull()).show()

# Approach - 4
df.filter(df.value.isNotNull()).show()

# Approach - 5
df.na.drop(subset=["value"]).show()

# Approach - 6
df.dropna(subset=["value"]).show()

# Note: You can also use where function instead of a filter.

Puoi anche controllare la sezione "Lavorare con valori NULL" sul mio blog per ulteriori informazioni.

Spero possa essere d'aiuto.


0

PySpark fornisce varie opzioni di filtraggio basate su condizioni aritmetiche, logiche e di altro tipo. La presenza di valori NULL può ostacolare ulteriori processi. Rimuoverli o imputarli statisticamente potrebbe essere una scelta.

Il set di codice seguente può essere considerato:

# 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


0

Se si desidera filtrare i record con il valore Nessuno nella colonna, vedere l'esempio di seguito:

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

Ora filtra i record di valore nullo:

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

df.show()

Se desideri rimuovere quei record da DF, vedi sotto:

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

df1.show()

0

Nessuno / Null è un tipo di dati della classe NoneType in pyspark / python quindi, di seguito non funzionerà poiché stai cercando di confrontare l'oggetto NoneType con l'oggetto stringa

Modo sbagliato di filtrare

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

corretta

df = df.where (col ("dt_mvmt"). isNotNull ()) restituisce tutti i record con dt_mvmt come Nessuno / Null

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.