package com.bjsxt.scala.spark.operator
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
/**
* 使用广播变量的注意点:
* 1、广播变量必须在Drivr端定义
* 2、广播变量不能在Executor端修改,只能读
* 问题:
* 1、可不可以使用广播变量将一个RDD给广播出去?
* 不可以!!!因为RDD是一个抽象的概念,并不是真实存储数据的
* 2、如何将一个RDD的计算结果广播出去?
* collect算子将这个RDD的计算结果拉回到Driver端,然后在创建一个广播变量
*/
object BroadCastTest {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("AggregateOperator").setMaster("local[3]")
val sc = new SparkContext(conf)
val blackNameList = Array(
"Hanhong",
"Fengjie",
"Wuyifan"
)
val rdd = sc.textFile("names")
/**
* 这种方式比较消耗内存空间
*/
rdd.filter(x=>{
!blackNameList.contains(x)
})
/**
* 使用广播变量来优化代码,节省内存的占用
*/
val brod = sc.broadcast(blackNameList)
rdd.filter { x => {
val blackNames = brod.value
!blackNames.contains(x)
} }.foreach { println }
sc.stop()
}
}