You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Stream Analytics多告警合并及保留可变Schema原始数据方法咨询

解决Azure Stream Analytics处理可变JSON事件并生成多告警的问题

针对你遇到的ASA中UNION不能搭配SELECT *的问题,同时要保留所有原始JSON键值对并生成多告警,这里有两个可行的方案,其中嵌套原始数据的方式最适合你的场景:

方案1:将原始事件封装为JSON子对象输出

这是最直接的解决方案,核心思路是把整个原始事件作为一个嵌套的raw_data字段输出,同时加上对应的ALERT字段,这样UNION的两个分支输出结构完全一致,就能绕过ASA对UNION的列一致性要求。

具体SQL代码如下:

-- 温度过低告警分支
SELECT 
    input AS raw_data,
    'Temp LOW' AS ALERT
FROM [input]
WHERE temp1 < 15

UNION

-- 湿度过高告警分支
SELECT 
    input AS raw_data,
    'Humidity HIGH' AS ALERT
FROM [input]
WHERE humidity > 50

这个方案的优势在于:

  • 不管原始事件有多少可变的JSON键,都会完整保留在raw_data子对象中,不会丢失任何数据
  • 两个UNION分支的输出列完全统一(仅包含raw_data和ALERT),符合ASA的UNION规则
  • 输出结果完全符合你想要的格式:
    {"ALERT": "Humidity HIGH", "raw_data": {"temp1": 33, "temp2": 52, "humidity": 60, "source": "sensorname", "otherkey": "value"} }
    

方案2:用WITH子句生成告警后关联原始数据(适合需要展开原始列的场景)

如果你希望直接输出原始列+ALERT字段(而非嵌套对象),可以先用WITH子句标记符合告警条件的事件,再过滤出有效告警。不过要注意:如果原始事件的键是完全可变的,这个方案可能会因为输出列不一致导致ASA报错,所以仅推荐你能提前确定所有可能键的场景。

示例代码:

WITH AlertEvents AS (
    SELECT 
        System.Timestamp() AS event_ts,
        NEWID() AS event_id, -- 生成唯一标识用于关联(可选,若不需要时间关联可省略)
        *,
        CASE
            WHEN temp1 < 15 THEN 'Temp LOW'
            WHEN humidity > 50 THEN 'Humidity HIGH'
            ELSE NULL
        END AS ALERT
    FROM [input]
)
SELECT 
    * -- 这里的*包含原始所有列+ALERT字段
FROM AlertEvents
WHERE ALERT IS NOT NULL

注意事项

  • 方案1是应对可变JSON键的最优解,因为它不依赖固定的输入架构,能适配任意新增的键
  • 如果你需要添加更多告警规则,只需要在UNION后追加新的分支即可,每个分支都保持input AS raw_data, 'xxx' AS ALERT的结构

内容的提问来源于stack exchange,提问作者mike_b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:41:04