使用包含最后 5 条记录的多维数组调用 Azure 流分析 UDF,按记录分组

Call Azure Stream Analytics UDF with multi-dimensional array of last 5 records, grouped by record

我正在尝试从流分析查询中调用 AzureML UDF,并且该 UDF 需要一个包含 5 行和 2 列的数组。输入数据从 IoT 中心流式传输,传入消息中有两个字段:温度和湿度。

这将是 'passthrough query' :

SELECT GetMetadataPropertyValue([room-telemetry], 'IoTHub.ConnectionDeviceId') AS RoomId, 
       Temperature, Humidity
INTO
    [maintenance-alerts]
FROM
    [room-telemetry]

我有一个 AzureML UDF(已成功创建),它应该使用每个 RoomId 的最后 5 条记录调用,并且 return 来自 ML 模型的一个值。显然,我的流中有多个房间,所以我需要找到一种方法来获得某种窗口,每个 RoomId 分组 5 条记录。我似乎找不到使用从输入流中选择的正确数组来调用 UDF 的方法。我知道我可以创建一个 Javascript UDF,它将 return 来自特定字段的数组,但那将是 record/by 记录,在这里我需要它与按分组的多个记录RoomId.

有人有什么见解吗?

此致

在@jean-sébastien 的好建议和对 的一个孤立问题的回答之后,我终于能够在构建的解决方案中将所有内容拼接在一起。 (尽管如此,仍然必须在 运行 时将其发送到 运行)。

因此,解决方案是使用 CollectTop 聚合要分组的实体的最新行,包括时间规范 Window。

下一步是创建 javascript UDF 以获取该数据结构并将其解析为 multi-dimensional 数组。

这是我现在的查询:

-- Taking relevant fields from the input stream
WITH RelevantTelemetry AS
(
    SELECT  engineid, tmp, hum, eventtime
    FROM    [engine-telemetry] 
    WHERE   engineid IS NOT NULL
),
-- Grouping by engineid in TimeWindows
TimeWindows AS
(
    SELECT engineid, 
        CollectTop(2) OVER (ORDER BY eventtime DESC) as TimeWindow
    FROM
        [RelevantTelemetry]
    WHERE engineid IS NOT NULL
    GROUP BY TumblingWindow(hour, 24), engineid
)
--Output timewindows for verification purposes
SELECT engineid, Udf.Predict(Udf.getTimeWindows(TimeWindow)) as Prediction
INTO debug
FROM TimeWindows

这是 Javascript UDF:

    function getTimeWindows(input){
        var output = [];
        for(var x in input){
            var array = [];
            array.push(input[x].value.tmp);
            array.push(input[x].value.hum);
            output.push(array);
        }
        return output;
    }