Azure Streaming Analytics有状态聚合

时间:2018-04-11 13:21:06

标签: azure azure-stream-analytics

我有一个物联网中心,其中包含多个将数据发送到流分析的设备。来自设备的消息包含有关其在float中的运行状况的信息(介于0和1之间)。流式分析将数据输出到服务总线,我想在特定时刻添加有关包含设备平均健康状况的字段的信息。

我想使用用户定义的聚合每10秒产生一次这个值,但看起来它只使用时间帧中的最后一条消息。

我是否正确使用UDA,如果没有,是否有其他方法可以在多个设备或某些其他有状态函数之间取得平均值?

UDA代码:

function main() {
this.init = function () {
    this.state = {};
}

this.accumulate = function (value, device_id) {
    this.state[device_id] = value;
}

/*this.deaccumulate = function (value, timestamp) {
    this.state -= value;
}

this.deaccumulateState = function (otherState) {
      this.state -= otherState.state;
}*/

this.computeResult = function () {
    length = 0,
    total  = 0;
    for (var device in this.state) {
        total += this.state[device];
        length++;
    }
    return total/length;
}
}

查询:

SELECT
uda.fleetHealth(device_health_status.level, device_id) as avg_health
INTO
    bustopic2
FROM
    iotdata
GROUP BY TumblingWindow(second, 10)

1 个答案:

答案 0 :(得分:1)

您只能将最后一条消息作为1在Java脚本中使用map。 2第二个参数始终相同且等于应用程序时间戳,即使您将其定义为device_id。 如果你想计算所有设备的平均水平,你应该这样做:

function UDASample() {
    this.init = function () {
        this.state = 0;
        this.length = 0;
    }

    this.accumulate = function (value, timestamp) {
        this.state += value;
        this.length = length + 1;
    }

    /*this.deaccumulate = function (value, timestamp) {
        this.state -= value;
    }

    this.deaccumulateState = function (otherState) {
          this.state -= otherState.state;
    }*/

    this.computeResult = function () {
        return this.state/this.length;
    }
}

SELECT
uda.fleetHealth(device_health_status.level) as avg_health
INTO
    bustopic2
FROM
    iotdata
GROUP BY TumblingWindow(second, 10)

如果你想统计每个设备的平均水平,你可以使用上面的相同UDA并使用这样的脚本:

SELECT device_id,
uda.fleetHealth(device_health_status.level) as avg_health
INTO
    bustopic2
FROM
    iotdata
GROUP BY TumblingWindow(second, 10), device_id