教程:编写有效查询以加入指标数据
重要
从 2023 年 9 月 20 日开始,将无法创建新的 Azure 指标顾问资源。 指标顾问服务将于 2026 年 10 月 1 日停用。
本教程介绍如何执行下列操作:
- 如何编写有效的数据加入查询
- 常见错误及其规避方法
必备条件
创建“指标顾问”资源
若要探索指标顾问的功能,需要在 Azure 门户中创建指标顾问资源,以部署指标顾问实例。
数据架构要求
Azure AI 指标顾问是一项用于时序异常检测、诊断和分析的服务。 作为由 AI 提供支持的服务,它使用你的数据来训练所使用的模型。 服务接受具有以下各列的聚合数据表:
- 度量值(必需):度量值是一个基本术语或单位特定的术语,是指标的可量化值。 它指一个或多个包含数值的列。
- 时间戳(可选):零个或一个类型为
DateTime
或String
的列。 如果未设置此列,则时间戳将设置为每个引入周期的开始时间。 设置时间戳的格式,如下所示:yyyy-MM-ddTHH:mm:ssZ
。 - 维度(可选):维度是一个或多个分类值。 这些值的组合标识特定的单变量时序(例如国家/地区、语言、租户等)。 维度列可以是任意数据类型。 处理大量的列和值时要格外小心,应避免处理过多的维度。
如果使用数据源(如 Azure Data Lake Storage 或 Azure Blob 存储),则可将数据聚合在一起,使其与预期的指标架构一致。 这是因为这些数据源使用文件作为指标输入。
如果使用的是 Azure SQL 或 Azure 数据资源管理器等数据源,则可使用聚合函数将数据聚合到预期的架构中。 这是因为这些数据源支持通过运行查询来从源获取指标数据。
“指标顾问”中的数据引入原理
通常有两种方法将指标加入“指标顾问”:
- 将指标预先聚合到预期的架构中,并将数据存储到某些文件中。 在加入过程中填写路径模板,“指标顾问”将从该路径持续获取新文件,并对指标执行检测。 这是针对 Azure Data Lake 和 Azure Blob 存储等数据源的常见做法。
- 如果要从 Azure SQL Server、Azure 数据资源管理器或其他源等支持使用查询脚本的数据源中引入数据,则需要确保正确构造查询。 本文将指导如何编写有效的查询以按预期加入指标数据。
什么是时间间隔?
指标需要根据业务需求按某种粒度进行监视。 例如,业务关键性能指标 (KPI) 按天的粒度进行监视。 但是,服务性能指标常常按分钟/小时的粒度进行监视。 因此,从源收集指标数据的频率各有不同。
“指标顾问”按每个时间间隔持续获取指标数据,该时间间隔等同于指标的粒度。每次,指标顾问运行在此特定时间间隔内写入数据的查询。 根据此数据引入机制,查询脚本不应返回数据库中存在的所有指标数据,而需将结果限制为单个时间间隔内。
如何编写有效查询?
Use @IntervalStart and @IntervalEnd to limit query results
为了帮助实现这一点,提供两个在查询中使用的参数:@IntervalStart 和 @IntervalEnd。
每次运行查询时,都会将 @IntervalStart 和 @IntervalEnd 自动更新为最新的时间间隔时间戳并获取相应的指标数据。 @IntervalEnd 始终分配为 @IntervalStart + 1 的粒度。
下面是针对 Azure SQL Server 正确使用这两个参数的示例:
SELECT [timestampColumnName] AS timestamp, [dimensionColumnName], [metricColumnName] FROM [sampleTable] WHERE [timestampColumnName] >= @IntervalStart and [timestampColumnName] < @IntervalEnd;
采用这种方式编写查询脚本后,指标的时间戳应在每个查询结果的时间间隔内。 “指标顾问”会自动将时间戳与指标粒度对齐。
使用聚合函数来聚合指标
通常情况下,客户数据源中包含许多列,但并不是所有列都可以作为维度去监视或纳入。 客户可以使用聚合函数来聚合指标并仅包含有意义的列作为维度。
在下面的示例中,客户的数据源包含超过 10 列的数据,但只有少量列有意义且需要包含并聚合到要监视的指标中。
TS | 市场 | 设备 OS | 类别 | ... | Measure1 | Measure2 | Measure3 |
---|---|---|---|---|---|---|---|
2020-09-18T12:23:22Z | 纽约 | iOS | 太阳眼镜 | ... | 43242 | 322 | 54546 |
2020-09-18T12:27:34Z | 北京 | Android | 包包 | ... | 3333 | 126 | 67677 |
... |
如果客户想要按小时粒度监视“Measure1”,并选择“Market”和“Category”作为维度,以下示例介绍了如何正确使用聚合函数来实现此目的:
SQL 示例:
SELECT dateadd(hour, datediff(hour, 0, TS),0) as NewTS ,Market ,Category ,sum(Measure1) as M1 FROM [dbo].[SampleTable] where TS >= @IntervalStart and TS < @IntervalEnd group by Market, Category, dateadd(hour, datediff(hour, 0, TS),0)
Azure 数据资源管理器示例:
SampleTable | where TS >= @IntervalStart and TS < @IntervalEnd | summarize M1 = sum(Measure1) by Market, Category, NewTS = startofhour(TS)
注意
在上例中,客户想要按小时的粒度监视指标,但原始时间戳 (TS) 不匹配。 在聚合语句中,需要对时间戳执行一个过程使其按小时对齐,并生成一个名为“NewTS”的新时间戳列。
加入过程中的常见错误
错误: 在查询结果中找到多个时间戳值
这是常见错误,原因是未将查询结果限制在某个时间间隔内。 例如,如果按天的粒度监视指标,当查询返回的结果如下所示时,则出现此错误:
包含多个时间戳值,且这些值不在指标的同一个时间间隔中(一天)。 请查看“指标顾问”中的数据引入原理,了解“指标顾问”将获取每个指标时间间隔内的指标数据。 然后,请确保在查询中使用 @IntervalStart 和 @IntervalEnd,以将结果限制在一个时间间隔内。 查看 Use @IntervalStart and @IntervalEnd to limit query results 以了解详细指南和示例。
错误: 在一个指标时间间隔内的同一个维度组合中发现重复的指标值
在一个时间间隔内,“指标顾问”只应为同一维度组合提供一个指标值。 例如,如果按天的粒度监视指标,当查询返回的结果如下所示时,则出现此错误:
有关详细指导和示例,请参阅使用聚合函数来聚合指标。
后续步骤
转到下一篇文章,了解如何创建。