在 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:类有两个属性titletext

我需要一个类型为:List[(String, Int)] 的输出,其中: 字符串:是 RDD 中的第一个元素,在每一行上都是唯一的 在上述情况下是“Groovy” Int:是该字符串的 compactbuffer 中 WikipediaArticles 的计数

我已尽力使事情尽可能清楚,但是,如果您认为有机会改进问题或有任何疑问,请随时提出。

【问题讨论】:

您正在寻求针对 coursera 课程作业的解决方案,这违反了荣誉准则。到目前为止,您尝试过什么? 我知道我被卡住了,我也无法从讨论部分找到任何帮助。我尝试使用 map 迭代 compactbuffer 但没有成功。我只需要一点提示,我知道我在做一些愚蠢的事情。 【参考方案1】:

如果您将 RDD 的每个元素都视为 (k, v) 对,第一个关键字为 k,CompactBuffer 为 v,则一种方法是使用带有部分函数 casemap如下:

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 =&gt; (k._1,k._2.iterator.size)).collect().toList。我不确定为什么它不能像你上面建议的那样将 rdd 视为 case(k,v) 对。不能清楚地说明错误是什么。 @Kireet Bhat,你确定 ,而不是( ),被用于封装case部分函数吗? 现在可以使用了!!现在这是全新的东西。我不知道大括号和圆括号的用法有区别。你知道为什么它之前不能与 ( ) 一起工作,但现在与 一起工作。 Scala 要求函数/部分函数文字(包括case)用花括号括起来。这是link 回复:花括号与括号。 我早该这么做的。对不起。谢谢你的帮助。 :)

以上是关于在 rdd 中迭代 CompactBuffer的主要内容,如果未能解决你的问题,请参考以下文章

RDD内存迭代原理

迭代cogrouped RDD

Pyspark:使用 map 函数而不是 collect 来迭代 RDD

如何在 PySpark 中为一个组迭代 Dataframe / RDD 的每一行。?

Spark中的迭代RDD / Dataframe处理

PySpark:在“NoneType”对象上过滤掉 RDD 元素失败是不可迭代的