将 JSON 数组值转换为流分析中的行不会产生任何输出

问题描述 投票:0回答:2

我正在从 blob 存储流式传输 JSON 输入。 JSON 中的大多数数据都以名称/值对的形式存储在数组中。我需要将每个输入作为单个输出发送,其中每个名称/值对都被转置到输出中的列。我有在编辑查询时使用“测试”功能时有效的代码。但是,在实时测试时,只有 debugblob1 输出接收数据。

为什么实时测试的工作方式与查询测试不同?有没有更好的方法将数组数据转置为列?

注意:数组的名称/值对始终相同,但我不想要依赖于它们的顺序始终相同的解决方案,因为这是我无法控制的。

查询

-- Get one row per input and array value
WITH OneRowPerArrayValue AS
(SELECT
    INPUT.id AS id,
    ARRAYVALUE.ArrayValue.value1 AS value1,
    ARRAYVALUE.ArrayValue.value2 AS value2
FROM
    [inputblob] INPUT
    CROSS APPLY GetElements(INPUT.arrayValues) as ARRAYVALUE),

-- Get one row per input, transposing the array values to columns.
OneRowPerInput AS
(SELECT
    INPUT.id as id,
    ORPAV_value1.value1 as value1,
    ORPAV_value2.value2 as value2
FROM
    [inputblob] INPUT
    left join OneRowPerArrayValue ORPAV_value1 ON ORPAV_value1.id = INPUT.id AND ORPAV_value1.value1 IS NOT NULL AND DATEDIFF(microsecond, INPUT, ORPAV_value1) = 0
    left join OneRowPerArrayValue ORPAV_value2 ON ORPAV_value2.id = INPUT.id AND ORPAV_value2.value2 IS NOT NULL AND DATEDIFF(microsecond, INPUT, ORPAV_value2) = 0
WHERE
    -- This is so that we only get one row per input, instead of one row per input multiplied by number of array values
    ORPAV_value1.value1 is not null)

SELECT * INTO debugblob1 FROM OneRowPerArrayValue

SELECT * INTO debugblob2 FROM OneRowPerInput

数据

{"id":"1","arrayValues":[{"value1":"1"},{"value2":"2"}]}
{"id":"2","arrayValues":[{"value1":"3"},{"value2":"4"}]}
azure-stream-analytics
2个回答
0
投票

请参阅下面我的通用示例。我相信这就是你的要求;其中您有一个包含 json 对象数组的 JSON 对象。

    WITH MyValues AS
(
   SELECT   
   arrayElement.ArrayIndex,  
   arrayElement.ArrayValue  
   FROM Input as event  
   CROSS APPLY GetArrayElements(event.<JSON Array Name>) AS arrayElement 
)
SELECT ArrayValue.Value1, CAST(ArrayValue.Value2 AS FLOAT) AS Value
INTO Output
FROM MyValues

0
投票

我也有类似的问题。我是一名新手,试图了解有关 Azure 流作业的更多信息。 我收到的数据如下(由 Azure IoT Expolrer 捕获)

{
  "body": {
    "DeviceId": "sc-uat-public-02",
    "ts": "2024-01-29T01:30:00Z",
    "DAY_SECONDS": 34199,
    "ECU_SERNUM": 8780248,
    "POSTAL_CODE": 609162,
    "IP011:M_KWP": 211.2,
    "IP021:M_KWP": 282.25,
    "IP031:M_KWP": 123.75,
    "IN011:N_KWP": 112.2,
    "IN012:N_KWP": 99,
    "IN021:N_KWP": 135.85,
    "IN022:N_KWP": 146.4,
    "IN031:N_KWP": 123.75
  },
  "enqueuedTime": "Mon Jan 29 2024 09:30:00 GMT+0800 (Singapore Standard Time)"
}

我想将其保存为 Azure 表存储中的单独行。 我无法让它发挥作用。

我的SQL语句:

选择 GetMetadataPropertyValue([mirai-iot-hub-ap], 'DeviceId') AS DeviceId, GetMetadataPropertyValue([mirai-iot-hub-ap], '时间戳') AS 时间戳, 输出.SensorKey, 输出.SensorValue INTO [mqtt-to-table-store-01] FROM [iot-hub-ap] 交叉应用 getarrayelements(UDF.JSONElementsToArrays([iot-hub-ap]) ) AS 输出

使用 Javascript UDF 如下

函数主(输入){ var 事件 = []; 尝试 { var data = JSON.parse(输入);

    for (var key in data) {
        if (data.hasOwnProperty(key)) {
            var value = data[key];
            var event = {
                             "TagName": key,
                             "TagValue": value
            };
                if(typeof value === 'number')
            {
                events.push(event);
            }
        }
    }
} catch (error) {
    
}
return (events); }

知道可能出了什么问题吗? 谢谢你的帮助 问候 阿杰

© www.soinside.com 2019 - 2024. All rights reserved.