将JSON数组值转置为Stream Analytics中的行不会产生任何输出

时间:2017-01-19 23:05:36

标签: azure-stream-analytics

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

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

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

QUERY

-- 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"}]}

1 个答案:

答案 0 :(得分: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