使用PySpark和不使用window对来自Kafka的流数据执行滚动平均
我一直在尝试对流数据执行数据聚合,出现以下错误: 窗口方法存在此问题-“流式数据帧/数据集不支持非基于时间的窗口” 我正在寻找一种替代窗口方法的方法来对流数据执行聚合使用PySpark和不使用window对来自Kafka的流数据执行滚动平均,pyspark,apache-kafka,pyspark-dataframes,Pyspark,Apache Kafka,Pyspark Dataframes,我一直在尝试对流数据执行数据聚合,出现以下错误: 窗口方法存在此问题-“流式数据帧/数据集不支持非基于时间的窗口” 我正在寻找一种替代窗口方法的方法来对流数据执行聚合 w = (Window .partitionBy("orig_time") .orderBy(F.col("epoch").cast('long')) .rangeBetween(-minutes(5), 0)) #windowedDeviceDF =
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()
与滑动窗口不同,但它避免了以某种方式保留数据 使用“指数移动平均线”: 在哪里
为当前平均值;这是唯一需要从一行保存到下一行的变量。(与最后N个值相反)avg
是一个控制平均平滑度的常数分数——0.01对变化的响应非常慢;0.5响应相当快事实
us当前行中的平均值xn
avg += fact * (xn - avg)