Filtro de múltiples condiciones en el dataframe

¿Puede alguien explicarme por qué estoy obteniendo resultados diferentes para estas 2 expresiones? Estoy tratando de filtrar entre 2 fechas:

df.filter("act_date ='2016-10-01'")\ .select("col1","col2").distinct().count() 

Resultado: 37M

vs

 df.filter("act_date ='2016-10-01'")\ .select("col1","col2").distinct().count() 

Resultado: 25M

En qué se diferencian ? Me parece que deberían producir el mismo resultado.

TL; DR Para pasar varias condiciones para filter o utilizar objetos de Column y operadores lógicos ( & , | , ~ ). Ver Pyspark: múltiples condiciones en la cláusula when .

 df.filter((col("act_date") >= "2016-10-01") & (col("act_date") <= "2017-04-01")) 

También puedes usar una sola cadena SQL:

 df.filter("act_date >='2016-10-01' AND act_date <='2017-04-01'") 

En la práctica tiene más sentido utilizar entre:

 df.filter(col("act_date").between("2016-10-01", "2017-04-01")) df.filter("act_date BETWEEN '2016-10-01' AND '2017-04-01'") 

El primer enfoque ni siquiera es válido a distancia. En Python, and devuelve:

  • El último elemento si todas las expresiones son "sinceras".
  • El primer elemento "falsey" de lo contrario.

Como resultado

 "act_date <='2017-04-01'" and "act_date >='2016-10-01'" 

se evalúa a (cualquier cadena no vacía es veraz):

 "act_date >='2016-10-01'" 

En el primer caso

 df.filter("act_date <='2017-04-01'" and "act_date >='2016-10-01'")\ .select("col1","col2").distinct().count() 

el resultado son valores superiores a 2016-10-01, lo que significa que todos los valores anteriores a 2017-04-01 también.

Mientras que en el segundo caso

 df.filter("act_date <='2017-04-01'").filter("act_date >='2016-10-01'")\ .select("col1","col2").distinct().count() 

El resultado son los valores entre 2016-10-01 y 2017-04-01.