2017-04-26 44 views
1

我一直在尋找一段時間,但我還沒有找到如何做到這一點。 我有一個包含一個參照表,其中一列包含字符串從數據框的火花過濾器列與集合中的單詞

dataframe schema: name string,lastname string, interests string 

我有像這樣的興趣列表中的數據框:

val sports:List [String] = List("football","basketball","soccer") 

我想所有的人篩選從我的數據框中包含的運動之一以上符合他們的利益

val peopledata = sqlContext.sql("select * from learning.people") 

我試圖做到這一點是這樣的:

for (sport <- sports)peopledata.filter(peopledata("interests").contains(sport)) 

,但我曾問一個親在我公司工作,他告訴我他在那裏一個更好,更漂亮的方式做到這一點

回答

0

執行collect()函數來得到的這個結果和過濾元件的Array[Row]陣列sports.contains()

peopledata.collect().filter(row => sports contains row.getString(2))

2這裏是在你的架構interests場的數量。串插

+0

它說,它需要一個int,它返回一個字符串 – SparkHelpPlease

+0

@SparkHelpPlease哎呀,固定我的答案 –

+0

我發佈一個答案,然後實現它有個bug,因此刪除它,但需要提到的是,通過執行「collect」,您將會將所有的人員數據傳送到您的驅動程序,只要它適合您的驅動程序的內存,這可能沒問題。另一種解決方法是'廣播''sports'並在'peopleData'' DataFrame'上做過濾器。恐怕我沒時間了,但是如果問題仍然存在,我會稍後再回來查看併發佈一個解決方案:) – ImDarrenG

1

使用將解決你的問題:

val interest = sports.mkString("('","','","')") 

val peopledata = sqlContext.sql(s"select * from learning.people where interest in $interest") 
+0

我認爲這樣做不夠用,因爲它的特點可以是這樣的:「足球,棒球」等等在一個字符串中 – SparkHelpPlease