2017-08-31 4 views
1

Kann mir jemand erklären, warum ich für diese beiden Ausdrücke unterschiedliche Ergebnisse erhalte? Ich versuche, zwischen zwei Terminen zu filtern:Filter für mehrere Bedingungen am Datenrahmen

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: 25M

Worin unterscheiden sie sich? Es scheint mir, als ob sie das gleiche Ergebnis

Antwort

6

TL produzieren sollte; DR Um mehrere Bedingungen filter oder where Verwendung Column Objekte und logische Operatoren (&, |, ~) übergeben. Siehe Pyspark: multiple conditions in when clause.

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

Sie können auch eine einzige SQL-Zeichenfolge verwenden:

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

In der Praxis ist es sinn zu verwenden, um zwischen macht:

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 nicht einmal entfernte gültig ist . In Python gibt and zurück:

  • Das letzte Element, wenn alle Ausdrücke "truthy" sind.
  • Das erste "falsey" Element andernfalls.

Als Ergebnis

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

zu ausgewertet wird (jede nicht leere Zeichenfolge ist truthy):

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

Danke, ich hätte eine einzelne SQL-Zeichenfolge wie oben beschrieben verwenden sollen. Ein Versehen meinerseits. – femibyte

0

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 mehr als 2016-10-01 das bedeutet alle Werte über 2017-04-01 auch.

Während im zweiten Fall

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

ist das Ergebnis die Werte zwischen 2016.10.01 bis 2017.04.01.

Verwandte Themen