2016年2月1日星期一

Spark中的累加器和广播变量

在使用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)

没有评论:

发表评论