Spark广播变量实现原理及基础编程

Posted 学亮编程手记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark广播变量实现原理及基础编程相关的知识,希望对你有一定的参考价值。

Spark广播变量实现原理及基础编程

实现原理

广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只读值,以供一个或多个 Spark 操作使用。比如,如果你的应用需要向所有节点发送一个较大的只读查询表,广播变量用起来都很顺手。在多个并行操作中使用同一个变量,但是 Spark 会为每个任务分别发送。

基础编程

pom

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <spark.version>3.1.1</spark.version>
    <spark.scala.version>2.12</spark.scala.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_${spark.scala.version}</artifactId>
        <version>${spark.version}</version>
    </dependency>
</dependencies>

代码

package com.zxl.spark.core

import org.apache.spark.broadcast.Broadcast
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object BroadcastDemo {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[4]").setAppName("BroadcastDemo")
    val sc: SparkContext = new SparkContext(conf)
    val rdd: RDD[(String, Int)] = sc.makeRDD(List( ("a",1), ("b", 2), ("c", 3), ("d", 4) ),4)
    val list: List[(String, Int)] = List(("a", 4), ("b", 5), ("c", 6), ("d", 7))
    val broadcast: Broadcast[List[(String, Int)]] = sc.broadcast(list)
    //这里使用到的是偏函数
    rdd.map{
      case (key,num)=>{
        var num2=0
        for ((k,v) <- broadcast.value) {
          if (k==key){
            num2=v
          }
        }
        (key,(num,num2))
      }
    }.collect().foreach(println)
  }
}

运行结果

(a,(1,4))
(b,(2,5))
(c,(3,6))
(d,(4,7))

以上是关于Spark广播变量实现原理及基础编程的主要内容,如果未能解决你的问题,请参考以下文章

Spark 累加器

Spark流处理中的广播变量

sparksql缓存表能做广播变量吗

Spark(20)——广播变量和累加器

Spark编程进阶

Spark调优Broadcast广播变量