我目前正在努力解决以下问题:
z-score 定义为:
z = (xu) / 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",avg($"value")+stddev($"value")) 中的 $"value" 会将源数据框中的每个值传递给结果,但这是不是这样
有任何想法吗?
我现在找到了答案 - 答案是这是不可能的,因为 groupBy 返回一个 org.apache.spark.sql.GroupedData 对象,它只支持额外的聚合(当然)不允许访问单个值分组的行。这个帖子解释的很好,
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句