我正在通过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]
将赞赏正确的方法。
谢谢。
答案 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。