我正在从 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"}]}
请参阅下面我的通用示例。我相信这就是你的要求;其中您有一个包含 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
我也有类似的问题。我是一名新手,试图了解有关 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); }
知道可能出了什么问题吗? 谢谢你的帮助 问候 阿杰