

要获得与亚马逊 Timestream 类似的功能 LiveAnalytics，可以考虑适用于 InfluxDB 的亚马逊 Timestream。适用于 InfluxDB 的 Amazon Timestream 提供简化的数据摄取和个位数毫秒级的查询响应时间，以实现实时分析。点击[此处](https://docs.amazonaws.cn//timestream/latest/developerguide/timestream-for-influxdb.html)了解更多信息。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 计划查询概念
<a name="scheduledqueries-concepts"></a>

**查询字符串**-这是您要预先计算其结果并将其存储在表的另一个 Timestream 中的查询。 LiveAnalytics 您可以使用 Timestream 的完整 SQL 表面区域来定义定时查询 LiveAnalytics，这使您可以灵活地使用常用表表达式、嵌套查询、窗口函数或 [Timestream 为 LiveAnalytics ](https://docs.amazonaws.cn/timestream/latest/developerguide/reference.html)查询语言支持的任何类型的聚合和标量函数编写查询。

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

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

**通知配置**-Timestream 根据您的计划表达式 LiveAnalytics 自动运行计划查询的实例。每当在您创建计划查询时配置的 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 存储桶及前缀。Timestream for 将调度查询名称和调用时间 LiveAnalytics 附加到此前缀，以帮助您识别与计划查询的特定实例相关的错误。

**标记**：您可以选择指定用于与计划查询相关联的标签。有关更多详细信息，请参阅为[资源标记时间流。 LiveAnalytics](https://docs.amazonaws.cn/timestream/latest/developerguide/tagging-keyspaces.html)

**示例**

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

```
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 的时间范围。

为了确保正确性并确保存储在目标表中的聚合与从源表计算出的聚合相匹配，Timestream for LiveAnalytics 确保只有在 2021-12-01 00:00:00:00 的计算完成后才会执行 2021-12-01 00:05:00 的计算。如果生成更新的值，则后者计算的结果可更新任何先前实现的聚合值 在内部，Timestream for LiveAnalytics 使用记录版本，其中由计划查询的后一个实例生成的记录将被分配更高的版本号。因此，假设源表中存在更新的数据，则在 2021-12-01 00:05:00 通过调用计算的聚合可更新在 2021-12-01 00:00:00 通过调用计算的聚合。

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

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

您可以使用 ExecuteScheduledQuery API 通过传递参数（用于 @scheduled\_runtime InvocationTime 参数的值）来手动启动计划查询的特定实例。以下是使用 ExecuteScheduledQuery API 时的一些重要注意事项：
+ 如果您要触发多个此类调用，则需确保这些调用不会在重叠的时间范围内生成结果。如果无法确保时间范围不重叠，则需确保这些查询按顺序依次启动。如果您同时启动多个查询任务且其时间范围存在重叠，则可能观察到触发器失败，在这些查询任务的错误报告中，您可能会看到版本冲突的提示。
+ 您可以使用 @scheduled\_runtime 的任何时间戳值启动调用。因此，您有责任正确设置这些值，以便目标表中与源表中数据更新范围相对应的时间范围得到相应更新。
+  ExecuteScheduledQuery API 以异步方式运行。成功调用后，该服务会发送 200 响应并继续执行查询。然而，如果同时运行多个计划查询执行，预计手动触发的计划执行可能会出现延迟。