我使用Spark Streaming处理导入的数据。导入数据存储在DStream
中。此外,我有Creation
和Update
类,其中包含Foo
个对象。
我想完成的任务之一是更改检测。
所以我加入2个rdds(一个保存处理的数据批,另一个保存当前的状态)currentState
最初为空。
val stream: DStream[Foo]
val currentState: RDD[Foo]
val changes = stream
.transform { batch =>
batch.leftouterJoin(currentState) {
case(objectNew, Some(objectOld)) => Update(objectNew)
case(objectNew, None) => Creation(objectNew)
}
}
currentState = currentState.fullOuterJoin(changes).map {
case (Some(foo), None) => foo
case (_, Some(change)) => change.foo
}
}.cache()
之后我会过滤掉更新。
changes.filter(!_.isInstanceOf[Update])
我现在两次导入相同的数据。由于 state 最初为空,因此第一个导入的结果集由Creation
个对象组成,而第二个导入的结果集仅导致Update
个对象。因此第二个结果集changes
为空。
在这种情况下,我注意到性能大幅下降。如果我省略过滤器,它可以正常工作。
我无法想象这是预期的行为,但也许这是Spark Computation Internals的一个问题。任何人都可以解释为什么会这样吗?