大数据Spark(八十):Action行动算子fold和aggregate使用案例

文章目录

Action行动算子fold和aggregate使用案例

一、fold使用案例

二、aggregate使用案例


Action行动算子fold和aggregate使用案例

一、fold使用案例

fold用于对RDD中的元素进行聚合操作,最终返回一个结果。类似reduce算子,但与reduce不同的是其可以对每个分区中的数据提供一个初始值,让分区中的数据与该初始值进行聚合,最终该初始值还会与各个分区的结果再次聚合。

fold的函数签名如下:

Scala 复制代码
def fold(zeroValue: T)(op: (T, T) => T): T
  • zeroValue:聚合操作的初始值,类型为 T。
  • op:用于合并元素的二元操作函数。

fold的工作原理:在每个分区内,fold 使用初始值 zeroValue 和二元操作函数 op,将该分区内的所有元素进行聚合。在所有分区内的聚合完成后,fold 将各分区的结果与初始值 zeroValue 一起,使用相同的二元操作函数 op 进行全局聚合,得到最终结果。

Java代码:

java 复制代码
SparkConf conf = new SparkConf().setMaster("local").setAppName("FoldTest");
JavaSparkContext sc = new JavaSparkContext(conf);

JavaRDD<String> rdd = sc.parallelize(Arrays.asList("a","b","c","d","e","f"), 3);
rdd.mapPartitionsWithIndex(new Function2<Integer, Iterator<String>, Iterator<String>>() {
    @Override
    public Iterator<String> call(Integer index, Iterator<String> iter) throws Exception {
        ArrayList<String> list = new ArrayList<>();
        while (iter.hasNext()) {
            String next = iter.next();
            list.add("rdd partition index: " + index + " current value: " + next);
        }
        return list.iterator();
    }
},true).foreach(x-> System.out.println(x));

/**
 * 0号分区:a b
 * 1号分区:c d
 * 2号分区:e f
 *
 * 0号分区:hello~a~b
 * 1号分区:hello~c~d
 * 2号分区:hello~e~f
 *
 * 最终结果:hello~hello~a~b~hello~c~d~hello~e~f
 */
String str = rdd.fold("hello", new Function2<String, String, String>() {
    @Override
    public String call(String v1, String v2) throws Exception {
        return v1 + "~" + v2;
    }
});

System.out.println(str);
sc.stop();

Scala代码:

Scala 复制代码
val conf = new SparkConf().setMaster("local").setAppName("FoldTest")
val sc = new SparkContext(conf)

val rdd: RDD[String] = sc.parallelize(List("a", "b", "c", "d", "e", "f"), 3)
rdd.mapPartitionsWithIndex((index, iter) => {
  val list = new ListBuffer[String]()
  while (iter.hasNext) {
    list.append(s"rdd partition index: $index ,current value: ${iter.next()}")
  }
  list.iterator
}).foreach(println)

/**
 * 0号分区:a b
 * 1号分区:c d
 * 2号分区:e f
 * map端聚合:
 * 0号分区:hello~a~b
 * 1号分区:hello~c~d
 * 2号分区:hello~e~f
 *
 * 最终结果:hello~hello~a~b~hello~c~d~hello~e~f
 */
val result: String = rdd.fold("hello")((v1, v2) => {
  v1 + "~" + v2
})

println(result)

sc.stop()

二、aggregate使用案例

aggregate用于对RDD中的元素进行聚合操作,最终返回一个结果。与 fold 和 reduce 等算子不同,aggregate 允许用户分别定义分区内和分区间的聚合函数,提供了更大的灵活性。

aggregate函数签名如下:

Scala 复制代码
def aggregate[U: ClassTag](zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U) => U): U
  • zeroValue:聚合操作的初始值,类型为 U。
  • seqOp:分区内的聚合函数,用于将分区内的元素与累加器进行合并,类型为 (U, T) => U。
  • combOp:分区间的聚合函数,用于将不同分区的累加器结果进行合并,类型为 (U, U) => U

