Statistics 是否可以使用spark streaming实时更新值?

Statistics 是否可以使用spark streaming实时更新值?,statistics,apache-spark,streaming,Statistics,Apache Spark,Streaming,假设我有一个双倍值流,我想每10秒计算一次平均值。我怎么能有一个滑动窗口,它不需要重新计算平均值,而是通过删除最旧的10秒部分,只添加新的10秒值来更新它呢?:使用reduceByWindow及其两个函数参数(跳到代码段的最后一段) 你的问题有两种解释,一种是具体的解释(我如何获得一小时的运行平均值,每2秒更新一次),另一种是一般的解释(我如何获得以稀疏方式更新状态的计算)。以下是一般问题的答案 首先,请注意,有一种方法可以表示您的数据,这样更新后的平均值很容易计算,基于:这表示您的数据是流的增

假设我有一个双倍值流,我想每10秒计算一次平均值。我怎么能有一个滑动窗口,它不需要重新计算平均值,而是通过删除最旧的10秒部分,只添加新的10秒值来更新它呢?

:使用
reduceByWindow
及其两个函数参数(跳到代码段的最后一段)

你的问题有两种解释,一种是具体的解释(我如何获得一小时的运行平均值,每2秒更新一次),另一种是一般的解释(我如何获得以稀疏方式更新状态的计算)。以下是一般问题的答案

首先,请注意,有一种方法可以表示您的数据,这样更新后的平均值很容易计算,基于:这表示您的数据是流的增量构造,具有最大的共享。但在计算上,重新计算每批的平均值效率较低——正如您所指出的

如果您确实想更新复杂的可逆状态计算,但又不想触及流的结构,那么就有——但Spark不能帮助您在流中反映计算的增量方面,您必须自己管理它

在这里,你有一些简单和可逆的东西,你没有键的概念。您可以使用它的逆归约参数,使用通常的函数来计算增量平均值

val myInitialDStream: DStream[Float]

val myDStreamWithCount: DStream[(Float, Long)] = 
  myInitialDStream.map((x) => (x, 1L))

def addOneBatchToMean(previousMean: (Float, Long), newBatch: (Float, Long)): (Float, Long) = 
  (previousMean._1 + newBatch._1, previousMean._2 + newBatch._2)

def removeOneBatchToMean(previousMean: (Float, Long), oldBatch: (Float, Long)): (Float, Long) = 
  (previousMean._1 - oldBatch._1, previousMean._2 - oldBatch._2)

val runningMeans = myDStreamWithCount.reduceByWindow(addOneBatchToMean, removeOneBatchToMean, Durations.seconds(3600), Duractions.seconds(2))

您得到一个元素
RDD
s的流,每个元素都包含一对(m,n),其中m是1h窗口中的运行和,n是1h窗口中的元素数。只需返回(或
map
to)m/n即可获得平均值。

请您添加一个示例……当然可以。让我们假设我必须每2秒计算一次平均值,数据来自一个流,但在1小时的窗口内。这意味着我希望每2秒排除窗口外的数据,包括新的数据,但不重新计算所有平均值。