2017-04-26 45 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