

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

# 具體化視觀表
<a name="materialized-views"></a>

**Topics**
+ [區分具體化視觀表與其他視觀表類型](#materialized-views-differentiating)
+ [使用案例](#materialized-views-use-cases)
+ [重要概念](#materialized-views-key-concepts)
+ [具體化視觀表的許可](#materialized-views-permissions)
+ [建立和管理具體化視觀表](#materialized-views-creating-managing)
+ [儲存和資料存取](#materialized-views-storage-access)
+ [與 AWS Lake Formation 許可整合](#materialized-views-lake-formation)
+ [監控與除錯](#materialized-views-monitoring-debugging)
+ [管理重新整理任務](#materialized-views-managing-refresh-jobs)
+ [監控和疑難排解](#materialized-views-monitoring-troubleshooting)
+ [考量和限制](#materialized-views-considerations-limitations)

在 AWS Glue 資料目錄中，具體化檢視是受管資料表，以 Apache Iceberg 格式存放 SQL 查詢的預先計算結果。與每次存取時執行查詢的標準 Data Catalog 檢視不同，具體化檢視會實際存放查詢結果，並在基礎來源資料表變更時加以更新。您可以在 Amazon Athena、Amazon EMR 或 中使用 Apache Spark 3.5.6\$1 版建立具體化視觀表。 AWS Glue

具體化視觀表參考在 AWS Glue Data Catalog 中註冊的 Apache Iceberg 資料表，預先計算的資料會儲存為 Amazon S3 Tables 儲存貯體或 Amazon S3 一般用途儲存貯體中的 Apache Iceberg 資料表，使其可從多個查詢引擎存取，包括 Amazon Athena、Amazon Redshift 和第三方 Iceberg 相容引擎。

## 區分具體化視觀表與其他視觀表類型
<a name="materialized-views-differentiating"></a>

具體化視觀表與 AWS Glue Data Catalog 檢視、Apache Spark 檢視和 Amazon Athena 檢視有基本差異。雖然 Data Catalog 檢視是虛擬資料表，每次存取 SQL 查詢定義時都會執行，但具體化檢視會實際存放預先計算的查詢結果。這可消除備援運算，並大幅改善經常存取複雜轉換的查詢效能。

具體化視觀表也與使用 AWS Glue ETL 或自訂 Spark 任務建置的傳統資料轉換管道不同。您可以使用標準 SQL 語法定義具體化視觀表，而不是編寫自訂程式碼來處理變更偵測、增量更新和工作流程協同運作。Data Catalog AWS Glue 會自動監控來源資料表、偵測變更，並使用全受管運算基礎設施重新整理具體化視觀表。

## 使用案例
<a name="materialized-views-use-cases"></a>

以下是具體化視觀表的重要使用案例：
+ **加速複雜的分析查詢** – 建立具體化視觀表，預先計算昂貴的聯結、彙總和視窗函數。Spark 引擎會自動重寫後續查詢，以使用預先計算的結果，進而降低查詢延遲和運算成本。
+ **簡化資料轉換管道** – 使用簡單的 SQL 型具體化視觀表定義取代處理變更偵測、增量更新和工作流程協同運作的複雜 ETL 任務。 AWS Glue Data Catalog 會自動管理所有操作複雜性。
+ **使用受管資料存取啟用自助式分析** – 建立策劃的具體化視觀表，將原始資料轉換為業務就緒的資料集。授予使用者對具體化視觀表的存取權，而不公開基礎來源資料表，簡化安全管理，同時授權自助式分析。
+ **最佳化機器學習的功能工程** – 定義實作 ML 模型功能轉換的具體化視觀表。自動重新整理功能可確保功能存放區在來源資料演進時保持最新狀態，而增量重新整理可將運算成本降至最低。
+ **實作有效率的資料共用** – 建立具體化視觀表，以篩選和轉換特定消費者的資料。使用 在帳戶和區域之間共用具體化視觀表 AWS Lake Formation，無需重複資料，同時保持集中式控管。

## 重要概念
<a name="materialized-views-key-concepts"></a>

### 自動重新整理
<a name="materialized-views-automatic-refresh"></a>

自動重新整理是持續監控來源資料表並根據您定義的排程更新具體化視觀表的功能。當您建立具體化視觀表時，您可以使用以時間為基礎的排程來指定重新整理頻率，間隔頻率為一小時。 AWS Glue Data Catalog 使用受管 Spark 運算基礎設施在背景執行重新整理操作，透明地處理變更偵測和增量更新的所有層面。

當來源資料在重新整理間隔之間變更時，具體化視觀表會暫時過時。直接存取具體化檢視的查詢可能會傳回過期的結果，直到下一次排定的重新整理完成為止。對於需要立即存取最新資料的案例，您可以使用 `REFRESH MATERIALIZED VIEW` SQL 命令執行手動重新整理。

### 增量重新整理
<a name="materialized-views-incremental-refresh"></a>

增量重新整理是一種最佳化技術，只會處理自上次重新整理後在來源資料表中變更的資料，而不是重新計算整個具體化視觀表。 AWS Glue Data Catalog 利用 Apache Iceberg 的中繼資料層，有效率地追蹤來源資料表的變更，並判斷具體化視觀表的哪些部分需要更新。

相較於完整重新整理操作，此方法可大幅降低運算成本和重新整理持續時間，尤其是在重新整理週期之間只有少量資料變更的大型資料集。增量重新整理機制會自動運作；您不需要撰寫自訂邏輯來偵測或處理變更的資料。

### 自動查詢重寫
<a name="materialized-views-automatic-query-rewrite"></a>

自動查詢重寫是 Spark 引擎跨 Amazon Athena、Amazon EMR 和 提供的查詢最佳化功能 AWS Glue。當您對基礎資料表執行查詢時，Spark 最佳化工具會分析您的查詢計畫，並自動判斷可用的具體化檢視是否可以更有效率地滿足查詢。如果存在適當的具體化視觀表，最佳化工具會透明地重寫查詢，以使用預先計算的結果，而不是處理基礎資料表。

此最佳化無需變更應用程式程式碼或查詢陳述式。Spark 最佳化工具可確保自動查詢重寫僅適用於具體化視觀表為最新版本，並可產生準確的結果。如果具體化視觀表過時或不符合查詢需求，最佳化工具會根據基底資料表執行原始查詢計劃，並優先考慮效能的正確性。

### 檢視定義者角色
<a name="materialized-views-view-definer-role"></a>

具體化視觀表會根據建立視觀表的 IAM 角色許可運作，稱為視觀表定義者角色。定義者角色必須具有具體化檢視定義中參考的所有基礎資料表的讀取存取權，並在目標資料庫上建立資料表許可。當 Data Catalog AWS Glue 重新整理具體化視觀表時，它會擔任定義者角色來存取來源資料表並寫入更新的結果。

此安全模型可讓您授予使用者具體化視觀表的存取權，而無需授予他們基礎來源資料表的直接許可。如果檢視定義者角色無法存取任何基礎資料表，後續重新整理操作將會失敗，直到許可還原為止。

## 具體化視觀表的許可
<a name="materialized-views-permissions"></a>

若要建立和管理具體化視觀表，您必須設定 AWS Lake Formation 許可。建立具體化檢視的 IAM 角色 （定義者角色） 需要來源資料表和目標資料庫的特定許可。

### 定義者角色的必要許可
<a name="materialized-views-required-permissions-definer-role"></a>

定義者角色必須具有下列 Lake Formation 許可：
+ 在來源資料表上 – 沒有資料列、資料欄或儲存格篩選條件的 SELECT 或 ALL 許可
+ 在目標資料庫上 – CREATE\$1TABLE 許可
+ 在 AWS Glue 資料目錄上 – GetTable 和 CreateTable API 許可

當您建立具體化檢視時，定義者角色的 ARN 會存放在檢視定義中。 AWS Glue Data Catalog 會在執行自動重新整理操作時擔任此角色。如果定義者角色無法存取來源資料表，重新整理操作將會失敗，直到許可還原為止。

### AWS Glue 任務的 IAM 許可
<a name="materialized-views-iam-permissions-glue-jobs"></a>

 AWS Glue 任務的 IAM 角色需要下列許可：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetCatalog",
                "glue:GetCatalogs",
                "glue:GetTable",
                "glue:GetTables",
                "glue:CreateTable",
                "glue:UpdateTable",
                "glue:DeleteTable",
                "glue:GetDatabase",
                "glue:GetDatabases",
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*:/aws-glue/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "lakeformation:GetDataAccess"
            ],
            "Resource": "*"
        }
    ]
}
```

您用於具體化檢視自動重新整理的角色必須具有角色的 iam：PassRole 許可。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::111122223333:role/materialized-view-role-name"
      ]
    }
  ]
}
```

若要讓 Glue 為您自動重新整理具體化視觀表，角色也必須具有下列信任政策，讓服務能夠擔任該角色。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "glue.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

如果具體化檢視存放在 S3 資料表儲存貯體中，您也需要將下列許可新增至角色。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3tables:PutTableMaintenanceConfiguration"
      ],
      "Resource": "arn:aws:s3tables:*:123456789012:*"
    }
  ]
}
```

### 授予具體化視觀表的存取權
<a name="materialized-views-granting-access"></a>

若要授予其他使用者查詢具體化視觀表的存取權，請使用 AWS Lake Formation 授予具體化視觀表的 SELECT 許可。使用者可以查詢具體化視觀表，而不需要直接存取基礎來源資料表。

如需設定 Lake Formation 許可的詳細資訊，請參閱《 AWS Lake Formation 開發人員指南》中的授予和撤銷 Data Catalog 資源的許可。

## 建立和管理具體化視觀表
<a name="materialized-views-creating-managing"></a>

您可以使用 Spark 引擎中的 `CREATE MATERIALIZED VIEW` SQL 陳述式建立具體化視觀表。檢視定義會指定定義轉換邏輯的 SQL 查詢、目標資料庫和資料表名稱，以及選用的重新整理組態。您可以定義複雜的轉換，包括彙總、跨多個資料表的聯結、篩選條件和視窗函數。

```
CREATE MATERIALIZED VIEW sales_summary
AS
SELECT 
    region,
    product_category,
    SUM(sales_amount) as total_sales,
    COUNT(DISTINCT customer_id) as unique_customers
FROM sales_transactions
WHERE transaction_date >= current_date - interval '90' day
GROUP BY region, product_category;
```

若要設定自動重新整理，請在檢視定義中包含重新整理排程：

```
CREATE MATERIALIZED VIEW sales_summary
SCHEDULE REFRESH EVERY 1 HOUR
AS
SELECT region, product_category, SUM(sales_amount) as total_sales
FROM sales_transactions
GROUP BY region, product_category;
```

您可以隨時使用 `REFRESH MATERIALIZED VIEW`命令手動重新整理具體化視觀表：

```
REFRESH MATERIALIZED VIEW sales_summary;
```

若要修改現有具體化視觀表的重新整理排程，請使用 `ALTER MATERIALIZED VIEW`陳述式：

```
ALTER MATERIALIZED VIEW sales_summary
ADD SCHEDULE REFRESH EVERY 2 HOURS;
```

### 巢狀具體化視觀表
<a name="materialized-views-nested"></a>

您可以建立具體化視觀表，將其他具體化視觀表參考為基礎資料表，以啟用多階段資料轉換。當您建立巢狀具體化視觀表時， AWS Glue Data Catalog 會追蹤相依性，並自動透過具體化視觀表階層傳播更新。當基礎具體化視觀表重新整理時，所有依賴該視觀表的下游具體化視觀表都會隨之更新。

此功能可讓您將複雜的轉換分解為邏輯階段，改善可維護性，並根據資料新鮮度需求選擇性重新整理轉換層。

## 儲存和資料存取
<a name="materialized-views-storage-access"></a>

具體化視觀表會將預先計算的結果儲存為 S3 Tables 儲存貯體中的 Apache Iceberg 資料表，或 AWS 帳戶中的一般用途 S3 儲存貯體。 AWS Glue Data Catalog 透過 S3 Tables 的自動化最佳化功能，管理 Iceberg 資料表維護的所有層面，包括壓縮和快照保留。

由於具體化視觀表會儲存為 Iceberg 資料表，因此您可以直接從任何 Iceberg 相容引擎讀取，包括 Amazon Athena、Amazon Redshift 和第三方分析平台。此多引擎可存取性可確保您的預先計算資料在整個分析生態系統中保持可存取，而不會進行資料重複或格式轉換。

## 與 AWS Lake Formation 許可整合
<a name="materialized-views-lake-formation"></a>

您可以使用 AWS Lake Formation 來管理具體化視觀表的精細許可。檢視建立者會自動成為具體化檢視的擁有者，並且可以使用 AWS Lake Formation具名資源方法或 LF 標籤授予其他使用者或角色許可。

當您授予使用者具體化檢視的`SELECT`許可時，他們可以查詢預先計算的結果，而不需要存取基礎來源資料表。此安全模型可簡化資料存取管理，並可讓您實作最低權限原則，讓使用者只能存取所需的特定資料轉換。

您可以使用 AWS Lake Formation跨 AWS 帳戶共用功能，跨帳戶、 AWS 組織和組織單位共用具體化視觀表。您也可以使用資源連結跨 AWS 區域存取具體化視觀表，透過分散式資料存取實現集中式資料控管。

## 監控與除錯
<a name="materialized-views-monitoring-debugging"></a>

 AWS Glue Data Catalog 會將所有具體化檢視重新整理操作和相關聯的指標發佈至 Amazon CloudWatch。您可以透過 CloudWatch 指標監控重新整理開始時間、結束時間、持續時間、處理的資料磁碟區和重新整理狀態。當重新整理操作失敗時，會在 CloudWatch Logs 中擷取錯誤訊息和診斷資訊。

您可以設定 CloudWatch 警示，以在重新整理任務超過預期持續時間或重複失敗時接收通知。 AWS Glue Data Catalog 也會針對成功和失敗的重新整理執行，將變更事件發佈至 ，讓您能夠將具體化視觀表操作整合至更廣泛的工作流程自動化。

若要檢查具體化檢視的目前狀態，請使用 `DESCRIBE MATERIALIZED VIEW` SQL 命令，這會傳回中繼資料，包括過時狀態、上次重新整理時間戳記和重新整理排程組態。

## 管理重新整理任務
<a name="materialized-views-managing-refresh-jobs"></a>

### 開始手動重新整理
<a name="materialized-views-manual-refresh"></a>

在排程間隔之外觸發立即重新整理。

必要許可：用於進行 API 呼叫的 AWS 登入資料必須具有具體化檢視的`glue:GetTable`許可。

對於 S3 Tables Catalog：

```
aws glue start-materialized-view-refresh-task-run \
    --catalog-id <ACCOUNT_ID>:s3tablescatalog/<CATALOG_NAME> \
    --database-name <DATABASE_NAME> \
    --table-name <MV_TABLE_NAME>
```

對於根目錄：

```
aws glue start-materialized-view-refresh-task-run \
    --catalog-id <ACCOUNT_ID> \
    --database-name <DATABASE_NAME> \
    --table-name <MV_TABLE_NAME>
```

### 檢查重新整理狀態
<a name="materialized-views-checking-refresh-status"></a>

取得特定重新整理任務的狀態：

```
aws glue get-materialized-view-refresh-task-run \
    --catalog-id <CATALOG_ID> \
    --materialized-view-refresh-task-run-id <TASK_RUN_ID>
```

### 列出重新整理歷史記錄
<a name="materialized-views-listing-refresh-history"></a>

檢視具體化檢視的所有重新整理任務：

```
aws glue list-materialized-view-refresh-task-runs \
    --catalog-id <CATALOG_ID> \
    --database-name <DATABASE_NAME> \
    --table-name <MV_TABLE_NAME>
```

**注意**  
將 `<ACCOUNT_ID>:s3tablescatalog/<CATALOG_NAME>` 用於 S3 資料表，或將 `<ACCOUNT_ID>`用於根目錄。

### 停止執行中的重新整理
<a name="materialized-views-stopping-refresh"></a>

取消進行中重新整理任務：

```
aws glue stop-materialized-view-refresh-task-run \
    --catalog-id <CATALOG_ID> \
    --database-name <DATABASE_NAME> \
    --table-name <MV_TABLE_NAME>
```

## 監控和疑難排解
<a name="materialized-views-monitoring-troubleshooting"></a>

監控具體化視觀表重新整理任務的方法有三種：

### CloudWatch Metrics
<a name="materialized-views-cloudwatch-metrics"></a>

在 CloudWatch 中檢視所有具體化檢視重新整理任務的彙總指標：

可用的指標：
+ AWS/Glue 命名空間與維度：
  + CatalogId：您的目錄識別符
  + DatabaseName：包含具體化視觀表的資料庫
  + TableName：具體化檢視名稱
  + TaskType：設定為 "MaterializedViewRefresh"

在主控台中檢視：

1. 導覽至 CloudWatch 主控台 → 指標

1. Select AWS/Glue 命名空間

1. 依維度篩選： CatalogId、DatabaseName、TableName、TaskType

1. 檢視任務成功、失敗和持續時間的指標

CloudWatch 指標查詢範例：

```
{AWS/Glue,CatalogId,DatabaseName,TableName,TaskType} MaterializedViewRefresh
```

使用 AWS CLI：

```
aws cloudwatch get-metric-statistics \
    --namespace AWS/Glue \
    --metric-name <MetricName> \
    --dimensions Name=CatalogId,Value=<CATALOG_ID> \
                 Name=DatabaseName,Value=<DATABASE_NAME> \
                 Name=TableName,Value=<TABLE_NAME> \
                 Name=TaskType,Value=MaterializedViewRefresh \
    --start-time <START_TIME> \
    --end-time <END_TIME> \
    --period 3600 \
    --statistics Sum \
    --region <REGION>
```

### CloudWatch Logs
<a name="materialized-views-cloudwatch-logs"></a>

檢視個別重新整理任務執行的詳細執行日誌：

日誌群組： `/aws-glue/materialized-views/<task_run_id>`

其中 `<task_run_id>`是 UUID （例如 abc12345-def6-7890-ghij-klmnopqrstuv)。

檢視日誌：

```
# List log streams for a task run
aws logs describe-log-streams \
    --log-group-name /aws-glue/materialized-views/<TASK_RUN_ID> \
    --region <REGION>

# Get log events
aws logs get-log-events \
    --log-group-name /aws-glue/materialized-views/<TASK_RUN_ID> \
    --log-stream-name <LOG_STREAM_NAME> \
    --region <REGION>
```

在 CloudWatch 主控台中：

1. 導覽至 CloudWatch → 日誌群組

1. 搜尋 /aws-glue/materialized-views/

1. 選取具有任務執行 ID 的日誌群組

1. 檢視詳細的執行日誌、錯誤和 Spark 任務輸出

### 通知
<a name="materialized-views-eventbridge"></a>

訂閱事件以取得有關重新整理任務狀態變更的即時通知：

可用的事件類型：
+ Glue 具體化檢視重新整理任務已啟動
+ Glue 具體化檢視重新整理任務成功
+ Glue 具體化檢視重新整理任務失敗
+ Glue 具體化檢視自動重新整理調用失敗

建立 規則：

```
aws events put-rule \
    --name materialized-view-refresh-notifications \
    --event-pattern '{
        "source": ["aws.glue"],
        "detail-type": [
            "Glue Materialized View Refresh Task Started",
            "Glue Materialized View Refresh Task Succeeded",
            "Glue Materialized View Refresh Task Failed",
            "Glue Materialized View Auto-Refresh Invocation Failure"
        ]
    }' \
    --region <REGION>
```

新增目標 （例如 SNS 主題）：

```
aws events put-targets \
    --rule materialized-view-refresh-notifications \
    --targets "Id"="1","Arn"="arn:aws:sns:<REGION>:<ACCOUNT_ID>:<TOPIC_NAME>" \
    --region <REGION>
```

### 檢視重新整理狀態
<a name="materialized-views-refresh-status"></a>

使用 AWS Glue API 檢查具體化檢視重新整理任務的狀態：

```
aws glue get-materialized-view-refresh-task-run \
    --catalog-id <CATALOG_ID> \
    --materialized-view-refresh-task-run-id <TASK_RUN_ID> \
    --region <REGION>
```

或列出所有最近的重新整理執行：

```
aws glue list-materialized-view-refresh-task-runs \
    --catalog-id <CATALOG_ID> \
    --database-name <DATABASE_NAME> \
    --table-name <MV_TABLE_NAME> \
    --region <REGION>
```

這會顯示：
+ 上次重新整理時間
+ 重新整理狀態 （成功、失敗、執行中、已停止）
+ 任務執行 ID
+ 錯誤訊息 （如果失敗）

常見重新整理狀態：
+ 執行中：重新整理任務目前正在執行
+ SUCCEEDED：重新整理成功完成
+ 失敗：重新整理發生錯誤
+ 已停止：手動取消重新整理

故障診斷失敗的重新整理：

如果重新整理失敗，請檢查：

1. IAM 許可：確保定義者角色可存取所有基礎資料表和具體化視觀表位置

1. 基礎資料表可用性：確認所有參考的資料表都存在且可供存取

1. 查詢有效性：確認 SQL 查詢對 Spark SQL 方言有效

1. 資源限制：檢查是否已達到帳戶的並行重新整理限制

使用 GetMaterializedViewRefreshTaskRun API 擷取詳細的錯誤訊息。

## 考量和限制
<a name="materialized-views-considerations-limitations"></a>
+ 具體化視觀表只能參考在 AWS Glue 資料目錄中註冊為基礎資料表的 Apache Iceberg 資料表。
+ 檢視建立和自動查詢重寫僅適用於 Amazon Athena、Amazon EMR 和 AWS Glue (5.1 版） 的 Apache Spark 3.5.6 版及更新版本中的 Spark 引擎。
+ 具體化視觀表最終與基礎資料表一致。在重新整理時段期間，直接存取具體化檢視的查詢可能會傳回過期的資料。若要立即存取目前的資料，請執行手動重新整理。
+ 最短自動重新整理間隔為一小時。對於需要更頻繁更新的使用案例，請使用 `REFRESH MATERIALIZED VIEW`命令以程式設計方式執行手動重新整理。
+ 查詢重寫會優先考慮效能的正確性。如果具體化視觀表過時或無法準確滿足查詢要求，Spark 引擎會對基底資料表執行原始查詢。