在Azure Stream Analytics查询中处理数组与记录类型
刚接触Azure Stream Analytics(ASA)查询的话,处理这种带数组和嵌套结构的Application Insights导出JSON确实得掌握几个关键技巧,我结合你的场景给你一步步讲清楚怎么处理:
核心问题:先展开嵌套的Request数组
你的JSON里request是一个数组,ASA默认会把整个数组当成单个字段,没法直接把里面的每个请求条目单独推送到Power BI。所以第一步必须用CROSS APPLY GetArrayElements()函数把数组拆成独立的行。
基础查询示例(提取所有需要的字段)
假设你的ASA输入别名是AppInsightsBlobInput,输出是指向Power BI的PowerBIOutput,可以用下面的查询来处理:
SELECT -- 提取request数组中每个条目的核心字段 req.ArrayValue.id AS RequestId, req.ArrayValue.name AS RequestName, req.ArrayValue.count AS RequestCount, req.ArrayValue.responseCode AS ResponseCode, req.ArrayValue.success AS IsRequestSuccess, req.ArrayValue.url AS FullRequestUrl, -- 提取嵌套的urlData子对象字段 req.ArrayValue.urlData.base AS UrlPath, req.ArrayValue.urlData.host AS UrlHost, req.ArrayValue.urlData.protocol AS UrlProtocol, -- 提取durationMetric性能指标 req.ArrayValue.durationMetric.value AS DurationMicroseconds, req.ArrayValue.durationMetric.min AS MinDuration, req.ArrayValue.durationMetric.max AS MaxDuration, -- 保留顶层的元数据(如果需要的话) internal.data.id AS TelemetryDocumentId, internal.data.documentVersion AS TelemetrySchemaVersion, -- 保留ASA自带的时间戳(用于Power BI时间轴分析) System.Timestamp() AS ProcessingTime INTO [PowerBIOutput] FROM [AppInsightsBlobInput] AS input -- 关键操作:展开request数组为单独行 CROSS APPLY GetArrayElements(input.request) AS req
代码说明:
GetArrayElements(input.request)会遍历request数组中的每个对象,将其拆分成独立的数据行,用别名req指代每个数组元素- 数组元素的属性通过
req.ArrayValue.xxx来访问,嵌套对象(比如urlData、durationMetric)直接用.链式访问即可
处理Context等其他顶层嵌套字段
你的示例里context字段是不完整的,如果里面包含用户、设备或自定义维度数据,处理逻辑完全一致:
- 如果是普通嵌套对象,直接用
input.context.data.userId这种格式提取字段 - 如果
context里也有数组(比如customDimensions数组),再追加一次CROSS APPLY GetArrayElements()即可,比如:
CROSS APPLY GetArrayElements(input.context.customDimensions) AS customDim
可选:添加聚合逻辑(适配Power BI可视化)
如果要在Power BI中展示统计类报表(比如按10分钟窗口统计请求数、平均响应时间),可以给查询加上窗口聚合:
SELECT req.ArrayValue.name AS RequestName, req.ArrayValue.responseCode AS ResponseCode, COUNT(req.ArrayValue.id) AS TotalRequests, AVG(req.ArrayValue.durationMetric.value / 1000) AS AvgDurationMilliseconds, -- 转换为毫秒 System.Timestamp() AS WindowEndTime INTO [PowerBIOutput] FROM [AppInsightsBlobInput] AS input CROSS APPLY GetArrayElements(input.request) AS req -- 按10分钟滚动窗口聚合 GROUP BY req.ArrayValue.name, req.ArrayValue.responseCode, TumblingWindow(minute, 10)
测试查询的小技巧
在ASA的查询编辑器里,点击「测试查询」按钮,上传你的示例JSON文件,就能实时预览查询结果,确认字段提取是否正确,避免作业上线后出现数据缺失的问题。
内容的提问来源于stack exchange,提问作者Peter Sm
相关产品推荐
相关产品推荐

