我正在开发一个Spark应用程序,用于从Kafka服务器的两个不同主题topic_a
和topic_b
流式传输数据。我想要使用两个流并检查来自这两个主题的数据是否相等。
val streamingContext = new StreamingContext(sparkContext, Seconds(batchDuration))
val eventStream = KafkaUtils.createDirectStream[String, String](streamingContext, PreferConsistent, Subscribe[String, String](topics, consumerConfig))
def start(record: (RDD[ConsumerRecord[String, String]], Time)): Unit = {
// ...
def cmp(rddA: RDD[ConsumerRecord[String, String]], rddB: RDD[ConsumerRecord[String, String]]): Unit = {
// Do compare...
// but rddA or rddB may be empty! :-(
}
val rddTopicA = rdd.filter(_.topic == 'topic_a')
val rddTopicB = rdd.filter(_.topic == 'topic_b')
cmp(rddTopicA, rddTopicB)
}
eventStream.foreachRDD((x, y) => start((x, y)))
streamingContext.start()
streamingContext.awaitTermination()
问题在于,当比较cmp
中的两个RDD时,其中一个RDD可能为空,因为数据流可能尚未在Kafka中可用。是否有可能等到两个RDD具有相同的行数然后开始比较?或者首先将具有数据的RDD转换为DataSet,然后临时存储以供以后比较?