SparkRDD之aggregateByKey

本文介绍了一个使用Apache Spark的Java示例程序,展示了如何利用AggregateByKey函数处理具有相同键的值,通过实例说明了AggregateByKey的基本用法及参数设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

像aggregate函数一样工作,只不过aggregateByKey应用于具有相同键的值。 与聚合函数不同,初始值不应用于第二个reduce。

示例如下:

package com.cb.spark.sparkrdd;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function2;

import scala.Tuple2;

public class AggregateByKeyExample {
	public static void main(String[] args) {
		SparkConf conf = new SparkConf().setAppName("AggregateByKey").setMaster("local");
		JavaSparkContext jsc = new JavaSparkContext(conf);
		JavaPairRDD<String, Integer> pairRDD = jsc.parallelizePairs(
				Arrays.asList(new Tuple2<String, Integer>("cat", 2), new Tuple2<String, Integer>("cat", 5),
						new Tuple2<String, Integer>("mouse", 4), new Tuple2<String, Integer>("cat", 12),
						new Tuple2<String, Integer>("dog", 12), new Tuple2<String, Integer>("mouse", 2)),
				2);

		JavaRDD<String> mapPartitionsWithIndexRDD = pairRDD
				.mapPartitionsWithIndex(new Function2<Integer, Iterator<Tuple2<String, Integer>>, Iterator<String>>() {
					private static final long serialVersionUID = 1L;

					@Override
					public Iterator<String> call(Integer arg0, Iterator<Tuple2<String, Integer>> arg1)
							throws Exception {
						List<String> list = new ArrayList<>();
						while (arg1.hasNext()) {
							Tuple2<String, Integer> tuple2 = arg1.next();
							list.add("partition " + arg0 + ":(" + tuple2._1 + "," + tuple2._2 + ")");
						}
						return list.iterator();
					}

				}, true);

		mapPartitionsWithIndexRDD.foreach(x -> System.out.println(x));

		JavaPairRDD<String, Integer> aggregateByKeyRDD = pairRDD.aggregateByKey(0, (a, b) -> Math.max(a, b),
				(x, y) -> x + y);
		// (dog,12)
		// (cat,17)
		// (mouse,6)
		aggregateByKeyRDD.foreach(x -> System.out.println(x));

		JavaPairRDD<String, Integer> aggregateByKeyRDD1 = pairRDD.aggregateByKey(100, (a, b) -> Math.max(a, b),
				(x, y) -> x + y);
		// (dog,100)
		// (cat,200)
		// (mouse,200)
		aggregateByKeyRDD1.foreach(x -> System.out.println(x));

		jsc.stop();

	}
}

使用Spark的算子aggregateByKey举例,可以参考以下代码: ```scala import org.apache.spark.{SparkConf, SparkContext} object Demo { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local").setAppName("aa") val sc = new SparkContext(conf) // 创建一个包含键值对的列表 val list = List((1,2),(2,7),(1,3),(2,8),(3,9),(3,10),(1,4),(1,5),(2,6),(2,11),(3,12),(3,13)) // 将列表转化为RDD val listRDD = sc.parallelize(list,2) // 使用aggregateByKey算子计算每个键对应的最大值 val result = listRDD.aggregateByKey(0)( (a, b) => math.max(a, b), (x, y) => math.max(x, y) ) // 打印结果 result.collect().foreach(println) } } ``` 以上代码中,我们创建了一个包含键值对的列表,然后将其转化为RDD。接下来,使用aggregateByKey算子计算每个键对应的最大值。在seqOp函数中,我们比较当前值与累加器并返回较大的值。在combOp函数中,我们再次比较两个累加器的值并返回较大的值。最后,通过collect函数将结果打印出来。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [详解Spark核心算子 : aggregateByKey和combineByKey](https://blog.csdn.net/f_n_c_k/article/details/88718262)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值