2016-05-14 31 views
1

我一直試圖根據選定的主題標籤過濾來自SQL數據框的推文。我的代碼(下面給出)適用於我嘗試過濾所選哈希標籤的推文。如何過濾基於關鍵字列表的Scala SQL上下文數據框中的文本

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

然而,當我向我的代碼過濾基於存儲在列表中的井號標籤的tweets,我碰到下面的錯誤。

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

error: missing arguments for method contains in class String; follow this method with `_' if you want to treat it as a partially applied function

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

回答

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. 

你必須通過一些參數在包含方法中:

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

謝謝你,你的代碼爲我完美工作。 –

0

您還可以使用UDF(用戶定義的函數)在整個列上工作,直接在DataFrame上工作。

第一步,是定義(String => Boolean)類型的函數,其接收鳴叫,如果它應包括在最終的數據幀返回true:

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

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

然後,可以直接調用它的您的數據幀的filter方法:

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

有關UDF的更多信息,這裏是一個不錯的文章:

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

+1

謝謝。您的解決方案非常完美,我發現定義爲獨立的UDF函數肯定有幾個優點 –

相關問題