Spark 分组然后排序(Java 代码)

Posted

技术标签:

【中文标题】Spark 分组然后排序(Java 代码)【英文标题】:Spark grouping and then sorting (Java code) 【发布时间】:2017-09-18 01:15:52 【问题描述】:

我有一个 JavaPairRDD,需要按键分组,然后使用对象 MyObject 中的值对其进行排序。

假设 MyObject 是:

class MyObject 
    Integer order;
    String name;

样本数据:

1, order:1, name:'Joseph'
1, order:2, name:'Tom'
1, order:3, name:'Luke'
2, order:1, name:'Alfred'
2, order:3, name:'Ana'
2, order:2, name:'Jessica'
3, order:3, name:'Will'
3, order:2, name:'Mariah'
3, order:1, name:'Monika'

预期结果:

分区 1:

1, order:1, name:'Joseph'
1, order:2, name:'Tom'
1, order:3, name:'Luke'

分区 2

2, order:1, name:'Alfred'
2, order:2, name:'Jessica'
2, order:3, name:'Ana'

分区 3:

3, order:1, name:'Monika'
3, order:2, name:'Mariah'
3, order:3, name:'Will'

我正在使用密钥对 RDD 进行分区,然后使用 MyObject.order 对分区内的数据进行排序。

我的目标是只获取每个排序分区中的 k-first 元素,然后将它们减少到由其他 MyObject 属性计算的值(也称为“组中的前 N ​​个最佳元素”)。

我该怎么做?

【问题讨论】:

这是您想要的 Scala 实现:***.com/questions/33655467/… 我在 Java 和 JavaPairRDD 中需要它。您将我指向 Scala 和 DataFrame。 【参考方案1】:

你可以使用mapPartitions:

JavaPairRDD<Long, MyObject> sortedRDD = rdd.groupBy(/* the first number */)
    .mapPartitionsToPair(x -> 
        List<Tuple2<Long, MyObject>> values = toArrayList(x);
        Collections.sort(values, (x, y) -> x._2.order - y._2.order);

        return values.iterator();
     , true);

两个亮点:

toArrayList 接受一个迭代器并返回 ArrayList。你必须自己实现它 重要的是将 true 作为 mapPartitionsToPair 的第二个参数,因为它将保留分区

【讨论】:

太棒了!看起来很有希望...我稍后会对其进行测试并尽快提供反馈。谢谢。 @MagnoC 没问题。抱歉,如果代码中有任何错误,我无法检查它,但是它应该可以工作:) 你能显示 lambda 的显式函数版本吗? 没有错误的问题。我掌握了基础知识。如果有的话,我会在测试时发布更正。 @MagnoC 你是说匿名类?

以上是关于Spark 分组然后排序(Java 代码)的主要内容,如果未能解决你的问题,请参考以下文章

Spark:按组对记录进行排序?

数据框:如何在 Scala 中分组/计数然后按计数排序

Spark 中在处理大批量数据排序问题时,如何避免OOM

spark 分组取topn

ODPS Spark PySpark分组排序打序号并自关联(包含中文乱码问题解决)

使用dataframe解决spark TopN问题:分组排序取TopN