webentwicklung-frage-antwort-db.com.de

Filter für mehrere Bedingungen für Datenrahmen

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

10
femibyte

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:

  • Das letzte Element, wenn alle Ausdrücke "wahr" sind.
  • Das erste "Falsey" -Element sonst.

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

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.

0
Ash Man