python
  • apache-spark
  • pyspark
  • 2017-08-31 64 views 1 likes 
    1

    任何人都可以向我解釋爲什麼我對這兩個表達式得到不同的結果嗎?我想2日期間進行過濾:數據幀上的多個條件篩選器

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

    結果:37M

    VS

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

    結果:25M

    他們如何不同?在我看來,像他們應該產生相同的結果

    回答

    6

    TL; DR要傳遞多個條件filterwhere使用Column對象和邏輯運算符(&|~)。見Pyspark: multiple conditions in when clause

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

    您還可以使用一個 SQL字符串:

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

    在實踐中更有意義,使用之間:

    df.filter(col("act_date").between("2016-10-01", "2017-04-01")) 
    df.filter("act_date BETWEEN '2016-10-01' AND '2017-04-01'") 
    

    第一種做法甚至不是遠程有效。在Python中,and返回:

    • 如果所有表達式都是「truthy」,則爲最後一個元素。
    • 否則爲第一個「僞造」元素。

    結果

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

    進行評估,以(任何非空字符串是truthy):

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

    謝謝,我應該使用上面描述的單個SQL字符串。我的一個疏忽。 – femibyte

    0

    在第一種情況下

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

    結果是值超過2016-10-01這意味着所有價值高於2017-04-01也。

    而在第二種情況下

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

    結果是2016年10月1日到2017年4月1日之間的值。

    相關問題