

Amazon Timestream for LiveAnalytics に類似した機能をご希望の場合は Amazon Timestream for InfluxDB をご検討ください。リアルタイム分析に適した、シンプルなデータインジェストと 1 桁ミリ秒のクエリ応答時間を特徴としています。詳細については、[こちら](https://docs.aws.amazon.com//timestream/latest/developerguide/timestream-for-influxdb.html)を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 組み込みの時系列機能
<a name="timeseries-specific-constructs"></a>

Timestream for LiveAnalytics には、時系列データを第一級の概念として扱う組み込みの時系列機能が備わっています。

組み込みの時系列機能は、ビューと関数の 2 つのカテゴリに分けられます。

各コンストラクトについては、以下を参照してください。

**Topics**
+ [時系列ビュー](timeseries-specific-constructs.views.md)
+ [時系列関数](timeseries-specific-constructs.functions.md)

# 時系列ビュー
<a name="timeseries-specific-constructs.views"></a>

Timestream for LiveAnalytics は、データを `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、boolean、double、varchar のいずれかになります。2 つ目のパラメータを null にすることはできません。

次に示すように、**metrics** という名前のテーブルに保存されている EC2 インスタンスの CPU 使用率を検討します。


| Time | リージョン | 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` を持つすべての系列を返します。この場合、2 つの系列があります。


| リージョン | 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` を 2 つの列、つまり `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)
+ [filter 関数と reduce 関数](timeseries-specific-constructs.functions.filter-reduce.md)

# 補間関数
<a name="timeseries-specific-constructs.functions.interpolation"></a>

特定の時点で時系列データにイベントの値が欠落している場合は、補間を使用して欠落しているイベントの値を推定できます。Amazon Timestream は、線形補間、3 次スプライン補間、直近の観測値による補間 (locf)、定数補間の 4 つの補間バリアントをサポートしています。このセクションでは、Timestream for LiveAnalytics における補間関数の使用状況の情報とサンプルクエリについて説明します。



## 使用状況の情報
<a name="w2aab7c59c13c13c11b7"></a>


| 関数 | 出力データ型 | 説明 | 
| --- | --- | --- | 
|  `interpolate_linear(timeseries, array[timestamp])`  |  timeseries  |  [線形補間](https://wikipedia.org/wiki/Linear_interpolation)を使用して欠落データを入力します。  | 
|  `interpolate_linear(timeseries, timestamp)`  |  double  |  [線形補間](https://wikipedia.org/wiki/Linear_interpolation)を使用して欠落データを入力します。  | 
|  `interpolate_spline_cubic(timeseries, array[timestamp])`  |  timeseries  |  [3 次スプライン補間](https://wikiversity.org/wiki/Cubic_Spline_Interpolation#:~:text=Cubic%20spline%20interpolation%20is%20a,Lagrange%20polynomial%20and%20Newton%20polynomial.)を使用して欠落データを入力します。  | 
|  `interpolate_spline_cubic(timeseries, timestamp)`  |  double  |  [3 次スプライン補間](https://wikiversity.org/wiki/Cubic_Spline_Interpolation#:~:text=Cubic%20spline%20interpolation%20is%20a,Lagrange%20polynomial%20and%20Newton%20polynomial.)を使用して欠落データを入力します。  | 
|  `interpolate_locf(timeseries, array[timestamp])`  |  timeseries  |  最後にサンプリングされた値を使用して欠落データを入力します。  | 
|  `interpolate_locf(timeseries, timestamp)`  |  double  |  最後にサンプリングされた値を使用して欠落データを入力します。  | 
|  `interpolate_fill(timeseries, array[timestamp], double)`  |  timeseries  |  定数値を使用して欠落データを入力します。  | 
|  `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 使用率を調べ、locf に基づく補間を使用して欠落値を入力します。  

```
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 は、2 つの導関数のバリアントをサポートしています。このセクションでは、Timestream for LiveAnalytics における導関数の使用状況の情報とサンプルクエリについて説明します。



## 使用状況の情報
<a name="w2aab7c59c13c13c13b9"></a>


| 関数 | 出力データ型 | 説明 | 
| --- | --- | --- | 
|  `derivative_linear(timeseries, interval)`  |  timeseries  |  指定された `interval` における `timeseries` の各ポイントの[導関数](https://wikipedia.org/wiki/Derivative)を計算します。  | 
|  `non_negative_derivative_linear(timeseries, interval)`  |  timeseries  |  `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**  
1 つ以上のマイクロサービスによって生成されたエラーの増加率を計算します。  

```
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>


| 関数 | 出力データ型 | 説明 | 
| --- | --- | --- | 
|  `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)を使用して、指定された `timeseries` の指定された `interval day to second` ごとに[積分](https://wikipedia.org/wiki/Integral)を近似します。interval day to second パラメータはオプションで、デフォルトは `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>

同様の長さの時系列が 2 つある場合、相関関数は相関係数を求め、2 つの時系列の経時的な傾向について説明します。相関係数の範囲は `-1.0`～`1.0` です。`-1.0` は、2 つの時系列が同じ比率で反対方向の傾向にあることを示します。一方 `1.0` は、2 つの時系列が同じ比率で同じ方向の傾向にあることを示します。`0` の値は、2 つの時系列間に相関がないことを示します。例えば、石油の価格が上がり、製油会社の株価が上昇すると、石油の価格上昇と製油会社の株価上昇の傾向には正の相関係数があります。正の相関係数が高い場合は、2 つの価格に同様の割合の傾向があることを示します。同様に、債券価格と債券利回りの相関係数は負であり、これら 2 つの値は時間の経過とともに逆方向に推移することを示しています。

Amazon Timestream は、相関関数の 2 つのバリアントをサポートしています。このセクションでは、Timestream for LiveAnalytics における相関関数の使用状況の情報とサンプルクエリについて説明します。



## 使用状況の情報
<a name="w2aab7c59c13c13c19c11"></a>


| 関数 | 出力データ型 | 説明 | 
| --- | --- | --- | 
|  `correlate_pearson(timeseries, timeseries)`  |  double  |  2 つの `timeseries` について[ピアソンの相関係数](https://wikipedia.org/wiki/Pearson_correlation_coefficient)を計算します。時系列には同じタイムスタンプが必要です。  | 
|  `correlate_spearman(timeseries, timeseries)`  |  double  |  2 つの `timeseries` について[スピアマンの相関係数](https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient)を計算します。時系列には同じタイムスタンプが必要です。  | 

## クエリの例
<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
```

# filter 関数と reduce 関数
<a name="timeseries-specific-constructs.functions.filter-reduce"></a>

Amazon Timestream は、時系列データに対してフィルタリングを実行し、オペレーションを減らすための関数をサポートしています。このセクションでは、Timestream for LiveAnalytics における filter 関数と reduce 関数の使用状況の情報とサンプルクエリについて説明します。



## 使用状況の情報
<a name="w2aab7c59c13c13c23b7"></a>


| 関数 | 出力データ型 | 説明 | 
| --- | --- | --- | 
|  `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
```