Scala 如果(!rdd.partitions.isEmpty)不工作,则触发流式处理
我试图从kafka服务器创建一个数据流,然后对该数据流进行一些转换。我已经包含了一个关于流是否为空的捕获(Scala 如果(!rdd.partitions.isEmpty)不工作,则触发流式处理,scala,apache-kafka,spark-streaming,kafka-consumer-api,dstream,Scala,Apache Kafka,Spark Streaming,Kafka Consumer Api,Dstream,我试图从kafka服务器创建一个数据流,然后对该数据流进行一些转换。我已经包含了一个关于流是否为空的捕获(if(!rdd.partitions.isEmpty));但是,即使没有将任何事件发布到卡夫卡主题,也永远不会到达else语句 val stream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics) stream.foreachRDD
if(!rdd.partitions.isEmpty)
);但是,即使没有将任何事件发布到卡夫卡主题,也永远不会到达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
时,是否应该使用另一种语句来检查流是否为空?使用RDD.isEmpty
而不是RDD.partitions.isEmpty
,它添加了一个检查底层分区是否实际包含元素的检查:
stream.foreachRDD { rdd =>
if(!rdd.isEmpty) {
// Stuff
}
}
RDD.partitions.isEmpty
不起作用的原因是RDD
中存在一个分区,但该分区本身是空的。但是从分区
这是一个数组[Partition]
的视图来看,它不是空的