如何判断DStream是否为空

时间:2016-06-20 11:52:45

标签: apache-spark spark-streaming

我有2个输入,第一个输入是流(比如input1),第二个是批处理(比如input2)。 我想弄清楚第一个输入中的键是否匹配第二个输入中的单行或多行。 进一步的转换/逻辑取决于匹配的行数,无论是单行匹配还是多行匹配(对于第一个输入中的至少一个键)

if(single row matches){
     // do something
}else{
     // do something
}

我到目前为止尝试的代码

val input1Pair = streamData.map(x => (x._1, x))
val input2Pair = input2.map(x => (x._1, x))
val joinData = input1Pair.transform{ x => input2Pair.leftOuterJoin(x)}
val result = joinData.mapValues{
    case(v, Some(a)) => 1L
    case(v, None) => 0
 }.reduceByKey(_ + _).filter(_._2 > 1)

我已完成上述编码。 当我执行result.print时,如果所有键只匹配input2中的一行,则它不会打印任何内容。 由于DStream可能有多个RDD,因此不确定如何判断DStream是否为空。如果可以,那么我可以进行if检查。

1 个答案:

答案 0 :(得分:4)

没有确定DStream是否为空的函数,因为DStream表示一段时间内的集合。从概念的角度来看,空的DStream将是一个从不拥有数据且不会非常有用的流。

可以做的是检查给定的微量分析是否有数据:

build.gradle

请注意,在任何给定的时间点,只有一个RDD。

我认为实际的问题是如何检查参考RDD与DStream中的数据之间的匹配数。可能最简单的方法是将两个集合相交并检查交叉点大小:

dstream.foreachRDD{ rdd => if (rdd.isEmpty) {...} }

我们还可以在val intersectionDStream = streamData.transform{rdd => rdd.intersection(input2)} intersectionDStream.foreachRDD{rdd => if (rdd.count > 1) { ..do stuff with the matches } else { ..do otherwise } } 操作中放置以RDD为中心的转换:

foreachRDD