2017-09-14 47 views
1

我是新來的一個特定問題,我試圖解決並搜索幾個小時並仍在進行掃描。通過迭代來自另一個spark/scala的低谷值來過濾數據幀

我有兩個數據幀。 (A)與列: {「ANames」,「description」,「id」,和更多}

另一個(B)只有一列「BName」。既然如此,我知道我應該把它轉換成另一種類型,但我不知道在什麼(列表,順序..)。那將是我的第一個問題。

最後,我想通過「ANames」在B中搜索(過濾)每個名稱「BName」。和後記若發現名稱的一個,把它寫在與結構中的另一數據框:

{BNAME,ID}

這聽起來很複雜。但實際上它只應在Dataframe中查找一些單詞。

編輯:「ANames」可以包含多個名稱(例如[John Senna,Bred Ford]),「BName」不包含。後來我也想在「說明」中搜索每個「BName」。

回答

0

連接兩個dataframes與 「array_contains」 功能:

import sqlContext.implicits._ 

val aData = List((Array("John Senna", "Bred Ford"), "Any description", 11), (Array("NoName"), "No description", 12)) 
val bData = List("Bred Ford") 

val aDF = sparkContext.parallelize(aData).toDF("ANames", "description", "id") 
val bDF = sparkContext.parallelize(bData).toDF("BName") 

val result = bDF.join(aDF, expr("array_contains(ANames, BName)"), "inner").select(col("BName"), col("id")) 
result.show(false) 

輸出:

+---------+---+ 
|BName |id | 
+---------+---+ 
|Bred Ford|11 | 
+---------+---+ 

類似的做法以後可以用於描述搜索。

+0

非常感謝。接縫要好。 :) – Puca

+0

expr(「array_contains(ANames,BName)」)不適合我。我猜引號應該在裏面:array_contains(「ANames」,「BName」) 但即使這樣也行不通,所以我嘗試了幾乎每種可能性。通常有一件奇怪的事情:對於第一列,如果我用「aDF()」包圍它,它需要一個字符串而不是一列,如果我再次刪除它,它需要一列而不是一個字符串。 – Puca

+0

最後它工作,因爲我刪除了「expr(array_contains())」,只是把兩個列之間的包含。 至少它仍然運行沒有錯誤,因爲20分鐘:-D – Puca

相關問題