gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:30:26 26 4
gpt4 key购买 nike

我有一个 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'}

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

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

我该怎么做?

最佳答案

您可以使用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 的第二个参数,因为它将保留分区

关于java - Spark分组然后排序(Java代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46270321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com