Si encuentras algún fallo con tu código o proyecto, recuerda probar siempre en un ambiente de testing antes añadir el código al proyecto final.
Solución:
Filtrar null valores prueba:
foo_df = df.filter( (df.foo==1) & (df.bar.isNull()) )
https://spark.apache.org/docs/1.6.2/api/python/pyspark.sql.html#pyspark.sql.Column.isNull
porque no filtra
Porque es SQL y NULL
indica valores faltantes. Por eso cualquier comparación con NULL
aparte de IS NULL
y IS NOT NULL
es indefinido. Necesitas:
col("bar").isNull() | (col("bar") != 1)
o
coalesce(col("bar") != 1, lit(True))
o (PySpark >= 2.3):
col("bar").eqNullSafe(1)
si tu quieres null comparaciones seguras en PySpark.
También 'null'
no es una forma válida de presentar NULL
literal. Deberías usar None
para indicar objetos perdidos.
from pyspark.sql.functions import col, coalesce, lit
df = spark.createDataFrame([
('a', 1, 1), ('a',1, None), ('b', 1, 1),
('c' ,1, None), ('d', None, 1),('e', 1, 1)
]).toDF('id', 'foo', 'bar')
df.where((col("foo") == 1) & (col("bar").isNull() | (col("bar") != 1))).show()
## +---+---+----+
## | id|foo| bar|
## +---+---+----+
## | a| 1|null|
## | c| 1|null|
## +---+---+----+
df.where((col("foo") == 1) & coalesce(col("bar") != 1, lit(True))).show()
## +---+---+----+
## | id|foo| bar|
## +---+---+----+
## | a| 1|null|
## | c| 1|null|
## +---+---+----+
Si sostienes alguna perplejidad o disposición de aclarar nuestro reseña eres capaz de realizar una apostilla y con gusto lo ojearemos.