首页 > 解决方案 > 使用按记录分组的最后 5 条记录的多维数组调用 Azure 流分析 UDF

问题描述

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

这将是“直通查询”:

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

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

有人有什么见解吗?

此致

标签: azure-iot-hubazure-stream-analyticsazure-machine-learning-service

解决方案


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

因此,解决方案存在于CollectTop用于聚合要分组的实体的最新行,包括时间窗口的规范。

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

这是我现在的查询:

-- 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;
    }

推荐阅读