如何在流分析组中使用字符串和空值合并多条记录
How to merge multiple records with strings and nulls in a Stream Analytics Group By
我正在尝试将一些记录的事件从 Application Insights 提取到我们的 SQL 数据库中。我无法控制由文件中的多个 json 数组组成的 json 文件的输入格式。在每条记录中,5 条信息位于文件中 [context].[custom].[dimensions] 处的 json 数组中,并使用 OUTER APPLY 将这些值展平。问题是它 returns 结果不是每条记录一行,而是好像你用 5 连接了一行(这确实是它所做的)并且 5 条数据的值在 4 种情况下为 NULL 并且另一个的实际值。我只需要 5 个值中的 2 个 - PageType 和 UserId - 并在我的 GROUP BY it returns 3 条记录中给出,一条记录每个值,一条记录都为空。
在正常 SQL 中,您只需使用 MAX 表达式来获取每个表达式的实际值,但在流分析中,您不能对字符串使用 MAX。您也不能使用 COALESCE 和我尝试使用的许多其他方法来解决此问题。关于如何更改结果的任何想法:
EventDateTime Event PageType UserId AppVersion CountA
2017-05-24 Nav Show NULL NULL 2.0.1293 1
2017-05-24 Nav Show NULL SIRTSW 2.0.1293 1
2017-05-24 Nav Show Trade NULL 2.0.1293 1
到
2017-05-24 Nav Show Trade SIRTSW 2.0.1293 1 ?
returns三行每行的代码如下(注意e.event是一个数组,所以不会导致同样的问题):
SELECT flatEvent.ArrayValue.name as Event,
e.context.data.eventTime as EventDateTime,
e.context.application.version as AppVersion
,flatCustom.ArrayValue.UserId as UserId
,flatCustom.ArrayValue.PageType as PageType,
SUM(flatEvent.ArrayValue.count) as CountA
INTO
[insights]
FROM [ios] e
CROSS APPLY GetArrayElements(e.[event]) as flatEvent
OUTER APPLY GetArrayElements(e.[context].[custom].[dimensions]) as flatCustom
GROUP BY SlidingWindow(minute, 1),
flatEvent.ArrayValue.name,
e.context.data.eventTime,
e.context.application.version,
flatCustom.ArrayValue.UserId,
flatCustom.ArrayValue.PageType
提前致谢,
罗布
根据您的情况,我假设您可以使用 JavaScript user-defined functions 的 Azure 流分析将多个维度合并为一个记录。这是我对这个问题的测试,你可以参考一下。
JSON 文件
{
"context":{
"data":{"eventTime":"2017-05-24"},
"application":{"version":"2.0.1293"},
"custom":{
"dimensions":[
{"PageType":null,"UserId":"SIRTSW"},
{"PageType":"Trade","UserId":null},
{"PageType":null,"UserId":null}
]
}
},
"event":[
{"name":"Nav Show","count":1}
]
}
javascript UDF,UDF.coalesce
function main(items) {
var result=[];
var UserIdStr="",PageTypeStr="";
for(var i=0;i<items.length;i++){
if(items[i].UserId!=null && items[i].UserId!=undefined)
UserIdStr+=items[i].UserId;
if(items[i].PageType!=null && items[i].PageType!=undefined)
PageTypeStr+=items[i].PageType;
}
result.push({UserId:UserIdStr,PageType:PageTypeStr});
return result;
}
查询
--first query
WITH f AS (
SELECT
e.context.data.eventTime as EventDateTime,
e.context.application.version as AppVersion,
e.event as flatEvent,
UDF.coalesce(e.[context].[custom].[dimensions]) as flatDimensions
FROM [ios] e
)
--second query
SELECT flatEvent.ArrayValue.name as Event,
f.EventDateTime,
f.AppVersion,
flatDimension.ArrayValue.UserId,
flatDimension.ArrayValue.PageType,
SUM(flatEvent.ArrayValue.count) as CountA
FROM f
CROSS APPLY GetArrayElements(f.[flatEvent]) as flatEvent
OUTER APPLY GetArrayElements(f.[flatDimensions]) as flatDimension
GROUP BY SlidingWindow(minute, 1),
flatEvent.ArrayValue.name,
f.EventDateTime,
f.AppVersion,
flatDimension.ArrayValue.UserId,
flatDimension.ArrayValue.PageType
测试结果
我正在尝试将一些记录的事件从 Application Insights 提取到我们的 SQL 数据库中。我无法控制由文件中的多个 json 数组组成的 json 文件的输入格式。在每条记录中,5 条信息位于文件中 [context].[custom].[dimensions] 处的 json 数组中,并使用 OUTER APPLY 将这些值展平。问题是它 returns 结果不是每条记录一行,而是好像你用 5 连接了一行(这确实是它所做的)并且 5 条数据的值在 4 种情况下为 NULL 并且另一个的实际值。我只需要 5 个值中的 2 个 - PageType 和 UserId - 并在我的 GROUP BY it returns 3 条记录中给出,一条记录每个值,一条记录都为空。
在正常 SQL 中,您只需使用 MAX 表达式来获取每个表达式的实际值,但在流分析中,您不能对字符串使用 MAX。您也不能使用 COALESCE 和我尝试使用的许多其他方法来解决此问题。关于如何更改结果的任何想法:
EventDateTime Event PageType UserId AppVersion CountA
2017-05-24 Nav Show NULL NULL 2.0.1293 1
2017-05-24 Nav Show NULL SIRTSW 2.0.1293 1
2017-05-24 Nav Show Trade NULL 2.0.1293 1
到
2017-05-24 Nav Show Trade SIRTSW 2.0.1293 1 ?
returns三行每行的代码如下(注意e.event是一个数组,所以不会导致同样的问题):
SELECT flatEvent.ArrayValue.name as Event,
e.context.data.eventTime as EventDateTime,
e.context.application.version as AppVersion
,flatCustom.ArrayValue.UserId as UserId
,flatCustom.ArrayValue.PageType as PageType,
SUM(flatEvent.ArrayValue.count) as CountA
INTO
[insights]
FROM [ios] e
CROSS APPLY GetArrayElements(e.[event]) as flatEvent
OUTER APPLY GetArrayElements(e.[context].[custom].[dimensions]) as flatCustom
GROUP BY SlidingWindow(minute, 1),
flatEvent.ArrayValue.name,
e.context.data.eventTime,
e.context.application.version,
flatCustom.ArrayValue.UserId,
flatCustom.ArrayValue.PageType
提前致谢, 罗布
根据您的情况,我假设您可以使用 JavaScript user-defined functions 的 Azure 流分析将多个维度合并为一个记录。这是我对这个问题的测试,你可以参考一下。
JSON 文件
{
"context":{
"data":{"eventTime":"2017-05-24"},
"application":{"version":"2.0.1293"},
"custom":{
"dimensions":[
{"PageType":null,"UserId":"SIRTSW"},
{"PageType":"Trade","UserId":null},
{"PageType":null,"UserId":null}
]
}
},
"event":[
{"name":"Nav Show","count":1}
]
}
javascript UDF,UDF.coalesce
function main(items) {
var result=[];
var UserIdStr="",PageTypeStr="";
for(var i=0;i<items.length;i++){
if(items[i].UserId!=null && items[i].UserId!=undefined)
UserIdStr+=items[i].UserId;
if(items[i].PageType!=null && items[i].PageType!=undefined)
PageTypeStr+=items[i].PageType;
}
result.push({UserId:UserIdStr,PageType:PageTypeStr});
return result;
}
查询
--first query
WITH f AS (
SELECT
e.context.data.eventTime as EventDateTime,
e.context.application.version as AppVersion,
e.event as flatEvent,
UDF.coalesce(e.[context].[custom].[dimensions]) as flatDimensions
FROM [ios] e
)
--second query
SELECT flatEvent.ArrayValue.name as Event,
f.EventDateTime,
f.AppVersion,
flatDimension.ArrayValue.UserId,
flatDimension.ArrayValue.PageType,
SUM(flatEvent.ArrayValue.count) as CountA
FROM f
CROSS APPLY GetArrayElements(f.[flatEvent]) as flatEvent
OUTER APPLY GetArrayElements(f.[flatDimensions]) as flatDimension
GROUP BY SlidingWindow(minute, 1),
flatEvent.ArrayValue.name,
f.EventDateTime,
f.AppVersion,
flatDimension.ArrayValue.UserId,
flatDimension.ArrayValue.PageType
测试结果