【问题标题】:Get the max value for each key in a Spark RDD获取 Spark RDD 中每个键的最大值
【发布时间】:2016-08-29 05:23:06
【问题描述】:

返回与 spark RDD 中的每个唯一键关联的最大行(值)的最佳方法是什么?

我正在使用 python,并且我已经尝试过 Math max,通过键和聚合进行映射和归约。有没有一种有效的方法来做到这一点?可能是 UDF?

我有 RDD 格式:

[(v, 3),
 (v, 1),
 (v, 1),
 (w, 7),
 (w, 1),
 (x, 3),
 (y, 1),
 (y, 1),
 (y, 2),
 (y, 3)]

我需要返回:

[(v, 3),
 (w, 7),
 (x, 3),
 (y, 3)]

Ties 可以返回第一个值或随机值。

【问题讨论】:

    标签: python apache-spark pyspark rdd


    【解决方案1】:

    实际上你有一个 PairRDD。最好的方法之一是使用 reduceByKey:

    (斯卡拉)

    val grouped = rdd.reduceByKey(math.max(_, _))
    

    (Python)

    grouped = rdd.reduceByKey(max)
    

    (Java 7)

    JavaPairRDD<String, Integer> grouped = new JavaPairRDD(rdd).reduceByKey(
        new Function2<Integer, Integer, Integer>() {
            public Integer call(Integer v1, Integer v2) {
                return Math.max(v1, v2);
        }
    });
    

    (Java 8)

    JavaPairRDD<String, Integer> grouped = new JavaPairRDD(rdd).reduceByKey(
        (v1, v2) -> Math.max(v1, v2)
    );
    

    reduceByKey 的 API 文档:

    【讨论】:

    • 你能不能也用 Java 来做这件事?我正在使用 java 并寻找完全相同的东西
    • @tsar2512 使用 Java 8,这可能有效:new JavaPairRDD(rdd).reduceByKey((v1, v2) -&gt; Math.max(v1, v2));
    • 感谢您的回复,不幸的是,我使用的是 Java 7 - 它不允许使用 lambda 函数。通常必须编写匿名函数。您能否让我知道 Java 7 中的解决方案是什么?我怀疑一个简单的比较器功能应该可以工作!
    • 另外。我们得到的是属于每个键的最大值。对吗?
    • @tsar2512,是的,生成的 RDD 将为每个键包含一个条目,其中包含一对 (key, maxValue)。我用 Java 7 和 Java 8 的版本更新了答案,但我还没有测试过它们,所以请让我知道它是否有效。
    猜你喜欢
    • 1970-01-01
    • 2018-09-17
    • 2020-02-11
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    相关资源
    最近更新 更多