我目前正在努力解决以下问题:
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”))会将每个值从源数据帧转移到结果,但事实并非如此
有什么想法吗?
答案 0 :(得分:0)
我现在找到了答案 - 答案是这是不可能的,因为groupBy返回一个org.apache.spark.sql.GroupedData对象,该对象仅支持其他聚合(当然)不允许访问分组行的各个值。这个post解释得非常好,