2017-06-05 87 views
0

我有一个消息数组;在每条消息内是另一个开始/停止值的数组。我可以很好地获取消息数组,但在Azure中执行流分析查询时,获取嵌套开始/停止值的下一级别返回0条记录。流分析 - 查询嵌套数组返回0结果

以下是Stream Analytics查询。

WITH 
main AS 
(
    SELECT   message.ArrayValue.header.messageId, 
        message.ArrayValue.startStopBlock as SSBlock      

    FROM   IoTHub i 
    CROSS APPLY  GetArrayElements(i.[STARTSTOPTIME:topic].message) AS 
message 
) 

SELECT    m.messageId,    
        SSEntry.ArrayValue.start, 
        SSEntry.ArrayValue.stop 

FROM   main m 
CROSS APPLY  GetArrayElements(m.SSBLOCK.ArrayValue.startStop) AS SSEntry 

这里是JSON

{ 
 
\t "@xsi:schemaLocation" : "", 
 
\t "nextBuffer" : { 
 
\t \t "url" : "", 
 
\t \t "moreData" : "false" 
 
\t }, 
 
\t "message" : [{ 
 
\t \t \t "header" : { 
 
\t \t \t \t "messageId" : "951262328", 
 
\t \t \t }, 
 
\t \t \t "totalStartStops" : "2", 
 
\t \t \t "startStopBlock" : { 
 
\t \t \t \t "startStop" : [{ 
 
\t \t \t \t \t \t "start" : "2017-05-16 14:11:01", 
 
\t \t \t \t \t \t "stop" : "2017-05-16 14:14:16", 
 
\t \t \t \t \t \t "operatorId" : "0" 
 
\t \t \t \t \t }, { 
 
\t \t \t \t \t \t "start" : "2017-05-16 14:38:45", 
 
\t \t \t \t \t \t "stop" : "2017-05-16 14:44:19", 
 
\t \t \t \t \t \t "operatorId" : "0" 
 
\t \t \t \t \t } 
 
\t \t \t \t ] 
 
\t \t \t } 
 
\t \t }, { 
 
\t \t \t "header" : { 
 
\t \t \t \t "messageId" : "951266462", 
 
\t \t \t }, 
 
\t \t \t "totalStartStops" : "2", 
 
\t \t \t "startStopBlock" : { 
 
\t \t \t \t "startStop" : [{ 
 
\t \t \t \t \t \t "start" : "2017-05-16 14:08:09", 
 
\t \t \t \t \t \t "stop" : "2017-05-16 14:08:20", 
 
\t \t \t \t \t \t "operatorId" : "-1" 
 
\t \t \t \t \t }, { 
 
\t \t \t \t \t \t "start" : "2017-05-16 14:54:38", 
 
\t \t \t \t \t \t "stop" : "2017-05-16 15:01:17", 
 
\t \t \t \t \t \t "operatorId" : "-1" 
 
\t \t \t \t \t } 
 
\t \t \t \t ] 
 
\t \t \t } 
 
\t \t } 
 
\t ] 
 
}

回答

0

按我的理解,你可以尝试通过改变message.ArrayValue.startStopBlock as SSBlockmessage.ArrayValue.startStopBlock.startStop as SSBlock来检索第一个查询的嵌套数组。这里是我的测试,你可以参考一下吧:

查询

WITH main AS 
(
    SELECT 
     message.ArrayValue.header.messageId, 
     message.ArrayValue.startStopBlock.startStop as SSBlock      
    FROM IoTHub i 
    CROSS APPLY GetArrayElements(i.message) AS message 
) 

SELECT 
    m.messageId,    
    SSEntry.ArrayValue.start, 
    SSEntry.ArrayValue.stop 
FROM main m 
CROSS APPLY GetArrayElements(m.SSBLOCK) AS SSEntry 

结果 enter image description here

+0

不错的工作,正是我需要的! –