

如需與 Amazon Timestream for LiveAnalytics 類似的功能，請考慮使用 Amazon Timestream for InfluxDB。它提供簡化的資料擷取和單一位數毫秒查詢回應時間，以進行即時分析。[在這裡](https://docs.aws.amazon.com//timestream/latest/developerguide/timestream-for-influxdb.html)進一步了解。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 內建時間序列功能
<a name="timeseries-specific-constructs"></a>

Timestream for LiveAnalytics 提供內建的時間序列功能，可將時間序列資料視為第一類概念。

內建的時間序列功能可分為兩個類別：檢視和函數。

您可以閱讀以下每個建構的相關文章。

**Topics**
+ [時間序列檢視](timeseries-specific-constructs.views.md)
+ [時間序列函數](timeseries-specific-constructs.functions.md)

# 時間序列檢視
<a name="timeseries-specific-constructs.views"></a>

適用於 LiveAnalytics 的 Timestream 支援下列函數，可將您的資料轉換為 `timeseries`資料類型：

**Topics**
+ [CREATE\$1TIME\$1SERIES](#timeseries-specific-constructs.views.CREATE_TIME_SERIES)
+ [UNNEST](#timeseries-specific-constructs.views.UNNEST)

## CREATE\$1TIME\$1SERIES
<a name="timeseries-specific-constructs.views.CREATE_TIME_SERIES"></a>

 **CREATE\$1TIME\$1SERIES** 是一種彙總函數，會取得時間序列的所有原始測量 （時間和測量值），並傳回時間序列資料類型。此函數的語法如下：

```
CREATE_TIME_SERIES(time, measure_value::<data_type>)
```

 其中 `<data_type>`是度量值的資料類型，可以是 bigint、布林值、雙值或 varchar 其中之一。第二個參數不能為 null。

考慮儲存在名為**指標**之資料表中的 EC2 執行個體 CPU 使用率，如下所示：


| 時間 | region | az | vpc | instance\$1id | measure\$1name | measure\$1value::double | 
| --- | --- | --- | --- | --- | --- | --- | 
|  2019-12-04 19：00：00.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef0  |  cpu\$1utilization  |  35.0  | 
|  2019-12-04 19：00：01.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef0  |  cpu\$1utilization  |  38.2  | 
|  2019-12-04 19：00：02.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef0  |  cpu\$1utilization  |  45.3  | 
|  2019-12-04 19：00：00.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef1  |  cpu\$1utilization  |  54.1  | 
|  2019-12-04 19：00：01.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef1  |  cpu\$1utilization  |  42.5  | 
|  2019-12-04 19：00：02.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef1  |  cpu\$1utilization  |  33.7  | 

執行查詢：

```
SELECT region, az, vpc, instance_id, CREATE_TIME_SERIES(time, measure_value::double) as cpu_utilization FROM metrics
    WHERE measure_name=’cpu_utilization’
    GROUP BY region, az, vpc, instance_id
```

將傳回具有 `cpu_utilization`作為度量值的所有序列。在這種情況下，我們有兩個系列：


| region | az | vpc | instance\$1id | cpu\$1utilization | 
| --- | --- | --- | --- | --- | 
|  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef0  |  【\$1time： 2019-12-04 19：00：00.000000000， measure\$1value：：double： 35.0\$1， \$1time： 2019-12-04 19：00：01.000000000， measure\$1value：：double： 38.2\$1， \$1time： 2019-12-04 19：00：02.000000000， measure\$1value：：double： 45.3\$1】  | 
|  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef1  |  【\$1time： 2019-12-04 19：00：00.000000000， measure\$1value：：double： 35.1\$1， \$1time： 2019-12-04 19：00：01.000000000， measure\$1value：：double： 38.5\$1， \$1time： 2019-12-04 19：00：02.000000000， measure\$1value：：：double： 45.7\$1】  | 

## UNNEST
<a name="timeseries-specific-constructs.views.UNNEST"></a>

 `UNNEST` 是一種資料表函數，可讓您將`timeseries`資料轉換為平面模型。語法如下：

 `UNNEST` 將 `timeseries` 轉換為兩個資料欄，即 `time`和 `value`。您也可以搭配 UNNEST 使用別名，如下所示：

```
UNNEST(timeseries) AS <alias_name> (time_alias, value_alias)
```

其中 `<alias_name>`是平面資料表的別名， `time_alias` 是`time`欄的別名， `value_alias`是`value`欄的別名。

例如，假設機群中的某些 EC2 執行個體設定為以 5 秒間隔發出指標，其他執行個體則以 15 秒間隔發出指標，而您需要過去 6 小時內以 10 秒精細程度發出所有執行個體的平均指標。若要取得此資料，您可以使用 **CREATE\$1TIME\$1SERIES** 將指標轉換為時間序列模型。然後，您可以使用 **INTERPOLATE\$1LINEAR** 取得 10 秒精細度的遺失值。接著，您可以使用 **UNNEST** 將資料轉換回一般模型，然後使用 **AVG** 取得所有執行個體的平均指標。

```
WITH interpolated_timeseries AS (
    SELECT region, az, vpc, instance_id,
        INTERPOLATE_LINEAR(
            CREATE_TIME_SERIES(time, measure_value::double),
                SEQUENCE(ago(6h), now(), 10s)) AS interpolated_cpu_utilization
    FROM timestreamdb.metrics 
    WHERE measure_name= ‘cpu_utilization’ AND time >= ago(6h)
    GROUP BY region, az, vpc, instance_id
)
SELECT region, az, vpc, instance_id, avg(t.cpu_util)
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_cpu_utilization) AS t (time, cpu_util)
GROUP BY region, az, vpc, instance_id
```

 上述查詢示範搭配別名使用 **UNNEST**。以下是未使用 **UNNEST** 別名的相同查詢範例：

```
WITH interpolated_timeseries AS (
    SELECT region, az, vpc, instance_id,
        INTERPOLATE_LINEAR(
            CREATE_TIME_SERIES(time, measure_value::double),
                SEQUENCE(ago(6h), now(), 10s)) AS interpolated_cpu_utilization
    FROM timestreamdb.metrics 
    WHERE measure_name= ‘cpu_utilization’ AND time >= ago(6h)
    GROUP BY region, az, vpc, instance_id
)
SELECT region, az, vpc, instance_id, avg(value)
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_cpu_utilization)
GROUP BY region, az, vpc, instance_id
```

# 時間序列函數
<a name="timeseries-specific-constructs.functions"></a>

Amazon Timestream for LiveAnalytics 支援時間序列函數，例如衍生、積分、相互關聯等，以從您的時間序列資料中衍生更深入的洞見。本節提供每個函數的使用資訊，以及範例查詢。選取以下主題以進一步了解。

**Topics**
+ [插補函數](timeseries-specific-constructs.functions.interpolation.md)
+ [衍生函數](timeseries-specific-constructs.functions.derivatives.md)
+ [整合函數](timeseries-specific-constructs.functions.integrals.md)
+ [關聯函數](timeseries-specific-constructs.functions.correlation.md)
+ [篩選和減少函數](timeseries-specific-constructs.functions.filter-reduce.md)

# 插補函數
<a name="timeseries-specific-constructs.functions.interpolation"></a>

如果您的時間序列資料在特定時間點遺失事件的值，您可以使用插補來估計這些遺失事件的值。Amazon Timestream 支援四種插補變體：線性插補、立方曲線插補、最後觀察值向前 (locf) 插補，以及常數插補。本節提供 Timestream for LiveAnalytics 插補函數的使用資訊，以及範例查詢。



## 用量資訊
<a name="w2aab7c59c13c13c11b7"></a>


| 函式 | 輸出資料類型 | Description | 
| --- | --- | --- | 
|  `interpolate_linear(timeseries, array[timestamp])`  |  時間序列  |  使用[線性插補](https://wikipedia.org/wiki/Linear_interpolation)填入遺失的資料。  | 
|  `interpolate_linear(timeseries, timestamp)`  |  double  |  使用[線性插補](https://wikipedia.org/wiki/Linear_interpolation)填入遺失的資料。  | 
|  `interpolate_spline_cubic(timeseries, array[timestamp])`  |  時間序列  |  使用[立方曲線插補](https://wikiversity.org/wiki/Cubic_Spline_Interpolation#:~:text=Cubic%20spline%20interpolation%20is%20a,Lagrange%20polynomial%20and%20Newton%20polynomial.)填入缺少的資料。  | 
|  `interpolate_spline_cubic(timeseries, timestamp)`  |  double  |  使用[立方曲線插補](https://wikiversity.org/wiki/Cubic_Spline_Interpolation#:~:text=Cubic%20spline%20interpolation%20is%20a,Lagrange%20polynomial%20and%20Newton%20polynomial.)填入缺少的資料。  | 
|  `interpolate_locf(timeseries, array[timestamp])`  |  時間序列  |  使用最後一個取樣值填入遺失的資料。  | 
|  `interpolate_locf(timeseries, timestamp)`  |  double  |  使用最後一個取樣值填入遺失的資料。  | 
|  `interpolate_fill(timeseries, array[timestamp], double)`  |  時間序列  |  使用常數值填入遺失的資料。  | 
|  `interpolate_fill(timeseries, timestamp, double)`  |  double  |  使用常數值填入遺失的資料。  | 

## 查詢範例
<a name="w2aab7c59c13c13c11b9"></a>

**Example**  
尋找過去 2 小時內特定 EC2 主機以 30 秒間隔固定的平均 CPU 使用率，並使用線性插補填入缺少的值：  

```
WITH binned_timeseries AS (
SELECT hostname, BIN(time, 30s) AS binned_timestamp, ROUND(AVG(measure_value::double), 2) AS avg_cpu_utilization
FROM "sampleDB".DevOps
WHERE measure_name = 'cpu_utilization'
    AND hostname = 'host-Hovjv'
    AND time > ago(2h)
GROUP BY hostname, BIN(time, 30s)
), interpolated_timeseries AS (
SELECT hostname,
    INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(binned_timestamp, avg_cpu_utilization),
            SEQUENCE(min(binned_timestamp), max(binned_timestamp), 15s)) AS interpolated_avg_cpu_utilization
FROM binned_timeseries
GROUP BY hostname
)
SELECT time, ROUND(value, 2) AS interpolated_cpu
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_avg_cpu_utilization)
```

**Example**  
尋找過去 2 小時內特定 EC2 主機以 30 秒間隔固定的平均 CPU 使用率，根據最後的觀察值使用插補填入缺少的值：  

```
WITH binned_timeseries AS (
SELECT hostname, BIN(time, 30s) AS binned_timestamp, ROUND(AVG(measure_value::double), 2) AS avg_cpu_utilization
FROM "sampleDB".DevOps
WHERE measure_name = 'cpu_utilization'
    AND hostname = 'host-Hovjv'
    AND time > ago(2h)
GROUP BY hostname, BIN(time, 30s)
), interpolated_timeseries AS (
SELECT hostname,
    INTERPOLATE_LOCF(
        CREATE_TIME_SERIES(binned_timestamp, avg_cpu_utilization),
            SEQUENCE(min(binned_timestamp), max(binned_timestamp), 15s)) AS interpolated_avg_cpu_utilization
FROM binned_timeseries
GROUP BY hostname
)
SELECT time, ROUND(value, 2) AS interpolated_cpu
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_avg_cpu_utilization)
```

# 衍生函數
<a name="timeseries-specific-constructs.functions.derivatives"></a>

衍生項目是用來計算指定指標的變更率，並可用來主動回應事件。例如，假設您計算過去 5 分鐘內 EC2 執行個體 CPU 使用率的衍生，並注意到顯著的正衍生。這可能表示工作負載的需求增加，因此您可能決定要啟動更多 EC2 執行個體，以更好地處理您的工作負載。

Amazon Timestream 支援兩種衍生函數變體。本節提供 Timestream for LiveAnalytics 衍生函數的使用資訊，以及範例查詢。



## 用量資訊
<a name="w2aab7c59c13c13c13b9"></a>


| 函式 | 輸出資料類型 | Description | 
| --- | --- | --- | 
|  `derivative_linear(timeseries, interval)`  |  時間序列  |  針對指定的 ，計算 中每個點`timeseries`的[衍生](https://wikipedia.org/wiki/Derivative)`interval`。  | 
|  `non_negative_derivative_linear(timeseries, interval)`  |  時間序列  |  與 相同`derivative_linear(timeseries, interval)`，但只會傳回正值。  | 

## 查詢範例
<a name="w2aab7c59c13c13c13c11"></a>

**Example**  
尋找過去 1 小時內每 5 分鐘 CPU 使用率的變化率：  

```
SELECT DERIVATIVE_LINEAR(CREATE_TIME_SERIES(time, measure_value::double), 5m) AS result 
FROM “sampleDB”.DevOps 
WHERE measure_name = 'cpu_utilization' 
AND hostname = 'host-Hovjv' and time > ago(1h) 
GROUP BY hostname, measure_name
```

**Example**  
計算一個或多個微服務產生的錯誤增加率：  

```
WITH binned_view as (
    SELECT bin(time, 5m) as binned_timestamp, ROUND(AVG(measure_value::double), 2) as value            
    FROM “sampleDB”.DevOps  
    WHERE micro_service = 'jwt'  
    AND time > ago(1h) 
    AND measure_name = 'service_error'
    GROUP BY bin(time, 5m)
)
SELECT non_negative_derivative_linear(CREATE_TIME_SERIES(binned_timestamp, value), 1m) as rateOfErrorIncrease
FROM binned_view
```

# 整合函數
<a name="timeseries-specific-constructs.functions.integrals"></a>

您可以使用積分來尋找時間序列事件每單位時間曲線下的區域。例如，假設您正在追蹤應用程式每單位時間收到的請求量。在此案例中，您可以使用整合函數來判斷在特定期間內，每個指定間隔所處理的請求總量。

Amazon Timestream 支援整合函數的一個變體。本節提供 Timestream for LiveAnalytics 整合函數的使用資訊，以及範例查詢。



## 用量資訊
<a name="w2aab7c59c13c13c15b9"></a>


| 函式 | 輸出資料類型 | Description | 
| --- | --- | --- | 
|  `integral_trapezoidal(timeseries(double))` `integral_trapezoidal(timeseries(double), interval day to second)` `integral_trapezoidal(timeseries(bigint))` `integral_trapezoidal(timeseries(bigint), interval day to second)` `integral_trapezoidal(timeseries(integer), interval day to second)` `integral_trapezoidal(timeseries(integer))`  |  double  |  使用[梯形規則](https://wikipedia.org/wiki/Trapezoidal_rule)，根據`interval day to second`針對`timeseries`所提供 指定的 近似[積分](https://wikipedia.org/wiki/Integral)。間隔天數到第二個參數為選用，預設值為 `1s`。如需間隔的詳細資訊，請參閱 [間隔和持續時間](date-time-functions.md#date-time-functions-interval-duration)。  | 

## 查詢範例
<a name="w2aab7c59c13c13c15c11"></a>

**Example**  
計算特定主機在過去 1 小時內每 5 分鐘處理的請求總量：  

```
SELECT INTEGRAL_TRAPEZOIDAL(CREATE_TIME_SERIES(time, measure_value::double), 5m) AS result FROM sample.DevOps 
WHERE measure_name = 'request' 
AND hostname = 'host-Hovjv' 
AND time > ago (1h) 
GROUP BY hostname, measure_name
```

# 關聯函數
<a name="timeseries-specific-constructs.functions.correlation"></a>

假設有兩個類似的長度時間序列，相互關聯函數提供相互關聯係數，這說明了兩個時間序列如何隨時間變化。相互關聯係數的範圍從 `-1.0`到 `1.0`。 `-1.0`表示兩個時間序列以相同速率相反方向的趨勢。 則`1.0`表示兩個時間序列以相同速率在相同方向的趨勢。的值`0`表示兩個時間序列之間沒有關聯。例如，如果油價上漲，且油公司的股票價格上漲，則油價上漲的趨勢和油價公司的價格上漲將具有正相互關聯係數。高正相關係數表示兩個價格趨勢的速率相似。同樣地，黏合價格和黏合收益之間的相互關聯係數是負數，表示這兩個值會隨著時間的推移向相反的趨勢。

Amazon Timestream 支援兩種相互關聯函數變體。本節提供 Timestream for LiveAnalytics 相互關聯函數的使用資訊，以及範例查詢。



## 用量資訊
<a name="w2aab7c59c13c13c19c11"></a>


| 函式 | 輸出資料類型 | Description | 
| --- | --- | --- | 
|  `correlate_pearson(timeseries, timeseries)`  |  double  |  計算兩個 [的 Pearson 相互關聯係數](https://wikipedia.org/wiki/Pearson_correlation_coefficient)`timeseries`。時間序列必須具有相同的時間戳記。  | 
|  `correlate_spearman(timeseries, timeseries)`  |  double  |  計算兩個 [的 Spearman 相互關聯係數](https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient)`timeseries`。時間序列必須具有相同的時間戳記。  | 

## 查詢範例
<a name="w2aab7c59c13c13c19c13"></a>

**Example**  

```
WITH cte_1 AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, measure_value::double), 
        SEQUENCE(min(time), max(time), 10m)) AS result 
    FROM sample.DevOps 
    WHERE measure_name = 'cpu_utilization' 
    AND hostname = 'host-Hovjv' AND time > ago(1h) 
    GROUP BY hostname, measure_name
), 
cte_2 AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, measure_value::double), 
        SEQUENCE(min(time), max(time), 10m)) AS result 
    FROM sample.DevOps 
    WHERE measure_name = 'cpu_utilization' 
    AND hostname = 'host-Hovjv' AND time > ago(1h) 
    GROUP BY hostname, measure_name
) 
SELECT correlate_pearson(cte_1.result, cte_2.result) AS result 
FROM cte_1, cte_2
```

# 篩選和減少函數
<a name="timeseries-specific-constructs.functions.filter-reduce"></a>

Amazon Timestream 支援執行篩選和減少時間序列資料操作的函數。本節提供 Timestream for LiveAnalytics 篩選和減少函數的使用資訊，以及範例查詢。



## 用量資訊
<a name="w2aab7c59c13c13c23b7"></a>


| 函式 | 輸出資料類型 | Description | 
| --- | --- | --- | 
|  `filter(timeseries(T), function(T, Boolean))`  |  timeseries(T)  |  使用傳遞的 `function`傳回 的值，從輸入時間序列建構時間序列`true`。  | 
|  `reduce(timeseries(T), initialState S, inputFunction(S, T, S), outputFunction(S, R))`  |  R  |  傳回單一值，從時間序列減少。`inputFunction` 將依序在時間序列中的每個元素上調用 。除了採用目前元素之外，inputFunction 也會採用目前狀態 （一開始為 `initialState`)，並傳回新狀態。`outputFunction` 將調用 ，將最終狀態轉換為結果值。`outputFunction` 可以是身分函數。  | 

## 查詢範例
<a name="w2aab7c59c13c13c23b9"></a>

**Example**  
建立測量值大於 70 的主機和篩選條件點的 CPU 使用率時間序列：  

```
WITH time_series_view AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, ROUND(measure_value::double,2)), 
            SEQUENCE(ago(15m), ago(1m), 10s)) AS cpu_user
    FROM sample.DevOps
    WHERE hostname = 'host-Hovjv' and measure_name = 'cpu_utilization'
        AND time > ago(30m)
    GROUP BY hostname
)
SELECT FILTER(cpu_user, x -> x.value > 70.0) AS cpu_above_threshold
from time_series_view
```

**Example**  
建構主機的 CPU 使用率時間序列，並判斷測量的總和平方：  

```
WITH time_series_view AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, ROUND(measure_value::double,2)), 
            SEQUENCE(ago(15m), ago(1m), 10s)) AS cpu_user
    FROM sample.DevOps
    WHERE hostname = 'host-Hovjv' and measure_name = 'cpu_utilization'
        AND time > ago(30m)
    GROUP BY hostname
)
SELECT REDUCE(cpu_user,
    DOUBLE '0.0',
    (s, x) -> x.value * x.value + s,
    s -> s)
from time_series_view
```

**Example**  
建構主機的 CPU 使用率時間序列，並判斷高於 CPU 閾值的樣本部分：  

```
WITH time_series_view AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, ROUND(measure_value::double,2)), 
            SEQUENCE(ago(15m), ago(1m), 10s)) AS cpu_user
    FROM sample.DevOps
    WHERE hostname = 'host-Hovjv' and measure_name = 'cpu_utilization'
        AND time > ago(30m)
    GROUP BY hostname
)
SELECT ROUND(
    REDUCE(cpu_user, 
      -- initial state 
      CAST(ROW(0, 0) AS ROW(count_high BIGINT, count_total BIGINT)),
      -- function to count the total points and points above a certain threshold
      (s, x) -> CAST(ROW(s.count_high + IF(x.value > 70.0, 1, 0), s.count_total + 1) AS ROW(count_high BIGINT, count_total BIGINT)),
      -- output function converting the counts to fraction above threshold
      s -> IF(s.count_total = 0, NULL, CAST(s.count_high AS DOUBLE) / s.count_total)), 
    4) AS fraction_cpu_above_threshold
from time_series_view
```