如何在流分析组中使用字符串和空值合并多条记录

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

测试结果