【问题标题】:Aggregate contents of array column in Azure Data Explorer在 Azure 数据资源管理器中聚合数组列的内容
【发布时间】:2018-11-30 05:16:48
【问题描述】:

我有一些数据存储在我想对其执行聚合和分析的 customEvents 属性包中。我不熟悉可以使用 Azure 数据资源管理器查询语言针对 AppInsights 运行的分析查询,但我被卡住了。

我可以将属性包的键值对之一的内容转换为数字数组(在下面的示例中,该输出由 items 表示。

let items = parse_json('{"operation_Id": "12345Z12", "days":[43, 21, 65]}');
print items.operation_Id, items.days;

但是,当我需要为每个 operation_Id 计算数组中项目的平均值时,我遇到了文档墙。我查看了mvexpandlet(使用 lambda 表达式)、datatable、使用动态数据类型等。使用mvexpand 时遇到的阻塞问题是我想关联每一行在与其操作operation_Id 相关的输出中,mvexpand 似乎只在第一行保持这种关系。对于datatable,该类型不支持管道输入。

我遇到的另一个常见错误(包括下面的代码示例是运算符源表达式应该是表或列)。

let items = parse_json('{"days":[43, 21, 65]}');

let arraySum = (T:(x: long))
{
   T 
   | summarize sum(x) 
};
items
| project days | invoke arraySum()

如果有必要,我可以在 JavaScript 中执行聚合代码,只将计算出的平均值传递到属性包中,但是丢弃原始数据值感觉很浪费。是否有一些明显的计算或聚合函数可以解决这个问题?

【问题讨论】:

    标签: azure-application-insights azure-data-explorer


    【解决方案1】:

    以下两个选项都可以让您根据自己的兴趣计算平均值:

    (警告:这是基于您展示的示例,可能会被“简化”以无法反映您的实际情况,因此请澄清以防万一这没有帮助):

    let items = dynamic({"operation_Id": "12345Z12", "days":[43, 21, 65]});
    print operationId = tostring(items.operation_Id), days = items.days
    | mvexpand days to typeof(int)
    | summarize avg(days) by operationId
    
    // or
    
    let items = dynamic({"operation_Id": "12345Z12", "days":[43, 21, 65]});
    print operationId = tostring(items.operation_Id), days = items.days
    | project operationId, series_stats_dynamic(days)['avg']
    

    您的第二个示例确实无效(标量和表格参数不相等),但可以重写如下:

    与上述相同的警告

    let items = dynamic({"days":[43, 21, 65]});
    let arraySum = (T:(x: long))
    {
       T 
       | summarize sum(x) 
    };
    print items 
    | mvexpand x = items.days to typeof(long)
    | invoke arraySum()
    
    // or
    
    let items = dynamic({"days":[43, 21, 65]});
    print items
    | project sum = series_stats_dynamic(items.days)["avg"] * array_length(items.days)
    

    更新了后续提供的 cmets 的示例:

    datatable (Operation_id:string, customDimensions:dynamic) 
    [ 
        "MTFfq", dynamic({"siteId": "1", "fileCount": "3", "pendingDays":[15,10,11]}), 
        "LXVjk", dynamic({"siteId": "2", "fileCount": "1", "pendingDays":[3]}),
        "jnySt", dynamic({"siteId": "3", "fileCount": "2", "pendingDays":[7,11]}), 
        "NoxoX", dynamic({"siteId": "4", "fileCount": "4", "pendingDays":[1,4,3,11]})
    ]
    | mvexpand days = customDimensions.pendingDays to typeof(int)
    | summarize avg(days) by Operation_id
    
    // or
    
    datatable (Operation_id:string, customDimensions:dynamic) 
    [ 
        "MTFfq", dynamic({"siteId": "1", "fileCount": "3", "pendingDays":[15,10,11]}), 
        "LXVjk", dynamic({"siteId": "2", "fileCount": "1", "pendingDays":[3]}),
        "jnySt", dynamic({"siteId": "3", "fileCount": "2", "pendingDays":[7,11]}), 
        "NoxoX", dynamic({"siteId": "4", "fileCount": "4", "pendingDays":[1,4,3,11]})
    ]
    | project Operation_id, series_stats_dynamic(customDimensions.pendingDays)['avg']
    

    和:

    let arraySum = (T:(x: long))
    {
       T 
       | summarize sum(x) 
    };
    datatable (Operation_id:string, customDimensions:dynamic) 
    [ 
        "MTFfq", dynamic({"siteId": "1", "fileCount": "3", "pendingDays":[15,10,11]}), 
        "LXVjk", dynamic({"siteId": "2", "fileCount": "1", "pendingDays":[3]}),
        "jnySt", dynamic({"siteId": "3", "fileCount": "2", "pendingDays":[7,11]}), 
        "NoxoX", dynamic({"siteId": "4", "fileCount": "4", "pendingDays":[1,4,3,11]})
    ]
    | mvexpand x = customDimensions.pendingDays to typeof(long)
    | invoke arraySum()
    
    // or
    
    datatable (Operation_id:string, customDimensions:dynamic) 
    [ 
        "MTFfq", dynamic({"siteId": "1", "fileCount": "3", "pendingDays":[15,10,11]}), 
        "LXVjk", dynamic({"siteId": "2", "fileCount": "1", "pendingDays":[3]}),
        "jnySt", dynamic({"siteId": "3", "fileCount": "2", "pendingDays":[7,11]}), 
        "NoxoX", dynamic({"siteId": "4", "fileCount": "4", "pendingDays":[1,4,3,11]})
    ]
    | project Operation_id, sum = series_stats_dynamic(customDimensions.pendingDays)["avg"] * array_length(customDimensions.pendingDays)
    

    上面使用的运算符/函数的一些参考:

    【讨论】:

    • 您的警告很好,因为我在整合您的建议时遇到了问题,即存储我的数据的customDimensions 属性(根据getschema 运算符,报告的数据类型为dynamic,所以不清楚我的集成问题是什么:例如,当我运行此查询时,我收到一个错误 确保表达式:items.siteName 确实是一个简单的名称 let foo = customEvents | where name == '锁定文件选择提交:' | project customDimensions; print bar = tostring(foo.siteName);
    • 就我能够阅读最后一个查询而言,foo 实际上是一个具有单列(和N 行)的表。所以你试图做的确实是无效的。如果我尝试从查询中得出意图,请考虑尝试以下操作:customEvents | where name == 'Lock files selection submitted:' | project bar = tostring(customDimensions.siteName)。请允许我还建议:使用datatable 运算符提供代表您的数据集的合成数据集,然后我们可以使用它(而不是尝试使用不反映真实用例的有限示例) .
    • 我没有想过使用数据表来创建合成的样本数据集。这应该更能代表我拥有的数据结构:datatable (Operation_id:string, customDimensions:dynamic) [ "MTFfq", dynamic({"siteId": "1", "fileCount": "3", "pendingDays":[15,10,11]}), "LXVjk", dynamic({"siteId": "2", "fileCount": "1", "pendingDays":[3]}), "jnySt", dynamic({"siteId": "3", "fileCount": "2", "pendingDays":[7,11]}), "NoxoX", dynamic({"siteId": "4", "fileCount": "4", "pendingDays":[1,4,3,11]}) ]
    • 谢谢。我在原始回复中添加了基于此数据集的示例,希望这会以更相关的方式回答原始问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多