广播变量:分布式共享只读变量。 在多个并行操作中(Executor)使用同一个变量,Spark默认会为每个任务(Task)分别发送,这样如果共享比较大的对象,会占用很大工作节点的内存。 广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只读值,以供一个或多个Spark操作使用。比如,如果你的应用需要向所有节点发送一个较大的只读查询表,甚至是机器学习算法中的一个很大的特征向量,广播变量用起来都很顺手。 1)使用广播变量步骤: (1)通过对一个类型T的对象调用SparkContext.broadcast创建出一个Broadcast[T]对象,任何可序列化的类型都可以这么实现。 (2)通过value属性访问该对象的值(在Java中为value()方法)。 (3)变量只会被发到各个节点一次,应作为只读值处理(修改这个值不会影响到别的节点)。
package com.bupt.day06 import org.apache.spark.broadcast.Broadcast import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.rdd.RDD /** * @author yangkun * @date 2020/10/20 21:50 * @version 1.0 */ object broadcastDemo { def main(args: Array[String]): Unit = { //创建SparkConf并设置App名称 val conf: SparkConf = new SparkConf().setAppName("SparkCoreTest").setMaster("local[*]") //创建SparkContext,该对象是提交Spark App的入口 val sc: SparkContext = new SparkContext(conf) //想实现类似join效果 (a,(1,4)),(b,(2,5)),(c,(3,6)) val rdd: RDD[(String, Int)] = sc.makeRDD(List(("a",1),("b",2),("c",3))) val list: List[(String, Int)] = List(("a",4),("b",5),("c",6)) //创建一个广播变量 val broadlist: Broadcast[List[(String, Int)]] = sc.broadcast(list) val resRDD: RDD[(String, (Int, Int))] = rdd.map { case (k1, v1) => { var v3 = 0 // for ((k2, v2) <- list) { for ((k2, v2) <- broadlist.value) { if (k1 == k2) { v3 = v2 } } (k1, (v1, v3)) } } resRDD.collect().foreach(println) sc.stop() } }来自尚硅谷教程