
文章目录
Action行动算子foreachpartition和count使用案例
Action行动算子foreachpartition和count使用案例
Action算子对 RDD 执行计算操作,将结果返回到Driver端或写入外部存储,这些操作会触发实际的计算过程,即:Transformations类算子是延迟执行,Action类算子是触发执行。此外,一个action算子对应一个spark job,一个application中有几个action算子就有几个job。下面对常见的Action算子进行介绍。
一、foreach
循环遍历数据集中的每个元素,运行相应的逻辑,这里不再给出案例。
二、foreachpartition
foreach遍历单位为每条数据,foreachPartition遍历单位是每个分区,可以对每个分区的数据进行批量操作。适用于需要对每个分区的数据进行批量处理的场景,例如在每个分区中建立一次数据库连接,然后对分区内的数据进行批量写入,避免为每个元素建立连接的开销。
Java代码:
java
SparkConf conf = new SparkConf().setMaster("local").setAppName("foreachPartitionTest");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> rdd = sc.parallelize(Arrays.asList("a", "b", "c", "d", "e", "f"), 2);
//foreach 遍历每条数据,每条数据都要创建一次数据库连接,效率低
/*rdd.foreach(str->{
System.out.println("创建数据库连接...");
System.out.println("插入数据:" + str);
System.out.println("关闭数据库连接...");
});*/
//foreachPartition 遍历每个分区的数据,每个分区创建一次数据库连接,效率高
rdd.foreachPartition(iter->{
System.out.println("创建数据库连接...");
while (iter.hasNext()) {
String s = iter.next();
System.out.println("插入数据:" + s);
}
System.out.println("关闭数据库连接...");
});
sc.stop();
Scala代码:
Scala
val conf: SparkConf = new SparkConf().setMaster("local").setAppName("ForeachPartitionTest")
val sc = new SparkContext(conf)
val rdd: RDD[String] = sc.parallelize(List("a", "b", "c", "d", "e", "f"), 2)
//foreach 遍历每条数据,每条数据都要创建一次数据库连接,效率低
/*rdd.foreach(str=>{
println("创建数据库连接...")
println(s"插入数据... $str")
println("关闭数据库连接...")
})*/
//foreachPartition 遍历每个分区的数据,每个分区创建一次数据库连接,效率高
rdd.foreachPartition(iter=>{
println("创建数据库连接...")
while (iter.hasNext){
val next = iter.next()
println(s"插入数据... $next")
}
println("关闭数据库连接...")
})
sc.stop()
三、count
返回数据集中的元素总数量,会在结果计算完成后回收到Driver端。
案例:统计数据总条数。
Java代码:
java
SparkConf conf = new SparkConf().setMaster("local").setAppName("filter");
JavaSparkContext sc = new JavaSparkContext(conf);
//count:统计RDD中元素的个数
long count = sc.parallelize(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)).count();
System.out.println(count);
sc.stop();
Scala代码:
Scala
val conf: SparkConf = new SparkConf().setMaster("local").setAppName("CountTest")
val sc = new SparkContext(conf)
//count: 统计RDD中元素的个数
val count: Long = sc.parallelize(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)).count()
println(count)
sc.stop()
- 📢博客主页:https://lansonli.blog.csdn.net
- 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
- 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
- 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