在rdd中迭代CompactBuffer

时间:2017-06-15 20:08:07

标签: scala apache-spark rdd

我有一个RDD [(String,Iterable [WikipediaArticle])],看起来像这样:

  

(Groovy,CompactBuffer(WikipediaArticle({有一个字符串标题},{有一些文本对应于该标题}),WikipediaArticle({有一个字符串标题} ,{有一些与该标题相对应的文字}))

上面的花括号只是为了区分标题和文字,同时使事情更清晰

Groovy:是字符串名称
WikipediaArticle:class有两个属性 title text

我需要一个类型为List[(String, Int)]的输出,其中:
String:是RDD中第一个在每行上唯一的元素
在上面的例子中," Groovy"
Int:是该String

的compactbuffer中WikipediaArticles的计数

我尽量让事情变得清晰,但是,如果你认为有机会改善这个问题,或者你有任何疑问,请随时提出。

1 个答案:

答案 0 :(得分:0)

如果您将RDD a(k,v)对的每个元素视为第一个关键字为k且CompactBuffer为v,则一种方法是使用map部分函数case如下所示:

case class WikipediaArticle(title: String, text: String)

val rdd = sc.parallelize(Seq(
  ( "Groovy", Iterable( WikipediaArticle("title1", "text1"), WikipediaArticle("title2", "text2") ) ),
  ( "nifty", Iterable( WikipediaArticle("title2", "text2"), WikipediaArticle("title3", "text3") ) ),
  ( "Funny", Iterable( WikipediaArticle("title1", "text1"), WikipediaArticle("title3", "text3"), WikipediaArticle("title4", "text4") ) )
))

rdd.map{ case (k, v) => (k, v.size) }
// res1: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[1] at map at <console>:29

res1.collect.toList
// res2: List[(String, Int)] = List((Groovy,2), (nifty,2), (Funny,3))