Azure 流分析 JSON 解析

问题描述

尝试建立一个相对简单的 ASA 查询提取作为数组摄取的数据。我似乎无法弄清楚的是如何让返回的表自动填充每个键的列。这意味着我们需要每一行都有一个列用于温度值、湿度值、照明值和接触值(如果存在)。其他一些阵列将只有键:温度和键:湿度。

谢谢!

"telemetry": {
      "data": [
        {
          "key": "temperature","value": 19.1,"unit": "°C"
        },{
          "key": "humidity","value": 38.5,"unit": "%"
        },{
          "key": "illumination","value": 0,"unit": "lx"
        },{
          "key": "accelerationStatus","value": "heartbeat","meaning": "Heartbeat"
        },{
          "key": "accelerationX","value": -0.02,"unit": "g"
        },{
          "key": "accelerationY",{
          "key": "accelerationZ","value": 1.01,{
          "key": "contact","value": "open","meaning": "Window opened"
        }
      ],

解决方法

您可以在 ASA 中使用 UDF。

UDF 函数代码:

function main(arg) {
    var array = arg.telemetry.data;
    var map = {};
    for(var i=0;i<array.length;i++){        
        var key=array[i].key;
        if(key == "temperature" || key == "humidity" || key == "illumination"){
            map[key] = array[i].value + "" + array[i].unit;
        }
        if(key == "contact"){
             map[key] = array[i].value;
        }    
    }
    return map;
}

SQL:

WITH 
c AS
(
    SELECT 
    udf.processArray(t) AS result
    FROM input AS t
)

SELECT c.result
FROM c

结果:

enter image description here