在Spark字数RDD中,如何为特定键索引值

时间:2017-05-22 18:24:55

标签: scala apache-spark

我有一个名为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),尽管我可能更喜欢后者。

1 个答案:

答案 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)