将变量值分配给Spark Streaming Scala

时间:2017-08-11 10:36:33

标签: scala apache-spark spark-streaming

我必须计算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
}

s1s2是DStream [传感器](传感器是自定义类)。

我哪里错了?

由于

1 个答案:

答案 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"
}