aggregate工作原理:在每个分区内,使用初始值 zeroValue 和函数 seqOp,将该分区内的所有元素进行聚合。在所有分区内的聚合完成后,使用初始值 zeroValue 和函数 combOp,将各分区的结果进行全局聚合,得到最终结果。

Java代码:

java 复制代码
SparkConf conf = new SparkConf().setMaster("local").setAppName("AggregateTest");
JavaSparkContext sc = new JavaSparkContext(conf);

JavaRDD<String> rdd = sc.parallelize(Arrays.asList("a","b","c","d","e","f"), 3);
rdd.mapPartitionsWithIndex(new Function2<Integer, Iterator<String>, Iterator<String>>() {
    @Override
    public Iterator<String> call(Integer index, Iterator<String> iter) throws Exception {
        ArrayList<String> list = new ArrayList<>();
        while (iter.hasNext()) {
            String next = iter.next();
            list.add("rdd partition index: " + index + " current value: " + next);
        }
        return list.iterator();
    }
},true).foreach(x-> System.out.println(x));

/**
 * 0号分区:a b
 * 1号分区:c d
 * 2号分区:e f
 *
 * map端聚合:
 * 0号分区:hello~a~b
 * 1号分区:hello~c~d
 * 2号分区:hello~e~f
 *
 * 最终结果:hello@hello~a~b@hello~c~d@hello~e~f
 */
String result = rdd.aggregate("hello", new Function2<String, String, String>() {

    @Override
    public String call(String s1, String s2) throws Exception {
        return s1 + "~" + s2;
    }
}, new Function2<String, String, String>() {
    @Override
    public String call(String s1, String s2) throws Exception {
        return s1 + "@" + s2;
    }
});

System.out.println(result);
sc.stop();

Scala代码:

Scala 复制代码
val conf = new SparkConf().setMaster("local").setAppName("FoldTest")
val sc = new SparkContext(conf)

val rdd: RDD[String] = sc.parallelize(List("a", "b", "c", "d", "e", "f"), 3)
rdd.mapPartitionsWithIndex((index, iter) => {
  val list = new ListBuffer[String]()
  while (iter.hasNext) {
    list.append(s"rdd partition index: $index ,current value: ${iter.next()}")
  }
  list.iterator
}).foreach(println)

val result: String = rdd.aggregate("hello")(
  (v1, v2) => {
    v1 + "~" + v2
  },
  (v1, v2) => {
    v1 + "@" + v2
  }
)

println(result)
sc.stop()

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨
相关推荐
Qyr994 小时前
2026全球汽车碳刷行业发展全景分析报告
大数据
蓝速科技5 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
精益数智工坊5 小时前
云计算环境数据怎么同步?云计算集成方案有哪些?
大数据·人工智能·数据挖掘·数据可视化
huashengzsj6 小时前
什么是DMS经销商管理系统?国内经销商管理系统有哪些品牌
大数据
IT毕设梦工厂7 小时前
计算机毕业设计选题推荐:基于大数据的草鱼价格分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·python·数据挖掘·数据分析·课程设计·大数据毕设项目
辛迪聊物业数字化8 小时前
智慧社区物业管理软件新手部署与实操指南
大数据·php
字节跳动数据平台8 小时前
模型再强,为什么 Demo 还是进不了生产?
大数据
南京兴帝文化传媒有限公司8 小时前
本地生活服务GEO优化实战:宁国花店地图关键词布局带来订单翻倍的技术路径
大数据·人工智能·生活·geo 优化·geo优化避坑·ai搜索获客
跨境小彭8 小时前
Temu运营避坑:制造地点信息填写规范、后果及批量实操教程
大数据·运维·自动化·跨境电商·temu
Cx330❀8 小时前
【Linux网络】网络层 IP 协议:从网段划分到内核源码解析
大数据·linux·服务器·网络·tcp/ip·性能优化·langchain