144、Spark核心编程进阶之aggregateByKey以及单词计数案例

本文深入探讨了Spark中AggregateByKey函数的原理与应用,对比ReduceByKey,详细解释了其三个参数的作用,包括如何进行map-side本地聚合和reduce-side全局聚合,通过实例展示了单词计数的实现过程。

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

reduceByKey可以认为是aggregateByKey的简化版
aggregateByKey,分为三个参数,,多提供了一个函数,Seq Function
就是说自己可以控制如何对每个partition中的数据进行先聚合,类似于mapreduce中的,map-side combine
然后才是对所有partition中的数据进行全局聚合

第一个参数是,每个key的初始值
第二个是个函数,Seq Function,如何进行shuffle map-side的本地聚合
第三个是个函数,Combiner Function,如何进行shuffle reduce-side的全局聚合

 

13274599-899ae00a2b2cd7df.png

aggregateByKey原理.png

public class AggregateByKey {

    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("AggregateByKeyJava").setMaster("local");

        JavaSparkContext sparkContext = new JavaSparkContext(conf);


        JavaRDD<String> linesRDD = sparkContext.textFile("E:\\testdata\\wordcount\\input\\1.txt", 3);

        JavaRDD<String> wordsRDD = linesRDD.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public Iterator<String> call(String s) throws Exception {
                return Arrays.asList(s.split(" ")).iterator();
            }
        });

        JavaPairRDD<String, Integer> wordNumbersRDD = wordsRDD.mapToPair(new PairFunction<String, String, Integer>() {
            @Override
            public Tuple2<String, Integer> call(String s) throws Exception {
                return new Tuple2<>(s, 1);
            }
        });

        JavaPairRDD<String, Integer> resultRDD = wordNumbersRDD.aggregateByKey(0, new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1 + v2;
            }
        }, new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1 + v2;
            }
        });

        resultRDD.foreach(new VoidFunction<Tuple2<String, Integer>>() {
            @Override
            public void call(Tuple2<String, Integer> stringIntegerTuple2) throws Exception {
                System.out.println(stringIntegerTuple2._1 + " appears " + stringIntegerTuple2._2 + " times");
            }
        });
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值