在 rdd 中迭代 CompactBuffer
Posted
技术标签:
【中文标题】在 rdd 中迭代 CompactBuffer【英文标题】:Iterating over CompactBuffer in an rdd 【发布时间】:2017-06-15 20:08:06 【问题描述】:我有一个看起来像这样的 RDD[(String, Iterable[WikipediaArticle])]:
(Groovy,CompactBuffer(WikipediaArticle( has a String title , has some text 对应那个标题), WikipediaArticle( has a String title , 有一些与该标题对应的文本))
上面的大括号只是为了区分标题和文本,同时使事情更清晰
Groovy : 是字符串名称 WikipediaArticle:类有两个属性title和text
我需要一个类型为:List[(String, Int)]
的输出,其中:
字符串:是 RDD 中的第一个元素,在每一行上都是唯一的
在上述情况下是“Groovy”
Int:是该字符串的 compactbuffer 中 WikipediaArticles 的计数
我已尽力使事情尽可能清楚,但是,如果您认为有机会改进问题或有任何疑问,请随时提出。
【问题讨论】:
您正在寻求针对 coursera 课程作业的解决方案,这违反了荣誉准则。到目前为止,您尝试过什么? 我知道我被卡住了,我也无法从讨论部分找到任何帮助。我尝试使用 map 迭代 compactbuffer 但没有成功。我只需要一点提示,我知道我在做一些愚蠢的事情。 【参考方案1】:如果您将 RDD 的每个元素都视为 (k, v) 对,第一个关键字为 k
,CompactBuffer 为 v
,则一种方法是使用带有部分函数 case
的 map
如下:
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))
【讨论】:
谢谢利奥。不幸的是,对于我来说,这个解决方案不起作用,但是当我这样做时它会起作用index.map(k => (k._1,k._2.iterator.size)).collect().toList
。我不确定为什么它不能像你上面建议的那样将 rdd 视为 case(k,v) 对。不能清楚地说明错误是什么。
@Kireet Bhat,你确定
,而不是( )
,被用于封装case
部分函数吗?
现在可以使用了!!现在这是全新的东西。我不知道大括号和圆括号的用法有区别。你知道为什么它之前不能与 ( ) 一起工作,但现在与 一起工作。
Scala 要求函数/部分函数文字(包括case
)用花括号括起来。这是link 回复:花括号与括号。
我早该这么做的。对不起。谢谢你的帮助。 :)以上是关于在 rdd 中迭代 CompactBuffer的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark:使用 map 函数而不是 collect 来迭代 RDD