2017-02-10 30 views
1

我正在使用pyspark。我有一個火花數據幀my_sdfcol1是一個整數,我預定整數在火花使用中「在一組」子句中過濾數據幀

S1 = [1,2,3,4] 

的名單,然後我想在我的my_sdf返回行,其中col1在集合S1。所以,我做了以下內容:

Test1 = my_sdf.filter(my_sdf.col1 in S1).cache() 
# or Test1 = my_sdf.filter(my_sdf.col1 not in S1).cache() 
Test1.count() 

但它返回

ValueError異常:無法列轉換爲布爾:請用「&」爲「和」,「|」爲'或','〜'爲'不'時構建DataFrame布爾表達式。

我不知道如何解決這個問題。最後,我想開始S1 = []是一個空列表作爲我迭代中的起點,在循環過程中,我將更新S1。同樣,not in S1也不起作用。我試着寫

Test1 = my_sdf.filter((my_sdf.col1 <10) & (my_sdf.col1>2)).cache() 

它的工作原理,但如果我使用的過濾條件in S1,那麼這是行不通的。

另一個問題是:這是什麼cache()東西在做什麼?如果我不這樣做,會有所作爲嗎?我被告知火花是lazy評估代碼,所以在我撥打Test.count()之前,它實際上不執行前面的過濾命令。但我不確定這個cache()的工作原理。

回答

1

可以使用ISIN

對於你的問題,你可以嘗試這樣的事:

from pyspark.sql.functions import col

Test1 = my_sdf.where(col("col1").isin(S1))

根據我的理解,高速緩存用來保存當前值的數據幀。這很有幫助,因爲如果你想再次使用這個數據幀,Spark會從緩存中取值,而不是從頭開始再計算它。所以,如果你的代碼只做Test1.count,那麼緩存與否並不重要。 CMIIW

+1

謝謝!我也玩過了,我找到了'not in',我們可以使用my_sdf.where((col(「col1」)。isin(S1))&(〜col(「col1」)。isin(S2)) )' – ftxx

+0

我的另一個問題是:如果'S1'不是一個python列表,而是一個pyspark數據框,其中一列看起來像'[Row(S = 9527),Row(S = 36)]',那麼I測試這個'isin'功能不起作用。你有什麼想法仍然能夠工作嗎? – ftxx