【问题标题】:Apache Spark (Scala) - print 1 entry of an RDD / pairRDDApache Spark (Scala) - 打印 RDD / pairRDD 的 1 个条目
【发布时间】:2015-03-21 01:00:32
【问题描述】:

使用 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),如果有,怎么做?如果不是,pairRDD的目的是什么?

【问题讨论】:

    标签: scala apache-spark rdd key-pair


    【解决方案1】:

    使用属于PairRDDFunctionslookup函数。来自官方文档:

    返回 RDD 中键 key 的值列表。这个操作是 如果 RDD 有一个已知的分区器,则只需搜索即可有效地完成 键映射到的分区。

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

    如果您只想查看 RDD 的内容,只需致电 collect

    【讨论】:

    • 完美,lookup 效果很好。但是,也许这是一个错误,但是当我尝试从控制台调用 lookup 时,它说该方法不存在。执行 Ctrl + Space ,我可以看到该方法不可见(存在)。但在代码(.scala 文件)中它工作正常。对于这种奇怪的行为有什么建议吗?
    • lookup 函数和许多其他在对 RDD 上运行的函数可通过隐式转换获得(查看我对 PairRDDFunctions 的回答中的链接)。因此,正确地说,控制台可能无法“推断”转换,并且只列出 RDD 函数,而不是通过隐式转换提供的函数。这可能适用于许多操作,不仅仅是lookup
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2015-07-05
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多