大数据全系列 教程
1869个小节阅读:466.9k
目录
408考研
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
问题引入:
xxxxxxxxxx
package com.itbaizhan.core
import org.apache.spark.rdd.RDD
import org.apache.spark.util.LongAccumulator
import org.apache.spark.{SparkConf, SparkContext}
object CoreAccumulator3 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[*]").setAppName("Accumulator3")
val sc = new SparkContext(conf)
//1.创建一个rdd对象
val rdd: RDD[Int] = sc.parallelize(Range(1, 26, 1).toList, 2)
//2.创建一个累加器对象
//累加器可能会出现被重复计算的问题
val sum: LongAccumulator = sc.longAccumulator("myFirstAcc")
//如果担心之前被使用过,怕产生不必要的干扰,可以重置
//sum.reset()
//3.自定义一个函数
def mapFunc(data:Int): Int ={
sum.add(1)
return data
}
//4.使用map算子调用mapFunc
val rddAcc: RDD[Int] = rdd.map(mapFunc)
//第一遍计算累加器
rddAcc.collect()
//第二遍计算累加器
val rdd1: RDD[Int] = rddAcc.map(_ * 10)
rdd1.collect()
println("driver sum:"+sum.value)//50
sc.stop()
}
}
发现累加器被重复计算了,如果解决?
解决方案:加缓存或CheckPoint即可。
xxxxxxxxxx
package com.itbaizhan.core
import org.apache.spark.rdd.RDD
import org.apache.spark.storage.StorageLevel
import org.apache.spark.util.LongAccumulator
import org.apache.spark.{SparkConf, SparkContext}
object CoreAccumulator3 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[*]").setAppName("Accumulator3")
val sc = new SparkContext(conf)
//1.创建一个rdd对象
val rdd: RDD[Int] = sc.parallelize(Range(1, 26, 1).toList, 2)
//2.创建一个累加器对象
//累加器可能会出现被重复计算的问题
val sum: LongAccumulator = sc.longAccumulator("myFirstAcc")
//如果担心之前被使用过,怕产生不必要的干扰,可以重置
//sum.reset()
//3.自定义一个函数
def mapFunc(data:Int): Int ={
sum.add(1)
return data
}
//4.使用map算子调用mapFunc
val rddAcc: RDD[Int] = rdd.map(mapFunc)
//B1.为rddAcc设置缓存
//rddAcc.cache()
//或者使用如下方式为rddAcc设置缓存
rddAcc.persist(StorageLevel.DISK_ONLY)
//第一遍计算累加器
rddAcc.collect()
//第二遍计算累加器
val rdd1: RDD[Int] = rddAcc.map(_ * 10)
rdd1.collect()
println("driver sum:"+sum.value)//25
//B2.最后记得将缓存清除
rddAcc.unpersist()
sc.stop()
}
}