当我遇到updateStateByKey()函数时,我刚刚开始寻找使用Spark Streaming进行有状态计算的解决方案。
我试图解决的问题: 10,000个传感器每分钟产生一个二进制值。
如果传感器报告的连续值彼此不同,我想将其标记并将其作为状态更改事件发送给Kafka。
我的假设是在这个例子中可以使用updateStateByKey(),但是我并不完全了解推荐的实现方法。
答案 0 :(得分:1)
我假设您将从传感器获取(String,Int)对的流,其中String是传感器的ID,Int是传感器返回的二进制值。有了这个假设,你可以尝试这样的事情:
val sensorData: DStream[(String, Int)] = ???
val state = sensorData.updateStateByKey[(String, Int)](updateFunction _)
def updateFunction(newValues: Seq[(String, Int)], currentValues: Seq[(String, Int)]) = {
val newValuesMap = newValues.toMap
val currentValuesMap = currentValues.toMap
currentValuesMap.keys.foreach ( (id) =>
if(currrentValuesMap.get(id) != newValuesMap.getOrElse(id, -1)) {
//send to Kafka
}
)
Some(newValues)
}
答案 1 :(得分:0)
有没有办法管理国家的生活/资源?或者它一直在增长?
例如在this sessionization example中,州会永远长大吗?有没有办法管理它,所以你可以清除/存档3个月只有汇总数据?