

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

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

# 唯一维度值
<a name="scheduledqueries-patterns-uniquedimvalues"></a>

您可能遇到这样的使用案例：在控制面板中，您希望将维度的唯一值作为变量，用于深入分析特定数据切片对应的指标。下方快照是一个示例，其中控制面板预先填充了多个维度的唯一值，例如区域、单元格、筒仓、微服务和可用区。在此我们演示如何利用计划查询，显著加快计算这些变量与所跟踪指标的不同值。

**Topics**
+ [关于原始数据](#scheduledqueries-patterns-uniquedimvalues-onraw)
+ [预先计算唯一的维度值](#scheduledqueries-patterns-uniquedimvalues-precompute)
+ [计算派生表中的变量](#scheduledqueries-patterns-uniquedimvalues-fromderived)

## 关于原始数据
<a name="scheduledqueries-patterns-uniquedimvalues-onraw"></a>

您可以使用 SELECT DISTINCT 计算数据中出现的不同值。例如，如果要获取 region 的不同值，可使用此形式的查询。

```
SELECT DISTINCT region
FROM "raw_data"."devops"
WHERE time > ago(1h)
ORDER BY 1
```

您可能正在跟踪数百万台设备和数十亿个时间序列。然而，在大多数情况下，这些有趣的变量属于基数较低的维度，其中包含的值仅有几个到几十个。从原始数据中计算 DISTINCT 可能需要扫描大量数据。

## 预先计算唯一的维度值
<a name="scheduledqueries-patterns-uniquedimvalues-precompute"></a>

您希望这些变量快速加载，以便控制面板能够进行交互。此外，这些变量通常在每次控制面板加载时进行计算，因此还应具有成本效益。您可使用计划查询来优化这些变量的查找过程，并将结果具体化到派生表中。

首先，您需要确定需要计算 DISTINCT 值的维度，或确定在计算 DISTINCT 值时用于谓词的列。

在此示例中，您可以发现控制面板正在为维度区域、单元格、筒仓、可用区和微服务填充不同的值。因此，您可以使用以下查询预先计算这些唯一值。

```
SELECT region, cell, silo, availability_zone, microservice_name, 
    min(@scheduled_runtime) AS time, COUNT(*) as numDataPoints 
FROM raw_data.devops 
WHERE time BETWEEN @scheduled_runtime - 15m AND @scheduled_runtime 
GROUP BY region, cell, silo, availability_zone, microservice_name
```

有一些重要事项需要注意。
+ 您可以使用一个计划计算，以预先计算许多不同查询的值。例如，您正在使用上述查询，以预先计算五个不同变量的值。因此，无需为每个变量单独创建一个。您可以使用相同的模式来识别多个面板间共享的计算，从而优化需要维护的计划查询数量。
+ 维度的唯一值本身并非时间序列数据。因此，需使用 @scheduled\$1runtime 将其转换为时间序列。通过将此数据与 @scheduled\$1runtime 参数相关联，您还可以跟踪给定时间点出现的唯一值，据此创建时间序列数据。
+ 在前面的示例中，您将看到正在被跟踪的指标值。此示例使用 COUNT(\$1)。如果要在控制面板中跟踪其他有意义的聚合数据，您可自行计算。

以下是使用先前查询进行计划计算的配置。在此示例中，使用计划表达式 cron(0/15 \$1 \$1 \$1 ? \$1)，配置为每 15 分钟刷新一次。

```
{
    "Name": "PT15mHighCardPerUniqueDimensions",
    "QueryString": "SELECT region, cell, silo, availability_zone, microservice_name, min(@scheduled_runtime) AS time, COUNT(*) as numDataPoints FROM raw_data.devops WHERE time BETWEEN @scheduled_runtime - 15m AND @scheduled_runtime GROUP BY region, cell, silo, availability_zone, microservice_name",
    "ScheduleConfiguration": {
        "ScheduleExpression": "cron(0/15 * * * ? *)"
    },
    "NotificationConfiguration": {
        "SnsConfiguration": {
            "TopicArn": "******"
        }
    },
    "TargetConfiguration": {
        "TimestreamConfiguration": {
            "DatabaseName": "derived",
            "TableName": "hc_unique_dimensions_pt15m",
            "TimeColumn": "time",
            "DimensionMappings": [
                {
                    "Name": "region",
                    "DimensionValueType": "VARCHAR"
                },
                {
                    "Name": "cell",
                    "DimensionValueType": "VARCHAR"
                },
                {
                    "Name": "silo",
                    "DimensionValueType": "VARCHAR"
                },
                {
                    "Name": "availability_zone",
                    "DimensionValueType": "VARCHAR"
                },
                {
                    "Name": "microservice_name",
                    "DimensionValueType": "VARCHAR"
                }
            ],
            "MultiMeasureMappings": {
                "TargetMultiMeasureName": "count_multi",
                "MultiMeasureAttributeMappings": [
                    {
                        "SourceColumn": "numDataPoints",
                        "MeasureValueType": "BIGINT"
                    }
                ]
            }
        }
    },
    "ErrorReportConfiguration": {
        "S3Configuration" : {
            "BucketName" : "******",
            "ObjectKeyPrefix": "errors",
            "EncryptionOption": "SSE_S3"
        }
    },
    "ScheduledQueryExecutionRoleArn": "******"
}
```

## 计算派生表中的变量
<a name="scheduledqueries-patterns-uniquedimvalues-fromderived"></a>

一旦计划计算在派生表 hc\$1unique\$1dimensions\$1pt15m 中预先生成唯一值，即可利用该派生表高效计算维度的唯一值。以下是示例查询，介绍如何计算唯一值，以及如何在这些唯一值查询中使用其他变量作为谓词。

**区域**

```
SELECT DISTINCT region
FROM "derived"."hc_unique_dimensions_pt15m"
WHERE time > ago(1h)
ORDER BY 1
```

**细胞**

```
SELECT DISTINCT cell
FROM "derived"."hc_unique_dimensions_pt15m"
WHERE time > ago(1h)
  AND region = '${region}'
ORDER BY 1
```

**筒仓**

```
SELECT DISTINCT silo
FROM "derived"."hc_unique_dimensions_pt15m"
WHERE time > ago(1h)
   AND region = '${region}' AND cell = '${cell}'
ORDER BY 1
```

**微服务**

```
SELECT DISTINCT microservice_name
FROM "derived"."hc_unique_dimensions_pt15m"
WHERE time > ago(1h)
   AND region = '${region}' AND cell = '${cell}'
ORDER BY 1
```

**可用区**

```
SELECT DISTINCT availability_zone
FROM "derived"."hc_unique_dimensions_pt15m"
WHERE time > ago(1h)
   AND region = '${region}' AND cell = '${cell}' AND silo = '${silo}'
ORDER BY 1
```