在使用map()或者filter()之类的函数时,可以使用在map外面定义的变量,但是无法改变变量的值。共享变量(累加器和广播变量)突破了这一个限制。
累加器
将文本按照空格分隔,顺便统计空行个数:
val file = sc.textFile("file.txt")
val blankLines = sc.accumulator(0) // 创建Accumulator[Int]并初始化为0
val res = file.flatMap( line => {
if (line == "") {
blankLines += 1
}
lines.split(" ")
})
res.collect() // 这里随便执行一个action,这样才会执行map中的运算
println(blankLines.value)
广播变量
在RDD的操作中如果每一次都使用同一个变量,驱动节点每次都会发送该变量到各个工作节点,如果变量很大,浪费了通信的开销,这种情况下可以使用广播变量,这个值只会被发送到各节点一次。
用法:
val broadcastVar = sc.broadcast(1)
sc.parallelize(1 to 10).map(_ + broadcastVar.value)
没有评论:
发表评论