

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

# 在 中建立物件 AWS Glue Data Catalog
<a name="populating-catalog"></a>

AWS Lake Formation 使用 AWS Glue Data Catalog (Data Catalog) 來儲存有關資料湖、資料來源、轉換和目標的中繼資料。中繼資料是資料集中的基礎資料的相關資料。每個 AWS 帳戶每個 AWS 區域都有一個資料目錄。

Data Catalog 中的中繼資料會組織在包含目錄、資料庫和資料表的三層資料階層中。它會將來自各種來源的資料組織到稱為目錄的邏輯容器。每個目錄代表來自 Amazon Redshift 資料倉儲、 Amazon DynamoDB 資料庫和第三方資料來源等來源的資料，例如 Snowflake、MySQL 和透過聯合連接器整合的超過 30 個外部資料來源。您也可以在資料目錄中建立新的目錄，將資料存放在 S3 資料表儲存貯體或 Redshift 受管儲存 (RMS) 中。

資料表會儲存基礎資料的相關資訊，包括結構描述資訊、分割區資訊和資料位置。資料庫是資料表的集合。Data Catalog 也包含資源連結，這些連結是外部帳戶中共用目錄、資料庫和資料表的連結，用於跨帳戶存取資料湖中的資料。

Data Catalog 是巢狀目錄物件，其中包含目錄、資料庫和資料表。它由 AWS 帳戶 ID 參考，並且是 帳戶和 中的預設目錄 AWS 區域。Data Catalog 使用三層階層 (catalog.database.table) 來組織資料表。
+ Catalog – Data Catalog 三層中繼資料階層的最上層。您可以透過聯合在 Data Catalog 中新增多個目錄。
+ 資料庫 – 中繼資料階層的第二層，包含資料表和檢視。在 Amazon Redshift 和 Trino 等許多資料系統中，資料庫也稱為結構描述。
+ 資料表和檢視 – Data Catalog 的 3 層資料階層的第三層。

Amazon S3 中的所有 Iceberg 資料表都會存放在目錄 ID = AWS 帳戶 ID 的預設 Data Catalog 中。您可以在 中建立聯合目錄 AWS Glue Data Catalog ，透過聯合在 Amazon Redshift、Amazon S3 Table 儲存體或其他第三方資料來源中存放資料表的定義。

**Topics**
+ [建立目錄](creating-catalog.md)
+ [建立資料庫](creating-database.md)
+ [建立資料表](creating-tables.md)
+ [建置 AWS Glue Data Catalog 檢視](working-with-views.md)

# 建立目錄
<a name="creating-catalog"></a>

目錄代表 的三層中繼資料階層中最高層級或最高層級 AWS Glue Data Catalog。您可以使用多種方法來將資料帶入 Data Catalog 並建立多層目錄。

 如需從外部資料來源建立目錄的詳細資訊，請參閱 [將您的資料帶入 AWS Glue Data Catalog](bring-your-data-overview.md)。

 若要使用 Lake Formation 主控台建立目錄，您必須以資料湖管理員或*目錄建立者*身分登入。目錄建立者是已獲授予 Lake Formation `CREATE_CATALOG`許可的主體。您可以在 Lake Formation 主控台的**管理角色和任務**頁面上查看目錄建立者清單。若要檢視此清單，您必須擁有 `lakeformation:ListPermissions` IAM 許可，並以資料湖管理員或目錄建立者身分登入，並具有`CREATE_CATALOG`許可上的授予選項。

# 建立資料庫
<a name="creating-database"></a>

Data Catalog 中的中繼資料表會存放在資料庫中。您可以視需要建立任意數量的資料庫，並對每個資料庫授予不同的 Lake Formation 許可。

