在不使用窗口的情况下,使用PySpark对来自Kafka的流数据进行滚动平均

时间:2020-09-20 19:30:35

标签: pyspark apache-kafka apache-kafka-streams pyspark-dataframes

我一直在尝试对流数据进行数据聚合,并收到以下错误:

窗口方法存在此问题-'流式数据帧/数据集不支持基于非时间的窗口'

我正在寻找一种窗口方法的替代方法,以对流数据进行聚合。

    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()

1 个答案:

答案 0 :(得分:0)

与滑动窗口不同,但避免以某种方式保留数据...

使用“指数移动平均线”:

avg += fact * (xn - avg)

哪里

  • avg是当前平均值;这是唯一需要从一行到另一行保留的变量。 (与最后N个值相对)
  • fact是控制平均平滑度的常数,0.01对变化的响应非常慢; 0.5响应很快。
  • xn为我们计算(当前行中)的平均值。