

在仔細考慮之後，我們決定停止 Amazon Kinesis Data Analytics for SQL 應用程式：

1. 從 **2025 年 9 月 1 日起，**我們不會為 Amazon Kinesis Data Analytics for SQL 應用程式提供任何錯誤修正，因為考慮到即將終止，我們將對其提供有限的支援。

2. 從 **2025 年 10 月 15 日起，**您將無法建立新的 Kinesis Data Analytics for SQL 應用程式。

3. 我們將自 **2026 年 1 月 27** 日起刪除您的應用程式。您將無法啟動或操作 Amazon Kinesis Data Analytics for SQL 應用程式。從那時起，Amazon Kinesis Data Analytics for SQL 將不再提供支援。如需詳細資訊，請參閱[Amazon Kinesis Data Analytics for SQL 應用程式終止](discontinuation.md)。

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

# 範例：偵測資料異常並取得說明 (RANDOM\$1CUT\$1FOREST\$1WITH\$1EXPLANATION 函數)
<a name="app-anomaly-detection-with-explanation"></a>

Amazon Kinesis Data Analytics 提供 `RANDOM_CUT_FOREST_WITH_EXPLANATION` 函數，可根據數值欄中的值為每筆記錄指派異常分數。該函數還提供了異常的解釋。如需詳細資訊，請參閱* Amazon Managed Service for Apache Flink SQL 參考資料*中的 [RANDOM\$1CUT\$1FOREST\$1WITH\$1EXPLANATION](https://docs.aws.amazon.com/kinesisanalytics/latest/sqlref/sqlrf-random-cut-forest-with-explanation.html)。

在本練習中，撰寫應用程式碼，以取得應用程式串流來源上的紀錄異常分數。您還可以獲得每個異常的解釋。

**Topics**
+ [步驟 1：準備資料](app-anomaly-with-ex-prepare.md)
+ [步驟 2：建立 Analytics 應用程式](app-anom-with-exp-create-app.md)
+ [步驟 3：檢查結果](examine-results-with-exp.md)

**首要步驟**  
[步驟 1：準備資料](app-anomaly-with-ex-prepare.md)

# 步驟 1：準備資料
<a name="app-anomaly-with-ex-prepare"></a>

在為此[範例](app-anomaly-detection-with-explanation.md)建立 Amazon Kinesis Data Analytics 應用程式之前，您必須先建立 Kinesis 資料串流作為應用程式的串流來源。您也可以執行 Python 程式碼，將模擬的血壓資料寫入串流。

**Topics**
+ [步驟 1.1：建立 Kinesis 資料串流](#app-anomaly-create-two-streams)
+ [步驟 1.2：將範例記錄寫入輸入串流](#app-anomaly-write-sample-records-inputstream)

## 步驟 1.1：建立 Kinesis 資料串流
<a name="app-anomaly-create-two-streams"></a>

在本節中，建立名為 `ExampleInputStream` 的 Kinesis 資料串流。您可以使用 AWS 管理主控台 或 建立此資料串流 AWS CLI。
+ 使用主控台：

  1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/kinesis](https://console.aws.amazon.com/kinesis) 的 Kinesis 主控台。

  1. 在導覽窗格中選擇 **資料串流**。選擇 **建立 Kinesis 串流**。

  1. 在角色名稱輸入 **ExampleInputStream**。在碎片數鍵入 **1**。
+ 或者，若要使用 AWS CLI 建立資料串流，請執行下列命令：

  ```
  $ aws kinesis create-stream --stream-name ExampleInputStream --shard-count 1
  ```

## 步驟 1.2：將範例記錄寫入輸入串流
<a name="app-anomaly-write-sample-records-inputstream"></a>

在此步驟中，執行 Python 程式碼以持續產生範例記錄，並將其寫入您建立的資料串流。

1. 安裝 Python 與 Pip。

   如需安裝 Python 的相關資訊，請參閱 [Python](https://www.python.org/) 網站。

   您可以使用 Pip 安裝相依性。如需安裝 Pip 的詳細資訊，請參閱 Pip 文件中的[安裝](https://pip.pypa.io/en/stable/installing/)。

1. 執行以下 Python 程式碼。您可以將區域變更為要在本範例中使用的區域。程式碼中的 `put-record` 命令會將 JSON 記錄寫入串流。

   ```
    
   from enum import Enum
   import json
   import random
   import boto3
   
   STREAM_NAME = "ExampleInputStream"
   
   
   class PressureType(Enum):
       low = "LOW"
       normal = "NORMAL"
       high = "HIGH"
   
   
   def get_blood_pressure(pressure_type):
       pressure = {"BloodPressureLevel": pressure_type.value}
       if pressure_type == PressureType.low:
           pressure["Systolic"] = random.randint(50, 80)
           pressure["Diastolic"] = random.randint(30, 50)
       elif pressure_type == PressureType.normal:
           pressure["Systolic"] = random.randint(90, 120)
           pressure["Diastolic"] = random.randint(60, 80)
       elif pressure_type == PressureType.high:
           pressure["Systolic"] = random.randint(130, 200)
           pressure["Diastolic"] = random.randint(90, 150)
       else:
           raise TypeError
       return pressure
   
   
   def generate(stream_name, kinesis_client):
       while True:
           rnd = random.random()
           pressure_type = (
               PressureType.low
               if rnd < 0.005
               else PressureType.high
               if rnd > 0.995
               else PressureType.normal
           )
           blood_pressure = get_blood_pressure(pressure_type)
           print(blood_pressure)
           kinesis_client.put_record(
               StreamName=stream_name,
               Data=json.dumps(blood_pressure),
               PartitionKey="partitionkey",
           )
   
   
   if __name__ == "__main__":
       generate(STREAM_NAME, boto3.client("kinesis"))
   ```

**後續步驟**  
[步驟 2：建立 Analytics 應用程式](app-anom-with-exp-create-app.md)

# 步驟 2：建立 Analytics 應用程式
<a name="app-anom-with-exp-create-app"></a>

在本節中，建立 Amazon Kinesis Data Analytics 應用程式，並將您在 [步驟 1：準備資料](app-anomaly-with-ex-prepare.md) 中建立的 Kinesis 資料串流設定為串流來源 。然後執行使用該 `RANDOM_CUT_FOREST_WITH_EXPLANATION` 函數的應用程式碼。

**建立應用程式**

1. 在以下網址開啟 Kinesis 主控台：[https://console.aws.amazon.com/kinesis](https://console.aws.amazon.com/kinesis)。

1. 在導覽窗格中，選擇 **Data Analytics**，然後選擇**建立應用程式**。

1. 提供應用程式名稱和說明 (選用)，然後選擇**建立應用程式**。

1. 選擇**連接串流資料**，然後從清單中選擇 **ExampleInputStream**。

1. 選擇**探索結構描述**，並確定 `Systolic` 與 `Diastolic` 顯示為 `INTEGER` 資料欄。如果它們具備其他類型，請選擇**編輯結構描述**，然後將類型 `INTEGER` 指定給它們。

1. 在**即時分析**下方，選擇**至 SQL 編輯器**。出現提示時，選擇執行您的應用程式。

1. 將下列程式碼貼到 SQL 編輯器中，然後選擇**儲存並執行 SQL**。

   ```
   --Creates a temporary stream.
   CREATE OR REPLACE STREAM "TEMP_STREAM" (
   	        "Systolic"                  INTEGER,
   	        "Diastolic"                 INTEGER,
   	        "BloodPressureLevel"        varchar(20),
   	        "ANOMALY_SCORE"             DOUBLE,
   	        "ANOMALY_EXPLANATION"       varchar(512));
   
   --Creates another stream for application output.	        
   CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
   	        "Systolic"                  INTEGER,
   	        "Diastolic"                 INTEGER,
   	        "BloodPressureLevel"        varchar(20),
   	        "ANOMALY_SCORE"             DOUBLE,
   	        "ANOMALY_EXPLANATION"       varchar(512));
   
   -- Compute an anomaly score with explanation for each record in the input stream
   -- using RANDOM_CUT_FOREST_WITH_EXPLANATION
   CREATE OR REPLACE PUMP "STREAM_PUMP" AS 
      INSERT INTO "TEMP_STREAM"
         SELECT STREAM "Systolic", "Diastolic", "BloodPressureLevel", ANOMALY_SCORE, ANOMALY_EXPLANATION 
         FROM TABLE(RANDOM_CUT_FOREST_WITH_EXPLANATION(
                 CURSOR(SELECT STREAM * FROM "SOURCE_SQL_STREAM_001"), 100, 256, 100000, 1, true));
   
   -- Sort records by descending anomaly score, insert into output stream
   CREATE OR REPLACE PUMP "OUTPUT_PUMP" AS 
      INSERT INTO "DESTINATION_SQL_STREAM"
         SELECT STREAM * FROM "TEMP_STREAM"
         ORDER BY FLOOR("TEMP_STREAM".ROWTIME TO SECOND), ANOMALY_SCORE DESC;
   ```

**後續步驟**  
[步驟 3：檢查結果](examine-results-with-exp.md)

# 步驟 3：檢查結果
<a name="examine-results-with-exp"></a>

執行此[範例](app-anomaly-detection-with-explanation.md)的 SQL 程式碼時，您會先看到異常分數等於零的資料列。這發生在初始學習階段。您會得到類似以下的結果：

```
ROWTIME SYSTOLIC DIASTOLIC BLOODPRESSURELEVEL ANOMALY_SCORE ANOMALY_EXPLANATION
27:49.0	101      66        NORMAL             0.711460417   {"Systolic":{"DIRECTION":"LOW","STRENGTH":"0.0922","ATTRIBUTION_SCORE":"0.3792"},"Diastolic":{"DIRECTION":"HIGH","STRENGTH":"0.0210","ATTRIBUTION_SCORE":"0.3323"}}
27:50.0	144      123       HIGH               3.855851061   {"Systolic":{"DIRECTION":"HIGH","STRENGTH":"0.8567","ATTRIBUTION_SCORE":"1.7447"},"Diastolic":{"DIRECTION":"HIGH","STRENGTH":"7.0982","ATTRIBUTION_SCORE":"2.1111"}}
27:50.0	113      69        NORMAL             0.740069409   {"Systolic":{"DIRECTION":"LOW","STRENGTH":"0.0549","ATTRIBUTION_SCORE":"0.3750"},"Diastolic":{"DIRECTION":"LOW","STRENGTH":"0.0394","ATTRIBUTION_SCORE":"0.3650"}}
27:50.0	105      64        NORMAL             0.739644157   {"Systolic":{"DIRECTION":"HIGH","STRENGTH":"0.0245","ATTRIBUTION_SCORE":"0.3667"},"Diastolic":{"DIRECTION":"LOW","STRENGTH":"0.0524","ATTRIBUTION_SCORE":"0.3729"}}
27:50.0	100      65        NORMAL             0.736993425   {"Systolic":{"DIRECTION":"HIGH","STRENGTH":"0.0203","ATTRIBUTION_SCORE":"0.3516"},"Diastolic":{"DIRECTION":"LOW","STRENGTH":"0.0454","ATTRIBUTION_SCORE":"0.3854"}}
27:50.0	108      69        NORMAL             0.733767202   {"Systolic":{"DIRECTION":"LOW","STRENGTH":"0.0974","ATTRIBUTION_SCORE":"0.3961"},"Diastolic":{"DIRECTION":"LOW","STRENGTH":"0.0189","ATTRIBUTION_SCORE":"0.3377"}}
```
+ `RANDOM_CUT_FOREST_WITH_EXPLANATION` 函數中的演算法會確保 `Systolic` 和 `Diastolic` 資料欄為數值，並將當作它們輸入。
+ 該 `BloodPressureLevel` 資料欄具有文本資料，因此演算法不會考慮。此資歷欄僅為視覺輔助，以幫助您快速發現範例中的正常、高血壓和低血壓水準。
+ 在 `ANOMALY_SCORE` 欄中，分數較高的記錄更為異常。此樣本結果集內的第二個記錄最異常，異常分數為 3.855851061。
+ 若要瞭解演算法考量的每個數值欄對異常分數的貢獻程度，請參閱 `ANOMALY_SCORE` 欄中名為 `ATTRIBUTION_SCORE` 的 JSON 欄位。在這組樣本結果第二列的情況下，`Systolic` 和 `Diastolic` 欄貢獻給異常的比例為 1. 7447:2.1111。換句話說，異常分數 45％ 的解釋歸因於收縮值，其餘歸因於舒張值。
+ 若要判斷此範例第二列所表示的點異常之方向，請參閱名為 `DIRECTION` 的 JSON 欄位。在此案例中，舒張值和收縮值都標記為 `HIGH`。若要判斷這些方向正確的信賴度，請參閱名為 `STRENGTH` 的 JSON 欄位。在此範例中，演算法更有信心舒張值高。事實上，舒張讀數的正常值通常為 60—80，123 比預期高得多。