Azure 数据资源管理器的编写查询

在本文中,你将了解如何在 Azure 数据资源管理器中使用查询语言通过最常见的运算符来执行基本查询。 此外,还可以接触到一些更高级的语言功能。

先决条件

可以通过以下两种方式之一运行本文中的查询:

查询语言概述

Azure 数据资源管理器中的查询是处理数据并返回结果的只读请求。 该请求用纯文本形式表示,使用的数据流模型旨在使语法更易于阅读、创作和自动执行。 该查询使用以类似于 SQL 的层次结构组织的架构实体:数据库、表和列。

该查询包含一系列由分号 (;) 分隔的查询语句,至少有一个语句是表格表达式语句,该语句可以生成按列和行的表式网格排列的数据。 查询的表格表达式语句生成查询结果。

表格表达语句的语法具有从一个表格查询运算符到另一个表格查询运算符的表格数据流,从数据源(例如,数据库中的一个表,或产生数据的运算符)开始,然后流经一组数据转换运算符,这些运算符通过使用竖线 (|) 分隔符绑定在一起。

例如,下面的查询有一个单独的语句,它是一个表格表达式语句。 该语句从对名为 StormEvents 的表引用开始(宿主此表的数据库在此是隐式的,并且是连接信息的一部分)。 然后,该表的数据(行)依次由 StartTime 列的值和 State 列的值进行筛选。 然后查询返回“幸存”的行计数。

[ 单击以运行查询 ]

StormEvents
| where StartTime >= datetime(2007-11-01) and StartTime < datetime(2007-12-01)
| where State == "FLORIDA"  
| count

在此情况下,结果为:

计数
23

有关详细信息,请参阅查询语言参考

最常见的运算符

本部分介绍的运算符是在 Azure 数据资源管理器中了解查询的构建基块。 你编写的大多数查询将包含其中一些运算符。

若要在帮助群集上运行查询:选择每个查询上方的“单击以运行查询”。

若要在自己的群集上运行查询:

  1. 将每个查询复制到基于 Web 的查询应用程序,然后选择查询,或将光标置于查询中。

  2. 在应用程序顶部,选择“运行”。

count

count:返回表中的行数。

以下查询返回 StormEvents 表中的行数。

[ 单击以运行查询 ]

StormEvents | count

take

take:返回最多指定数量的数据行。

以下查询从 StormEvents 表返回 5 行。 关键字“limit”是“take”的别名。

[ 单击以运行查询 ]

StormEvents | take 5

提示

除非对源数据进行排序,否则无法保证返回的记录。

project

project:选择列的子集。

以下查询将返回一组特定的列。

[ 单击以运行查询 ]

StormEvents
| take 5
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative

其中

where:筛选表,获取满足谓词的行子集。

以下查询依据 EventTypeState 来筛选数据。

[ 单击以运行查询 ]

StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| take 5
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative

sort

sort:按照一个或多个列的顺序对输入表的行排序。

以下查询依据 DamageProperty 按降序对数据进行排序。

[ 单击以运行查询 ]

StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| sort by DamageProperty desc
| take 5
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative

备注

运算顺序非常重要。 请尝试将 take 5 置于 sort by 前面。 是否获取了不同的结果?

top

top:返回按指定列排序的前 N 列。

以下查询返回与上面相同的结果,并减少了一个运算符。

[ 单击以运行查询 ]

StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| top 5 by DamageProperty desc
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative

extend

extend:计算派生的列。

以下查询通过计算每行中的值来创建新列。

[ 单击以运行查询 ]

StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| top 5 by DamageProperty desc
| extend Duration = EndTime - StartTime
| project StartTime, EndTime, Duration, State, EventType, DamageProperty, EpisodeNarrative

表达式可包含所有常用运算符(+、-、*、/、%),且含有一系列可调用的有用函数。

summarize

summarize:聚合行组。

以下查询返回按 State 统计的事件计数。

[ 单击以运行查询 ]

StormEvents
| summarize event_count = count() by State

