如何在ApacheSpark stucured streaming中计算数据帧API的z-score?

时间:2017-03-25 08:13:04

标签: scala apache-spark statistics time-series spark-streaming

我目前正在努力解决以下问题:

z-score定义为:

z =(x-u)/ sd

(其中x是单个值,u是窗口的平均值,sd是窗口的标准偏差)

我可以在窗口上计算u和sd,但不知道如何将每个x值“结转”到结果数据帧以计算每个值的z得分,这是我得到的距离远:

val df = spark.readStream
    .format("org.apache.bahir.sql.streaming.mqtt.MQTTStreamSourceProvider")   
    .option("topic", "topic/path")
    .load("tcp://localhost:1883")

val counter = df.groupBy(
    window($"timestamp", "2 seconds"),
      $"value")
    .agg($"value",avg($"value")+stddev($"value"))

val query = counter.writeStream
  .outputMode("complete")
  .format("console")
  .start()

我希望.agg中的$“value”($“value”,avg($“value”)+ stddev($“value”))会将每个值从源数据帧转移到结果,但事实并非如此

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我现在找到了答案 - 答案是这是不可能的,因为groupBy返回一个org.apache.spark.sql.GroupedData对象,该对象仅支持其他聚合(当然)不允许访问分组行的各个值。这个post解释得非常好,