資料庫可以有選用的位置屬性。此位置通常位於向 Lake Formation 註冊的 Amazon Simple Storage Service (Amazon S3) 位置。當您指定位置時，主體不需要資料位置許可，即可建立指向資料庫位置內位置的 Data Catalog 資料表。如需詳細資訊，請參閱[Underlying data access control](access-control-underlying-data.md#data-location-permissions)。

若要使用 Lake Formation 主控台建立資料庫，您必須以資料湖管理員或*資料庫建立者*身分登入。資料庫建立者是已獲授予 Lake Formation `CREATE_DATABASE`許可的主體。您可以在 Lake Formation 主控台的**管理角色和任務**頁面上查看資料庫建立者清單。若要檢視此清單，您必須擁有 `lakeformation:ListPermissions` IAM 許可，並以資料湖管理員或資料庫建立者身分登入，並具有`CREATE_DATABASE`許可上的授予選項。

**若要建立資料庫**

1. 在 https：//[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/) 開啟 AWS Lake Formation 主控台，並以資料湖管理員或資料庫建立者身分登入。

1. 在導覽窗格中的資料**目錄**下，選擇**資料庫**。

1. 選擇**建立資料庫**。

1. 在**建立資料庫**對話方塊中，輸入資料庫名稱、選用位置和選用描述。

1. 或者，選取**僅對此資料庫中的新資料表使用 IAM 存取控制**。

   如需此選項的詳細資訊，請參閱[變更資料湖的預設設定](change-settings.md)。

1. 選擇**建立資料庫**。

# 建立資料表
<a name="creating-tables"></a>

AWS Lake Formation 中繼資料表包含資料湖中資料的相關資訊，包括結構描述資訊、分割區資訊和資料位置。這些資料表存放在 AWS Glue Data Catalog 中。您可以使用它們來存取資料湖中的基礎資料，並使用 Lake Formation 許可管理該資料。資料表存放在 Data Catalog 的資料庫中。

有多種方法可以建立 Data Catalog 資料表：
+ 在 中執行爬蟲程式AWS Glue。請參閱《 *AWS Glue 開發人員指南*[》中的定義爬蟲程式](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html)。
+ 建立並執行工作流程。請參閱 [在 Lake Formation 中使用工作流程匯入資料](workflows.md)。
+ 使用 Lake Formation 主控台、AWS GlueAPI 或 AWS Command Line Interface () 手動建立資料表AWS CLI。
+ 使用 建立資料表 Amazon Athena。
+ 建立外部帳戶中資料表的資源連結。請參閱 [建立資源連結](creating-resource-links.md)。

# 建立 Apache Iceberg 資料表
<a name="creating-iceberg-tables"></a>

 AWS Lake Formation 支援建立 Apache Iceberg 資料表，這些資料表使用 中的 Apache Parquet 資料格式 AWS Glue Data Catalog 與 Amazon S3 中的資料。Data Catalog 中的資料表是中繼資料定義，表示資料存放區中的資料。根據預設，Lake Formation 會建立 Iceberg v2 資料表。有關 v1 和 v2 資料表之間的區別，請參閱 Apache Iceberg 文件中的[格式版本變更](https://iceberg.apache.org/spec/#appendix-e-format-version-changes)。

 [Apache Iceberg](https://iceberg.apache.org/) 是開放式的資料表格式，專用於非常大型的分析資料集。Iceberg 可讓您輕鬆地變更結構描述，也稱為結構描述演變，這表示使用者可以從資料表中新增、重新命名或移除資料欄，而不會中斷基礎資料。Iceberg 也支援資料版本控制，可讓使用者追蹤資料隨時間的變化。這可啟用時間歷程功能，允許使用者存取和查詢資料的歷史版本，並分析更新和刪除之間的資料變更。

您可以使用 Lake Formation 主控台或 AWS Glue API 中的 `CreateTable`操作，在 Data Catalog 中建立 Iceberg 資料表。如需詳細資訊，請參閱 [CreateTable 動作 (Python: create\$1table)](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-CreateTable)。

當您在 Data Catalog 中建立 Iceberg 資料表時，必須在 Amazon S3 中指定資料表格式和中繼資料檔案路徑，才能執行讀取和寫入。

 當您向 Amazon S3 資料位置註冊時，您可以使用 Lake Formation 使用精細存取控制許可來保護 Iceberg 資料表 AWS Lake Formation。對於 Amazon S3 中的來源資料和未向 Lake Formation 註冊的中繼資料，存取權取決於 Amazon S3 和 AWS Glue 動作的 IAM 許可政策。如需詳細資訊，請參閱[管理 Lake Formation 許可](managing-permissions.md)。

**注意**  
Data Catalog 不支援建立分區和新增 Iceberg 資料表屬性。

**Topics**
+ [先決條件](#iceberg-prerequisites)
+ [建立 Iceberg 資料表](#create-iceberg-table)

## 先決條件
<a name="iceberg-prerequisites"></a>

 若要在 Data Catalog 中建立 Iceberg 資料表，並設定 Lake Formation 資料存取許可，需要滿足下列要求：

1. 

**在沒有向 Lake Formation 註冊資料的情況下建立 Iceberg 資料表所需的許可。**

   除了在 Data Catalog 中建立資料表所需的許可之外，資料表建立者還需要下列許可：
   + `s3:PutObject` on resource arn:aws:s3:::\$1bucketName\$1
   + `s3:GetObject` on resource arn:aws:s3:::\$1bucketName\$1
   + `s3:DeleteObject`on resource arn:aws:s3:::\$1bucketName\$1

1. 

**在向 Lake Formation 註冊資料的情況下建立 Iceberg 資料表所需的許可：**

   若要使用 Lake Formation 來管理和保護資料湖中的資料，請使用 Lake Formation 註冊具有資料表資料的 Amazon S3 位置。這可讓 Lake Formation 將登入資料提供給 AWS 分析服務，例如 Athena、Redshift Spectrum 和 Amazon EMR 來存取資料。如需註冊 Amazon S3 位置的詳細資訊，請參閱 [將 Amazon S3 位置新增至您的資料湖](register-data-lake.md)。

   讀取和寫入向 Lake Formation 註冊的基礎資料的主體需要下列許可：
   + `lakeformation:GetDataAccess`
   + `DATA_LOCATION_ACCESS`

     在某個位置擁有資料位置許可的主體在所有子位置也擁有位置許可。

     如需資料位置許可的詳細資訊，請參閱 [基礎資料存取控制](access-control-underlying-data.md)。

 若要啟用壓縮，服務需要擔任有權在 Data Catalog 中更新資料表的 IAM 角色。如需詳細資訊，請參閱[資料表最佳化先決條件](https://docs.aws.amazon.com/glue/latest/dg/optimization-prerequisites.html)。

## 建立 Iceberg 資料表
<a name="create-iceberg-table"></a>

您可以使用 Lake Formation 主控台或此頁面所記載 AWS Command Line Interface 的方式建立 Iceberg v1 和 v2 資料表。您也可以使用 AWS Glue 主控台或 建立 Iceberg 資料表 AWS Glue 編目程式。如需詳細資訊，請參閱《 AWS Glue 開發人員指南》中的 [Data Catalog 和編目程式](https://docs.aws.amazon.com/glue/latest/dg/catalog-and-crawler.html)。

**若要建立 Iceberg 資料表**

------
#### [ Console ]

1. 登入 AWS 管理主控台，並在 https：//[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/) 開啟 Lake Formation 主控台。

1. 在 Data Catalog 下，選擇**資料表**，然後使用**建立資料表**按鈕來指定下列屬性：
   + **資料表名稱**：輸入資料表的名稱。如果使用 Athena 來存取資料表，請使用《Amazon Athena 使用者指南》中的這些[命名秘訣](https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html)。
   + **資料庫**：選擇現有的資料庫或建立新的資料庫。
   + **描述**：資料表的描述。您可以撰寫說明，來協助您了解資料表的內容。
   + **資料表格式**：針對**資料表格式**，選擇 Apache Iceberg。  
![\[使用資料表最佳化選項選取 Apache Iceberg 資料表選項。\]](http://docs.aws.amazon.com/zh_tw/lake-formation/latest/dg/images/table-optimization.png)
   + **資料表最佳化**
     + **壓縮** – 合併和重寫資料檔案，移除過時的資料，並將分段資料合併為更大、更有效的檔案。
     + **快照保留 **– 快照是 Iceberg 資料表的時間戳記版本。快照保留組態可讓客戶強制執行保留快照的時間長度，以及要保留的快照數量。設定快照保留最佳化工具可透過移除較舊、不必要的快照及其相關聯的基礎檔案，協助管理儲存體負荷。
     + **孤立檔案刪除** – 孤立檔案是 Iceberg 資料表中繼資料不再參考的檔案。這些檔案可能會隨著時間累積，特別是在資料表刪除或 ETL 任務失敗等操作之後。啟用孤立檔案刪除 AWS Glue 可讓 定期識別和移除這些不必要的檔案，釋放儲存空間。

     如需詳細資訊，請參閱[最佳化 Iceberg 資料表](https://docs.aws.amazon.com/glue/latest/dg/table-optimizers.html)。
   + **IAM 角色**：若要執行壓縮，服務會代表您擔任 IAM 角色。您可以使用下拉式選單選擇 IAM 角色。請確認角色具有啟用壓縮的必要權限。

     若要進一步了解所需的許可，請參閱[資料表最佳化先決條件](https://docs.aws.amazon.com/glue/latest/dg/optimization-prerequisites.html)。
   + **位置**：指定 Amazon S3 中存放中繼資料表之資料夾的路徑。Iceberg 需要 Data Catalog 中的中繼資料檔案和位置，才能執行讀取和寫入。
   + **結構描述**：選擇**新增資料欄**以新增資料欄和資料欄的資料類型。可以選擇建立空白資料表，稍後再更新結構描述。Data Catalog 支援 Hive 資料類型。如需詳細資訊，請參閱 [Hive 資料類型](https://cwiki.apache.org/confluence/plugins/servlet/mobile?contentId=27838462#content/view/27838462)。

      Iceberg 可讓您在建立資料表之後改進結構描述和分區。可以使用 [Athena 查詢](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-evolving-table-schema.html)來更新資料表結構描述，使用 [Spark 查詢](https://iceberg.apache.org/docs/latest/spark-ddl/#alter-table-sql-extensions)來更新分區。

------
#### [ AWS CLI ]

```
aws glue create-table \
    --database-name iceberg-db \
    --region us-west-2 \
    --open-table-format-input '{
      "IcebergInput": { 
           "MetadataOperation": "CREATE",
           "Version": "2"
         }
      }' \
    --table-input '{"Name":"test-iceberg-input-demo",
            "TableType": "EXTERNAL_TABLE",
            "StorageDescriptor":{ 
               "Columns":[ 
                   {"Name":"col1", "Type":"int"}, 
                   {"Name":"col2", "Type":"int"}, 
                   {"Name":"col3", "Type":"string"}
                ], 
               "Location":"s3://DOC_EXAMPLE_BUCKET_ICEBERG/"
            }
        }'
```

------

# 最佳化處理 Iceberg 資料表
<a name="data-compaction"></a>

Lake Formation 支援多個資料表最佳化選項，以增強 AWS 分析引擎和 ETL 任務所使用的 Apache Iceberg 資料表管理和效能。這些最佳化工具可提供高效儲存使用率、改善的查詢效能以及有效的資料管理。Lake Formation 提供三種類型的資料表最佳化工具：
+ **壓縮** – 資料壓縮會壓縮小型資料檔案，以減少儲存用量並提高讀取效能。合併和重寫資料檔案，以移除過時的資料，並將分段資料合併為更大、更有效的檔案。壓縮可設定為自動執行，或視需要手動觸發。
+ **快照保留 **– 快照是 Iceberg 資料表的時間戳記版本。快照保留組態可讓客戶強制執行保留快照的時間長度，以及要保留的快照數量。設定快照保留最佳化工具可透過移除較舊、不必要的快照及其相關聯的基礎檔案，協助管理儲存體負荷。
+ **孤立檔案刪除** – 孤立檔案是 Iceberg 資料表中繼資料不再參考的檔案。這些檔案可能會隨著時間累積，特別是在資料表刪除或 ETL 任務失敗等操作之後。啟用孤立檔案刪除 AWS Glue 可讓 定期識別和移除這些不必要的檔案，釋放儲存空間。

您可以使用 AWS Glue 主控台或 AWS Glue API 操作，啟用或停用 Data Catalog 中個別 Iceberg 資料表的壓縮 AWS CLI、快照保留和孤立檔案刪除最佳化工具。

如需詳細資訊，請參閱《 AWS Glue 開發人員指南》中的[最佳化 Iceberg 資料表](https://docs.aws.amazon.com/glue/latest/dg/table-optimizers.html)。

# 搜尋資料表
<a name="searching-for-tables"></a>

您可以使用 AWS Lake Formation 主控台，依名稱、位置、包含資料庫等來搜尋 Data Catalog 資料表。搜尋結果只會顯示您擁有 Lake Formation 許可的資料表。

**搜尋資料表 （主控台）**

1. 登入 AWS 管理主控台 並開啟 Lake Formation 主控台，網址為 https：//[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)。

1. 在導覽窗格中，選擇 **Tables** (資料表)。

1. 將游標放在頁面頂端的搜尋欄位中。欄位具有依*屬性尋找資料表*的預留位置文字。

   屬性****功能表隨即出現，顯示要搜尋的各種資料表屬性。  
![\[屬性選單會從搜尋欄位中捨棄，並包含下列項目：名稱、分類、資料庫、位置、目錄 ID\]](http://docs.aws.amazon.com/zh_tw/lake-formation/latest/dg/images/search-for-tables.png)

1. 執行以下任意一項：
   + 依包含資料庫的 搜尋。

     1. 從**屬性**功能表中選擇**資料庫**，然後從出現的**資料庫**功能表中選擇資料庫，或輸入資料庫名稱，然後按 **Enter** 鍵。

        列出您在資料庫中擁有許可的資料表。

     1. （選用） 若要將清單縮小為資料庫中的單一資料表，請再次在搜尋欄位中放置游標，從**屬性**功能表中選擇**名稱**，然後從出現的**資料表**功能表中選擇資料表名稱，或輸入資料表名稱，然後按 **Enter** 鍵。

        系統會列出單一資料表，資料庫名稱和資料表名稱都會在搜尋欄位下顯示為圖磚。  
![\[搜尋欄位下方有兩個圖磚：一個標籤資料庫，其中包含選取的資料庫名稱，另一個標籤的資料表，包含選取的資料表名稱。圖磚右側有一個清除篩選條件按鈕。\]](http://docs.aws.amazon.com/zh_tw/lake-formation/latest/dg/images/search-for-tables-with-filter.png)

        若要調整篩選條件，請關閉其中一個圖磚，或選擇**清除篩選條件**。
   + 依其他屬性搜尋。

     1. 從屬性功能表中選擇搜尋**屬性**。

        若要依 AWS 帳戶 ID 搜尋，請從**屬性**功能表中選擇**目錄 ID**，輸入有效的 AWS 帳戶 ID （例如 111122223333)，然後按 **Enter**。

        若要依位置搜尋，請從**屬性**功能表中選擇**位置**，然後從出現的位置功能表中選取**位置**。系統會傳回所選位置 （例如 Amazon S3) 根位置中的所有資料表。

**使用 搜尋資料表 AWS CLI**
+ 下列範例示範如何執行部分 serach。`--search-text` 參數可讓您搜尋在其中繼資料中包含指定文字的資料表。在這種情況下，它會傳回名稱、描述或其他中繼資料欄位中具有「客戶」的所有資料表。

  ```
  aws glue search-tables 
        --search-text "customer" 
        --region AWS 區域
        --max-results 10
        --sort-criteria "FieldName=Name,Sort=ASC"
  ```

# 跨 AWS 帳戶共用 Data Catalog 資料表和資料庫
<a name="sharing-catalog-resources"></a>

您可以透過將資源的 Lake Formation 許可授予外部 AWS 帳戶，與外部帳戶共用 Data Catalog 資源 （資料庫和資料表）。然後，使用者可以執行查詢和任務，以跨多個帳戶聯結和查詢資料表。在某些限制下，當您與其他帳戶共用 Data Catalog 資源時，該帳戶中的主體可以在該資源上操作，就像資源在其 Data Catalog 中一樣。

您不與外部 AWS 帳戶中的特定主體共用資源，而是與 AWS 帳戶或組織共用資源。當您與 AWS 組織共用資源時，您要與該組織所有層級的所有帳戶共用資源。然後，每個外部帳戶中的資料湖管理員必須將共用資源的許可授予其帳戶中的主體。

如需詳細資訊，請參閱[Lake Formation 中的跨帳戶資料共用](cross-account-permissions.md)及[授予 Data Catalog 資源的許可](granting-catalog-permissions.md)。

**另請參閱:**  
[存取和檢視共用的 Data Catalog 資料表和資料庫](viewing-shared-resources.md)
[先決條件](cross-account-prereqs.md)

# 建置 AWS Glue Data Catalog 檢視
<a name="working-with-views"></a>

在 中 AWS Glue Data Catalog，*檢視*是虛擬資料表，其中內容是由參考一或多個資料表的 SQL 查詢定義。您可以使用 Amazon Athena、Amazon Redshift 或 Apache Spark 的 SQL 編輯器，使用 EMR Serverless 或 5.0 AWS Glue 版建立最多參考 10 個資料表的資料目錄檢視。檢視的基礎參考資料表可以屬於相同 AWS 帳戶 Data Catalog 中的相同資料庫或不同資料庫。

您可以參考開放 AWS Glue 資料表格式 (OTF) 的標準資料表和資料表，例如 [Apache Hudi](https://hudi.incubator.apache.org/)、Linux Foundation [Delta Lake](https://delta.io/) 和 [Apache Iceberg](https://iceberg.apache.org/)，並將基礎資料存放在註冊的 Amazon S3 位置 AWS Lake Formation。此外，您可以從與 Lake Formation 共用的 Amazon Redshift 資料共用，從聯合資料表建立檢視。

## 區分 Data Catalog 檢視與其他檢視類型
<a name="diff-views"></a>

Data Catalog 檢視與 Apache Hive、Apache Spark 和 Amazon Athena 檢視不同。Data Catalog 檢視是 的原生功能 AWS Glue Data Catalog，也是多向度定義者建立的檢視。您可以使用其中一個支援的分析服務建立 Data Catalog 檢視，例如 Athena 或 Amazon Redshift Spectrum，並使用其他支援的分析服務存取相同的檢視。另一方面，Apache Hive、Apache Spark 和 Athena 檢視會在 Athena 和 Amazon Redshift 等每個分析服務中獨立建立，並且只能在該服務內可見和存取。

## 什麼是定義器檢視？
<a name="definer-view"></a>

 定義者檢視是一種 SQL 檢視，根據建立它的委託人許可運作。定義者角色具有存取參考資料表的必要許可，並執行定義檢視的 SQL 陳述式。定義器會建立檢視，並透過 的 AWS Lake Formation精細存取控制與其他使用者共用。

當使用者查詢定義者檢視時，查詢引擎會使用定義者角色的許可來存取基礎參考資料表。此方法可讓使用者與檢視互動，而無需直接存取來源資料表、增強安全性並簡化資料存取管理。

若要設定定義者檢視，定義者 IAM 角色可以在與基礎資料表相同的 AWS 帳戶中，或使用跨帳戶定義者角色在不同帳戶中。如需定義者角色所需許可的詳細資訊，請參閱 [建立檢視的先決條件](views-prereqs.md)。

## 多方視觀表的架構
<a name="multi-dialect"></a>

Data Catalog 支援使用多種結構化查詢語言 (SQL) 方言建立檢視。SQL 是一種用於在關聯式資料庫中存放和處理資訊的語言，每個 AWS 分析引擎都會使用自己的 SQL 變化或 SQL 方言。

您可以使用其中一個支援的分析查詢引擎，在一個 SQL 方言中建立 Data Catalog 檢視。然後，您可以使用任何其他支援的分析引擎中不同 SQL 方言中的 `ALTER VIEW`陳述式來更新檢視。不過，每個方言都必須參考一組相同的資料表、資料欄和資料類型。

您可以使用 `GetTable` API AWS CLI 和 AWS 主控台存取可用於檢視的多個方言。因此，資料目錄檢視是可見的，可用於在不同支援的分析引擎之間進行查詢。

透過定義您可以從多個引擎查詢的常見檢視結構描述和中繼資料物件，Data Catalog 檢視可讓您跨資料湖使用統一檢視。

如需如何解決每個方言結構描述的詳細資訊，請參閱 [API 參考的連結]()。如需不同類型相符規則的詳細資訊，請參閱 [API 文件中的相關區段連結]()。

## 與 Lake Formation 許可整合
<a name="lf-view-integ"></a>

您可以使用 AWS Lake Formation 集中管理使用者 AWS Glue Data Catalog 檢視的許可。您可以使用具名資源方法或 LF 標籤，對 Data Catalog 檢視授予精細的許可，並在 AWS 帳戶組織和組織單位之間 AWS 共用這些許可。您也可以 AWS 區域 使用資源連結跨 共用和存取 Data Catalog 檢視。這可讓使用者提供資料存取，而無需複製資料來源，並共用基礎資料表。

Data Catalog 檢視的 `CREATE VIEW` DDL 陳述式可以開放資料表格式 (OTF) 參考標準 AWS Glue 資料表和資料表，例如 Hudi、Delta Lake 和 Iceberg，其中包含存放在向 Lake Formation 註冊的 Amazon S3 位置的基礎資料，以及與 Lake Formation 共用的 Amazon Redshift 資料共用的聯合資料表。只要用於查詢檢視的引擎支援該格式，資料表可以是任何檔案格式。您也可以參考執行引擎的內建函數，但可能不允許其他引擎特定資源。如需詳細資訊，請參閱 [Data Catalog 檢視的考量和限制](views-notes.md)。

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

以下是 Data Catalog 檢視的重要使用案例：
+ 建立和管理單一檢視結構描述的許可。這可協助您避免在多個引擎中建立的重複檢視上具有不一致許可的風險。
+ 在參考多個資料表的檢視上將許可授予使用者，而不直接在基礎參考資料表上授予許可。
+ 透過在檢視上套用 LF 標籤並將以 LF 標籤為基礎的許可授予使用者，在資料表上使用 LF 標籤 （其中 LF 標籤只會層疊至資料欄層級） 來達成資料列層級篩選。

## 檢視支援的 AWS 分析服務
<a name="views-supported-engines"></a>

下列 AWS 分析服務支援建立 Data Catalog 檢視：
+ Amazon Redshift
+ Amazon Athena 第 3 版
+ EMR Serverless 上的 Apache Spark
+  5.0 AWS Glue 版上的 Apache Spark

## 其他資源
<a name="views-addtional-resources"></a>

您可以在本指南中進一步了解 Data Catalog，以及使用下列資源：

下列影片示範如何從 Athena 和 Amazon Redshift 建立檢視和查詢檢視。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/rFO2OoxVYxE?si=Z0qsyuvTp2ZJg-PL/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/rFO2OoxVYxE?si=Z0qsyuvTp2ZJg-PL)


**Topics**
+ [區分 Data Catalog 檢視與其他檢視類型](#diff-views)
+ [什麼是定義器檢視？](#definer-view)
+ [多方視觀表的架構](#multi-dialect)
+ [與 Lake Formation 許可整合](#lf-view-integ)
+ [使用案例](#views-use-cases)
+ [檢視支援的 AWS 分析服務](#views-supported-engines)
+ [其他資源](#views-addtional-resources)
+ [建立檢視的先決條件](views-prereqs.md)
+ [使用 DDL 陳述式建立 Data Catalog 檢視](create-views.md)
+ [使用 AWS Glue APIs建立 Data Catalog 檢視](views-api-usage.md)
+ [授予 Data Catalog 檢視的許可](grant-perms-views.md)
+ [具體化視觀表](materialized-views.md)

# 建立檢視的先決條件
<a name="views-prereqs"></a>
+ 若要在 Data Catalog 中建立檢視，您必須向 Lake Formation 註冊參考資料表的基礎 Amazon S3 資料位置。如需向 Lake Formation 註冊資料的詳細資訊，請參閱 [將 Amazon S3 位置新增至您的資料湖](register-data-lake.md)。
+ 只有 IAM 角色可以建立 Data Catalog 檢視。其他 IAM 身分無法建立 Data Catalog 檢視。
+ 定義檢視的 IAM 角色必須具有下列許可：
  + Lake Formation `SELECT`許可，其中包含所有參考資料表上的 `Grantable`選項。
  + 正在建立檢視的目標資料庫 Lake Formation `CREATE_TABLE`許可。
  + Lake Formation 和 AWS Glue 服務擔任角色的信任政策。

------
#### [ JSON ]

****  

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

------
  +  AWS Glue 和 Lake Formation 的 iam：PassRole 許可。

------
#### [ JSON ]

****  

    ```
    {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
                "Sid": "DataCatalogViewDefinerPassRole1",
                "Action": [
                    "iam:PassRole"
                ],
                "Effect": "Allow",
                "Resource": "*",
                "Condition": {
                    "StringEquals": {
                        "iam:PassedToService": [ 
                            "glue.amazonaws.com",
                            "lakeformation.amazonaws.com"
                          ]
                    }
                }
            }
        ]
    }
    ```

------
  + AWS Glue 和 Lake Formation 許可。

------
#### [ JSON ]

****  

    ```
    {
        "Version":"2012-10-17",		 	 	 
                     "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "Glue:GetDatabase",
                    "Glue:GetDatabases",
                    "Glue:CreateTable",
                    "Glue:GetTable",
                    "Glue:GetTables",
                    "Glue:BatchGetPartition",
                    "Glue:GetPartitions",
                    "Glue:GetPartition",
                    "Glue:GetTableVersion",
                    "Glue:GetTableVersions",
    				"Glue:PassConnection",
                    "lakeFormation:GetDataAccess"
                ],
                "Resource": "*"
            }
        ]   
    }
    ```

------
+ 您無法在已將 `Super`或 `ALL`許可授予`IAMAllowedPrincipals`群組的資料庫中建立檢視。您可以在資料庫上撤銷 `IAMAllowedPrincipals`群組的`Super`許可，請參閱[步驟 4：將資料存放區切換至 Lake Formation 許可模型](upgrade-glue-lake-formation.md#upgrade-glue-lake-formation-step4)，或使用在此資料庫方塊中**的新資料表只使用 IAM 存取控制**，在**新建立資料表的預設許可**下取消勾選。

# 使用 DDL 陳述式建立 Data Catalog 檢視
<a name="create-views"></a>

您可以使用 Athena、Amazon Redshift 和 AWS Glue APIs/ 的 SQL 編輯器建立 AWS Glue Data Catalog 檢視AWS CLI。

若要使用 SQL 編輯器建立 Data Catalog 檢視，請選擇 Athena 或 Redshift Spectrum，然後使用`CREATE VIEW`資料定義語言 (DDL) 陳述式建立檢視。在第一個引擎的方言中建立檢視後，您可以使用第二個引擎的 `ALTER VIEW` DDL 陳述式來新增其他方言。

定義檢視時，請務必考量下列事項：
+ **定義多方檢視** – 當您定義具有多個方言的檢視時，不同方言的結構描述必須相符。每個 SQL 方言都有略有不同的語法規格。定義 Data Catalog 檢視的查詢語法應該在所有方言中解析為完全相同的資料欄清單，包括類型和名稱。此資訊會存放在 檢視`StorageDescriptor`的 中。方言也必須參考資料目錄中的相同基礎資料表物件。

  若要使用 DDL 將另一個方言新增至檢視，您可以使用 `ALTER VIEW`陳述式。如果`ALTER VIEW`陳述式嘗試更新檢視定義，例如修改檢視的儲存描述項或基礎資料表，則陳述式會錯誤地說出「輸入和現有儲存描述項不相符」。您可以使用 SQL 轉換操作來確保檢視欄類型相符。
+ **更新檢視** – 若要更新檢視，您可以使用 `UpdateTable` API。如果您在沒有相符儲存描述項或參考資料表的情況下更新檢視，您可以提供 `FORCE`旗標 （如需語法，請參閱引擎 SQL 文件）。強制更新後，檢視將採用強制資料表`StorageDescriptor`和參考資料表。任何進一步的 `ALTER VIEW` DDL 都應符合修改後的值。已更新為具有不相容方言的檢視將處於「過時」狀態。檢視狀態會顯示在 Lake Formation 主控台和使用 `GetTable`操作。
+ **參考 varchar 資料欄類型做為字串** – 無法將 Redshift Spectrum 的 varchar 資料欄類型轉換為字串。如果在 Redshift Spectrum 中使用 varchar 資料欄類型建立檢視，且後續方言嘗試將該欄位參考為字串，則 Data Catalog 會將它視為字串，而不需要`FORCE`標記。
+ **複雜類型欄位的處理** – Amazon Redshift 會將所有複雜類型視為 [SUPER 類型](https://docs.aws.amazon.com/redshift/latest/dg/r_SUPER_type.html)，而 Athena 會指定複雜類型。如果檢視具有`SUPER`類型欄位，且另一個引擎參考該資料欄作為特定複雜類型，例如 struct (`<street_address:struct<street_number:int, street_name:string, street_type:string>>`)，則 Data Catalog 會假設該欄位為特定複雜類型，並在儲存體描述項中使用該欄位，而不需要`Force`旗標。

如需建立和管理 Data Catalog 檢視之語法的詳細資訊，請參閱：
+ 《Amazon Athena 使用者指南》中的[使用 AWS Glue Data Catalog 檢視](https://docs.aws.amazon.com/athena/latest/ug/views-glue.html)。
+ 《Amazon Athena 使用者指南》中的 [Glue Data Catalog 檢視查詢語法](https://docs.aws.amazon.com/athena/latest/ug/views-glue-ddl.html)。
+ 《Amazon Redshift 資料庫開發人員指南》中的在 中[建立檢視 AWS Glue Data Catalog](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html)。

  若要取得有關與 Data Catalog 中的視觀表相關之 SQL 命令的更多資訊，請參閱[CREATE EXTERNAL VIEW](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_VIEW.html)、[ALTER EXTERNAL VIEW](https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_EXTERNAL_VIEW.html) 和 [DROP EXTERNAL VIEW](https://docs.aws.amazon.com/redshift/latest/dg/r_DROP_EXTERNAL_VIEW.html)。

建立 Data Catalog 檢視後，您可以在 Lake Formation 主控台中取得檢視的詳細資訊。

1. 在 Lake Formation 主控台中選擇資料目錄下的**檢視**。

1. 可用檢視的清單會顯示在檢視頁面上。

1. 從清單中選擇檢視，詳細資訊頁面會顯示檢視的屬性。

![\[下一節包含五個水平排列的標籤，其中每個標籤都包含對應的資訊 。\]](http://docs.aws.amazon.com/zh_tw/lake-formation/latest/dg/images/view-definition.png)


結構描述  
選擇資料`Column`列，然後選取**編輯 LF 標籤**以更新標籤值或指派新的 LF 標籤。

SQL 定義  
您可以查看可用的 SQL 定義清單。選取**新增 SQL 定義**，然後選擇查詢引擎以新增 SQL 定義。在資料`Edit definition`欄下選擇查詢引擎 (Athena 或 Amazon Redshift) 以更新 SQL 定義。

LF 標籤  
選擇**編輯 LF 標籤**以編輯標籤的值或指派新標籤。您可以使用 LF 標籤來授予檢視的許可。

跨帳戶存取權  
您可以查看已與您共用 Data Catalog 檢視的組織 AWS 帳戶和組織單位 (OUs) 清單。

基礎資料表  
用於建立檢視的 SQL 定義中參考的基礎資料表會顯示在此索引標籤下方。

# 使用 AWS Glue APIs建立 Data Catalog 檢視
<a name="views-api-usage"></a>

您可以使用 AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) 和 [UpdateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateTable.html) APIs Data Catalog 中建立和更新檢視。`CreateTable` 和 `UpdateTable`操作具有 的新`TableInput`結構`ViewDefinition`，而 `SearchTables`、`GetTable``GetTables`、`GetTableVersion`、、 `GetTableVersions`操作在其檢視的輸出語法`ViewDefinition`中提供 。此外，`GetTable`API 輸出中有新的`Status`欄位。

有兩個新的 AWS Glue 連線可用於驗證每個支援的查詢引擎 Amazon Athena 和 Amazon Redshift 的 SQL 方言。

與檢視搭配使用時， `CreateTable`和 `UpdateTable` APIs是非同步的。當使用多個 SQL 方言呼叫這些 APIs 時，呼叫會驗證每個引擎，以判斷該方言是否可以在該引擎上執行，以及每個方言的檢視結果結構描述是否相符。 AWS Glue 服務使用這些連線對分析引擎進行內部呼叫。這些呼叫會模擬引擎如何驗證在引擎上執行的 `CREATE VIEW`或 `ALTER VIEW` SQL DDL。

如果提供的 SQL 有效，且檢視方言之間的結構描述相符，則 API 會以 AWS Glue 原子方式遞交結果。Atomicity 允許建立或修改具有多個方言的檢視，而不會停機。

**Topics**
+ [建立 AWS Glue 連線以驗證狀態](views-api-usage-connection.md)
+ [驗證檢視產生狀態](views-api-usage-get-table.md)
+ [非同步狀態和操作](views-api-usage-async-states.md)
+ [檢視非同步操作期間的建立失敗案例](views-api-usage-errors.md)

# 建立 AWS Glue 連線以驗證狀態
<a name="views-api-usage-connection"></a>

若要使用 或 `UpdateTable`操作建立`CreateTable`或更新 AWS Glue Data Catalog 檢視，您必須建立新的連線類型 AWS Glue 以進行驗證，並將其提供給支援的分析引擎。搭配 Athena 或 Amazon Redshift 使用 Data Catalog 檢視需要這些連線。您只能使用 AWS CLI、 AWS SDKs或 AWS Glue APIs建立這些連線。您無法使用 AWS 管理主控台 建立 AWS Glue 連線。

**注意**  
如果檢視定義者角色和呼叫 `CreateTable`或 `UpdateTable` 的角色不同，則兩者都需要其 IAM 政策陳述式中的`glue:PassConnection`許可。

如需詳細資訊，請參閱 [create-connection](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/create-connection.html) AWS CLI 文件。

**AWS CLI 用於建立連線的 命令**  
以下是用於建立連線的 AWS CLI 命令：

```
aws glue create-connection --region us-east-1 
--endpoint-url https://glue.us-east-1.amazonaws.com 
--cli-input-json file:///root/path/to/create-connection.json
```

**AWS CLI 輸入 JSON**  
對於 Amazon Redshift：

```
{
    "CatalogId": "123456789012",
    "ConnectionInput": {
        "ConnectionType": "VIEW_VALIDATION_REDSHIFT",
        "Name": "views-preview-cluster-connection-2",
        "Description": "My first Amazon Redshift validation connection",
        "ConnectionProperties": {
            "DATABASE": "dev",
            "CLUSTER_IDENTIFIER": "glue-data-catalog-views-preview-cluster"
        }
    }
}
```

對於 Amazon Athena：

```
{
    "CatalogId": "123456789012",
    "ConnectionInput": {
        "ConnectionType": "VIEW_VALIDATION_ATHENA",
        "Name": "views-preview-cluster-connection-3",
        "Description": "My first Amazon Athena validation connection",
        "ConnectionProperties": {
            "WORKGROUP_NAME": "workgroup-name"
        }
    }
}
```

# 驗證檢視產生狀態
<a name="views-api-usage-get-table"></a>

當您執行 `CreateTable`或 `UpdateTable`操作時，`GetTable`API 輸出的 `Status` 欄位會顯示檢視建立狀態的詳細資訊。對於資料表尚不存在的`create`請求， 會在非同步程序期間 AWS Glue 建立空資料表。呼叫 時`GetTable`，您可以傳遞選用的布林值旗標 `IncludeStatusDetails`，其中顯示請求的診斷資訊。如果失敗，此旗標會顯示錯誤訊息，其中包含每個方言的個別狀態。

檢視建立、讀取、更新和刪除 (CRUD) 操作期間的錯誤可能發生在 AWS Glue/Lake Formation 服務的處理期間，或在 Amazon Redshift 或 Athena 的檢視 SQL 驗證期間。在引擎驗證期間發生錯誤時，服務 AWS Glue 會提供引擎傳回的錯誤訊息。

**狀態欄位**  
以下是狀態欄位：
+ 狀態：一般狀態，與不同類型的任務無關：
  + QUEUED
  + IN\$1PROGRESS
  + 成功
  + 失敗
+ 動作 – 指出在資料表上呼叫的動作，目前只有 `CREATE`或 `UPDATE`操作可用。

  使用檢視時，區分 `UPDATE`和 `CREATE`操作非常重要。操作類型會決定您應該如何繼續查詢資料表。

   `UPDATE` 操作表示資料表已存在於 Data Catalog 中。在這種情況下，您可以繼續查詢先前建立的資料表，而不會發生任何問題。另一方面，`CREATE `操作表示之前從未成功建立資料表。如果資料表標示為 `CREATE`，嘗試查詢將會失敗，因為資料表尚未存在於系統中。因此，在嘗試查詢資料表之前，請務必識別操作類型 (UPDATE 或 CREATE)。
+ RequestedBy – 請求非同步變更之使用者的 ARN。
+ UpdatedBy – 上次手動變更非同步變更程序的使用者 ARN，例如請求取消或修改。
+ 錯誤 – 此欄位只會在狀態為 **FAILED** 時出現。這是父層級例外狀況訊息。每個方言可能會有不同的錯誤。
  + ErrorCode – 例外狀況的類型。
  + ErrorMessage – 例外狀況的簡短描述。
+ RequestTime – ISO 8601 格式的日期字串，指出啟動變更的時間。
+ UpdateTime – ISO 8601 格式的日期字串，指出上次更新狀態的時間。

# 非同步狀態和操作
<a name="views-api-usage-async-states"></a>

當您執行`glue:CreateTable`請求時，會開始非同步建立 Data Catalog 檢視。在下列各節中，本文件說明`glue:GetTable`回應中可用的 AWS Glue 檢視`Status`的 。為了簡潔起見，本節省略完整回應。

```
{
    "Table": {
        ...
        "Status": {
            ...
            "Action": "CREATE",
            "State": "QUEUED",
        }
    }
}
```

上述兩個屬性都代表重要的診斷資訊，指出非同步操作的狀態，以及可在此檢視上執行的動作。以下是這些屬性可以接受的可能值。

1. `Status.Action`

   1. CREATE

   1. UPDATE

1. `Status.State`

   1. QUEUED

   1. IN\$1PROGRESS

   1. 成功

   1. 失敗

也請務必注意，Data Catalog 檢視上的某些更新不需要非同步操作。例如，可能想要更新資料表的 `Description` 屬性。由於這不需要任何非同步操作，因此產生的資料表中繼資料將沒有任何 `Status`，且屬性將為 `NULL`。

```
{
    "Table": {
        ...,
        "Description": "I changed this attribute!"
    }
}
```

接下來，本主題會探索上述狀態資訊如何影響可在 AWS Glue 檢視上執行的操作。

**glue:CreateTable**  
相較於任何 Glue 資料表的 `glue:CreateTable`函數，此 API 沒有任何變更。 `CreateTable` 可能針對尚未存在的任何資料表名稱呼叫 。

**glue:UpdateTable**  
此操作無法在具有下列狀態資訊的 AWS Glue 檢視上執行：

1. 動作 == CREATE 和狀態 == QUEUED

1. 動作 == CREATE 和狀態 == IN\$1PROGRESS

1. 動作 == CREATE 和狀態 == 失敗

1. 動作 == UPDATE 和狀態 == QUEUED

1. 動作 == UPDATE 和狀態 == IN\$1PROGRESS

總而言之，只有在 Data Catalog 檢視符合下列要求時，您才能更新它。

1. 第一次成功建立。

   1. 動作 == CREATE 和狀態 == 成功

1. 在非同步更新操作之後，它已達到結束狀態。

   1. 動作 == UPDATE 和狀態 == 成功

   1. 動作 == UPDATE 和狀態 == 失敗

1. 由於同步更新，它具有`NULL`狀態屬性。

**glue:DeleteTable**  
相較於任何 AWS Glue 資料表的 `glue:DeleteTable` 函數，此操作沒有任何變更。您可以刪除 Data Catalog 檢視，無論其狀態為何。

**glue:GetTable**  
相較於任何 AWS Glue 資料表的 `glue:GetTable` 函數，此操作沒有任何變更。不過，在第一次成功建立 Data Catalog 檢視之前，您無法從分析引擎查詢 Data Catalog 檢視。 `Action == CREATE and State == SUCCESS`第一次成功建立 Data Catalog 檢視後，無論其狀態為何，您都可以查詢檢視。

**注意**  
本節中的所有資訊適用於所有資料表讀取 APIs`GetTables`，例如 `GetTable`、 和 `SearchTables`。

# 檢視非同步操作期間的建立失敗案例
<a name="views-api-usage-errors"></a>

下列範例代表可能因`CreateTable`或`UpdateTable`檢視 API 呼叫而產生的錯誤類型。它們並不詳盡，因為 SQL 查詢失敗的錯誤表面相當大。

## 案例 1：Amazon Redshift 查詢失敗
<a name="views-api-usage-errors-scenario-1"></a>

驗證期間，在資料目錄中找不到針對 Amazon Redshift 提供的查詢，其中包含拼寫錯誤的資料表名稱。產生的錯誤會顯示在檢視`GetTable`回應的 `Status` 欄位中。

`GetTable` 請求：

```
{
    "CatalogId": "123456789012",
    "DatabaseName": "async-view-test-db",
    "TableInput": {
        "Name": "view-athena-redshift-72",
        "Description": "This is an atomic operation",
        "StorageDescriptor": {
            "Columns": [
                { "Name": "col1", "Type": "int" },
                { "Name": "col2", "Type": "string" },
                { "Name": "col3", "Type": "double" }
            ]
        },
        "ViewDefinition": {
            "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
            "SubObjects": [ "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1" ],
            "Representations": [
                {
                    "Dialect": "ATHENA",
                    "DialectVersion": "3",
                    "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-db\".\"table_1\"",
                    "ValidationConnection": "athena-connection"
                },
                {
                    "Dialect": "REDSHIFT",
                    "DialectVersion": "1.0",
                    "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table__1\";",
                    "ValidationConnection": "redshift-connection"
                }
            ]
        }
    }
}
```

`GetTable` 回應：

```
IncludeStatusDetails = FALSE
{
    "Table": {
        "Name": "view-athena-redshift-72",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:39:19-07:00",
        "UpdateTime": "2024-07-11T11:39:19-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:39:19-07:00",
            "UpdateTime": "2024-07-11T11:40:06-07:00",
            "Action": "CREATE",
            "State": "FAILED"
        }
    }
}

IncludeStatusDetails = TRUE
{
    "Table": {
        "Name": "view-athena-redshift-72",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:39:19-07:00",
        "UpdateTime": "2024-07-11T11:39:19-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:39:19-07:00",
            "UpdateTime": "2024-07-11T11:40:06-07:00",
            "Action": "CREATE",
            "State": "FAILED",
            "Error": {
                "ErrorCode": "QueryExecutionException",
                "ErrorMessage": "Error received during view SQL validation using a connection: [Connection Name: redshift-connection | Query Execution Id: ddb711d3-2415-4aa9-b251-6a76ab4f41b1 | Timestamp: Thu Jul 11 18:39:37 UTC 2024]: Redshift returned error for the statement: ERROR: AwsClientException: EntityNotFoundException from glue - Entity Not Found"
            },
            "Details": {
                "RequestedChange": {
                    "Name": "view-athena-redshift-72",
                    "DatabaseName": "async-view-test-db",
                    "Description": "This is an atomic operation",
                    "Retention": 0,
                    "StorageDescriptor": {
                        "Columns": [
                            {
                                "Name": "col1",
                                "Type": "int"
                            },
                            {
                                "Name": "col2",
                                "Type": "string"
                            },
                            {
                                "Name": "col3",
                                "Type": "double"
                            }
                        ],
                        "Compressed": false,
                        "NumberOfBuckets": 0,
                        "SortColumns": [],
                        "StoredAsSubDirectories": false
                    },
                    "TableType": "VIRTUAL_VIEW",
                    "IsRegisteredWithLakeFormation": false,
                    "CatalogId": "123456789012",
                    "IsRowFilteringEnabled": false,
                    "VersionId": "-1",
                    "DatabaseId": "<databaseID>",
                    "ViewDefinition": {
                        "IsProtected": true,
                        "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
                        "SubObjects": [
                            "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1"
                        ],
                        "Representations": [
                            {
                                "Dialect": "ATHENA",
                                "DialectVersion": "3",
                                "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-db\".\"table_1\"",
                                "IsStale": false
                            },
                            {
                                "Dialect": "REDSHIFT",
                                "DialectVersion": "1.0",
                                "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table__1\";",
                                "IsStale": false
                            }
                        ]
                    },
                    "IsMultiDialectView": true
                },
                "ViewValidations": [
                    {
                        "Dialect": "ATHENA",
                        "DialectVersion": "3",
                        "ViewValidationText": "SELECT * FROM \"gdc-view-playground-db\".\"table_1\"",
                        "UpdateTime": "2024-07-11T11:40:06-07:00",
                        "State": "SUCCESS"
                    },
                    {
                        "Dialect": "REDSHIFT",
                        "DialectVersion": "1.0",
                        "ViewValidationText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table__1\";",
                        "UpdateTime": "2024-07-11T11:39:37-07:00",
                        "State": "FAILED",
                        "Error": {
                            "ErrorCode": "QueryExecutionException",
                            "ErrorMessage": "Error received during view SQL validation using a connection: [Connection Name: redshift-connection | Query Execution Id: ddb711d3-2415-4aa9-b251-6a76ab4f41b1 | Timestamp: Thu
 Jul 11 18:39:37 UTC 2024]: Redshift returned error for the statement: ERROR: AwsClientException: EntityNotFoundException from glue - Entity Not Found"
                        }
                    }
                ]
            }
        }
    }
}
```

## 案例 2：無效的 Amazon Redshift 連線
<a name="views-api-usage-errors-scenario-2"></a>

下列範例中的 Amazon Redshift 連線格式錯誤，因為它是指在提供的叢集/無伺服器端點中不存在的 Amazon Redshift 資料庫。Amazon Redshift 無法驗證檢視，回應中的 `Status` 欄位`GetTable`會顯示錯誤 (`"State": "FAILED"`來自 Amazon Redshift。

`GetTable` 請求：

```
{
    "CatalogId": "123456789012",
    "DatabaseName": "async-view-test-db",
    "TableInput": {
        "Name": "view-athena-redshift-73",
        "Description": "This is an atomic operation",
        "StorageDescriptor": {
            "Columns": [
                { "Name": "col1", "Type": "int" },
                { "Name": "col2", "Type": "string" },
                { "Name": "col3", "Type": "double" }
            ]
        },
        "ViewDefinition": {
            "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
            "SubObjects": [ "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1" ],
            "Representations": [
                {
                    "Dialect": "ATHENA",
                    "DialectVersion": "3",
                    "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-db\".\"table_1\"",
                    "ValidationConnection": "athena-connection"
                },
                {
                    "Dialect": "REDSHIFT",
                    "DialectVersion": "1.0",
                    "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                    "ValidationConnection": "redshift-connection-malformed"
                }
            ]
        }
    }
}
```

`GetTable` 回應：

```
IncludeStatusDetails = FALSE
{
    "Table": {
        "Name": "view-athena-redshift-73",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:43:27-07:00",
        "UpdateTime": "2024-07-11T11:43:27-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:43:27-07:00",
            "UpdateTime": "2024-07-11T11:43:40-07:00",
            "Action": "CREATE",
            "State": "FAILED"
        }
    }
}

IncludeStatusDetails = TRUE
{
    "Table": {
        "Name": "view-athena-redshift-73",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:43:27-07:00",
        "UpdateTime": "2024-07-11T11:43:27-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:43:27-07:00",
            "UpdateTime": "2024-07-11T11:43:40-07:00",
            "Action": "CREATE",
            "State": "FAILED",
            "Error": {
                "ErrorCode": "QueryExecutionException",
                "ErrorMessage": "Error received during view SQL validation using a connection: [Connection Name: redshift-connection-malformed | Query Execution Id: 69bfafd4-3d51-4cb0-9320-7ce5404b1809 | Timestamp: Thu Jul 11 18:43:38 UTC 2024]: Redshift returned error for the statement: FATAL: database \"devooo\" does not exist"
            },
            "Details": {
                "RequestedChange": {
                    "Name": "view-athena-redshift-73",
                    "DatabaseName": "async-view-test-db",
                    "Description": "This is an atomic operation",
                    "Retention": 0,
                    "StorageDescriptor": {
                        "Columns": [
                            {
                                "Name": "col1",
                                "Type": "int"
                            },
                            {
                                "Name": "col2",
                                "Type": "string"
                            },
                            {
                                "Name": "col3",
                                "Type": "double"
                            }
                        ],
                        "Compressed": false,
                        "NumberOfBuckets": 0,
                        "SortColumns": [],
                        "StoredAsSubDirectories": false
                    },
                    "TableType": "VIRTUAL_VIEW",
                    "IsRegisteredWithLakeFormation": false,
                    "CatalogId": "123456789012",
                    "IsRowFilteringEnabled": false,
                    "VersionId": "-1",
                    "DatabaseId": "<databaseID>",
                    "ViewDefinition": {
                        "IsProtected": true,
                        "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
                        "SubObjects": [
                            "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1"
                        ],
                        "Representations": [
                            {
                                "Dialect": "ATHENA",
                                "DialectVersion": "3",
                                "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-db\".\"table_1\"",
                                "IsStale": false
                            },
                            {
                                "Dialect": "REDSHIFT",
                                "DialectVersion": "1.0",
                                "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                                "IsStale": false
                            }
                        ]
                    },
                    "IsMultiDialectView": true
                },
                "ViewValidations": [
                    {
                        "Dialect": "ATHENA",
                        "DialectVersion": "3",
                        "ViewValidationText": "SELECT * FROM \"gdc-view-playground-db\".\"table_1\"",
                        "UpdateTime": "2024-07-11T11:43:40-07:00",
                        "State": "SUCCESS"
                    },
                    {
                        "Dialect": "REDSHIFT",
                        "DialectVersion": "1.0",
                        "ViewValidationText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                        "UpdateTime": "2024-07-11T11:43:38-07:00",
                        "State": "FAILED",
                        "Error": {
                            "ErrorCode": "QueryExecutionException",
                            "ErrorMessage": "Error received during view SQL validation using a connection: [Connection Name: redshift-connection-malformed | Query Execution Id: 69bfafd4-3d51-4cb0-9320-7ce5404b1809 | Time
stamp: Thu Jul 11 18:43:38 UTC 2024]: Redshift returned error for the statement: FATAL: database \"devooo\" does not exist"
                        }
                    }
                ]
            }
        }
    }
}
```

## 案例 3：Athena 查詢失敗
<a name="views-api-usage-errors-scenario-3"></a>

這裡的 SQL for Athena 無效，因為查詢漏接資料庫名稱。Athena 查詢驗證會擷取此項目，而產生的錯誤會透過`GetTable`呼叫中的`Status`物件呈現。

`GetTable` 請求：

```
{
    "CatalogId": "123456789012",
    "DatabaseName": "async-view-test-db",
    "TableInput": {
        "Name": "view-athena-redshift-70",
        "Description": "This is an atomic operation",
        "StorageDescriptor": {
            "Columns": [
                { "Name": "col1", "Type": "int" },
                { "Name": "col2", "Type": "string" },
                { "Name": "col3", "Type": "double" }
            ]
        },
        "ViewDefinition": {
            "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
            "SubObjects": [ "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1" ],
            "Representations": [
                {
                    "Dialect": "ATHENA",
                    "DialectVersion": "3",
                    "ViewOriginalText": "SELECT * FROM \"gdc--view-playground-db\".\"table_1\"",
                    "ValidationConnection": "athena-connection"
                },
                {
                    "Dialect": "REDSHIFT",
                    "DialectVersion": "1.0",
                    "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                    "ValidationConnection": "redshift-connection"
                }
            ]
        }
    }
}
```

`GetTable` 回應：

```
IncludeStatusDetails = FALSE
{
    "Table": {
        "Name": "view-athena-redshift-70",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:09:53-07:00",
        "UpdateTime": "2024-07-11T11:09:53-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:09:54-07:00",
            "UpdateTime": "2024-07-11T11:10:41-07:00",
            "Action": "CREATE",
            "State": "FAILED",
        }
    }
}

IncludeStatusDetails = TRUE
{
    "Table": {
        "Name": "view-athena-redshift-70",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:09:53-07:00",
        "UpdateTime": "2024-07-11T11:09:53-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:09:54-07:00",
            "UpdateTime": "2024-07-11T11:10:41-07:00",
            "Action": "CREATE",
            "State": "FAILED",
            "Error": {
                "ErrorCode": "QueryExecutionException",
                "ErrorMessage": "Error received during view SQL validation using a connection: [Connection Name: athena-connection | Query Execution Id: d9bb1e6d-ce26-4b35-8276-8a199af966aa | Timestamp: Thu Jul 11 18:10:
41 UTC 2024]: Athena validation FAILED: {ErrorCategory: 2,ErrorType: 1301,Retryable: false,ErrorMessage: line 1:118: Schema 'gdc--view-playground-db' does not exist}"
            },
            "Details": {
                "RequestedChange": {
                    "Name": "view-athena-redshift-70",
                    "DatabaseName": "async-view-test-db",
                    "Description": "This is an atomic operation",
                    "Retention": 0,
                    "StorageDescriptor": {
                        "Columns": [
                            {
                                "Name": "col1",
                                "Type": "int"
                            },
                            {
                                "Name": "col2",
                                "Type": "string"
                            },
                            {
                                "Name": "col3",
                                "Type": "double"
                            }
                        ],
                        "Compressed": false,
                        "NumberOfBuckets": 0,
                        "SortColumns": [],
                        "StoredAsSubDirectories": false
                    },
                    "TableType": "VIRTUAL_VIEW",
                    "IsRegisteredWithLakeFormation": false,
                    "CatalogId": "123456789012",
                    "IsRowFilteringEnabled": false,
                    "VersionId": "-1",
                    "DatabaseId": "<databaseID>",
                    "ViewDefinition": {
                        "IsProtected": true,
                        "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
                        "SubObjects": [
                            "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1"
                        ],
                        "Representations": [
                            {
                                "Dialect": "ATHENA",
                                "DialectVersion": "3",
                                "ViewOriginalText": "SELECT * FROM \"gdc--view-playground-db\".\"table_1\"",
                                "IsStale": false
                            },
                            {
                                "Dialect": "REDSHIFT",
                                "DialectVersion": "1.0",
                                "ViewOriginalText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                                "IsStale": false
                            }
                        ]
                    },
                    "IsMultiDialectView": true
                },
                "ViewValidations": [
                    {
                        "Dialect": "ATHENA",
                        "DialectVersion": "3",
                        "ViewValidationText": "SELECT * FROM \"gdc--view-playground-db\".\"table_1\"",
                        "UpdateTime": "2024-07-11T11:10:41-07:00",
                        "State": "FAILED",
                        "Error": {
                            "ErrorCode": "QueryExecutionException",
                            "ErrorMessage": "Error received during view SQL validation using a connection: [Connection Name: athena-connection | Query Execution Id: d9bb1e6d-ce26-4b35-8276-8a199af966aa | Timestamp: Thu J
ul 11 18:10:41 UTC 2024]: Athena validation FAILED: {ErrorCategory: 2,ErrorType: 1301,Retryable: false,ErrorMessage: line 1:118: Schema 'gdc--view-playground-db' does not exist}"
                        }
                    },
                    {
                        "Dialect": "REDSHIFT",
                        "DialectVersion": "1.0",
                        "ViewValidationText": "SELECT * FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                        "UpdateTime": "2024-07-11T11:10:41-07:00",
                        "State": "SUCCESS"
                    }
                ]
            }
        }
    }
}
```

## 案例 4：不相符的儲存描述項
<a name="views-api-usage-errors-scenario-4"></a>

Athena 方言提供的 SQL 會選取 `col1`，`col2`而 SQL for Redshift 只會選取 `col1`。這會導致儲存描述項不相符錯誤。

`GetTable` 請求：

```
{
    "CatalogId": "123456789012",
    "DatabaseName": "async-view-test-db",
    "TableInput": {
        "Name": "view-athena-redshift-71",
        "Description": "This is an atomic operation",
        "StorageDescriptor": {
            "Columns": [
                { "Name": "col1", "Type": "int" },
                { "Name": "col2", "Type": "string" },
                { "Name": "col3", "Type": "double" }
            ]
        },
        "ViewDefinition": {
            "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
            "SubObjects": [ "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1" ],
            "Representations": [
                {
                    "Dialect": "ATHENA",
                    "DialectVersion": "3",
                    "ViewOriginalText": "SELECT col1, col2 FROM \"gdc-view-playground-db\".\"table_1\"",
                    "ValidationConnection": "athena-connection"
                },
                {
                    "Dialect": "REDSHIFT",
                    "DialectVersion": "1.0",
                    "ViewOriginalText": "SELECT col1 FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                    "ValidationConnection": "redshift-connection"
                }
            ]
        }
    }
}
```

`GetTable` 回應：

```
IncludeStatusDetails = FALSE

{
    "Table": {
        "Name": "view-athena-redshift-71",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:22:02-07:00",
        "UpdateTime": "2024-07-11T11:22:02-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:22:02-07:00",
            "UpdateTime": "2024-07-11T11:23:19-07:00",
            "Action": "CREATE",
            "State": "FAILED"
        }
    }
}

IncludeStatusDetails = TRUE

{
    "Table": {
        "Name": "view-athena-redshift-71",
        "DatabaseName": "async-view-test-db",
        "Description": "",
        "CreateTime": "2024-07-11T11:22:02-07:00",
        "UpdateTime": "2024-07-11T11:22:02-07:00",
        "Retention": 0,
        "ViewOriginalText": "",
        "ViewExpandedText": "",
        "TableType": "",
        "CreatedBy": "arn:aws:iam::123456789012:user/zcaisse",
        "IsRegisteredWithLakeFormation": false,
        "CatalogId": "123456789012",
        "IsRowFilteringEnabled": false,
        "VersionId": "-1",
        "DatabaseId": "<databaseID>",
        "IsMultiDialectView": false,
        "Status": {
            "RequestedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "UpdatedBy": "arn:aws:iam::123456789012:user/zcaisse",
            "RequestTime": "2024-07-11T11:22:02-07:00",
            "UpdateTime": "2024-07-11T11:23:19-07:00",
            "Action": "CREATE",
            "State": "FAILED",
            "Error": {
                "ErrorCode": "InvalidInputException",
                "ErrorMessage": "Engine and existing storage descriptor mismatch"
            },
            "Details": {
                "RequestedChange": {
                    "Name": "view-athena-redshift-71",
                    "DatabaseName": "async-view-test-db",
                    "Description": "This is an atomic operation",
                    "Retention": 0,
                    "StorageDescriptor": {
                        "Columns": [
                            {
                                "Name": "col1",
                                "Type": "int"
                            },
                            {
                                "Name": "col2",
                                "Type": "string"
                            },
                            {
                                "Name": "col3",
                                "Type": "double"
                            }
                        ],
                        "Compressed": false,
                        "NumberOfBuckets": 0,
                        "SortColumns": [],
                        "StoredAsSubDirectories": false
                    },
                    "TableType": "VIRTUAL_VIEW",
                    "IsRegisteredWithLakeFormation": false,
                    "CatalogId": "123456789012",
                    "IsRowFilteringEnabled": false,
                    "VersionId": "-1",
                    "DatabaseId": "<databaseID>",
                    "ViewDefinition": {
                        "IsProtected": true,
                        "Definer": "arn:aws:iam::123456789012:role/GDCViewDefiner",
                        "SubObjects": [
                            "arn:aws:glue:us-east-1:123456789012:table/gdc-view-playground-db/table_1"
                        ],
                        "Representations": [
                            {
                                "Dialect": "ATHENA",
                                "DialectVersion": "3",
                                "ViewOriginalText": "SELECT col1, col2 FROM \"gdc-view-playground-db\".\"table_1\"",
                                "IsStale": false
                            },
                            {
                                "Dialect": "REDSHIFT",
                                "DialectVersion": "1.0",
                                "ViewOriginalText": "SELECT col1 FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                                "IsStale": false
                            }
                        ]
                    },
                    "IsMultiDialectView": true
                },
                "ViewValidations": [
                    {
                        "Dialect": "ATHENA",
                        "DialectVersion": "3",
                        "ViewValidationText": "SELECT col1, col2 FROM \"gdc-view-playground-db\".\"table_1\"",
                        "UpdateTime": "2024-07-11T11:23:19-07:00",
                        "State": "FAILED",
                        "Error": {
                            "ErrorCode": "InvalidInputException",
                            "ErrorMessage": "Engine and existing storage descriptor mismatch"
                        }
                    },
                    {
                        "Dialect": "REDSHIFT",
                        "DialectVersion": "1.0",
                        "ViewValidationText": "SELECT col1 FROM \"gdc-view-playground-external-schema\".\"table_1\";",
                        "UpdateTime": "2024-07-11T11:22:49-07:00",
                        "State": "FAILED",
                        "Error": {
                            "ErrorCode": "InvalidInputException",
                            "ErrorMessage": "Engine and existing storage descriptor mismatch"
                        }
                    }
                ]
            }
        }
    }
}
```

# 授予 Data Catalog 檢視的許可
<a name="grant-perms-views"></a>

 在 中建立檢視後 AWS Glue Data Catalog，您可以將檢視的資料湖許可授予跨 AWS 帳戶組織和組織單位的主體。您可以使用 LF-Tags 或具名資源方法授予許可。如需標記資源的詳細資訊，請參閱 [Lake Formation 標籤型存取控制](tag-based-access-control.md)。如需直接授予檢視許可的詳細資訊，請參閱 [使用具名資源方法授予檢視的許可](granting-view-permissions.md)。

# 具體化視觀表
<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 引擎會對基底資料表執行原始查詢。