Kann mir jemand erklären, warum ich für diese beiden Ausdrücke unterschiedliche Ergebnisse bekomme? Ich versuche zwischen zwei Terminen zu filtern:
df.filter("act_date <='2017-04-01'" and "act_date >='2016-10-01'")\
.select("col1","col2").distinct().count()
Ergebnis: 37M
vs
df.filter("act_date <='2017-04-01'").filter("act_date >='2016-10-01'")\
.select("col1","col2").distinct().count()
Ergebnis: 25 Millionen
Wie unterscheiden sie sich? Es scheint mir, als sollten sie dasselbe Ergebnis erzielen
TL; DR Um mehrere Bedingungen an filter
oder where
zu übergeben, verwenden Sie Column
-Objekte und logische Operatoren (&
, |
, ~
). Siehe Pyspark: Mehrere Bedingungen in when-Klausel .
df.filter((col("act_date") >= "2016-10-01") & (col("act_date") <= "2017-04-01"))
Sie können auch einen einzelnen SQL-String verwenden:
df.filter("act_date >='2016-10-01' AND act_date <='2017-04-01'")
In der Praxis ist es sinnvoller zwischen zu verwenden:
df.filter(col("act_date").between("2016-10-01", "2017-04-01"))
df.filter("act_date BETWEEN '2016-10-01' AND '2017-04-01'")
Der erste Ansatz ist nicht einmal remote gültig. In Python gibt and
Folgendes zurück:
Als Ergebnis
"act_date <='2017-04-01'" and "act_date >='2016-10-01'"
wird ausgewertet (jede nicht leere Zeichenfolge ist wahr):
"act_date >='2016-10-01'"
Im ersten Fall
df.filter("act_date <='2017-04-01'" and "act_date >='2016-10-01'")\
.select("col1","col2").distinct().count()
das Ergebnis ist Werte über 2016-10-01, dh alle Werte über 2017-04-01.
Im zweiten Fall
df.filter("act_date <='2017-04-01'").filter("act_date >='2016-10-01'")\
.select("col1","col2").distinct().count()
das ergebnis sind die werte zwischen 01.10.2016 und 01.04.2017.