[Spark进阶]-- 广播变量

第一种:不可变类型

package com.scala
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
/**
 * scala实现广播变量(第一种:不可变类型)
 * 增加后的结果:2
    增加后的结果:4
    增加后的结果:6
    增加后的结果:8
    增加后的结果:10
 */
object BroadCastValue {
  def main(args:Array[String]):Unit={
    val conf=new SparkConf().setAppName("BroadCastValue1").setMaster("local[1]")
    //获取contex
    val sc=new SparkContext(conf)
    //创建广播变量
    val broads=sc.broadcast(3)//变量可以是任意类型
    //创建一个测试的List
    val lists=List(1,2,3,4,5)
    //转换为rdd(并行化)
    val listRDD=sc.parallelize(lists)
    //map操作数据
    val results=listRDD.map(x=>x*broads.value)
    //遍历结果
    results.foreach(x => println("增加后的结果:"+x))
    sc.stop
  }
}

第二种:累加器

package com.scala
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
/**
 * 第二种广播变量:累加器
 */
object AccumulatorValue {
    def main(args:Array[String]):Unit={
      val conf=new SparkConf().setAppName("AccumulatorValue2").setMaster("local[2]")
     //获取context
      val sc=new SparkContext(conf)
      //创建广播变量
      var accumulator=sc.accumulator(2)
      //创建测试的List
      val lists=List(1,2,3,4,5)
      //转换list为RDD
      val rdd=sc.parallelize(lists)
      //进行map操作
      val result=rdd.foreach { x => {
        if(x<5){
          accumulator+=3
//          accumulator.add(2)
//          println(accumulator.value)不能再task中取值,只能在driver里获取
//Caused by: java.lang.UnsupportedOperationException: Can't read accumulator value in task          
        }
      }}
      //取出增加后的广播变量值
      println("accumulator is "+accumulator.value)
    }
}

 

你可能感兴趣的:(Spark)