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:
numeric_filtered = numeric.filter(numeric[''LOW''] != ''null'').filter(numeric[''HIGH''] != ''null'').filter(numeric[''NORMAL''] != ''null'')
numeric_filtered = numeric.filter(numeric[''LOW''] != ''null'' AND numeric[''HIGH''] != ''null'' AND numeric[''NORMAL''] != ''null'')
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