【问题标题】:How to find max value in pair RDD?如何在对 RDD 中找到最大值?
【发布时间】:2015-01-09 06:20:10
【问题描述】:

我有一个如下的火花对 RDD (key, count)

Array[(String, Int)] = Array((a,1), (b,2), (c,1), (d,3))

如何使用 spark scala API 找到计数最高的密钥?

编辑:对 RDD 的数据类型是 org.apache.spark.rdd.RDD[(String, Int)]

【问题讨论】:

  • 你是怎么找到pair rdd的数据类型的?

标签: scala apache-spark pyspark


【解决方案1】:

使用takeOrdered(1)(Ordering[Int].reverse.on(_._2)):

val a = Array(("a",1), ("b",2), ("c",1), ("d",3))
val rdd = sc.parallelize(a)
val maxKey = rdd.takeOrdered(1)(Ordering[Int].reverse.on(_._2))
// maxKey: Array[(String, Int)] = Array((d,3))

引用RDD.takeOrdered的注释:

只有在预期结果数组很小的情况下才应使用此方法,因为所有数据都已加载到驱动程序的内存中。

【讨论】:

  • 这比使用 Rubber Duck 的 answer 更好吗?
  • @Glenn 鉴于我刚刚添加的注释,我不太确定。您必须自己检查一下(并报告回来)。
【解决方案2】:

Spark RDD 保留为 RDD 而不转换为数组时,在时间上效率更高

strinIntTuppleRDD.reduce((x, y) => if(x._2 > y._2) x else y)

【讨论】:

    【解决方案3】:

    对于 Pyspark:

    a 成为键为字符串、值为整数的 RDD 对

    a.max(lambda x:x[1])
    

    返回具有最大值的键值对。基本上,max 函数按 lambda 函数的返回值排序。

    这里的a是一对RDD,带有('key',int)x[1]等元素,只是指元素的整数部分。

    请注意,max 函数本身将按键排序并返回最大值。

    文档可在https://spark.apache.org/docs/1.5.0/api/python/pyspark.html#pyspark.RDD.max获取

    【讨论】:

    • 问题与Scala有关,而不是python
    • 知道如何打印整个元组吗?上面的答案给出了 x[1] 的最大值。我还想要 x[0] 的值,其中 x[1] 是最大值
    • @user2543622 不,它返回两个值。
    【解决方案4】:

    使用Array.maxBy方法:

    val a = Array(("a",1), ("b",2), ("c",1), ("d",3))
    val maxKey = a.maxBy(_._2)
    // maxKey: (String, Int) = (d,3)
    

    RDD.max:

    val maxKey2 = rdd.max()(new Ordering[Tuple2[String, Int]]() {
      override def compare(x: (String, Int), y: (String, Int)): Int = 
          Ordering[Int].compare(x._2, y._2)
    })
    

    【讨论】:

      猜你喜欢
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 2021-04-09
      • 2019-11-28
      相关资源
      最近更新 更多