tutorial spark example espaƱol python apache-spark dataframe pyspark apache-spark-sql

python - example - spark 2.3 6



Filtrar la columna del marco de datos Pyspark con el valor Ninguno (7)

Estoy tratando de filtrar un marco de datos PySpark que tiene None como valor de fila:

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

y puedo filtrar correctamente con un valor de cadena:

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

pero esto falla:

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

Pero definitivamente hay valores en cada categoría. ¿Que esta pasando?


Intenta usar la función isNotNull .

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


Para obtener entradas cuyos valores en la columna dt_mvmt no son nulos, tenemos

df.filter("dt_mvmt is not NULL")

y para entradas que son nulas tenemos

df.filter("dt_mvmt is NULL")


Puede usar Column.isNull / Column.isNotNull :

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

Si desea simplemente soltar valores NULL , puede usar na.drop con argumento de subset :

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

Las comparaciones basadas en la igualdad con NULL no funcionarán porque en SQL NULL no está definido, por lo que cualquier intento de compararlo con otro valor devuelve NULL :

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

El único método válido para comparar el valor con NULL es IS / IS NOT que son equivalentes a las llamadas al método isNull / isNotNull .


PySpark proporciona varias opciones de filtrado basadas en condiciones aritméticas, lógicas y de otro tipo. La presencia de valores NULL puede dificultar otros procesos. Eliminarlos o imputarlos estadísticamente podría ser una opción.

A continuación se puede considerar el conjunto de códigos:

# 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


Si desea filtrar los registros que tienen el valor Ninguno en la columna, consulte el siguiente ejemplo:

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

Ahora filtre los registros de valores nulos:

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

Si desea eliminar esos registros de DF, consulte a continuación:

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


También intentaría:

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


si columna = Ninguno

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

Utilice crear un marco de datos tentable en:

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

Entonces use: column_old_value=''None''