2017-03-11 31 views
-3

我在Coursera做Scala和Spark的大數據分析的第一項任務。 https://www.coursera.org/learn/scala-spark-big-data/programming/QcWcs/wikipedia如何將List傳遞給Scala Spark中的RDD?

我被困在實施以下方法:

def rankLangs(langs: List[String], rdd: RDD[WikipediaArticle]): List[(String, Int)] = ??? 

,並將列表更早在程序中定義:

val langs = List(
    "JavaScript", "Java", "PHP", "Python", "C#", "C++", "Ruby", "CSS", 
    "Objective-C", "Perl", "Scala", "Haskell", "MATLAB", "Clojure", "Groovy") 

我的理解是,對列表中的每個元素,我應該將它傳遞給RDD,以便它可以進行過濾並計算維基百科文章中出現的編程語言的出現次數。我正在考慮在RDD中執行for循環/ foreach以遍歷列表。它可行嗎?如果不是,你能建議做什麼以實現功能?

這是問題描述的快照: enter image description here

我occurrencesOfLang的實現如下:

def occurrencesOfLang(lang: String, rdd: RDD[WikipediaArticle]): Int = 
    { 
     val tmp: Array[(String, Int)] = rdd.filter(line => line.text.contentEquals(lang)).map(line => (lang, 1)).aggregateByKey(0)(_ + _, _ + _).collect() 
     return tmp(0)._2  
    } 

感謝您的幫助!

+0

我不明白你到底在問什麼。如果你有一些解決方案,你爲什麼問它是否可行? – Hlib

回答

0

您正在尋找這個答案。

def rankLangs(langs: List[String], rdd: RDD[WikipediaArticle]): List[(String, Int)] = { 
    return langs.map(x=> (x,WikipediaRanking.occurrencesOfLang(x, WikipediaRanking.wikiRdd))).sortBy(_._2); 
} 
0

我TNIK您正在尋找這樣的事情:

def occurrencesOfLang(lang: String, rdd: RDD[WikipediaArticle]): Int = { 
     val wordsRdd: Int = wikiRdd.filter(_.text.contains(lang)) 
      .flatMap(word => word.text.split(" ")) 
      .filter(_.equalsIgnoreCase(lang)) 
      .count().toInt 
     wordsRdd 
     } 
+0

這是用於上一步:def occurrencesOfLang(lang:String,rdd:RDD [WikipediaArticle]):Int = { }返回wikiRdd.filter(line => line.text.toString()。contains(lang +「」) ).Count之間()toInt。 } –

相關問題