forEachPartition有效,但mapPartition不起作用

时间:2019-04-10 10:27:56

标签: apache-spark spark-streaming

我有一个Spark Streaming应用程序,可以读取Kafka流并将数据插入数据库。

这是代码段

eventDStream.foreachRDD { (rdd, time) =>
      val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges

      // First example that works
      val accumulator = streamingContext.sparkContext.longAccumulator
      rdd.foreachPartition { records =>
        val count = Consumer.process(records)
        accumulator.add(count)
      }
      println(s"accumulated $accumulator.value")
      // do the same but aggregate count, does not work
      val results = rdd.mapPartitions(records => Consumer.processIterator(records))
      val x = results.fold(0)(_ + _)
      println(x)
      eventDStream.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges)
    }

在第一部分中,我将foreachPartition与一个累加器一起使用来计算成功插入的次数

在第二部分中,我计算了一个RDD[Int],它表示每个RDD中成功插入的次数,并使用fold函数汇总结果

但是第二部分总是打印0,而第一部分总是按照我想要的做。

你能告诉我为什么吗?

谢谢

0 个答案:

没有答案