我一直在尝试根据选定的主题标签从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)
答案 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