- 广播变量
广播变量理解图
数据源
科比
詹姆斯
乔丹
杜兰特
科比
詹姆斯
乔丹
杜兰特
- scala代码
package examples
import org.apache.spark.{SparkConf, SparkContext}
/**
* @Author yqq
* @Date 2021/12/11 23:35
* @Version 1.0
*/
object BroadCastTest1 {
def main(args: Array[String]): Unit = {
val context = new SparkContext(
new SparkConf()
.setMaster("local")
.setAppName("test1")
)
context.setLogLevel("Error")
val blackName = List[String]("科比", "杜兰特")
val broadCastName = context.broadcast(blackName)
context.textFile("data/names")
.filter(e=>{
val value = broadCastName.value
!value.contains(e)
}).foreach(println)
}
}
- java代码
package examples;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.broadcast.Broadcast;
import java.util.Arrays;
import java.util.List;
/**
* @Author yqq
* @Date 2021/12/11 23:16
* @Version 1.0
*/
public class BroadCastTest {
public static void main(String[] args) {
JavaSparkContext context = new JavaSparkContext(
new SparkConf()
.setMaster("local")
.setAppName("test")
);
context.setLogLevel("Error");
List<String> blackName = Arrays.asList("乔丹", "詹姆斯");//在Driver端
Broadcast<List<String>> listBroadcast = context.broadcast(blackName);
context.textFile("data/names",10)
.filter(e->{
List<String> value = listBroadcast.value();
return !value.contains(e);
}).foreach(e-> System.out.println(e));
// context.textFile("data/names",10).filter(e->{
// return !blackName.contains(e);//Excecutor端
// }).foreach(e-> System.out.println(e));
}
}
注意事项:
- 能不能将一个 RDD 使用广播变量广播出去? 不能,因为 RDD 是不存储数据的。可以将 RDD 的结果广播出去
- 广播变量只能在 Driver 端定义,不能在 Executor 端定义。
- 在 Driver 端可以修改广播变量的值,在 Executor 端无法修改 广播变量的值。