web-dev-qa-db-fra.com

Filtre de condition multiple sur la structure de données

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

10
femibyte

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:

  • Le dernier élément si toutes les expressions sont "vérité".
  • Le premier élément "falsey" sinon.

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'"
19
zero323

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.

0
Ash Man