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

Azure Stream Analytics提取属性内数组并转宽格式的问题

解决Azure Stream Analytics中嵌套JSON转宽格式的问题

我懂你现在的困扰——想把嵌套的JSON数据转成宽格式,但试了Cross Apply没达到预期效果对吧?咱们来搞定这个问题。

首先看你的JSON结构:根节点包含devicename、msgtime,还有一个payload数组,里面每个元素是单个传感器的读数。要把每个Sensor转成列、对应Value作为值,核心是先展开数组,再通过聚合+条件判断来重组行。

下面是能实现你需求的ASA查询语句:

SELECT
    devicename AS name,
    -- 为每个传感器单独提取对应值
    MAX(CASE WHEN p.ArrayValue.Sensor = 'one' THEN p.ArrayValue.Value END) AS one,
    MAX(CASE WHEN p.ArrayValue.Sensor = 'two' THEN p.ArrayValue.Value END) AS two,
    MAX(CASE WHEN p.ArrayValue.Sensor = 'three' THEN p.ArrayValue.Value END) AS three,
    msgtime -- 保留时间戳方便后续分析
INTO
    [你的输出目标] -- 替换成实际的输出接收器(比如Blob存储、SQL DB等)
FROM
    [你的输入源] -- 替换成实际的输入流(比如Event Hub、IoT Hub等)
CROSS APPLY GetArrayElements(payload) AS p -- 展开payload数组
GROUP BY
    devicename, msgtime -- 按设备名和时间分组,把同一设备同一时间的多传感器读数合并成一行

为什么之前的Cross Apply没生效?

Cross Apply只是把payload数组里的每个元素拆成单独的行,比如原来1条数据会变成3条(对应3个传感器)。但要转成宽格式,还需要用MAX()这类聚合函数,配合CASE WHEN把不同行的传感器值映射到对应的列里,最后通过GROUP BY把同一设备同一时间的行合并成一行。

如果后续新增传感器,只需要复制MAX(CASE...)的行,替换Sensor的名称就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:47:41