1

使用 RDD 时,我按键对 RDD 中的项目进行了分组。

    val pairRDD = oldRDD.map(x => (x.user, x.product)).groupByKey

pairRDD是类型:RDD(Int, Iterable[Int]))

我遇到的问题只是访问特定元素。当我似乎无法通过密钥访问 RDD 中的项目时,拥有密钥有什么意义?

在我filter将 RDD 缩减为单个项目的那一刻,但是我仍然有一个 RDD,因此我必须foreach在 RDD 上进行打印才能将其打印出来:

    val userNumber10 = pairRDD.filter(_._1 == 10)
    userNumber10.foreach(x => println("user number = " + x._1))

或者,我可以filterRDD 然后take(1)返回一个大小为 1 的数组:

    val userNumber10Array = pairRDD.filter(_._1 == 10).take(1)

或者,我可以选择该返回数组的第一个元素:

    val userNumber10Array = pairRDD.filter(_._1 == 10).take(1)(0)

这会根据需要返回给我。但是......显然,这很不方便,我会冒险猜测这不是 RDD 的用途!

我为什么要这样做你可能会问!好吧,它出现的原因是因为我只是想“查看”我的 RDD 中的内容以用于我自己的测试目的。那么,有没有办法访问 RDD 中的单个项目(更严格地说是 pairRDD),如果有,怎么做?如果不是,pairRDD 的目的是什么?

4

1 回答 1

4

使用lookup属于 的函数PairRDDFunctions。来自官方文档:

返回键 key 的 RDD 中的值列表。如果 RDD 具有已知的分区器,则此操作通过仅搜索键映射到的分区来有效地完成。

https://spark.apache.org/docs/0.8.1/api/core/org/apache/spark/rdd/PairRDDFunctions.html

如果您只想查看 RDD 的内容,只需调用collect.

于 2015-03-20T16:48:38.693 回答