summarize 运算符将在 by 子句中拥有相同值的行组合在一起,然后使用聚合函数(如 count)将每个组合并到单个行。 因此,在此情况下,每个州都有相应的行,还有一个列,用来表示该州的行计数。

有一系列聚合函数,并且可以在一个 summarize 运算符中使用其中多个函数,以生成多个计算列。 例如,可以获取每个州的风暴计数,以及每个州的唯一风暴数,然后使用 top 来获取受风暴影响最大的州。

[ 单击以运行查询 ]

StormEvents
| summarize StormCount = count(), TypeOfStorms = dcount(EventType) by State
| top 5 by StormCount desc

summarize 运算的结果是:

  • 以 by 命名的各列

  • 每个计算表达式相应的列

  • 每个 by 值组合相应的行

render

render:以图形输出的形式呈现结果。

以下查询显示柱形图。

[ 单击以运行查询 ]

StormEvents
| summarize event_count=count(), mid = avg(BeginLat) by State
| sort by mid
| where event_count > 1800
| project State, event_count
| render columnchart

以下查询显示简单的时间表。

[ 单击以运行查询 ]

StormEvents
| summarize event_count=count() by bin(StartTime, 1d)
| render timechart

以下查询根据一天的时间取模(量化到小时)对事件进行计数,并显示一个时间图表。

[ 单击以运行查询 ]

StormEvents
| extend hour = floor(StartTime % 1d , 1h)
| summarize event_count=count() by hour
| sort by hour asc
| render timechart

以下查询比较时间图表上的多个每日系列。

[ 单击以运行查询 ]

StormEvents
| extend hour= floor( StartTime % 1d , 1h)
| where State in ("GULF OF MEXICO","MAINE","VIRGINIA","WISCONSIN","NORTH DAKOTA","NEW JERSEY","OREGON")
| summarize event_count=count() by hour, State
| render timechart

备注

render 运算符为客户端功能,而不是引擎的一部分。 它被集成到语言以方便使用。 Web 应用程序支持以下选项:条形图、柱形图、饼图、时间表和线形图。

标量运算符

本部分介绍了一些最重要的标量运算符。

bin()

bin():将值向下舍入到给定 bin 大小的整数倍。

以下查询计算一天存储桶大小的计数。

[ 单击以运行查询 ]

StormEvents
| where StartTime > datetime(2007-02-14) and StartTime < datetime(2007-02-21)
| summarize event_count = count() by bin(StartTime, 1d)

case()

case():计算谓词列表,并返回第一个满足其谓词的结果表达式,或最终的 else 表达式。 此运算符可用于分类或分组数据:

以下查询将返回一个新列 deaths_bucket,并按编号对死亡进行分组。

[ 单击以运行查询 ]

StormEvents
| summarize deaths = sum(DeathsDirect) by State
| extend deaths_bucket = case (
    deaths > 50, "large",
    deaths > 10, "medium",
    deaths > 0, "small",
    "N/A")
| sort by State asc

extract()

extract():从文本字符串中获取正则表达式的匹配项。

以下查询从跟踪中提取特定属性值。

[ 单击以运行查询 ]

let MyData = datatable (Trace: string) ["A=1, B=2, Duration=123.45,...", "A=1, B=5, Duration=55.256, ..."];
MyData
| extend Duration = extract("Duration=([0-9.]+)", 1, Trace, typeof(real)) * time(1s)

此查询使用 let 语句,将名称(在此情况下为 MyData)绑定到表达式。 对于范围中的其余部分,其中出现 let 语句(全局范围或在函数正文范围内),可以使用名称来引用其绑定值。

parse_json()

parse_json():将字符串解释为 JSON 值并以动态方式返回值。 当需要提取 JSON 复合对象的多个元素时,使用它比使用 extractjson() 函数更好。

以下查询从数组中提取 JSON 元素。

[ 单击以运行查询 ]

