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
相关产品推荐
相关产品推荐

