#foreachRDD是Dstream的outPutOperator算子
foreachRDD定义:
def foreachRDD(foreachFunc : org.apache.spark.api.java.function.VoidFunction[R]) : scala.Unit
##foreachRDD作用:
对Dstream中RDD操作
动态改变广播变量值
foreachRDD注意事项:
foreachRDD虽然是outPutOperator算子,但是outPutOperator算子内是对RDD的transformation action操
作,只有RDD的transformation算子,outPutOperator算子是不执行的,要有action触发,outPutOperator
算子才能执行
call 方法内,rdd算子外是driver端执行的,每一个Duration执行一次,适合读取外部知识文件,作为广播
变量,做到动态改变
call 方法内,不能直接使用主方法定义的JavaSparkContext,要重新从RDD中获取
`
JavaSparkContext javaSparkContext = new JavaSparkContext(pairRDD.context());
Broadcast<String> broadcast = javaSparkContext.broadcast("hello");`
//foreachRDD 算子可以对Dstream里面的rdd的操作
reducedDstream.foreachRDD(new VoidFunction<JavaPairRDD<String, Integer>>() {
@Override
public void call(JavaPairRDD<String, Integer> pairRDD) throws Exception {
//这在driver端执行,每个duration都执行一次
//Broadcast<String> broadcast = jsc.broadcast("hello");
//java.io.NotSerializableException: org.apache.spark.api.java.JavaSparkContext
System.out.println("diver端执行的");
//不能直接拿方法外的JavaSparkContext使用
//这块可以读外部知识库,然后广播出去,因为不断读,可以动态改变广播变量
JavaSparkContext javaSparkContext = new JavaSparkContext(pairRDD.context());
Broadcast<String> broadcast = javaSparkContext.broadcast("hello");
JavaPairRDD<String, Integer> pairRDD1 = pairRDD.mapToPair(new PairFunction<Tuple2<String, Integer>, String, Integer>() {
//这在excutor执行,有数据才执行
@Override
public Tuple2<String, Integer> call(Tuple2<String, Integer> t) throws Exception {
System.out.println("--------------这是RDD的mapToPair方法-----------------------------------------------");
return new Tuple2<String, Integer>(t._1 + "~", t._2);
}
});
//要有rdd的action算子。有rdd的action算子,foreachRDD才能触发
pairRDD1.foreach(new VoidFunction<Tuple2<String, Integer>>() {
@Override
public void call(Tuple2<String, Integer> t2) throws Exception {
System.out.println(t2);
System.out.println(broadcast.value());
}
});
transform和foreachRDD 类似,只是transform 是transformation 算子