let MyData = datatable (Trace: string)
['{"duration":[{"value":118.0,"valcount":5.0,"min":100.0,"max":150.0,"stdDev":0.0}]}'];
MyData
| extend NewCol = parse_json(Trace)
| project NewCol.duration[0].value, NewCol.duration[0].valcount, NewCol.duration[0].min, NewCol.duration[0].max, NewCol.duration[0].stdDev

以下查询提取 JSON 元素。

[ 单击以运行查询 ]

let MyData = datatable (Trace: string) ['{"value":118.0,"valcount":5.0,"min":100.0,"max":150.0,"stdDev":0.0}'];
MyData
| extend NewCol = parse_json(Trace)
| project NewCol.value, NewCol.valcount, NewCol.min, NewCol.max, NewCol.stdDev

以下查询提取带有动态数据类型的 JSON 元素。

[ 单击以运行查询 ]

let MyData = datatable (Trace: dynamic)
[dynamic({"value":118.0,"counter":5.0,"min":100.0,"max":150.0,"stdDev":0.0})];
MyData
| project Trace.value, Trace.counter, Trace.min, Trace.max, Trace.stdDev

ago()

ago():从当前 UTC 时钟时间减去给定时间跨度。

以下查询返回最近 12 个小时的数据。

[ 单击以运行查询 ]

//The first two lines generate sample data, and the last line uses
//the ago() operator to get records for last 12 hours.
print TimeStamp= range(now(-5d), now(), 1h), SomeCounter = range(1,121)
| mv-expand TimeStamp, SomeCounter
| where TimeStamp > ago(12h)

startofweek()

startofweek():返回包含日期的一周的起点,根据偏移量移动(如提供)

以下查询将返回带不同偏移量的一周的起点。

[ 单击以运行查询 ]

range offset from -1 to 1 step 1
| project weekStart = startofweek(now(), offset),offset

此查询使用 range 运算符,将生成单列值表。 另请参阅:startofday()startofweek()startofyear())、startofmonth()endofday() endofweek() endofmonth() endofyear()

between()

between():匹配包含范围内的输入。

以下查询依据给定日期范围来筛选数据。

[ 单击以运行查询 ]

StormEvents
| where StartTime between (datetime(2007-07-27) .. datetime(2007-07-30))
| count

以下查询根据给定日期范围对数据进行筛选,与起始日期存在三天 (3d) 的略微偏差。

[ 单击以运行查询 ]

StormEvents
| where StartTime between (datetime(2007-07-27) .. 3d)
| count

表格运算符

Kusto 有多个表格运算符,本文的其他部分介绍了其中一些运算符。 此处我们将重点介绍 parse。

parse

parse:计算字符串表达式并将其值分析为一个或多个计算列。 有三种分析方法:简单分析(默认)、正则表达式分析和宽松分析。

以下查询使用默认的简单分析来分析跟踪并提取相关值。 表达式(也称为“StringConstant”)是常规字符串值,并且有严格的匹配要求:扩展列必须匹配所需的类型。

[ 单击以运行查询 ]

let MyTrace = datatable (EventTrace:string)
[
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00Z, releaseTime=02/17/2016 08:40:00Z, previousLockTime=02/17/2016 08:39:00Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:00Z)'
];
MyTrace
| parse EventTrace with * "resourceName=" resourceName ", totalSlices=" totalSlices:long * "sliceNumber=" sliceNumber:long * "lockTime=" lockTime ", releaseTime=" releaseTime:date "," * "previousLockTime=" previouLockTime:date ")" *  
| project resourceName ,totalSlices , sliceNumber , lockTime , releaseTime , previouLockTime

以下查询使用 kind = regex 来分析跟踪并提取相关值。 StringConstant 可以是正则表达式。

[ 单击以运行查询 ]

let MyTrace = datatable (EventTrace:string)
[
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00Z, releaseTime=02/17/2016 08:40:00Z, previousLockTime=02/17/2016 08:39:00Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:00Z)'
];
MyTrace
| parse kind = regex EventTrace with "(.*?)[a-zA-Z]*=" resourceName @", totalSlices=\s*\d+\s*.*?sliceNumber=" sliceNumber:long  ".*?(previous)?lockTime=" lockTime ".*?releaseTime=" releaseTime ".*?previousLockTime=" previousLockTime:date "\\)"  
| project resourceName , sliceNumber , lockTime , releaseTime , previousLockTime

