广播变量的理解(原理+图解+代码)

 一.图解

 二.说明

  • 能不能将一个RDD使用广播变量广播出去?

不能,因为RDD是不存储数据的。可以将RDD的结果广播出去。

  • 广播变量只能在Driver端定义,不能在Executor端定义。
  • 在Driver端可以修改广播变量的值,在Executor端无法修改广播变量的值。

三.代码示例:

package com.bjsxt;

import java.util.Arrays;
import java.util.List;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.VoidFunction;

public class Add {
    public static void main(String[] args) {
        SparkConf conf=new SparkConf()
                .setAppName("test")
                .setMaster("local");
        JavaSparkContext sc=new JavaSparkContext(conf);
        /**
         * 对于广播变量的理解
         */
        //list要转换成final类型的修饰
        final List<String> asList = Arrays.asList("hello java","hello python","hello word");
        JavaRDD<String> rdd1 = sc.parallelize(Arrays.asList("hello java","hello python","hello text"));
        JavaRDD<String> rdd2 = rdd1.filter(new Function<String, Boolean>() {
            
            @Override
            public Boolean call(String line) throws Exception {
                /**
                 * aslist中包含line的部分
                 * 然后再在此基础上取反
                 */
                return !asList.contains(line);
            }
        });
        /**
         * 循环打印输出

         * 同时也是触发懒算子的执行
         */
        rdd2.foreach(new VoidFunction<String>() {
            
            @Override
            public void call(String arg0) throws Exception {
                System.out.println(arg0);            
            }
        });
    }
}

猜你喜欢

转载自blog.csdn.net/wyqwilliam/article/details/81173576