火花流如果(!rdd.partitions.isEmpty)不起作用

时间:2016-11-02 16:53:22

标签: scala apache-kafka spark-streaming kafka-consumer-api dstream

我正在尝试从kafka服务器创建一个dStream,然后在该流上进行一些转换。如果流是空的,我已经包含了一个catch(if(!rdd.partitions.isEmpty));但是,即使没有事件发布到kafka主题,也永远不会达到else语句。

val stream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics)

stream.foreachRDD { rdd =>
    if(!rdd.partitions.isEmpty) {

        val message = rdd.map((x$2) => x$2._2).collect().toList.map(parser)

        val val = message(0)

    } else println("empty stream...")

    ssc.start() 
    ssc.awaitTermination()

}

在使用KafkaUtils.createDirectStream而不是createStream时,是否应该使用替代语句检查流是否为空?

1 个答案:

答案 0 :(得分:4)

使用RDD.isEmpty代替RDD.partitions.isEmpty,它会添加一项检查,以查看基础分区是否确实包含元素:

stream.foreachRDD { rdd =>
  if(!rdd.isEmpty) {
    // Stuff
  }
}

RDD.partitions.isEmpty无效的原因是RDD内存在分区,但该分区本身为空。但是从partitions Array[Partition]的角度来看,它不是空的。