我有一个RDD [(String,Iterable [WikipediaArticle])],看起来像这样:
(Groovy,CompactBuffer(WikipediaArticle({有一个字符串标题},{有一些文本对应于该标题}),WikipediaArticle({有一个字符串标题} ,{有一些与该标题相对应的文字}))
上面的花括号只是为了区分标题和文字,同时使事情更清晰
Groovy:是字符串名称
WikipediaArticle:class有两个属性 title 和 text
我需要一个类型为List[(String, Int)]
的输出,其中:
String:是RDD中第一个在每行上唯一的元素
在上面的例子中," Groovy"
Int:是该String
我尽量让事情变得清晰,但是,如果你认为有机会改善这个问题,或者你有任何疑问,请随时提出。
答案 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))