我一直在尝试对流数据进行数据聚合,并收到以下错误:
窗口方法存在此问题-'流式数据帧/数据集不支持基于非时间的窗口'
我正在寻找一种窗口方法的替代方法,以对流数据进行聚合。
w = (Window
.partitionBy("orig_time")
.orderBy(F.col("epoch").cast('long'))
.rangeBetween(-minutes(5), 0))
#windowedDeviceDF = deviceDF.withColumn('rolling_average', F.avg("tag_value").over(w))
windowSpec5 = Window.partitionBy("orig_time").orderBy(F.col("epoch").cast('long')).rangeBetween(-minutes(5),0)
windowSpec10 = Window.partitionBy("orig_time").orderBy(F.col("epoch").cast('long')).rangeBetween(-minutes(10), 0)
windowedDeviceDF = deviceDF.withColumn("avg5", F.avg("tag_value").over(windowSpec5)).withColumn("avg10",F.avg("tag_value").over(windowSpec10)).withColumn('occurrences_in_5_min', F.count('epoch').over(w)).withColumn('rolling_average', F.avg("tag_value").over(w)).select(
"tag_name", "epoch", "avg5", "avg10", "occurrences_in_5_min", "rolling_average")
windowedDeviceDF = deviceDF.groupBy(deviceDF.tag_name, deviceDF.tag_value, window(deviceDF.orig_time, windowDuration, slideDuration)).avg()
答案 0 :(得分:0)
与滑动窗口不同,但避免以某种方式保留数据...
使用“指数移动平均线”:
avg += fact * (xn - avg)
哪里
avg
是当前平均值;这是唯一需要从一行到另一行保留的变量。 (与最后N个值相对)fact
是控制平均平滑度的常数,0.01对变化的响应非常慢; 0.5响应很快。xn
为我们计算(当前行中)的平均值。