以下查询使用 kind = relaxed 来分析跟踪并提取相关值。 StringConstant 是常规字符串值,其匹配要求较为宽松:扩展列可部分匹配所需的类型。

[ 单击以运行查询 ]

let MyTrace = datatable (EventTrace:string)
[
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00Z, releaseTime=02/17/2016 08:40:00Z, previousLockTime=02/17/2016 08:39:00Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:00Z)'
];
MyTrace
| parse kind=relaxed "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=NULL, sliceNumber=23, lockTime=02/17/2016 08:40:01, releaseTime=NULL, previousLockTime=02/17/2016 08:39:01)" with * "resourceName=" resourceName ", totalSlices=" totalSlices:long * "sliceNumber=" sliceNumber:long * "lockTime=" lockTime ", releaseTime=" releaseTime:date "," * "previousLockTime=" previousLockTime:date ")" *  
| project resourceName ,totalSlices , sliceNumber , lockTime , releaseTime , previousLockTime

时序分析

make-series

make-series:将 summarize 之类的行组聚合在一起,但每个 by 值组合会生成一个(时间)序列向量。

以下查询将返回一组有关每日风暴事件计数的时间序列。 该查询涵盖了每个州三个月的时段,用常数 0 填充缺少的量化:

[ 单击以运行查询 ]

StormEvents
| make-series n=count() default=0 on StartTime in range(datetime(2007-01-01), datetime(2007-03-31), 1d) by State

在创建一组(时间)序列后,即可应用序列函数来检测异常形状、季节性模式等等。

以下查询提取具体某天事件最多的前三个州:

[ 单击以运行查询 ]

StormEvents
| make-series n=count() default=0 on StartTime in range(datetime(2007-01-01), datetime(2007-03-31), 1d) by State
| extend series_stats(n)
| top 3 by series_stats_n_max desc
| render timechart

有关详细信息,请查看完整的序列函数列表。

高级聚合

本文前面部分介绍了基本聚合,如 count 和 summarize。 本部分将介绍更高级的选项。

top-nested

top-nested:生成分层式最佳结果,其中每个级别都是对上一级别值的深化。

此操作符对于仪表板可视化场景或者需要回答以下问题时非常有用:“找出 K1 的前 N 个值(使用一些聚合);对于上述每一个值,找出 K2 的前 M 个值(使用另一个聚合);……”

以下查询将返回一个分层式的表,最高级别为 State,后跟 Sources

[ 单击以运行查询 ]

StormEvents
| top-nested 2 of State by sum(BeginLat),
top-nested 3 of Source by sum(BeginLat),
top-nested 1 of EndLocation by sum(BeginLat)

pivot() 插件

pivot() plugin:通过将输入表某列中的唯一值转换成输出表中的多个列来旋转表。 该运算符将在最终输出中的任何剩余列值上执行聚合。

以下查询应用筛选器,并将行旋转成列。

[ 单击以运行查询 ]

StormEvents
| project State, EventType
| where State startswith "AL"
| where EventType has "Wind"
| evaluate pivot(State)

dcount()

dcount():返回对组中某个表达式的非重复值数的估计值。 使用 count() 来计数所有值。

以下查询根据 State 来计数非重复 Source

[ 单击以运行查询 ]

StormEvents
| summarize Sources = dcount(Source) by State

dcountif()

dcountif():返回谓词计算结果为 true 的行表达式非重复值数量的估计值。

以下查询将计数其中 DamageProperty < 5000Source 的非重复值。

[ 单击以运行查询 ]

StormEvents 
| take 100
| summarize Sources = dcountif(Source, DamageProperty < 5000) by State

dcount_hll()

dcount_hll():从 HyperLogLog 结果计算 dcount(由 hll or hll_merge 生成)。

以下查询使用 HLL 算法来生成计数。

