我有一个名为wc的RDD,它有(键,值)对,其中键是单词,值是单词在某个文档中出现的次数。例如:
scala> :type wc
org.apache.spark.rdd.RDD[(String, Int)]
scala> wc.take(10).foreach(println)
(means,1)
(under,2)
(this,4)
(Because,1)
(Python,2)
(agree,1)
(cluster,1)
(its,1)
(follows,1)
(general,2)
无需在RDD中打印每一对,我如何索引此RDD以获取特定单词的计数(例如,Python)。我尝试了很多东西,包括:
wc.filter(_.1 == "Python")
// error: ')' expected but double literal found.
// wc.filter(_.1 == "Python")
wc.filter(_.2 == "Python")
// error: ')' expected but double literal found.
// wc.filter(_.2 == "Python")
wc.filter(wc.keys == "Python")
// type mismatch;
// found : Boolean
// required: ((String, Int)) => Boolean
// wc.filter(wc.keys == "Python")
wc.filter((k,v) => k == "Python")
// wrong number of parameters; expected = 1
// wc.filter((k,v) => k == "Python")
我对火花语法不太熟悉,但我认为我走的正确。任何对此感兴趣的想法 - 通过其密钥索引RDD是一个简单而重要的操作,我想更好地理解它。
提前致谢!
注意 - 我在SCALA中执行此编码,而不是python。我的班级正在使用SCALA,我对学习SCALAs语法感兴趣。
编辑 - 输出应该是'2'或(Python,2),尽管我可能更喜欢后者。
答案 0 :(得分:2)
问题非常微妙......您在Scala代码中忘记了_
(下划线)。
而不是_.1
,您应该_._1
如果您想访问wc
中的第5个元素,可以使用RDD.zipWithIndex
运算符:
zipWithIndex():RDD [(T,Long)]
将此RDD与其元素索引一起拉出。排序首先基于分区索引,然后是每个分区内的项目顺序。因此,第一个分区中的第一个项目获得索引0,最后一个分区中的最后一个项目获得最大索引。
这类似于Scala的zipWithIndex,但它使用Long而不是Int作为索引类型。当此RDD包含多个分区时,此方法需要触发spark作业。
以下内容应该有效:
scala> wc.zipWithIndex.filter(_._2 == 5).first._1
res0: (String, Int) = (Python,2)