topandas sqlcontext spark examples example drop createdataframe python sql apache-spark apache-spark-sql pyspark

python - sqlcontext - spark sql



Filtrado Sparksql(seleccionando con cláusula where) con múltiples condiciones (1)

Estás usando la conjunción lógica (Y). Significa que todas las columnas tienen que ser diferentes de ''null'' para que se incluya la fila. Permite ilustrar que usando la versión de filter como ejemplo:

numeric = sqlContext.createDataFrame([ (''3.5,'', ''5.0'', ''null''), (''2.0'', ''14.0'', ''null''), (''null'', ''38.0'', ''null''), (''null'', ''null'', ''null''), (''1.0'', ''null'', ''4.0'')], (''low'', ''high'', ''normal'')) numeric_filtered_1 = numeric.where(numeric[''LOW''] != ''null'') numeric_filtered_1.show() ## +----+----+------+ ## | low|high|normal| ## +----+----+------+ ## |3.5,| 5.0| null| ## | 2.0|14.0| null| ## | 1.0|null| 4.0| ## +----+----+------+ numeric_filtered_2 = numeric_filtered_1.where( numeric_filtered_1[''NORMAL''] != ''null'') numeric_filtered_2.show() ## +---+----+------+ ## |low|high|normal| ## +---+----+------+ ## |1.0|null| 4.0| ## +---+----+------+ numeric_filtered_3 = numeric_filtered_2.where( numeric_filtered_2[''HIGH''] != ''null'') numeric_filtered_3.show() ## +---+----+------+ ## |low|high|normal| ## +---+----+------+ ## +---+----+------+

Todos los métodos restantes que has probado siguen exactamente el mismo esquema. Lo que necesitas aquí es una disyunción lógica (OR).

from pyspark.sql.functions import col numeric_filtered = df.where( (col(''LOW'') != ''null'') | (col(''NORMAL'') != ''null'') | (col(''HIGH'') != ''null'')) numeric_filtered.show() ## +----+----+------+ ## | low|high|normal| ## +----+----+------+ ## |3.5,| 5.0| null| ## | 2.0|14.0| null| ## |null|38.0| null| ## | 1.0|null| 4.0| ## +----+----+------+

o con SQL sin formato:

numeric.registerTempTable("numeric") sqlContext.sql("""SELECT * FROM numeric WHERE low != ''null'' OR normal != ''null'' OR high != ''null''""" ).show() ## +----+----+------+ ## | low|high|normal| ## +----+----+------+ ## |3.5,| 5.0| null| ## | 2.0|14.0| null| ## |null|38.0| null| ## | 1.0|null| 4.0| ## +----+----+------+

Ver también: Pyspark: múltiples condiciones en cuándo cláusula

Hola, tengo el siguiente problema:

numeric.registerTempTable("numeric").

Todos los valores que deseo filtrar son cadenas nulas literales y no valores N / A o nulos.

Intenté estas tres opciones:

  1. numeric_filtered = numeric.filter(numeric[''LOW''] != ''null'').filter(numeric[''HIGH''] != ''null'').filter(numeric[''NORMAL''] != ''null'')

  2. numeric_filtered = numeric.filter(numeric[''LOW''] != ''null'' AND numeric[''HIGH''] != ''null'' AND numeric[''NORMAL''] != ''null'')

  3. sqlContext.sql("SELECT * from numeric WHERE LOW != ''null'' AND HIGH != ''null'' AND NORMAL != ''null''")

Desafortunadamente, numeric_filtered siempre está vacío. Revisé y el número tiene datos que se deben filtrar en función de estas condiciones.

Aquí hay algunos valores de muestra:

Bajo Alto Normal

3.5 5.0 nulo

2.0 14.0 nulo

nulo 38.0 nulo

null null null

1.0 nulo 4.0