如何基于关键字列表过滤Scala SQL上下文数据框中的文本

时间:2016-05-14 06:29:00

标签: sql scala apache-spark filter

我一直在尝试根据选定的主题标签从SQL数据框中过滤推文。当我尝试过滤所选主题标签的推文时,我的代码(如下所示)有效。

dfs.select(dfs("text"))
  .map(r => r.getString(0))
  .filter(_.contains("#tweet_of_interest"))
  .foreach(println)

然而,当我扩展我的代码以根据存储在列表中的主题标签过滤推文时,我收到以下错误。

dfs.select(dfs("text"))
  .map(r => r.getString(0))
  .filter(hashtag_list.exists(_.contains))
  .foreach(println)
  

错误:类String中包含方法的缺少参数;跟随   这个方法用`_'如果你想把它当作部分应用   功能

dfs.select(dfs("text"))
  .map(r => r.getString(0))
  .filter(konykeywords.exists(_.contains))
  .foreach(println)

2 个答案:

答案 0 :(得分:0)

你可以尝试这段代码:

dfs.select(dfs("text")).map(r => r.getString(0)).filter(line => {
  hashtag_list.exists(line.contains)
}).foreach(println)

您编写的代码不能像这样工作:

hashtag_list.exists(_.contains) // gives the error: missing arguments for method contains in class String; follow this method with '_' if you want to treat it as a partially applied function.

你必须在contains方法中传递一些参数:

hashtag_list.exists(_.contains("somevalue"))

答案 1 :(得分:0)

您还可以使用适用于整列的UDF(用户定义函数)直接在DataFrame上工作。

第一步是定义一个类型(String => Boolean)的函数,它接收一条推文,如果它应该包含在最终的DataFrame中,则返回true:

def myFunc: (String => Boolean) = { t => hashtag_list.exists(t.contains) }

import org.apache.spark.sql.functions._
val myUDF = udf(myFunc)

然后,您可以直接在DataFrame的filter方法上调用它:

val filteredDF = dfs.filter(myUDF(col("tweets")))

有关UDF的更多信息,这里有一篇很好的文章:

http://www.sparktutorials.net/using-sparksql-udfs-to-create-date-times-in-spark-1.5