[ 单击以运行查询 ]

StormEvents
| summarize hllRes = hll(DamageProperty) by bin(StartTime,10m)
| summarize hllMerged = hll_merge(hllRes)
| project dcount_hll(hllMerged)

arg_max()

arg_max():在最大化表达式的组中查找行,并返回另一个表达式的值(或使用 * 返回整个行)。

以下查询返回每个州上次洪水报告的时间。

[ 单击以运行查询 ]

StormEvents
| where EventType == "Flood"
| summarize arg_max(StartTime, *) by State
| project State, StartTime, EndTime, EventType

makeset()

makeset():返回表达式在组中所获取非重复值集的动态 (JSON) 数组。

以下查询返回每个州报告洪水的所有时间,并从非重复值集中创建一个数组。

[ 单击以运行查询 ]

StormEvents
| where EventType == "Flood"
| summarize FloodReports = makeset(StartTime) by State
| project State, FloodReports

mv-expand

mv-expand:从动态类型的列扩展多值集合,以便集合中的每个值都获得一个单独的行。 将复制扩展行中的所有其他列。 它与 makelist 相反。

以下查询通过创建一组数据,然后用其演示 mv-expand 功能来生成示例数据。

[ 单击以运行查询 ]

let FloodDataSet = StormEvents
| where EventType == "Flood"
| summarize FloodReports = makeset(StartTime) by State
| project State, FloodReports;
FloodDataSet
| mv-expand FloodReports

percentiles()

percentiles():返回表达式定义的人口中指定 最近排名百分位数的估计值。 准确性取决于百分位区域中的填充密度。 只能在 summarize 内的聚合上下文中使用。

以下查询计算风暴持续时间的百分位数。

[ 单击以运行查询 ]

StormEvents
| extend duration = EndTime - StartTime
| where duration > 0s
| where duration < 3h
| summarize percentiles(duration, 5, 20, 50, 80, 95)

以下查询按州计算风暴持续时间的百分位数,并按照 5 分钟量化 (5m) 来规范化数据。

[ 单击以运行查询 ]

StormEvents
| extend duration = EndTime - StartTime
| where duration > 0s
| where duration < 3h
| summarize event_count = count() by bin(duration, 5m), State
| summarize percentiles(duration, 5, 20, 50, 80, 95) by State

跨数据集

本部分介绍的一些元素,可让你创建更复杂的查询,跨表联接数据,以及跨数据库和群集查询。

let

let:改进模块化和重复使用。 let 语句可以将潜在的复杂表达式拆分为多个部分,每个部分绑定到一个名称,然后将这些部分组合在一起。 此外,let 语句还可用于创建用户定义的函数和视图(表的结果类似于新表的表达式)。 通过 let 语句绑定的表达式可以是标量类型、表格类型或用户定义的函数 (lambda)。

以下示例创建一个表格类型变量,并在后续表达式中使用。

[ 单击以运行查询 ]

let LightningStorms =
StormEvents
| where EventType == "Lightning";
let AvalancheStorms =
StormEvents
| where EventType == "Avalanche";
LightningStorms
| join (AvalancheStorms) on State
| distinct State

join

join:通过匹配每个表中指定列的值,合并两个表的行以组成新表。 Kusto 支持一系列完整的联接类型:fullouter、inner、innerunique、leftanti、leftantisemi、leftouter、leftsemi、rightanti、rightantisemi、rightouter 、rightsemi 。

以下示例使用内部联接来联接两个表。

[ 单击以运行查询 ]

let X = datatable(Key:string, Value1:long)
[
    'a',1,
    'b',2,
    'b',3,
    'c',4
];
let Y = datatable(Key:string, Value2:long)
[
    'b',10,
    'c',20,
    'c',30,
    'd',40
];
X 
| join kind=inner Y on Key

提示

在联接前,使用 where 和 project 运算符可以减少输入表中的行数和列数。 如果某个表始终小于另一个表,则将其用作 join 的左侧(通过管道传送)。 join 匹配的列必须具有相同名称。 如有必要,请使用 project 运算符重命名其中一个表中的一列。

