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))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295589.html
標籤:其他
上一篇:hnu暑期CCF培訓之多項式加法