当前位置: 首页 > news >正文

大数据Spark(七十三):Transformation转换算子glom和foldByKey使用案例

文章目录

Transformation转换算子glom和foldByKey使用案例

一、glom使用案例

二、foldByKey使用案例


Transformation转换算子glom和foldByKey使用案例

一、glom使用案例

glom可以将每个分区中的数据元素合并为一个数组,将RDD[T]转换成RDD[Array[T]]类型。如果RDD数据量小且需要对分区内的数据进行统计时(最大、最小值统计)可以使用glom。

Java代码:

SparkConf conf = new SparkConf().setMaster("local").setAppName("GlomTest");
JavaSparkContext sc = new JavaSparkContext(conf);JavaRDD<Integer> rdd = sc.parallelize(Arrays.asList(10, 20, 5, 7, 9, 20, 15, 3, 8), 3);
rdd.mapPartitionsWithIndex(new Function2<Integer, Iterator<Integer>, Iterator<String>>() {@Overridepublic Iterator<String> call(Integer index, Iterator<Integer> iter) throws Exception {ArrayList<String> list = new ArrayList<>();while (iter.hasNext()) {Integer next = iter.next();list.add("rdd1 partition index: " + index + " current value: " + next);}return list.iterator();}
},true).foreach(s->System.out.println(s));//glom: 将RDD每个分区中的元素放到一个集合中,形成RDD
JavaRDD<List<Integer>> glomRDD = rdd.glom();glomRDD.foreach(list->{System.out.println(list);//计算每个分区元素总和int sum = 0;for (Integer i : list) {sum += i;}System.out.println("sum: " + sum);
});sc.stop();

Scala代码:

val conf = new SparkConf().setMaster("local").setAppName("GlomTest")
val sc = new SparkContext(conf)val rdd: RDD[Int] = sc.parallelize(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 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
},true).foreach(println)val result: RDD[Array[Int]] = rdd.glom()
result.foreach(list=>{println(list.mkString(","))println(list.sum)
})sc.stop()

二、foldByKey使用案例

foldByKey针对K,V格式RDD进行数据聚合操作,与reduceByKey类似,该算子是map端有预聚合的算子,但可以为每个分区中的每个不同K提供一个初始值。其函数签名如下:

def foldByKey(zeroValue: V)(func: (V, V) => V): RDD[(K, V)]
  • zeroValue:在map端聚合过程,每个分区中的每个不同K的初始值。
  • func:用于在map端和reduce端合并具有相同K的V的函数。

注意:需要对具有相同键的数据进行聚合操作,且分区内和分区间的聚合规则相同时,可以使用foldByKey,如果分区内和分区间的聚合规则不相同可以使用aggregateByKey。

Java代码:

SparkConf conf = new SparkConf().setMaster("local").setAppName("foldByKeyTest");
JavaSparkContext sc = new JavaSparkContext(conf);JavaPairRDD<String, Integer> rdd = sc.parallelizePairs(Arrays.asList(new Tuple2<String, Integer>("a", 1),new Tuple2<String, Integer>("b", 2),new Tuple2<String, Integer>("a", 3),new Tuple2<String, Integer>("b", 4),new Tuple2<String, Integer>("c", 5)
));JavaPairRDD<String, Integer> result = rdd.foldByKey(10, new Function2<Integer, Integer, Integer>() {@Overridepublic Integer call(Integer v1, Integer v2) throws Exception {return v1 + v2;}
});//结果:a:14 b:16 c:15
result.foreach(tp-> System.out.println(tp));sc.stop();

Scala代码:

val conf = new SparkConf().setMaster("local").setAppName("FoldByKeyTest")
val sc = new SparkContext(conf)val rdd: RDD[(String, Int)] = sc.parallelize(Array(("a", 1),("b", 2),("a", 3),("b", 4),("c", 5)), 3)rdd.foldByKey(10)(_+_).foreach(println)sc.stop()

结果:

#如果分区设置为1个,每个分区不同key初始值为10
结果:a:14 b:16 c:15#如果分区设置为3个,每个分区不同key初始值为10
结果:a:24 b:26 c:15

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨
http://www.dtcms.com/a/613418.html

相关文章:

  • 工业显示器在真空包装机中的应用
  • 西安网站建设咪豆广告发布与制作
  • 无锡网站设计服务电子商务网站技术
  • 跨平台账号矩阵高效协同术
  • Ubuntu重新挂载Windows C盘以及如何安全退出外挂硬盘
  • 前端微前端框架原理,qiankun源码分析
  • 深入HarmonyOS打印服务:从基础到高级应用开发
  • 在ubuntu中创建根文件系统
  • 科大讯飞哪些做教学资源的网站泰安网络推广seo
  • 建站资源共享怎样在阿里云做网站
  • 前端无障碍开发检查清单,WCAG合规
  • 【软考 位示图大小计算问题】物理块|字长|字数
  • 用Ai生成webos设计稿
  • DNS练习
  • 学生可以做的网站兼职门户网站建设哪专业
  • Python 编程实战 · 实用工具与库 — Flask 路由与模板
  • Wayland 会话下使用 Fcitx 5 输入法与 GNOME Shell 的兼容性
  • 第39节:3D打印输出:模型导出准备
  • 买空间的网站好wordpress萌
  • sql基本增删改查语句汇总
  • vue3-封装权限按钮组件和自定义指令
  • 物联网定位技术实验报告|实验一 Wi-Fi指纹定位
  • 标签的ref属性
  • 网站站内的seo怎么做拍卖网站建设需求
  • 微服务即时通讯系统(服务端)——消息转发微服务设计与实现详解(5)
  • 抽象工厂模式在智慧蔬菜大棚物联网系统中的应用
  • 新建站点的步骤网站建设工具的公司
  • 【微服务】【Nacos 3】 ① 深度解析:架构演进、核心组件与源码剖析
  • Rust赋能Android蓝牙协议栈:从C++到安全高效的重构之路
  • 网站 建设 原则wordpress入门教程8