serialize

serialize:序列化行集,以便可以使用需要序列化数据的函数,如 row_number()。

以下查询将成功执行,因为已序列化数据。

[ 单击以运行查询 ]

StormEvents
| summarize count() by State
| serialize
| extend row_number = row_number()

如果行集是以下运算的结果,则同样视为已序列化:sort、top 或 range 运算符,后可跟 project、project-away、extend、where、parse、mv-expand 或 take 运算符。

[ 单击以运行查询 ]

StormEvents
| summarize count() by State
| sort by State asc
| extend row_number = row_number()

跨数据库和跨群集查询

跨数据库和跨群集查询:可以通过将同一群集引用为 database("MyDatabase").MyTable 来查询其中的数据库。 你可以通过将远程群集引用为 cluster("MyCluster").database("MyDatabase").MyTable 来查询其中的数据库。

以下查询从一个群集中调用,并查询 MyCluster 群集中的数据。 若要运行此查询,使用你自己的群集名称和数据库名称。

cluster("MyCluster").database("Wiki").PageViews
| where Views < 2000
| take 1000;

用户分析

本部分包含了一些元素和查询,用于演示在 Kusto 中执行用户行为分析的容易程度。

activity_counts_metrics 插件

activity_counts_metrics plugin:计算有用的活动指标(总计数值、非重复计数值、新值的非重复计数和聚合非重复计数)。 计算每个时间窗口的指标,然后将它们进行比较,并与之前的所有时间窗口进行聚合。

以下查询通过计算每日活动计数来分析用户采用。

[ 单击以运行查询 ]

let start=datetime(2017-08-01);
let end=datetime(2017-08-04);
let window=1d;
let T = datatable(UserId:string, Timestamp:datetime)
[
'A', datetime(2017-08-01),
'D', datetime(2017-08-01),
'J', datetime(2017-08-01),
'B', datetime(2017-08-01),
'C', datetime(2017-08-02),
'T', datetime(2017-08-02),
'J', datetime(2017-08-02),
'H', datetime(2017-08-03),
'T', datetime(2017-08-03),
'T', datetime(2017-08-03),
'J', datetime(2017-08-03),
'B', datetime(2017-08-03),
'S', datetime(2017-08-03),
'S', datetime(2017-08-04),
];
T
| evaluate activity_counts_metrics(UserId, Timestamp, start, end,
window)

activity_engagement 插件

activity_engagement plugin:在滑动时间线窗口中,根据 ID 列计算活动参与比率。 activity_engagement 插件可用于计算 DAU、WAU 和 MAU(每日、每周和每月的活动用户)。

以下查询在一个移动的七天窗口中,返回使用每日应用程序的不同用户总数,与使用每周应用程序的不同用户总数之间的比率。

[ 单击以运行查询 ]

// Generate random data of user activities
let _start = datetime(2017-01-01);
let _end = datetime(2017-01-31);
range _day from _start to _end step 1d
| extend d = tolong((_day - _start)/1d)
| extend r = rand()+1
| extend _users=range(tolong(d*50*r), tolong(d*50*r+100*r-1), 1)
| mv-expand id=_users to typeof(long) limit 1000000
// Calculate DAU/WAU ratio
| evaluate activity_engagement(['id'], _day, _start, _end, 1d, 7d)
| project _day, Dau_Wau=activity_ratio*100
| render timechart

提示

在计算 DAU/MAU 时,更改结束数据和移动窗口期 (OuterActivityWindow)。

activity_metrics 插件

activity_metrics plugin:根据当前阶段窗口和前一阶段窗口计算有用的活动指标(非重复计数值、新值的不同计数、保留率和改动率)。

以下查询计算给定数据集的改动率和保留率。

[ 单击以运行查询 ]

