Quelqu'un peut-il m'expliquer pourquoi j'obtiens des résultats différents pour ces 2 expressions? J'essaye de filtrer entre 2 dates:
df.filter("act_date <='2017-04-01'" and "act_date >='2016-10-01'")\
.select("col1","col2").distinct().count()
Résultat: 37M
contre
df.filter("act_date <='2017-04-01'").filter("act_date >='2016-10-01'")\
.select("col1","col2").distinct().count()
Résultat: 25M
Comment sont-ils différents ? Il me semble qu'ils devraient produire le même résultat
TL; DR Pour transmettre plusieurs conditions à filter
ou where
, utilisez des objets Column
et des opérateurs logiques (&
, |
, ~
). Voir Pyspark: plusieurs conditions dans la clause when .
df.filter((col("act_date") >= "2016-10-01") & (col("act_date") <= "2017-04-01"))
Vous pouvez également utiliser une seule chaîne SQL:
df.filter("act_date >='2016-10-01' AND act_date <='2017-04-01'")
En pratique, il est plus logique d'utiliser 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'")
La première approche n'est même pas valide à distance. En Python, and
renvoie:
Par conséquent
"act_date <='2017-04-01'" and "act_date >='2016-10-01'"
est évalué à (toute chaîne non vide est vérité):
"act_date >='2016-10-01'"
En premier cas
df.filter("act_date <='2017-04-01'" and "act_date >='2016-10-01'")\
.select("col1","col2").distinct().count()
le résultat correspond à des valeurs supérieures à 2016-10-01, c'est-à-dire toutes les valeurs supérieures à 2017-04-01.
Attendu que dans le second cas
df.filter("act_date <='2017-04-01'").filter("act_date >='2016-10-01'")\
.select("col1","col2").distinct().count()
le résultat correspond aux valeurs comprises entre le 2016-10-01 et le 2017-04-01.