Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 在Spark Streaming中使用updateStateByKey()从原始事件流生成状态更改流_Apache Spark_Spark Streaming - Fatal编程技术网

Apache spark 在Spark Streaming中使用updateStateByKey()从原始事件流生成状态更改流

Apache spark 在Spark Streaming中使用updateStateByKey()从原始事件流生成状态更改流,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我刚刚开始寻找一种使用Spark Streaming的有状态计算解决方案,这时我遇到了updateStateByKey()函数 我试图解决的问题是: 10000个传感器每分钟产生一个二进制值 如果传感器报告的连续值彼此不同,我想标记该值并将其作为状态更改事件发送到卡夫卡 我的假设是可以在本例中使用updateStateByKey(),但是我并不完全了解实现相同的建议方法。我假设您将从传感器中获得(字符串,Int)对流,其中字符串是传感器的ID,Int是传感器返回的二进制值。基于这种假设,您可以尝

我刚刚开始寻找一种使用Spark Streaming的有状态计算解决方案,这时我遇到了updateStateByKey()函数

我试图解决的问题是: 10000个传感器每分钟产生一个二进制值

如果传感器报告的连续值彼此不同,我想标记该值并将其作为状态更改事件发送到卡夫卡


我的假设是可以在本例中使用updateStateByKey(),但是我并不完全了解实现相同的建议方法。

我假设您将从传感器中获得(字符串,Int)对流,其中字符串是传感器的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)
}

有没有办法管理该州的生命/资源?还是它一直在成长


例如,在美国,国家将永远增长,对吗?有没有办法管理它,以便您可以清除/归档仅3个月的聚合数据或其他内容?

关于(String,Int)对,您是对的,我将试用您的代码,看看它是如何工作的。谢谢您嗨,Patrick,您能用
.mapWithState()
执行相同的过程吗?您可以返回任何您想要的新状态,因此您可以自由管理。在我上面回答的例子中,每次只存储当前状态,因此它不会增长。如果你把这个问题作为一个新的问题来问,而不是作为一个原始问题的答案,可能是最好的。