首页 > 解决方案 > 对相似的列字符串值进行分组

问题描述

我在 Azure Log Analytics 中有一个记录消息的表。实际上并没有很多不同的消息,但在每个消息中都有一个可变部分,例如用户 ID 或时间戳。我需要计算按一小时间隔分组的不同消息类型,忽略每条消息中的变量元素(在这种情况下为 UUID 和时间戳)。我不知道所有的消息类型。我不能碰其他任何东西,我被迫使用这张桌子。

示例数据:

timestamp | message 
----------|--------------------------------------------------------
          | Message type A for user id 993215f6-c42a-4957-bd55-78d71306a8d0
          | Message type A for user id 60e7d02c-770a-4641-b379-6bd33fcd563c
          | Message type A for user id 5bf7646c-092b-4e20-ba43-de7fe01010ea
          | Another message type containing timestamp hh:mm:ss
          | Another message type containing timestamp hh:mm:ss
          | Another message type containing timestamp hh:mm:ss
          | Type C message <variable_string>

期望的输出:

timestamp                   | distinct_message                           | count 
----------------------------|--------------------------------------------|------
10/2/2019, 10:00:00.000 AM  | Message type A for user id                 | 25
10/2/2019, 10:00:00.000 AM  | Another message type containing timestamp  | 13
10/2/2019, 10:00:00.000 AM  | Type C message                             | 0
10/2/2019, 11:00:00.000 AM  | Message type A for user id                 | 4
10/2/2019, 11:00:00.000 AM  | Another message type containing timestamp  | 6
10/2/2019, 11:00:00.000 AM  | Type C message                             | 2

这是我设法创建的,但我对 KQL 的了解非常有限。

let regex_uid = "[[:xdigit:]]+-[[:xdigit:]]+-[[:xdigit:]]+-[[:xdigit:]]+-[[:xdigit:]]+";
traces 
| where timestamp > ago(1d) 
| extend message = replace(regex_uid, "", message) 
| extend message = replace("[0-9]+", "", message) 
| extend message = iif(message startswith "Type C message", "Type C message", message ) 
| project timestamp, message, operation_Name
| summarize count(operation_Name) by bin(timestamp, 1h), message

有没有更好的方法来做到这一点?

标签: azure-data-explorerkql

解决方案


您要考虑的另一个选择是使用reduce运算符:https ://docs.microsoft.com/en-us/azure/kusto/query/reduceoperator

输出将与您的问题中的输出不同。虽然如果我正确理解你的意图,它遵循相同的原则。


推荐阅读