azure-iot-hub - 使用按记录分组的最后 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 分组的多个记录。
有人有什么见解吗?
此致
解决方案
在@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;
}
推荐阅读
- xml - 如何删除xml文本节点中的换行符
- asp.net-core - 在 BlazorWeb 程序集中创建指向服务器控制器操作的链接
- delphi - Delphi - SysUtils.Trim 不删除最后一个空格(?)字符
- python - Plotly:如何将均值和标准差添加到 create_displot 图?
- git - Intellij - 将 git 分支显示为目录
- sql - 查询 Clickhouse 当前安装的版本
- javascript - 使用 Discord.js 获取所有公会 ID
- reactjs - 单击reactjs和样式化组件上的按钮
- python - Lucas 和 Kanade 的结构张量
- random - 从Stata中的指数分布生成随机样本