我必须计算DStream中元组的数量,并且根据值,我必须修改布尔变量的值。 不幸的是,我所做的并不是分配新的价值。 这是代码:
val teon = false
s1.foreachRDD( rdd => {
System.out.println("# events = " + rdd.count())
if (rdd.count().>(1000))
teon.equals(true)
else
teon.equals(false)
})
if(teon){
val ton2 = s2.map { x => x.sensor_name }
ton2.print
}
else {
val ton3 = s2.map { x => x.stt.spatial.unit }
ton3.print
}
s1
和s2
是DStream [传感器](传感器是自定义类)。
我哪里错了?
由于
答案 0 :(得分:1)
此代码中有两个问题:
第一个是teon
被声明为val
。它是不可变的,因此,它的值在程序执行期间永远不会改变。
第二个问题是结构性问题。在DStream
级别声明的转换,如:
if(teon){
val ton2 = s2.map { x => x.sensor_name }
ton2.print
}
首次加载程序时,仅评估一次,并添加到Dstream转换DAG中执行。让我们记住DStream
编程模型基于streamingContext
启动时应用的转换。这些步骤将根据teon
的初始值定义单个转换路径,之后不会更改。
由于我们希望根据流中包含 的值进行动态选择,因此我们需要在DStream
操作的上下文中 中执行这些决策。
考虑到这一点,代码应如下所示:
var teon = false
s1.foreachRDD{ rdd =>
val count = rdd.count // compute it only once!
System.out.println("# events = " + count)
teon = count > 1000 // use the boolean value directly
}
s2.foreachRDD { rdd =>
val ton = if (teon) {
rdd.map( x => x.sensor_name )
} else {
rdd.map( x => x.stt.spatial.unit ) // I'm assuming here that sensor_name and _stt.spatial_unit are the same type.
}
ton.take(10).foreach(e => println(e)) // implement DStream.print "by hand"
}