流分析JSON输入查询解析

时间:2018-07-31 03:45:04

标签: azure azure-stream-analytics

我正在通过EventHub接收JSON,然后通过Stream作业对其进行处理并将其推送到Azure SQL DW中进行POC。

我以前曾处理过JSON提取,但现在遇到的困难是JSON中使用的命名结构。

以下是示例:

{
    "1-1": [{
            "Details": [{
                    "FirstName": "Super",
                    "LastName": "Man"                   
                }
            ]
        }
    ]
}

root元素带有连字符(-),我很难通过该元素进行解析以访问相关项。

我尝试了以下查询,并在输出到的SQL表中得到NULL:

--#1
SELECT
    ["2-1"].Details.FirstName AS First_Name
    ,["2-1"].Details.LastName AS Last_Name
INTO
    [SA-OUTPUT]
FROM
    [SA-INPUT]

--#2
SELECT
    [2-1].Details.FirstName AS First_Name
    ,[2-1].Details.LastName AS Last_Name
INTO
    [SA-OUTPUT]
FROM
    [SA-INPUT]

--#3
SELECT
    2-1.Details.FirstName AS First_Name
    ,2-1.Details.LastName AS Last_Name
INTO
    [SA-OUTPUT]
FROM
    [SA-INPUT]

--#4
SELECT
    SA-INPUT.["2-1"].Details.FirstName AS First_Name
    ,SA-INPUT.["2-1"].Details.LastName AS Last_Name
INTO
    [SA-OUTPUT]
FROM
    [SA-INPUT]

将赞赏正确的方法。

谢谢。

2 个答案:

答案 0 :(得分:1)

您的JSON模式是嵌套的,但也有一些数组。为了读取数据,您将需要使用GetArrayElement函数。

以下是一个查询,它将读取您的示例数据:

WITH Step1 AS(
SELECT GetArrayElement([1-1], 0) as FirstLevel
FROM iothub),
Step2 AS(
SELECT GetArrayElement(FirstLevel.Details,0) SecondLevel
FROM Step1)
SELECT SecondLevel.FirstName, SecondLevel.LastName from Step2

有关更多信息,请查看我们的页面Work with complex Data Types in JSON and AVRO

如果您有任何问题,请告诉我。

谢谢, JS(ASA团队)

答案 1 :(得分:0)

它尝试了并且效果很好。如果说我必须从两个单独的数组元素生成数据,则必须创建两个单独的CTE。

{
    "1-1": [{
            "Details": [{
                    "FirstName": "Super",
                    "LastName": "Man"                   
                }
            ]
        }
    ]
},
{
    "2-1": [{
            "Address": [{
                    "Street": "Main",
                    "Lane": "Second"                   
                }
            ]
        }
    ]
}   

如何将两个CTE中的元素合并到一个输出查询中?我只能在以下行中引用CTE。