一.图解
二.说明
- 能不能将一个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);
}
});
}
}