// Generate random data of user activities
let _start = datetime(2017-01-02);
let _end = datetime(2017-05-31);
range _day from _start to _end step 1d
| extend d = tolong((_day - _start)/1d)
| extend r = rand()+1
| extend _users=range(tolong(d*50*r), tolong(d*50*r+200*r-1), 1)
| mv-expand id=_users to typeof(long) limit 1000000
| where _day > datetime(2017-01-02)
| project _day, id
// Calculate weekly retention rate
| evaluate activity_metrics(['id'], _day, _start, _end, 7d)
| project _day, retention_rate*100, churn_rate*100
| render timechart

new_activity_metrics 插件

new_activity_metrics plugin:为新用户队列计算有用的活动指标(非重复计数值、非重复计数的新值、保留率和改动率)。 此插件的概念类似于 activity_metrics 插件,但关注的是新用户。

以下查询计算新用户队列(第一周到达的用户)在周间窗口的保留率和改动率。

[ 单击以运行查询 ]

// Generate random data of user activities
let _start = datetime(2017-05-01);
let _end = datetime(2017-05-31);
range Day from _start to _end step 1d
| extend d = tolong((Day - _start)/1d)
| extend r = rand()+1
| extend _users=range(tolong(d*50*r), tolong(d*50*r+200*r-1), 1)
| mv-expand id=_users to typeof(long) limit 1000000
// Take only the first week cohort (last parameter)
| evaluate new_activity_metrics(['id'], Day, _start, _end, 7d, _start)
| project from_Day, to_Day, retention_rate, churn_rate

session_count 插件

session_count plugin:基于某个时间线的 ID 列计算会话计数。

以下查询返回会话计数。 如果用户 ID 在 100 个时间段的时间范围内出现至少一次,而会话回查窗口为 41 个时段,会话将被视为处于活动状态。

[ 单击以运行查询 ]

let _data = range Timeline from 1 to 9999 step 1
| extend __key = 1
| join kind=inner (range Id from 1 to 50 step 1 | extend __key=1) on __key
| where Timeline % Id == 0
| project Timeline, Id;
// End of data definition
_data
| evaluate session_count(Id, Timeline, 1, 10000, 100, 41)
| render linechart

funnel_sequence 插件

funnel_sequence plugin:计算已获取州序列的用户的非重复计数;显示序列产生或遵循的前一个和下一个州的分布。

以下查询显示在 2007 年的所有龙卷风事件之前和之后发生了哪些事件。

[ 单击以运行查询 ]

// Looking on StormEvents statistics:
// Q1: What happens before Tornado event?
// Q2: What happens after Tornado event?
StormEvents
| evaluate funnel_sequence(EpisodeId, StartTime, datetime(2007-01-01), datetime(2008-01-01), 1d,365d, EventType, dynamic(['Tornado']))

funnel_sequence_completion 插件

funnel_sequence_completion plugin:计算不同时间段内已完成序列步骤的漏斗图。

以下查询检查序列中的完成漏斗图:在一小时、四小时和一天 ([1h, 4h, 1d]) 的“总体”时间中的 Hail -> Tornado -> Thunderstorm -> Wind

[ 单击以运行查询 ]

let _start = datetime(2007-01-01);
let _end = datetime(2008-01-01);
let _windowSize = 365d;
let _sequence = dynamic(['Hail', 'Tornado', 'Thunderstorm', 'Wind']);
let _periods = dynamic([1h, 4h, 1d]);
StormEvents
| evaluate funnel_sequence_completion(EpisodeId, StartTime, _start, _end, _windowSize, EventType, _sequence, _periods)

函数

本部分介绍 函数:存储在服务器上的可重用查询。 函数可由查询和其他函数调用(不支持递归函数)。

备注

你不能在只读的帮助群集上创建函数。 在此部分使用你自己的测试群集。

以下示例创建一个函数,采用州名称 (MyState) 作为参数。

.create function with (folder="Demo")
MyFunction (MyState: string)
{
StormEvents
| where State =~ MyState
}

以下示例调用一个函数,该函数获取德克萨斯州的数据。

MyFunction ("Texas")
| summarize count()

以下示例删除在第一步中创建的函数。

.drop function MyFunction

后续步骤

Kusto 查询语言参考