计划查询概念 - Amazon Timestream
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

有关与适用于 LiveAnalytics 的 Amazon Timestream 类似的功能,可以考虑使用适用于 InfluxDB 的 Amazon Timestream。适用于 InfluxDB 的 Amazon Timestream 提供简化的数据摄取和个位数毫秒级的查询响应时间,以实现实时分析。点击此处了解更多信息。

计划查询概念

查询字符串:这是您要预先计算其结果并存储在另一个适用于 LiveAnalytics 的 Timestream 表中的查询。您可以使用适用于 LiveAnalytics 的 Timestream 的完整 SQL 表面区域定义计划查询,这使您可以灵活地使用常用表表达式、嵌套查询、窗口函数或适用于 LiveAnalytics 的 Timestream 查询语言支持的任何聚合函数和标量函数写入查询。

计划表达式:允许您指定计划查询实例的运行时间。您可以使用 cron 表达式(例如每天上午 8 点 UTC 运行)或 rate 表达式(例如每 10 分钟运行一次)以指定表达式。

目标配置:允许您指定如何将计划查询的结果映射到存储此计划查询结果的目标表。

通知配置:适用于 LiveAnalytics 的 Timestream 根据计划表达式自动运行计划查询的实例。每当在您创建计划查询时配置的 SNS 主题上运行此类查询时,您都会收到通知。此通知说明实例是成功运行还是遇到任何错误。此外,该通知还提供诸如计量字节数、写入目标表的数据、下次调用时间等信息。

下面是此类通知消息的示例。

{ "type":"AUTO_TRIGGER_SUCCESS", "arn":"arn:aws:timestream:us-east-1:123456789012:scheduled-query/ PT1mPerMinutePerRegionMeasureCount-9376096f7309", "nextInvocationEpochSecond":1637302500, "scheduledQueryRunSummary": { "invocationEpochSecond":1637302440, "triggerTimeMillis":1637302445697, "runStatus":"AUTO_TRIGGER_SUCCESS", "executionStats": { "executionTimeInMillis":21669, "dataWrites":36864, "bytesMetered":13547036820, "recordsIngested":1200, "queryResultRows":1200 } } }

在此通知消息中,bytesMetered 是查询在源表上扫描的字节数,而 dataWrites 是写入目标表的字节数。

注意

如果您以编程方式使用这些通知,请注意未来通知消息中可能新增字段。

错误报告位置:计划查询以异步方式运行并将数据存储在目标表中。如果实例遇到任何错误(例如无法存储的无效数据),则会将出错的记录写入错误报告中,该错误报告存储在您创建计划查询时指定的位置。您需指定存储位置的 S3 存储桶及前缀。适用于 LiveAnalytics 的 Timestream 会将计划查询名称和调用时间附加到此前缀,以帮助您识别与计划查询特定实例相关的错误。

标记:您可以选择指定用于与计划查询相关联的标签。有关更多详细信息,请参阅标记适用于 LiveAnalytics 的 Timestream 资源

示例

在以下示例中,您使用计划查询计算简单的聚合:

SELECT region, bin(time, 1m) as minute, SUM(CASE WHEN measure_name = 'metrics' THEN 20 ELSE 5 END) as numDataPoints FROM raw_data.devops WHERE time BETWEEN @scheduled_runtime - 10m AND @scheduled_runtime + 1m GROUP BY bin(time, 1m), region

@scheduled_runtime parameter:在此示例中,您会注意到查询接受特殊命名的参数 @scheduled_runtime。这是一个特殊参数(类型为时间戳),服务在调用计划查询的特定实例时设置该参数,以便您能够确定性地控制计划查询的特定实例分析源表数据的时间范围。在查询中,对于需要时间戳类型的任何位置,您都可以使用 @scheduled_runtime

以设置计划表达式为例:cron(0/5 * * * ? *),其中计划查询将在每小时的第 0、5、10、15、20、25、30、35、40、45、50、55 分钟运行。对于在 2021-12-01 00:05:00 触发的实例,@scheduled_runtime 参数初始化为该值,使得该时间点的实例处理的数据范围为 2021-11-30 23:55:00 至 2021-12-01 00:06:00。

时间范围重叠的实例:如本例所示,两个连续的计划查询实例可能存在时间范围重叠的情况。您可以根据自身需求、指定的时间谓词以及计划表达式来控制这一点。在此情况下,这种重叠使得这些计算能够基于任何延迟到达的数据(本例中最长可达 10 分钟)更新聚合结果。2021-12-01 00:00:00 触发的查询运行将涵盖 2021-11-30 23:50:00 到 2021-12-30 00:01:00 的时间范围,而 2021-12-01 00:05:00 触发的查询运行将涵盖 2021-11-30 23:55:00 到 2021-12-01 00:06:00 的时间范围。

为确保正确性并保证目标表中存储的聚合数据与源表计算结果一致,适用于 LiveAnalytics 的 Timestream 确保在 2021-12-01 00:05:00 进行的计算仅在 2021-12-01 00:00:00 的计算完成后才会执行。如果生成更新的值,则后者计算的结果可更新任何先前实现的聚合值 在内部,适用于 LiveAnalytics 的 Timestream 使用记录版本,对于计划查询,后续实例生成的记录将被分配更高的版本号。因此,假设源表中存在更新的数据,则在 2021-12-01 00:05:00 通过调用计算的聚合可更新在 2021-12-01 00:00:00 通过调用计算的聚合。

自动触发器与手动触发器:创建计划查询后,适用于 LiveAnalytics 的 Timestream 将根据指定计划自动运行实例。此类自动触发器完全由服务进行管理。

然而,在某些情况下,您可能需要手动启动计划查询的某些实例。示例包括:查询运行中某个具体实例失败时;自动化计划运行后源表出现延迟到达的数据或更新时;或需要根据自动化查询运行未覆盖的时间段(例如计划查询创建前的时段)更新目标表时。

您可以通过传递 InvocationTime 参数(用于 @scheduled_runtime 参数的值)手动触发计划查询的特定实例,从而使用 ExecuteScheduledQuery API。以下是使用 ExecuteScheduledQuery API 时的一些重要注意事项:

  • 如果您要触发多个此类调用,则需确保这些调用不会在重叠的时间范围内生成结果。如果无法确保时间范围不重叠,则需确保这些查询按顺序依次启动。如果您同时启动多个查询任务且其时间范围存在重叠,则可能观察到触发器失败,在这些查询任务的错误报告中,您可能会看到版本冲突的提示。

  • 您可以使用 @scheduled_runtime 的任何时间戳值启动调用。因此,您有责任正确设置这些值,以便目标表中与源表中数据更新范围相对应的时间范围得到相应更新。

  • ExecuteScheduledQuery API 以异步方式运行。成功调用后,该服务会发送 200 响应并继续执行查询。然而,如果同时运行多个计划查询执行,预计手动触发的计划执行可能会出现延迟。