如何通过 Microsoft Azure Query 从 json 文件中的数组中获取数据

Posted

技术标签:

【中文标题】如何通过 Microsoft Azure Query 从 json 文件中的数组中获取数据【英文标题】:How to get data from an array in a json file through a Microsoft Azure Query 【发布时间】:2018-06-04 12:40:43 【问题描述】:

如何在我的一个输入中返回数组元素的值,它所在的索引不断变化?

我很确定我的查询结构是正确的。我有两个输入,并且正在使用连接,并且成功地从两个表中获取了一些数据。但是,我需要从表 B 中获取 RemoteIpAddress,但它是 json 格式的数组。

My Query

如果您想轻松复制、粘贴和/或编辑它,这里是文本:

SELECT  
A.context.data.eventTime as eventTime,
A.context.device.type as deviceType,
A.context.[user].anonId as userId,
A.context.device.roleInstance as machineName,
B.context.operation.name as eventName,
B.context.custom.dimensions[0],
--B.GetRecordPropertyValue(GetArrayElement(B.context.custom.dimensions,7), B.RemoteIpAddress) as remoteIpAddress,
--GetArrayElement(B.context.custom.dimensions,3),
--B.GetRecordPropertyValue(GetArrayElement(B.context.custom.dimensions,3), B.userName) as userName,
DATEDIFF(minute,A.context.data.eventTime,B.context.data.eventTime) as durationInMinutes



INTO DevUserlgnsOutput

FROM DevUserlgnsInput A TIMESTAMP BY A.context.data.eventTime

JOIN DevUserlgnsInput2 B TIMESTAMP BY B.context.data.eventTime
ON DATEDIFF(minute,A,B) BETWEEN 0 AND 5

注释掉的行不起作用,所以我把它们注释掉了。

我查看了这个并看到了使用 GetRecordPropertyValue 和 GetArrayElement 的建议,所以我这样做了。我没有收到任何错误,但它返回 null。

我还发现,如果我执行 B.context.custom.dimensions[0],则会返回包含我想要查看的元素的完整数组。

更复杂的是,我意识到我想要的元素在数组中的位置并不总是相同的。在某些示例数据中,它是 7,而在其他示例数据中,它是 3。

提前致谢。

阅读答案后更新:

我的新查询:

SELECT 
Events.context.data.eventTime as eventTime,
Events.context.device.type as deviceType,
mDim.ArrayValue.MachineName as machineName,
mDim.ArrayValue.UserId as userID,
mDim.ArrayValue.RemoteIpAddress as remoteIpAddress,
mDim.ArrayValue.UserName as userName,
mDim.ArrayValue.EventName as eventName

INTO DevUserlgnsOutput

FROM DevUserlgnsInput2 Events

CROSS APPLY GetArrayElements(Events.context.custom.dimensions) AS mDim

问题:我现在有多个用于单个事件的行,每行显示我要跟踪的 1 个属性(每行中与数组有关的其余列为 NULL)。关于如何解决这个问题的任何想法?

【问题讨论】:

您是否尝试过 GetArrayElements(复数)以交叉应用所有这些元素? msdn.microsoft.com/en-us/azure/stream-analytics/reference/… 我尝试过并且正在使用这种方法。我在原始问题中发布了更新后的查询。但是,单个事件显示多行,每行仅显示数组的 1 个属性(与数组相关的所有其他列显示 NULL)。我该如何解决这个问题? 【参考方案1】:

下面的查询适合你最新的数组结构,试试看:

SELECT   
context.data.EventTime as eventTime,
context.device.type as deviceType,
GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 4), 'MachineName') AS machineName,  
GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 5), 'UserId') AS userId,
GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 9), 'UserName') AS userName,
GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 11), 'remoteIpAddress') AS remoteIpAddress,
GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 13), 'EventName') AS eventName     
INTO output1
FROM input1

【讨论】:

【参考方案2】:

我的解决方案:

    WITH Events AS

(

SELECT

  context.data.EventTime as eventTime,

  context.device.type as deviceType,

  GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 7), 'MachineName') AS machineName,

  GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 8), 'UserName') AS userName,

  GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 2), 'remoteIpAddress') AS remoteIpAddress,

  GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 0), 'EventName') AS eventName,

  CASE WHEN GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 12), 'UserId') is NULL THEN GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 11), 'UserId') ELSE GetRecordPropertyValue(GetArrayElement(context.custom.dimensions, 12), 'UserId') END as userId


FROM ProdUserlgnsInput

)


SELECT eventTime, deviceType, MachineName, UserId, UserName, remoteIpAddress, eventName  INTO ProdUserlgnsOutput FROM Events

但是,我不得不将 EventName 属性移动到主数组,因为我尝试使用 WITH 语句从 2 个单独的数组中获取信息并不允许我将结果放在单个输出中。另外,由于 UserId 的索引大多是 12,但有时是 11。所以,为了显示所有记录的实际 UserId,我使用了“Case When”语法。

我为解决这个问题做了很多工作,所以如果有人想了解更多细节,请随时询问。

【讨论】:

【参考方案3】:

你可以使用UDF

function arraygetvaluebyname(arg, name) 
    var z = arg;
    for(var i=0;i<z.length;i++)
        if(name === Object.keys(z[i])[0])
        
            return z[i][name];
        
    
    return null;

【讨论】:

您能进一步解释一下吗?您所说的“UDF”是什么意思,该代码有什么作用? UDF : 用 Ja​​vaScript 编写的 Azure 流分析用户定义函数 docs.microsoft.com/en-us/azure/stream-analytics/…

以上是关于如何通过 Microsoft Azure Query 从 json 文件中的数组中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何取消我的 Microsoft Azure 订阅?

使用用户模拟来调用Azure AD Microsoft API的Web API

如何在 Microsoft azure 存储资源管理器工具中删除表列名称?

Microsoft 标识导致 Azure Web 应用程序崩溃

如何使用 Google FCM 和 Microsoft azure 作为托管服务器从 chrome for android 上的 PWA 发送推送通知

查看本地SPT上传到Microsoft Azure临时存储区是否成功的方法