BroadCastTest

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()
   }
}

  

posted @ 2018-06-18 14:10  uuhh  阅读(115)  评论(0)    收藏  举报