Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在rdd中的CompactBuffer上迭代_Scala_Apache Spark_Rdd - Fatal编程技术网

Scala 在rdd中的CompactBuffer上迭代

Scala 在rdd中的CompactBuffer上迭代,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我有一个RDD[(String,Iterable[WikipediaArticle]),看起来像这样: (Groovy,CompactBuffer(WikipediaArticle({有一个字符串标题},{有一些文本对应于该标题}),WikipediaArticle({有一个字符串标题},{有一些文本对应于该标题})) 上面的花括号只是为了区分标题和文本,同时使内容更清晰 Groovy:是字符串名 维基百科文章:类有两个属性title和text 我需要类型为:List[(String,Int)]

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

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

上面的花括号只是为了区分标题和文本,同时使内容更清晰

Groovy:是字符串名
维基百科文章:类有两个属性titletext

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


我已经尽可能地把事情弄清楚了,但是,如果您认为有机会改进这个问题,或者您有任何疑问,请随时提问。

如果您处理RDD a(k,v)的每个元素与第一个关键字为
k
和压缩缓冲区为
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))
case类维基百科文章(标题:String,文本:String)
val rdd=sc.parallelize(顺序(
(“Groovy”、Iterable(维基百科文章(“标题1”、“文本1”)、维基百科文章(“标题2”、“文本2”)),
(“俏皮”,可编辑(维基百科文章(“标题2”,“文本2”),维基百科文章(“标题3”,“文本3”)),
(“有趣”,可编辑(维基百科文章(“标题1”,“文本1”),维基百科文章(“标题3”,“文本3”),维基百科文章(“标题4”,“文本4”))
))
map{case(k,v)=>(k,v.size)}
//res1:org.apache.spark.rdd.rdd[(String,Int)]=MapPartitionsRDD[1]位于map at:29
res1.collect.toList
//res2:List[(String,Int)]=List((Groovy,2),(nifty,2),(fully,3))

如果将RDD a(k,v)对的每个元素处理为第一个关键字为
k
,压缩缓冲区为
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))
case类维基百科文章(标题:String,文本:String)
val rdd=sc.parallelize(顺序(
(“Groovy”、Iterable(维基百科文章(“标题1”、“文本1”)、维基百科文章(“标题2”、“文本2”)),
(“俏皮”,可编辑(维基百科文章(“标题2”,“文本2”),维基百科文章(“标题3”,“文本3”)),
(“有趣”,可编辑(维基百科文章(“标题1”,“文本1”),维基百科文章(“标题3”,“文本3”),维基百科文章(“标题4”,“文本4”))
))
map{case(k,v)=>(k,v.size)}
//res1:org.apache.spark.rdd.rdd[(String,Int)]=MapPartitionsRDD[1]位于map at:29
res1.collect.toList
//res2:List[(String,Int)]=List((Groovy,2),(nifty,2),(fully,3))

你在要求解决coursera课程作业,这违反了荣誉准则。到目前为止你尝试了什么?我知道我被卡住了,在讨论部分也找不到任何帮助。我尝试使用map迭代compactbuffer,但没有成功。我只需要一点提示我知道我在做傻事。哟你在要求解决coursera课程作业的问题,这违反了荣誉准则。到目前为止你尝试了什么?我知道我被卡住了,我也无法从讨论部分找到任何帮助。我尝试使用map迭代compactbuffer,但没有成功。我只需要一点提示,我知道我在做一些愚蠢的事情。谢谢Leo。不幸的是,对于我的情况,这个解决方案不起作用,但当我改为
index.map(k=>(k.\u 1,k.\u 2.iterator.size)).collect().toList
。我不确定为什么它不能像你上面建议的那样将rdd视为case(k,v)对。无法清楚地说出错误是什么。@Kireet Bhat,你确定
{/code>,而不是
()
,用于封装
大小写
部分函数?它现在可以工作了!!这是一个全新的东西。我不知道花括号和圆括号的用法有什么区别。你知道为什么它以前不适用于()而现在适用于{}。Scala需要函数/部分函数文本(包括
case
)用大括号括起来。这是一个关于:大括号vs圆括号。我应该早一点这样做。对不起。谢谢你的帮助。:)谢谢Leo。不幸的是,对于我的情况,这个解决方案不起作用,但当我改为
index.map(k=>(k.\u 1,k.\u 2.iterator.size))。collect().toList
。我不知道为什么它不能像您上面建议的那样将rdd视为大小写(k,v)对。无法清楚地说出错误是什么。@Kireet Bhat,您确定
{}
,而不是
()
,用于封装
case
部分函数?它现在可以工作了!!这是一个全新的东西。我不知道花括号和圆括号的用法有什么区别。你知道为什么它以前不适用于()而现在适用于{}。Scala需要函数/部分函数文本(包括
大小写
)用大括号括起来。这是一个关于:大括号和括号的问题。我应该早点做。对不起。谢谢你的帮助。:)