sparkStreaming foreachRDD算子

本文介绍了SparkStreaming中的核心算子foreachRDD,详细解释了它的定义和作用,包括如何对Dstream中的RDD进行操作以及如何动态改变广播变量的值。同时提到了transform算子与foreachRDD的相似性和区别,transform作为转换算子的特点被强调。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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 算子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值