使用RDD时,我已按键将项目分组到RDD中。
val pairRDD = oldRDD.map(x => (x.user, x.product)).groupByKey
pairRDD
的类型为:RDD(Int, Iterable[Int]))
我遇到的麻烦就是访问特定元素。当我无法通过密钥访问RDD中的项目时,拥有密钥有什么意义?
在我将filter
RDD归结为单个项目时,我仍然有一个RDD,因此我必须在RDD上执行foreach
打印出来:
val userNumber10 = pairRDD.filter(_._1 == 10)
userNumber10.foreach(x => println("user number = " + x._1))
或者,我可以filter
RDD然后take(1)
返回一个大小为1的数组:
val userNumber10Array = pairRDD.filter(_._1 == 10).take(1)
除此之外,我可以选择返回数组的第一个元素:
val userNumber10Array = pairRDD.filter(_._1 == 10).take(1)(0)
根据需要返回该对。但... 很明显,这是不方便的,我猜想这不是一个RDD的用法!
为什么我这样做你可能会问!它出现的原因是因为我只是想"看到"我的RDD中有什么用于我自己的测试目的。那么,有没有办法访问RDD中的单个项目(更严格来说是一个pairRDD),如果是这样,怎么样?如果没有,对RDD的目的是什么?
答案 0 :(得分:4)
使用属于lookup
的{{1}}功能。从官方文档:
返回RDD中键值的列表。这个操作是 如果RDD通过仅搜索具有已知分区器,则有效地完成 键映射到的分区。
https://spark.apache.org/docs/0.8.1/api/core/org/apache/spark/rdd/PairRDDFunctions.html
如果您只想查看RDD的内容,只需致电PairRDDFunctions
。