reduce 运算符

使用 “版本 ”下拉列表切换服务。 了解有关导航的详细信息。
适用于:✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel

根据值相似性分组一系列字符串。

对于每个此类组,运算符将返回 pattern、count 和 representative。 pattern 最好地描述组,其中的 * 字符表示通配符。 count 是组中值的数量,representative 是组中的原始值之一。

语法

T|reduce [kind=ReduceKind] byExpr [with [threshold=阈值] [,characters=Characters]]

详细了解语法约定。

参数

客户 类型 必需 说明
Expr string ✔️ 作为减小量的值。
阈值 real 一个介于 0 到 1 之间的值,用于确定与分组条件匹配以触发缩减操作所需的最小行数。 默认值为 0.1。

阈值参数确定要组合在一起的值所需的最低相似性级别。 使用较小的阈值(接近 0),将更相似的值组合在一起,从而减少但更相似的组。 更大的阈值(接近 1)需要更少的相似性,导致更多的组不太相似。 建议为大型输入设置较小的阈值。 请参阅示例。
字符 string 在字词之间进行分隔的字符的列表。 默认值为每个非 ascii 数字字符。 有关示例,请参阅示例。
ReduceKind string 唯一有效的值是 source。 如果指定了 source,则运算符会将 Pattern 列追加到表中的现有行,而不是通过 Pattern 进行聚合。

返回

一个表,其行数与标题为 pattern、count 和 representative 的组数和列数相同。 pattern 最好地描述组,其中的 * 字符表示通配符,或任意插入字符串的占位符。 count 是组中值的数量,representative 是组中的原始值之一。

例如,reduce by city 的结果可能包括:

模式 计数 代表
三* 5182 圣伯纳德
圣人* 2846 圣露西
莫斯科 3726 莫斯科
*-上-* 2730 一对一
巴黎 2716 巴黎

示例

本节中的示例演示如何使用语法来帮助get started。

本文中的示例使用 help 群集中的公开可用的表,例如 Samples 数据库中的 StormEvents 表。

下面的示例生成一系列数字,创建一个包含串联字符串和随机整数的新列,然后使用特定的缩减参数按新列对行进行分组。 阈值设置为 0.001,这意味着运算符对彼此非常相似的值进行分组。

range x from 1 to 1000 step 1
| project MyText = strcat("MachineLearningX", tostring(toint(rand(10))))
| reduce by MyText  with threshold=0.001 , characters = "X" 

输出

模式 计数 代表
MachineLearning* 1000 MachineLearningX4

下面的示例生成一系列数字,创建一个包含串联字符串和随机整数的新列,然后使用特定的缩减参数按新列对行进行分组。 阈值设置为 0.9,这意味着运算符将值组合在一起的严格程度较低,并允许更多的方差。

range x from 1 to 1000 step 1
| project MyText = strcat("MachineLearningX", tostring(toint(rand(10))))
| reduce by MyText  with threshold=0.9 , characters = "X" 

输出

结果仅包含 MyText 值至少出现在行的 90% 的组。

模式 计数 代表
MachineLearning* 177 MachineLearningX9
MachineLearning* 102 MachineLearningX0
MachineLearning* 106 MachineLearningX1
MachineLearning* 96 MachineLearningX6
MachineLearning* 110 MachineLearningX4
MachineLearning* 100 MachineLearningX3
MachineLearning* 99 MachineLearningX8
MachineLearning* 104 MachineLearningX7
MachineLearning* 106 MachineLearningX2

如果未指定 Characters 参数,则运算符默认将所有非字母数字字符(包括空格和标点符号)视为术语分隔符。 以下示例演示未指定 reduce 参数时运算符的行为方式。

range x from 1 to 10 step 1 | project str = strcat("foo", "Z", tostring(x)) | reduce by str

输出

模式 计数 代表
别人 10

但是,如果指定“Z”是分隔符,则好像 str 中的每个值都是两个术语:foo 和 tostring(x):

range x from 1 to 10 step 1 | project str = strcat("foo", "Z", tostring(x)) | reduce by str with characters="Z"

输出

模式 计数 代表
foo* 10 fooZ1

以下示例演示如何将 reduce 运算符应用于“清理”输入,其中要减少的列中的 GUID 在减少之前将被替换:

从跟踪表中的一些记录开始。 然后减少包含随机 GUID 的文本列。 当随机 GUID 干扰化简作时,将它们全部替换为字符串“GUID”。 现在执行化简作。 如果存在嵌入的“-”或“_”字符的其他“准随机”标识符,请将字符视为非分词符。

Trace
| take 10000
| extend Text = replace(@"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}", "GUID", Text)
| reduce by Text with characters="-_"

注意

运算符的实现主要基于 Risto Vaarandi 的日志中挖掘<模式的数据聚类分析算法1>A 数据聚类分析算法。