

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

# 中的資料探索和目錄編製 AWS Glue
<a name="catalog-and-crawler"></a>

 AWS Glue Data Catalog 是集中式儲存庫，可存放組織資料集的相關中繼資料。其可作為您資料來源之位置、結構描述及執行時期指標的索引。中繼資料儲存在中繼資料資料表中，其中每個資料表代表單一資料存放區。

您可以使用編目程式填入 Data Catalog，該編目程式會自動掃描資料來源並擷取中繼資料。編目程式可以連接至 AWS的內部 (AWS型) 和外部的資料來源。

如需有關受支援事件來源的詳細資訊，請參閱[支援的網路爬取資料來源](crawler-data-stores.md)。

您也可以根據特定需求定義資料表結構、結構描述和分區結構，在 Data Catalog 中手動建立資料表。

如需手動建立中繼資料表的詳細資訊，請參閱[手動定義中繼資料](populate-dg-manual.md)。

您可以使用 Data Catalog 中的資訊來建立和監控 ETL 任務。Data Catalog 與其他 AWS 分析服務整合，提供資料來源的統一檢視，讓您更輕鬆地管理和分析資料。
+ Amazon Athena – 使用 SQL 在 Data Catalog 中儲存和查詢 Amazon S3 資料的資料表中繼資料。
+ AWS Lake Formation – 集中定義和管理精細的資料存取政策和稽核資料存取。
+ Amazon EMR – 存取 Data Catalog 中定義的資料來源以進行巨量資料處理。
+ Amazon SageMaker AI – 快速且自信地建置、訓練和部署機器學習模型。Data Catalog 的主要功能

以下是 Data Catalog 的關鍵層面。

中繼資料儲存庫  
 Data Catalog 可作為中央中繼資料儲存庫，儲存資料來源位置、結構描述和屬性的相關資訊。此中繼資料會組織成資料庫和資料表，類似於傳統的關聯式資料庫目錄。

自動資料探索能力  
 AWS Glue 編目程式可以自動探索和編目新的或更新的資料來源，減少手動中繼資料管理的開銷，並確保 Data Catalog 保持最新狀態。透過編目資料來源，Data Catalog 可讓使用者和應用程式更輕鬆地探索和了解組織內可用的資料資產，進而提升資料重複使用和協作。  
Data Catalog 支援各種資料來源，包括 Amazon S3、Amazon RDS、Amazon Redshift、Apache Hive 等。它可以使用 AWS Glue 編目程式自動推斷和存放來自這些來源的中繼資料。  
如需詳細資訊，請參閱 [使用編目程式填入 Data Catalog](add-crawler.md)。

結構描述管理  
Data Catalog 會自動擷取和管理資料來源的結構描述，包括結構描述推論、演進和版本控制。您可以使用 AWS Glue ETL 任務更新 Data Catalog 中的結構描述和分割區。

資料表最佳化  
為了獲得 Amazon Athena 和 Amazon EMR 等 AWS 分析服務以及 AWS Glue ETL 任務的更佳讀取效能，Data Catalog 為 Data Catalog 中的 Iceberg 資料表提供受管壓縮 （將小型 Amazon S3 物件壓縮為較大物件的程序）。您可以使用 AWS Glue 主控台 AWS CLI、 AWS Lake Formation 主控台或 AWS API 來啟用或停用 Data Catalog 中個別 Iceberg 資料表的壓縮。  
如需詳細資訊，請參閱[最佳化處理 Iceberg 資料表](table-optimizers.md)。

資料欄統計資料  
 您可以計算 Parquet、ORC、JSON、ION、CSV 及 XML 等資料格式之 Data Catalog 資料表的資料欄層級統計資料，無需設定其他資料管道。資料欄統計資料可協助您透過深入了解資料欄內的值，了解資料設定檔。Data Catalog 支援產生資料欄值的統計資料 (例如，最小值、最大值、總 Null 值、總相異值、值平均長度及 true 值出現總數)。  
如需詳細資訊，請參閱[使用資料欄統計資料最佳化查詢效能](column-statistics.md)。

資料沿襲  
Data Catalog 會維護對資料執行的轉換和操作記錄，並提供資料沿襲資訊。此沿襲資訊對於稽核、合規和了解資料的來源來說特別有價值。

與其他 AWS 服務的整合  
Data Catalog 與其他 AWS 服務無縫整合 AWS Lake Formation，例如 Amazon Athena、Amazon Redshift Spectrum 和 Amazon EMR。此整合可讓您使用單一、一致的中繼資料層級，查詢和分析各種資料存放區中的資料。

安全性和存取控制  
AWS Glue 與 整合 AWS Lake Formation 以支援 Data Catalog 資源的精細存取控制，可讓您根據組織的政策和需求管理對資料資產的許可和安全存取。 與 AWS Key Management Service (AWS KMS) AWS Glue 整合，以加密存放在 Data Catalog 中的中繼資料。

具體化視觀表   
Data Catalog 支援 Apache Iceberg 具體化視觀表，這些視觀表是存放 SQL 查詢預先計算結果的受管資料表，並在基礎來源資料變更時自動重新整理。具體化視觀表可簡化資料轉換管道，並透過消除冗餘運算來加速查詢效能。  
您可以使用 Glue AWS 5.1 版和更新版本中的 Apache Spark SQL、Amazon EMR 7.12.0 版和更新版本，以及 Amazon Athena 來建立具體化視觀表。Data Catalog 會自動監控來源 Apache Iceberg 資料表，並使用受管運算基礎設施重新整理具體化視觀表。Glue、Amazon EMR 和 Amazon Athena AWS 的 Spark 引擎可以在提供更佳效能時自動重寫查詢，以使用具體化視觀表。  
具體化視觀表會以 Apache Iceberg 資料表的形式存放在 Amazon S3 Tables 儲存貯體中，或存放在您帳戶中的 Amazon S3 一般用途儲存貯體中，使其可從多個查詢引擎存取。Data Catalog 會管理具體化檢視生命週期的所有層面，包括自動重新整理排程、增量更新和中繼資料管理。  
如需詳細資訊，請參閱使用具體化視觀表搭配 AWS Glue 和使用具體化視觀表搭配 Amazon EMR。

**Topics**
+ [填入 AWS Glue 資料目錄](populate-catalog-methods.md)
+ [填入並管理交易資料表](populate-otf.md)
+ [管理 Data Catalog](manage-catalog.md)
+ [存取 Data Catalog](access_catalog.md)
+ [AWS Glue Data Catalog 最佳實務](best-practice-catalog.md)
+ [在 中監控 Data Catalog 用量指標 Amazon CloudWatch](data-catalog-cloudwatch-metrics.md)
+ [AWS Glue 結構描述登錄檔](schema-registry.md)

# 填入 AWS Glue 資料目錄
<a name="populate-catalog-methods"></a>

您可以使用 AWS Glue Data Catalog 下列方法填入 ：
+ AWS Glue 編目程式 – AWS Glue 編目程式 可以自動探索和分類資料來源，例如資料庫、資料湖和串流資料。編目程式是填入 Data Catalog 的最常見建議方法，因為其可以自動發現和推斷各種資料來源的中繼資料。
+  手動新增中繼資料 – 您可以使用 AWS Glue 主控台、Lake Formation 主控台、 AWS CLI或 AWS Glue APIs，手動定義資料庫、資料表和連線詳細資訊，並將其新增至 Data Catalog。當您想要針對無法編目的資料來源編製目錄時，手動輸入非常有用。
+ 與其他 AWS 服務整合 – 您可以使用 AWS Lake Formation 和 Amazon Athena 等服務的中繼資料填入 Data Catalog。這些服務可以在 Data Catalog 中發現和註冊資料來源。
+  從現有的中繼資料儲存庫填入 - 如果您有現有的中繼資料存放區，例如 Apache Hive Metastore，您可以使用 AWS Glue 將該中繼資料匯入 Data Catalog。如需詳細資訊，請參閱 GitHub 上的 [Migration between the Hive Metastore and the AWS Glue Data Catalog](https://github.com/aws-samples/aws-glue-samples/tree/master/utilities/Hive_metastore_migration)。

**Topics**
+ [使用編目程式填入 Data Catalog](add-crawler.md)
+ [手動定義中繼資料](populate-dg-manual.md)
+ [與 Amazon S3 資料表整合](glue-federation-s3tables.md)
+ [與其他 AWS 服務整合](populate-dc-other-services.md)
+ [Data Catalog 設定](console-data-catalog-settings.md)

# 使用編目程式填入 Data Catalog
<a name="add-crawler"></a>

您可以使用 AWS Glue 編目程式 將 AWS Glue Data Catalog 資料庫和資料表填入 。這是大多數 AWS Glue 使用者使用的主要方法。爬蟲程式可以在單一執行中抓取多個資料存放區。一旦完成，爬蟲程式即會在 Data Catalog 中建立或更新一或多個資料表。您在 AWS Glue 中定義的擷取、轉換和載入 (ETL) 任務，會將這些 Data Catalog 資料表做為來源和目標使用。ETL 任務可讀取和寫入來源及目標 Data Catalog 資料表中指定的資料存放區。

## 工作流程
<a name="crawler-workflow"></a>

以下任務流程圖顯示 AWS Glue 爬蟲程式如何與資料存放區和其他元素互動以填入資料目錄。

![\[任務流程顯示 AWS Glue 爬蟲程式如何以 5 個基本步驟填入資料目錄。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/PopulateCatalog-overview.png)


以下是爬蟲程式填入 AWS Glue Data Catalog的一般任務流程：

1. 爬蟲程式會執行您選擇的任何自訂「分類器」**以推斷資料的結構描述。您為自訂分類器提供程式碼，分類器依照您指定的順序執行。

   第一個自訂分類器成功識別資料結構可用來建立結構描述。清單中較低的自訂分類器會被略過。

1. 如果沒有自訂分類器符合您資料的結構描述，內建分類器將嘗試識別您資料的結構描述。可識別 JSON 的分類器即是一種內建分類器的範例。

1. 爬蟲程式連接到資料存放區。有些資料存放區需要連線屬性才能讓爬蟲程式存取。

1. 為您的資料建立經過推斷的結構描述。

1. 爬蟲程式將中繼資料寫入資料目錄。資料表定義包含與資料存放區中的資料有關的中繼資料。資料表寫入資料庫，該資料庫是資料目錄中的資料表容器。資料表的屬性包含分類，它是由推斷資料表結構描述的分類器所建立的標籤。

**Topics**
+ [工作流程](#crawler-workflow)
+ [爬蟲程式的運作方式](#crawler-running)
+ [爬蟲程式如何決定何時建立分割區？](#crawler-s3-folder-table-partition)
+ [支援的網路爬取資料來源](crawler-data-stores.md)
+ [爬蟲程式的先決條件](crawler-prereqs.md)
+ [定義和管理分類器](add-classifier.md)
+ [設定編目程式](define-crawler.md)
+ [排程爬蟲程式](schedule-crawler.md)
+ [檢視爬蟲程式結果和詳細資訊](console-crawlers-details.md)
+ [自訂編目程式行為](crawler-configuration.md)
+ [教學課程：新增 AWS Glue 爬蟲程式](tutorial-add-crawler.md)

## 爬蟲程式的運作方式
<a name="crawler-running"></a>

爬蟲程式執行時，它會進行以下動作來詢問資料存放區：
+ **分類器資料會判斷格式、結構描述及原始資料的相關屬性** – 您可以透過建立自訂分類器來設定分類的結果。
+ **將資料分組至資料表或分區中** – 資料是根據爬蟲程式啟發來加以分組。
+ **將中繼資料寫入到 Data Catalog ** – 您可以設定爬蟲程式如何新增、更新和刪除資料表和分區。

定義爬蟲程式時，您可選擇一個或多個分類器評估資料格式以推斷結構描述。爬蟲程式執行時，清單中第一個成功辨識資料存放區的分類器會用於為您的資料表建立結構描述。您可以使用內建的分類器或自行定義。您可以先在個別操作中定義自訂分類器，之後再定義爬蟲程式。AWS Glue 提供內建的分類器，可從常見檔案格式 (包括 JSON、CSV 和 Apache Avro) 來推斷結構描述。關於 AWS Glue 目前的內建分類器清單，請參閱[內建分類器](add-classifier.md#classifier-built-in)。

爬蟲程式建立的中繼資料資料表，會包含在您定義爬蟲程式時的資料庫裡。如果爬蟲程式未指定資料庫，資料表會存放於預設的資料庫。此外，每個資料表都有分類欄，會由第一個成功辨識資料存放區的分類器填寫。

如果抓取的檔案已壓縮，爬蟲程式就必須下載檔案才能處理。當爬蟲程式執行時，其會詢問檔案以判斷格式和壓縮類型，並將這些屬性寫入到 Data Catalog 。Apache Parquet 等部分檔案格式，可讓您在進行寫入時壓縮部分檔案。對於這些檔案，壓縮資料是檔案內部元件，且 AWS Glue 不會在將資料表寫入 Data Catalog 時填入 `compressionType` 屬性。反之，如果「整個檔案」**是以壓縮演算法進行壓縮 (例如 gzip)，則會在將資料表寫入 Data Catalog 時填入 `compressionType` 屬性。

爬蟲程式會為其建立的資料表產生名稱。存放在 中的資料表名稱 AWS Glue Data Catalog 遵循下列規則：
+ 只能使用英數字元和底線 (`_`)。
+ 任何自訂的字首都不能超過 64 個字元。
+ 名稱的長度上限不能超過 128 個字元。爬蟲程式會截斷產生的名稱以符合限制。
+ 如果遇到重複的資料表名稱，爬蟲程式會為名稱加上雜湊字串尾碼。

如果爬蟲程式執行超過一次 (或許是按照排程)，則會在資料存放區中尋找新的或變更過的檔案或資料表。爬蟲程式的輸出會包含前一次執行時找到的新資料表和分割區。

## 爬蟲程式如何決定何時建立分割區？
<a name="crawler-s3-folder-table-partition"></a>

當AWS Glue爬蟲程式掃描 Amazon S3 資料存放區並偵測儲存貯體中的多個資料夾時，它會決定資料夾結構中資料表的根目錄，以及哪些資料夾是資料表的分割區。資料表名稱是根據 Amazon S3 字首或資料夾名稱。您提供的**包含路徑**會指向要探索的資料夾層級。當大部分資料夾層級的結構描述都很類似時，爬蟲程式會建立資料表分區，而不是不同的資料表。若要影響爬蟲程式來建立不同的資料表，請當您定義爬蟲程式時，新增每個資料表的根資料夾做為個別的資料存放區。

例如，請試想有以下 Amazon S3 資料夾結構。

![\[多個層級的矩形代表 Amazon S3 中的資料夾階層。頂端矩形標示為「Sales (銷售)」。下方的矩形標記為 year=2019。下方的兩個矩形標示為 month=Jan 和 month=Feb。每個矩形下方都有兩個矩形，標示為 day=1 和 day=2。所有四個「day (天)」(底部) 矩形下都有兩個或四個檔案。所有矩形和檔案都以線條連接。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/crawlers-s3-folders.png)


四個最低層級資料夾的路徑如下：

```
S3://sales/year=2019/month=Jan/day=1
S3://sales/year=2019/month=Jan/day=2
S3://sales/year=2019/month=Feb/day=1
S3://sales/year=2019/month=Feb/day=2
```

假設爬蟲程式目標設為 `Sales`，並且 `day=n` 資料夾中的所有檔案具有相同的格式 (例如 JSON，未加密)，並且具有相同或非常相似的結構描述。爬蟲程式將使用分割區索引鍵 `year`、`month` 以及 `day`，建立包含四個分割區的單一資料表。

在下一個範例中，請設想以下 Amazon S3 結構：

```
s3://bucket01/folder1/table1/partition1/file.txt
s3://bucket01/folder1/table1/partition2/file.txt
s3://bucket01/folder1/table1/partition3/file.txt
s3://bucket01/folder1/table2/partition4/file.txt
s3://bucket01/folder1/table2/partition5/file.txt
```

如果 `table1` 和 `table2` 下的檔案結構描述相似，且您是透過 **Include path (包括路徑)** `s3://bucket01/folder1/` 在爬蟲程式中加以定義單一資料存放區，爬蟲程式即會建立含兩個分割區索引鍵欄的單一資料表。第一個分割區索引鍵欄包含 `table1` 和 `table2`，而第二個分割區索引鍵欄包含 `partition1` 到 `partition3` (針對 `table1` 分割區) 和 `partition4` 和 `partition5` (針對 `table2` 分割區)。若要建立兩個不同的資料表，定義含有兩個資料存放區的爬蟲程式。在這個範例中，定義第一個**包含路徑**為 `s3://bucket01/folder1/table1/` 和第二個包含路徑為 `s3://bucket01/folder1/table2`。

**注意**  
在 Amazon Athena，每個資料表會與資料表中所有物件的 Amazon S3 字首相對應。如果物件有不同的結構描述，Athena 無法將相同字首中的不同的物件識別為個別資料表。若爬蟲程式透過相同 Amazon S3 字首建立資料表，就可能會發生上述問題。這可能會導致 Athena 中的查詢傳回零結果。對於 Athena，若要正確識別和查詢資料表，使用個別 **Include path (包含路徑)**，針對 Amazon S3 資料夾結構中的每個不同資料表結構描述建立爬蟲程式。如需詳細資訊，請參閱[使用 Athena 搭配 AWS Glue 的最佳實務](https://docs.aws.amazon.com/athena/latest/ug/glue-best-practices.html)以及此 [AWS 知識中心文章](https://aws.amazon.com/premiumsupport/knowledge-center/athena-empty-results/)。

# 支援的網路爬取資料來源
<a name="crawler-data-stores"></a>

爬蟲程式可以抓取下列檔案型和資料表型資料存放區。


| 爬蟲程式使用的存取類型 | 資料存放區 | 
| --- | --- | 
| 原生用戶端 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/crawler-data-stores.html)  | 
| JDBC |  Amazon Redshift Snowflake 在 Amazon Relational Database Service (Amazon RDS) 中或 Amazon RDS 外部： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/crawler-data-stores.html)  | 
| MongoDB 用戶端 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/crawler-data-stores.html)  | 

**注意**  
目前 AWS Glue 不支援資料串流的爬蟲程式。

對於 JDBC、MongoDB、MongoDB Atlas 和 Amazon DocumentDB (with MongoDB compatibility) 資料存放區，您必須指定爬蟲程式可用來連線到資料存放區的 AWS Glue *連線*爬蟲程式。對於 Amazon S3，您可以選擇性地指定網路類型的連線。連線是儲存連線資訊的 Data Catalog 物件，例如憑證、URL、Amazon Virtual Private Cloud 資訊等。如需詳細資訊，請參閱[連線至資料](glue-connections.md)。

以下是編目程式支援的驅動程式版本：


| 產品 | 編目程式支援的驅動程式 | 
| --- | --- | 
| PostgreSQL | 42.2.1 | 
| Amazon Aurora | 與原生編目程式驅動程式相同 | 
| MariaDB | 8.0.13 | 
| Microsoft SQL Server | 6.1.0 | 
| MySQL | 8.0.13 | 
| Oracle | 11.2.2 | 
| Amazon Redshift | 4.1 | 
| Snowflake | 3.13.20 | 
| MongoDB | 4.7.2 | 
| MongoDB Atlas | 4.7.2 | 

以下是有關各種資料存放區的注意事項。

**Amazon S3**  
您可以選擇在您的帳戶或在另一個帳戶網路爬取路徑。如果資料夾中的所有 Amazon S3 檔案都具有相同的結構描述，爬蟲程式就會建立一個資料表。此外，如果 Amazon S3 物件已分割，則只會建立一個中繼資料資料表，並將分割資訊新增到該資料表的 Data Catalog 。

**Amazon S3 和 Amazon DynamoDB**  
爬蟲程式使用 AWS Identity and Access Management (IAM) 角色來取得存取資料存放區的許可。*您傳遞至爬蟲程式的角色必須擁有許可，才能存取已抓取的 Amazon S3 路徑和 Amazon DynamoDB 資料表*。

**Amazon DynamoDB**  
使用 AWS Glue 主控台定義爬蟲程式時，需指定一個 DynamoDB 資料表。若您是使用 AWS Glue API，可指定資料表清單。您可以選擇只網路爬取一小部分的資料範例，以減少爬蟲程式的執行時間。

**Delta Lake**  
針對每個 Delta Lake 資料存放區，請指定如何建立 Delta 資料表：  
+ **建立原生資料表**：允許與支援直接查詢 Delta 交易日誌的查詢引擎整合。如需詳細資訊，請參閱[查詢 Delta Lake 資料表](https://docs.aws.amazon.com/athena/latest/ug/delta-lake-tables.html)。
+ **建立符號連結資料夾**：根據特定組態參數，使用由分割區索引鍵分割的資訊清單檔案建立 `_symlink_manifest` 資料夾。

**Iceberg**  
對於每個 Iceberg 資料存放區，您可以指定包含 Iceberg 資料表中繼資料的 Amazon S3 路徑。如果爬蟲程式發現 Iceberg 資料表中繼資料，其會在資料目錄中註冊該中繼資料。您可以為爬蟲程式設定排程，讓資料表持續更新。  
您可以為資料存放區定義下列參數：  
+ **排除**：可讓您略過某些資料夾。
+ **周遊深度上限**：設定爬蟲程式可在 Amazon S3 儲存貯體中爬取的深度限制。預設的周遊深度上限為 10，而您可以設定的深度上限為 20。

**Hudi**  
對於每個 Hudi 資料存放區，您可以指定包含 Hudi 資料表中繼資料的 Amazon S3 路徑。如果爬蟲程式發現 Hudi 資料表中繼資料，其會在資料目錄中註冊該中繼資料。您可以為爬蟲程式設定排程，讓資料表持續更新。  
您可以為資料存放區定義下列參數：  
+ **排除**：可讓您略過某些資料夾。
+ **周遊深度上限**：設定爬蟲程式可在 Amazon S3 儲存貯體中爬取的深度限制。預設的周遊深度上限為 10，而您可以設定的深度上限為 20。
由於與 Hudi 0.13.1 和時間戳記類型不相容，邏輯類型為 `millis` 的時間戳記資料欄將解譯為 `bigint`。即將發布的 Hudi 版本中可能會提供解決方案。
Hudi 資料表的分類如下，每個資料表都具有特定的含義：  
+ 寫入時複製 (CoW)：資料會以單欄式格式 (Parquet) 存放，每次更新都會在寫入期間建立新版檔案。
+ 讀取時合併 (MoR)：資料的存放是使用單欄式格式 (Parquet) 和以資料列為基礎的格式 (Avro) 組合進行。更新會記錄到以資料列為基礎的 delta 檔案，並視需要壓縮以建立新版本的直欄式檔案。
使用 CoW 資料集，每次有記錄進行更新時，包含記錄的檔案就會以更新的值重寫。若使用 MoR 資料集，每次有更新時，Hudi 只會寫入已變更之記錄的資料行。MoR 更適合較少讀取，而寫入或變更較繁重的工作負載。CoW 更適合資料變更較不頻繁，而讀取作業較為繁重的工作負載。  
Hudi 提供三個可用於資料存取的查詢類型：  
+ 快照查詢：查詢會查看截至指定遞交或壓縮動作之資料表的最新快照。對於 MoR 資料表，快照查詢會公開資料表的最新狀態，方法是合併查詢時最新檔案切片的基底和 delta 檔案。
+ 增量查詢：查詢只會看到自指定遞交/壓縮以來在資料表中寫入的新資料。這會有效地提供變更串流，以啟用增量資料管道。
+ 讀取最佳化查詢：對於 MoR 資料表，查詢會看到壓縮的最新資料。對於 CoW 資料表，查詢會看到遞交的最新資料。
對於寫入時複製資料表，爬蟲程式會使用 ReadOptimized serde `org.apache.hudi.hadoop.HoodieParquetInputFormat`，在資料目錄中建立單一資料表。  
對於「讀取時合併」資料表，爬蟲程式會在資料目錄中為相同的資料表位置建立兩個資料表：  
+ 尾碼為 `_ro` 的資料表，使用 ReadOptimized serde `org.apache.hudi.hadoop.HoodieParquetInputFormat`。
+ 尾碼為 `_rt` 的資料表，使用允許快照查詢的 RealTime Serde：`org.apache.hudi.hadoop.realtime.HoodieParquetRealtimeInputFormat`。

**MongoDB 和 Amazon DocumentDB (with MongoDB compatibility)**  
支援 MongoDB 3.2 版和更新版本。您可以選擇只網路爬取一小部分的資料範例，以減少爬蟲程式的執行時間。

**關聯式資料庫**  
身分驗證是使用資料庫使用者名稱和密碼。根據資料庫引擎的類型，您可以選擇要探索哪些物件 (例如資料庫、結構描述和資料表)。

**Snowflake**  
Snowflake JDBC 爬蟲程式支援網路爬取資料表、外部資料表、視觀表以及具體化視觀表。不會填入具體化視觀表定義。  
對於 Snowflake 外部資料表，爬蟲程式只有在指向 Amazon S3 位置時才會進行網路爬取。除了資料表結構描述，爬蟲程式還會網路爬取 Amazon S3 位置、檔案格式和作為 Data Catalog 資料表中資料表參數的輸出內容。請注意，不會填入已分割外部資料表的分割區資訊。  
使用 Snowflake 爬蟲程式建立的 Data Catalog 資料表目前不支援 ETL。

# 爬蟲程式的先決條件
<a name="crawler-prereqs"></a>

爬蟲程式會擔任您在定義角色時指定的 AWS Identity and Access Management (IAM) 角色許可。這個 IAM 角色必須具有許可，來從您的資料存放區擷取資料，以及將資料寫入至 Data Catalog 。AWS Glue 主控台只會列出已經連接 AWS Glue 主要服務適用信任政策的 IAM 角色。從主控台，您也可以建立 IAM 角色與 IAM 政策，以存取爬蟲程式所存取的 Amazon S3 資料存放區。如需為 AWS Glue 提供角色的詳細資訊，請參閱 [Glue AWS 的身分型政策](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies)。

**注意**  
網路爬取 Delta Lake 資料儲存時，您必須擁有讀/寫 Amazon S3 位置的權限。

對於爬蟲程式，您可以建立角色並連接下列政策：
+ `AWSGlueServiceRole` AWS 受管政策，授予 Data Catalog 所需的許可
+ 授予資料來源許可的內嵌政策。
+ 授予角色 `iam:PassRole` 許可的內嵌政策。

更快的方法是讓 AWS Glue 主控台爬蟲程式精靈為您建立角色。其建立的角色專門用於爬蟲程式，並包含 `AWSGlueServiceRole` AWS 受管政策加上指定資料來源所需的內嵌政策。

如果您指定爬蟲程式的現有角色，請確定它包含 `AWSGlueServiceRole` 政策或同等政策 (或此政策的範圍縮減版本)，以及必要的內嵌政策。例如，對於 Amazon S3 資料存放區，內嵌政策至少需要如下：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::bucket/object*"
      ]
    }
  ]
}
```

------

對於 Amazon DynamoDB 資料存放區，政策至少需要如下：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:DescribeTable",
        "dynamodb:Scan"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:111122223333:table/table-name*"
      ]
    }
  ]
}
```

------

此外，如果爬蟲程式讀取 AWS Key Management Service (AWS KMS) 加密的 Amazon S3 資料，則 IAM 角色必須具有 AWS KMS 金鑰的解密許可。如需詳細資訊，請參閱[步驟 2：為 AWS Glue 建立 IAM 角色](create-an-iam-role.md)。

# 定義和管理分類器
<a name="add-classifier"></a>

分類器讀取資料存放區中的資料。如果它能辨識資料的格式，將會產生結構描述。分類器也會傳回一個確定數字以表示所識別格式的確定程度。

AWS Glue 提供一組內建分類器，但您也可以建立自訂分類器。AWS Glue 會先依照您在爬蟲程式定義中指定的順序叫用自訂分類器。根據從自訂分類器傳回的結果，AWS Glue 也可能叫用內建分類器。如果分類器在處理期間傳回 `certainty=1.0`，表示它 100% 確定可以建立正確的結構描述。然後，AWS Glue 將使用此分類器的輸出。

如果沒有分類器傳回 `certainty=1.0`，AWS Glue 將使用確定程度最高的分類器的輸出。如果沒有分類器傳回大於 `0.0` 的確定程度，AWS Glue 將傳回預設的分類字串 `UNKNOWN`。

## 我應該在何時使用分類器？
<a name="classifier-when-used"></a>

當您在 AWS Glue Data Catalog中探索資料存放區以定義中繼資料資料表時，可使用分類器。您可以用一組已排序的分類器來設定您的爬蟲程式。當爬蟲程式叫用分類器時，分類器會判斷資料是否能夠辨識。如果分類器無法識別資料或無法 100% 確定，爬蟲程式將叫用清單中的下一個分類器，以判斷它是否能夠識別資料。

 如需使用 AWS Glue 主控台建立分類器的詳細資訊，請參閱[使用 AWS Glue 主控台建立分類器](console-classifiers.md)。

## 自訂分類器
<a name="classifier-defining"></a>

分類器的輸出包含一個字串，它會指出檔案的分類或格式 (例如，`json`) 以及檔案結構描述。對於自訂分類器，您可以根據分類器的類型，定義建立結構描述的邏輯。分類器類型包括根據 grok 模式、XML 標籤以及 JSON 路徑定義結構描述。

如果您變更分類器定義，之前使用分類器探索的任何資料將不會重新分類。爬蟲程式會持續追蹤之前探索的資料。會使用更新分類器來分類新資料，這可能會更新結構描述。如果資料的結構描述擴張，則於爬蟲程式執行時將分類器更新到任何結構描述變更的帳戶。若要重新分類資料以更正不正確的分類器，請使用更新的分類器建立新爬蟲程式。

如需在 AWS Glue 中建立自訂分類器的詳細資訊，請參閱[為各種資料格式撰寫自訂分類器](custom-classifier.md)。

**注意**  
如果您的資料格式能夠由內建分類器之一加以辨識，您將無需建立自訂分類器。

## 內建分類器
<a name="classifier-built-in"></a>

 AWS Glue 提供各種格式的內建分類器，包括 JSON、CSV、Web 日誌，以及許多資料庫系統。

如果 AWS Glue 找不到能 100% 確定符合輸入資料格式的自訂分類器，將會依照下表所列順序叫用內建分類器。內建分類器傳回結果，指出格式是否符合 (`certainty=1.0`) 或不符合 (`certainty=0.0`)。第一個具有 `certainty=1.0` 的分類器將為 Data Catalog 的中繼資料資料表提供分類字串和結構描述。


| 分類器類型 | 分類字串 | 備註 | 
| --- | --- | --- | 
| Apache Avro | avro | 讀取檔案開頭的結構描述以判斷格式。 | 
| Apache ORC | orc | 讀取檔案中繼資料以判斷格式。 | 
| Apache Parquet | parquet | 讀取檔案結尾的結構描述以判斷格式。 | 
| JSON | json | 讀取檔案的開頭以判斷格式。 | 
| Binary JSON | bson | 讀取檔案的開頭以判斷格式。 | 
| XML | xml | 讀取檔案的開頭以判斷格式。AWS Glue 根據文件中的 XML 標籤來判斷資料表結構描述。 如需建立自訂 XML 分類器以指定文件中的列的詳細資訊，請參閱 [撰寫 XML 自訂分類器](custom-classifier.md#custom-classifier-xml)。 | 
| Amazon Ion | ion | 讀取檔案的開頭以判斷格式。 | 
| 結合的 Apache 日誌 | combined\$1apache | 透過 grok 模式決定日誌格式。 | 
| Apache 日誌 | apache | 透過 grok 模式決定日誌格式。 | 
| Linux 核心日誌 | linux\$1kernel | 透過 grok 模式決定日誌格式。 | 
| Microsoft 日誌 | microsoft\$1log | 透過 grok 模式決定日誌格式。 | 
| Ruby 日誌 | ruby\$1logger | 讀取檔案的開頭以判斷格式。 | 
| Squid 3.x 日誌 | squid | 讀取檔案的開頭以判斷格式。 | 
| Redis 監控日誌 | redismonlog | 讀取檔案的開頭以判斷格式。 | 
| Redis 日誌 | redislog | 讀取檔案的開頭以判斷格式。 | 
| CSV | csv | 檢查以下分隔符號：逗號 (,)、直立線符號 (\$1)、Tab (\$1t)、分號 (;) 和 Ctrl-A (\$1u0001)。Ctrl-A 為 Start Of Heading 的 Unicode 控制字元。 | 
| Amazon Redshift | redshift | 使用 JDBC 連線來匯入中繼資料。 | 
| MySQL | mysql | 使用 JDBC 連線來匯入中繼資料。 | 
| PostgreSQL | postgresql | 使用 JDBC 連線來匯入中繼資料。 | 
| Oracle 資料庫 | oracle | 使用 JDBC 連線來匯入中繼資料。 | 
| Microsoft SQL Server | sqlserver | 使用 JDBC 連線來匯入中繼資料。 | 
| Amazon DynamoDB | dynamodb | 從 DynamoDB 資料表讀取資料。 | 

可分類以下壓縮格式的檔案：
+ ZIP (僅包含單一檔案的封存可支援)。請注意，Zip 在其他服務中並未完整支援 (因為封存的關係)。
+ BZIP
+ GZIP
+ LZ4
+ Snappy (支援標準和 Hadoop 原生 Snappy 格式)

### 內建 CSV 分類器
<a name="classifier-builtin-rules"></a>

內建 CSV 分類器會剖析 CSV 檔案內容，以判斷 AWS Glue 資料表的結構描述。此分類器會檢查以下分隔符號：
+ 逗號 (,)
+ 管道 (\$1)
+ Tab (\$1t)
+ 分號 (;)
+ Ctrl-A (\$1u0001)

  Ctrl-A 為 `Start Of Heading` 的 Unicode 控制字元。

若要被歸類為 CSV，資料表結構描述必須至少有兩個資料欄和兩個資料列。CSV 分類器使用多種啟發，以判斷在特定檔案中標頭是否存在。如果分類器無法判斷第一列資料的標頭，欄標頭會顯示為 `col1`、`col2`、`col3`，以此類推。內建 CSV 分類器會透過評估檔案的以下特點判斷是否要推斷標頭：
+ 在潛在標頭中的每個欄位剖析為 STRING 資料類型。
+ 除了最後一個欄位，每個在潛在標頭中內容少於 150 個字元的欄位。若要允許結尾為分隔符號，整個檔案的最後一個欄位可以是空的。
+ 在潛在標頭中的每個欄必須符合欄位名稱的 AWS Glue `regex` 要求。
+ 標頭資料列必須與資料列有足夠的差異。若要判斷此項目，一或多個資料列必須剖析為其他 STRING 類型。如果所有欄位的類型為 STRING，則第一列資料與用做為標頭的後續資料列的差異不足夠。

**注意**  
如果內建的 CSV 分類器無法如您想要地建立 AWS Glue 資料表，您可以使用以下其中一個替代選項：  
變更在 Data Catalog 中的欄名稱，將 `SchemaChangePolicy` 設定為 LOG，並將分區輸出配置設定為 `InheritFromTable` 以供未來爬蟲程式執行使用。
建立自訂 grok 分類器來剖析資料並指派您想要的欄。
內建 CSV 分類器會建立資料表，參考 `LazySimpleSerDe` 做為序列化的程式庫，這是類型推導的最佳選擇。不過，如果 CSV 資料包含引用字串，編輯資料表定義並將 SerDe 程式庫變更為 `OpenCSVSerDe`。將任何推導類型調整為 STRING，將 `SchemaChangePolicy` 設定為 LOG，並將分區輸出配置設定為 `InheritFromTable` 以供未來爬蟲程式執行使用。如需 SerDe 程式庫的更多資訊，請參閱《Amazon Athena 使用者指南》中的 [SerDe 參考](https://docs.aws.amazon.com/athena/latest/ug/serde-reference.html)。

# 為各種資料格式撰寫自訂分類器
<a name="custom-classifier"></a>

您可以提供自訂分類器，分類在 AWS Glue中的資料。您可以使用 grok 模式、XML 標籤、JavaScript Object 符號 (JSON) 或逗號分隔值 (CSV)，建立自訂分類器。AWS Glue 爬蟲程式呼叫自訂分類器。如果分類器能夠辨識資料，它會將資料的分類和結構描述傳回爬蟲程式。如果您的資料不符合任何內建的分類器，或者想要自訂由爬蟲程式建立的資料表，那麼您可能需要定義自訂分類器。

 如需使用 AWS Glue 主控台建立分類器的詳細資訊，請參閱[使用 AWS Glue 主控台建立分類器](console-classifiers.md)。

AWS Glue 會依照您指定的順序，在內建的分類器之前執行自訂分類器。當爬蟲程式找到符合資料的分類器時，分類字串和結構描述將用於資料表的定義中，這些資料表將寫入至您的 AWS Glue Data Catalog。

**Topics**
+ [撰寫 grok 自訂分類器](#custom-classifier-grok)
+ [撰寫 XML 自訂分類器](#custom-classifier-xml)
+ [撰寫 JSON 自訂分類器](#custom-classifier-json)
+ [撰寫 CSV 自訂分類器](#custom-classifier-csv)

## 撰寫 grok 自訂分類器
<a name="custom-classifier-grok"></a>

Grok 是一種工具，用於剖析指定相符模式的文字資料。grok 模式是一組命名規則表達式 (regex)， 用於每次比對一行。AWS Glue 使用 grok 模式來推斷資料的結構描述。當 grok 模式符合您的資料時，AWS Glue 將使用此模式判斷您資料的結構，並將其映射到欄位。

AWS Glue 提供許多內建模式，或者您可以定義自己的模式。您可以在自訂分類器定義中使用內建模式和自訂模式來建立 grok 模式。您可以量身打造 grok 模式來分類自訂文字檔案格式。

**注意**  
針對 AWS Glue Data Catalog中建立的資料表，AWS Glue Grok 自訂分類器會使用 `GrokSerDe` 序列化程式庫。如果您將 AWS Glue Data Catalog 與 Amazon Athena、Amazon EMR 或 Redshift Spectrum 搭配使用，請查看這些服務的文件，以取得 支援的相關資訊`GrokSerDe`。目前，當您從 Amazon EMR 和 Redshift 查詢利用 `GrokSerDe` 建立的資料表時，可能會遇到問題。

以下是 grok 模式元件的基本語法：

```
%{PATTERN:field-name}
```

符合具名的 `PATTERN` 的資料會映射到結構描述中的 `field-name` 欄位符合，預設資料類型為 `string`。除此之外，您亦可選擇在產生的結構描述中，將欄位的資料類型轉換為 `byte`、`boolean`、`double`、`short`、`int`、`long` 或 `float`。

```
%{PATTERN:field-name:data-type}
```

例如，若要將 `num` 欄位轉換為 `int` 資料類型，您可以使用此模式：

```
%{NUMBER:num:int}
```

模式可由其他模式組成。舉例而言，您可使用月、日及時間的模式來定義 `SYSLOG` 時間戳記的模式 (例如 `Feb 1 06:25:43`)。您能夠使用下列模式來定義此資料：

```
SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME}
```

**注意**  
Grok 模式每次只能處理一行。不支援多行模式。此外，不支援在模式中的換行。

### grok 分類器的自訂值
<a name="classifier-values"></a>

定義 grok 分類器時，請提供以下值以建立自訂分類器。

**名稱**  
分類器名稱。

**分類**  
寫入的字串用於描述分類資料的格式；例如 `special-logs`。

**Grok 模式**  
套用到資料存放區的一組模式可判斷是否符合。這些模式皆來自 AWS Glue [ 內建模式](#classifier-builtin-patterns)，以及您所定義的任何自訂模式。  
以下為 grok 模式的範例：  

```
%{TIMESTAMP_ISO8601:timestamp} \[%{MESSAGEPREFIX:message_prefix}\] %{CRAWLERLOGLEVEL:loglevel} : %{GREEDYDATA:message}
```
當資料符合 `TIMESTAMP_ISO8601`，將會建立結構描述欄位 `timestamp`。此行為類似範例中的其他具名模式。

**自訂模式**  
您定義的選用自訂模式。分類您的資料的 grok 模式會參考這些模式。您可以在套用至您資料的 grok 模式中參考這些自訂模式。每個自訂元件模式都必須位於不同的行。[規則表達式 (regex)](http://en.wikipedia.org/wiki/Regular_expression) 語法可用來定義模式。  
以下是使用指定模式的範例：  

```
CRAWLERLOGLEVEL (BENCHMARK|ERROR|WARN|INFO|TRACE)
MESSAGEPREFIX .*-.*-.*-.*-.*
```
當資料符合其中一個列舉字串時，第一個自訂具名模式 `CRAWLERLOGLEVEL` 即為相符。第二個自訂模式 `MESSAGEPREFIX` 嘗試符合訊息字首字串。

AWS Glue 追蹤建立時間、上次更新時間和您的分類器版本。

### 內建模式
<a name="classifier-builtin-patterns"></a>

AWS Glue 提供許多常見的模式，您可用來建立自訂分類器。您將一個具名模式新增到分類器定義中的 `grok pattern`。

以下清單包含各個模式的一行。在每一行中，模式名稱之後是它的定義。[規則表達式 (regex)](http://en.wikipedia.org/wiki/Regular_expression) 語法可用來定義模式。

```
#<noloc>&GLU;</noloc> Built-in patterns
 USERNAME [a-zA-Z0-9._-]+
 USER %{USERNAME:UNWANTED}
 INT (?:[+-]?(?:[0-9]+))
 BASE10NUM (?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))
 NUMBER (?:%{BASE10NUM:UNWANTED})
 BASE16NUM (?<![0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+))
 BASE16FLOAT \b(?<![0-9A-Fa-f.])(?:[+-]?(?:0x)?(?:(?:[0-9A-Fa-f]+(?:\.[0-9A-Fa-f]*)?)|(?:\.[0-9A-Fa-f]+)))\b
 BOOLEAN (?i)(true|false)
 
 POSINT \b(?:[1-9][0-9]*)\b
 NONNEGINT \b(?:[0-9]+)\b
 WORD \b\w+\b
 NOTSPACE \S+
 SPACE \s*
 DATA .*?
 GREEDYDATA .*
 #QUOTEDSTRING (?:(?<!\\)(?:"(?:\\.|[^\\"])*"|(?:'(?:\\.|[^\\'])*')|(?:`(?:\\.|[^\\`])*`)))
 QUOTEDSTRING (?>(?<!\\)(?>"(?>\\.|[^\\"]+)+"|""|(?>'(?>\\.|[^\\']+)+')|''|(?>`(?>\\.|[^\\`]+)+`)|``))
 UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}
 
 # Networking
 MAC (?:%{CISCOMAC:UNWANTED}|%{WINDOWSMAC:UNWANTED}|%{COMMONMAC:UNWANTED})
 CISCOMAC (?:(?:[A-Fa-f0-9]{4}\.){2}[A-Fa-f0-9]{4})
 WINDOWSMAC (?:(?:[A-Fa-f0-9]{2}-){5}[A-Fa-f0-9]{2})
 COMMONMAC (?:(?:[A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2})
 IPV6 ((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?
 IPV4 (?<![0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9])
 IP (?:%{IPV6:UNWANTED}|%{IPV4:UNWANTED})
 HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-_]{0,62}))*(\.?|\b)
 HOST %{HOSTNAME:UNWANTED}
 IPORHOST (?:%{HOSTNAME:UNWANTED}|%{IP:UNWANTED})
 HOSTPORT (?:%{IPORHOST}:%{POSINT:PORT})
 
 # paths
 PATH (?:%{UNIXPATH}|%{WINPATH})
 UNIXPATH (?>/(?>[\w_%!$@:.,~-]+|\\.)*)+
 #UNIXPATH (?<![\w\/])(?:/[^\/\s?*]*)+
 TTY (?:/dev/(pts|tty([pq])?)(\w+)?/?(?:[0-9]+))
 WINPATH (?>[A-Za-z]+:|\\)(?:\\[^\\?*]*)+
 URIPROTO [A-Za-z]+(\+[A-Za-z+]+)?
 URIHOST %{IPORHOST}(?::%{POSINT:port})?
 # uripath comes loosely from RFC1738, but mostly from what Firefox
 # doesn't turn into %XX
 URIPATH (?:/[A-Za-z0-9$.+!*'(){},~:;=@#%_\-]*)+
 #URIPARAM \?(?:[A-Za-z0-9]+(?:=(?:[^&]*))?(?:&(?:[A-Za-z0-9]+(?:=(?:[^&]*))?)?)*)?
 URIPARAM \?[A-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]]*
 URIPATHPARAM %{URIPATH}(?:%{URIPARAM})?
 URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})?
 
 # Months: January, Feb, 3, 03, 12, December
 MONTH \b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b
 MONTHNUM (?:0?[1-9]|1[0-2])
 MONTHNUM2 (?:0[1-9]|1[0-2])
 MONTHDAY (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])
 
 # Days: Monday, Tue, Thu, etc...
 DAY (?:Mon(?:day)?|Tue(?:sday)?|Wed(?:nesday)?|Thu(?:rsday)?|Fri(?:day)?|Sat(?:urday)?|Sun(?:day)?)
 
 # Years?
 YEAR (?>\d\d){1,2}
 # Time: HH:MM:SS
 #TIME \d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?
 # TIME %{POSINT<24}:%{POSINT<60}(?::%{POSINT<60}(?:\.%{POSINT})?)?
 HOUR (?:2[0123]|[01]?[0-9])
 MINUTE (?:[0-5][0-9])
 # '60' is a leap second in most time standards and thus is valid.
 SECOND (?:(?:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?)
 TIME (?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9])
 # datestamp is YYYY/MM/DD-HH:MM:SS.UUUU (or something like it)
 DATE_US %{MONTHNUM}[/-]%{MONTHDAY}[/-]%{YEAR}
 DATE_EU %{MONTHDAY}[./-]%{MONTHNUM}[./-]%{YEAR}
 DATESTAMP_US %{DATE_US}[- ]%{TIME}
 DATESTAMP_EU %{DATE_EU}[- ]%{TIME}
 ISO8601_TIMEZONE (?:Z|[+-]%{HOUR}(?::?%{MINUTE}))
 ISO8601_SECOND (?:%{SECOND}|60)
 TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
 TZ (?:[PMCE][SD]T|UTC)
 DATESTAMP_RFC822 %{DAY} %{MONTH} %{MONTHDAY} %{YEAR} %{TIME} %{TZ}
 DATESTAMP_RFC2822 %{DAY}, %{MONTHDAY} %{MONTH} %{YEAR} %{TIME} %{ISO8601_TIMEZONE}
 DATESTAMP_OTHER %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{TZ} %{YEAR}
 DATESTAMP_EVENTLOG %{YEAR}%{MONTHNUM2}%{MONTHDAY}%{HOUR}%{MINUTE}%{SECOND}
 CISCOTIMESTAMP %{MONTH} %{MONTHDAY} %{TIME}
 
 # Syslog Dates: Month Day HH:MM:SS
 SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME}
 PROG (?:[\w._/%-]+)
 SYSLOGPROG %{PROG:program}(?:\[%{POSINT:pid}\])?
 SYSLOGHOST %{IPORHOST}
 SYSLOGFACILITY <%{NONNEGINT:facility}.%{NONNEGINT:priority}>
 HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT}
 
 # Shortcuts
 QS %{QUOTEDSTRING:UNWANTED}
 
 # Log formats
 SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:
 
 MESSAGESLOG %{SYSLOGBASE} %{DATA}
 
 COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{Bytes:bytes=%{NUMBER}|-})
 COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent}
 COMMONAPACHELOG_DATATYPED %{IPORHOST:clientip} %{USER:ident;boolean} %{USER:auth} \[%{HTTPDATE:timestamp;date;dd/MMM/yyyy:HH:mm:ss Z}\] "(?:%{WORD:verb;string} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion;float})?|%{DATA:rawrequest})" %{NUMBER:response;int} (?:%{NUMBER:bytes;long}|-)
 
 
 # Log Levels
 LOGLEVEL ([A|a]lert|ALERT|[T|t]race|TRACE|[D|d]ebug|DEBUG|[N|n]otice|NOTICE|[I|i]nfo|INFO|[W|w]arn?(?:ing)?|WARN?(?:ING)?|[E|e]rr?(?:or)?|ERR?(?:OR)?|[C|c]rit?(?:ical)?|CRIT?(?:ICAL)?|[F|f]atal|FATAL|[S|s]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)
```

## 撰寫 XML 自訂分類器
<a name="custom-classifier-xml"></a>

XML 會利用檔案中的標籤來定義文件的結構。使用 XML 自訂分類器，您可以指定用來定義一個列的標籤名稱。

### XML 分類器的自訂分類器值
<a name="classifier-values-xml"></a>

當您定義 XML 分類器時，您將以下值提供至 AWS Glue 以建立分類器。此分類器的分類欄位設定為 `xml`。

**名稱**  
分類器名稱。

**Row 標籤**  
在 XML 文件中用於定義資料表列的 XML 標籤名稱，不含角括號 `< >`。此名稱必須符合 XML 的標籤規則。  
包含列資料的元素**不得**為自我封閉的空元素。舉例而言，** **不會AWS Glue剖析此空元素：  

```
            <row att1=”xx” att2=”yy” />  
```
 空元素可撰寫如下：  

```
            <row att1=”xx” att2=”yy”> </row> 
```

AWS Glue 追蹤建立時間、上次更新時間和您的分類器版本。

例如，假設您擁有以下 XML 檔案。若要建立僅含有作者和標題的 AWS Glue 資料表，請在 AWS Glue 主控台中以 **Row 標籤**做為 `AnyCompany` 來建立分類器。接著，新增並執行採用此自訂分類器的爬蟲程式即可。

```
<?xml version="1.0"?>
<catalog>
   <book id="bk101">
     <AnyCompany>
       <author>Rivera, Martha</author>
       <title>AnyCompany Developer Guide</title>
     </AnyCompany>
   </book>
   <book id="bk102">
     <AnyCompany>   
       <author>Stiles, John</author>
       <title>Style Guide for AnyCompany</title>
     </AnyCompany>
   </book>
</catalog>
```

## 撰寫 JSON 自訂分類器
<a name="custom-classifier-json"></a>

JSON 是資料交換格式。它定義資料結構與名稱值組或值的排序清單。使用 JSON 自訂分類器時，您可以指定資料結構的 JSON 路徑，以用於定義資料表的結構描述。

### AWS Glue 中的自訂分類器值
<a name="classifier-values-json"></a>

當您定義 JSON 分類器時，您將以下值提供至 AWS Glue 以建立分類器。此分類器的分類欄位設定為 `json`。

**名稱**  
分類器名稱。

**JSON 路徑**  
JSON 路徑會指向用來定義資料表結構描述的物件。您可以用點標記法或括號標記法來撰寫 JSON 路徑。以下是支援的運算子：      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/custom-classifier.html)

AWS Glue 追蹤建立時間、上次更新時間和您的分類器版本。

**Example 使用 JSON 分類器從陣列中提取記錄**  
此處會假設您的 JSON 資料是一系列的記錄。舉例來說，檔案的前面幾行可能如下所示：  

```
[
  {
    "type": "constituency",
    "id": "ocd-division\/country:us\/state:ak",
    "name": "Alaska"
  },
  {
    "type": "constituency",
    "id": "ocd-division\/country:us\/state:al\/cd:1",
    "name": "Alabama's 1st congressional district"
  },
  {
    "type": "constituency",
    "id": "ocd-division\/country:us\/state:al\/cd:2",
    "name": "Alabama's 2nd congressional district"
  },
  {
    "type": "constituency",
    "id": "ocd-division\/country:us\/state:al\/cd:3",
    "name": "Alabama's 3rd congressional district"
  },
  {
    "type": "constituency",
    "id": "ocd-division\/country:us\/state:al\/cd:4",
    "name": "Alabama's 4th congressional district"
  },
  {
    "type": "constituency",
    "id": "ocd-division\/country:us\/state:al\/cd:5",
    "name": "Alabama's 5th congressional district"
  },
  {
    "type": "constituency",
    "id": "ocd-division\/country:us\/state:al\/cd:6",
    "name": "Alabama's 6th congressional district"
  },
  {
    "type": "constituency",
    "id": "ocd-division\/country:us\/state:al\/cd:7",
    "name": "Alabama's 7th congressional district"
  },
  {
    "type": "constituency",
    "id": "ocd-division\/country:us\/state:ar\/cd:1",
    "name": "Arkansas's 1st congressional district"
  },
  {
    "type": "constituency",
    "id": "ocd-division\/country:us\/state:ar\/cd:2",
    "name": "Arkansas's 2nd congressional district"
  },
  {
    "type": "constituency",
    "id": "ocd-division\/country:us\/state:ar\/cd:3",
    "name": "Arkansas's 3rd congressional district"
  },
  {
    "type": "constituency",
    "id": "ocd-division\/country:us\/state:ar\/cd:4",
    "name": "Arkansas's 4th congressional district"
  }
]
```
透過內建 JSON 分類器執行爬蟲程式時，即可將整個檔案用來定義結構描述。因為您尚未 JSON 路徑，該爬蟲程式會將資料視為一個物件，亦即只是一個陣列。例如，結構描述看起來類似如下：  

```
root
|-- record: array
```
然而，若要在 JSON 陣列中根據每個記錄建立結構描述，請建立自訂 JSON 分類器並指定 JSON 路徑為 `$[*]`。當您指定此 JSON 路徑時，分類器會詢問陣列中的 12 筆記錄以判斷結構描述。產生的結構描述將包含各個物件的獨立欄位，如以下範例所示：  

```
root
|-- type: string
|-- id: string
|-- name: string
```

**Example 使用 JSON 分類器僅檢查檔案的部分**  
此處假設 JSON 資料會遵循範例 JSON 檔案 `s3://awsglue-datasets/examples/us-legislators/all/areas.json` 的模式，該檔案取自 [http://everypolitician.org/](http://everypolitician.org/)。JSON 檔案中的範例物件看起來會像下述內容：  

```
{
  "type": "constituency",
  "id": "ocd-division\/country:us\/state:ak",
  "name": "Alaska"
}
{
  "type": "constituency",
  "identifiers": [
    {
      "scheme": "dmoz",
      "identifier": "Regional\/North_America\/United_States\/Alaska\/"
    },
    {
      "scheme": "freebase",
      "identifier": "\/m\/0hjy"
    },
    {
      "scheme": "fips",
      "identifier": "US02"
    },
    {
      "scheme": "quora",
      "identifier": "Alaska-state"
    },
    {
      "scheme": "britannica",
      "identifier": "place\/Alaska"
    },
    {
      "scheme": "wikidata",
      "identifier": "Q797"
    }
  ],
  "other_names": [
    {
      "lang": "en",
      "note": "multilingual",
      "name": "Alaska"
    },
    {
      "lang": "fr",
      "note": "multilingual",
      "name": "Alaska"
    },
    {
      "lang": "nov",
      "note": "multilingual",
      "name": "Alaska"
    }
  ],
  "id": "ocd-division\/country:us\/state:ak",
  "name": "Alaska"
}
```
透過內建 JSON 分類器執行爬蟲程式時，即可將整個檔案用來建立結構描述。您得到的結構描述可能類似：  

```
root
|-- type: string
|-- id: string
|-- name: string
|-- identifiers: array
|    |-- element: struct
|    |    |-- scheme: string
|    |    |-- identifier: string
|-- other_names: array
|    |-- element: struct
|    |    |-- lang: string
|    |    |-- note: string
|    |    |-- name: string
```
不過，您必須建立自訂 JSON 分類器並將 JSON 路徑指定為 `id`，才能僅使用「`$.id`」物件建立結構描述。如此一來，系統僅會依據「`id`」欄位來產生結構描述：  

```
root
|-- record: string
```
使用此結構描述所擷取的前幾行資料如下所示：  

```
{"record": "ocd-division/country:us/state:ak"}
{"record": "ocd-division/country:us/state:al/cd:1"}
{"record": "ocd-division/country:us/state:al/cd:2"}
{"record": "ocd-division/country:us/state:al/cd:3"}
{"record": "ocd-division/country:us/state:al/cd:4"}
{"record": "ocd-division/country:us/state:al/cd:5"}
{"record": "ocd-division/country:us/state:al/cd:6"}
{"record": "ocd-division/country:us/state:al/cd:7"}
{"record": "ocd-division/country:us/state:ar/cd:1"}
{"record": "ocd-division/country:us/state:ar/cd:2"}
{"record": "ocd-division/country:us/state:ar/cd:3"}
{"record": "ocd-division/country:us/state:ar/cd:4"}
{"record": "ocd-division/country:us/state:as"}
{"record": "ocd-division/country:us/state:az/cd:1"}
{"record": "ocd-division/country:us/state:az/cd:2"}
{"record": "ocd-division/country:us/state:az/cd:3"}
{"record": "ocd-division/country:us/state:az/cd:4"}
{"record": "ocd-division/country:us/state:az/cd:5"}
{"record": "ocd-division/country:us/state:az/cd:6"}
{"record": "ocd-division/country:us/state:az/cd:7"}
```
若要根據 JSON 檔案中的深度巢狀物件 (例如「`identifier`」) 來建立結構描述，則可建立自訂 JSON 分類器並將 JSON 路徑指定為 `$.identifiers[*].identifier`。儘管產生的結構描述與先前範例類似，但它是依據 JSON 檔案中不同的物件建立而成。  
結構描述看起來類似如下：  

```
root
|-- record: string
```
若列出資料表的前面幾行，即會顯示以「`identifier`」物件中資料為基礎的結構描述：  

```
{"record": "Regional/North_America/United_States/Alaska/"}
{"record": "/m/0hjy"}
{"record": "US02"}
{"record": "5879092"}
{"record": "4001016-8"}
{"record": "destination/alaska"}
{"record": "1116270"}
{"record": "139487266"}
{"record": "n79018447"}
{"record": "01490999-8dec-4129-8254-eef6e80fadc3"}
{"record": "Alaska-state"}
{"record": "place/Alaska"}
{"record": "Q797"}
{"record": "Regional/North_America/United_States/Alabama/"}
{"record": "/m/0gyh"}
{"record": "US01"}
{"record": "4829764"}
{"record": "4084839-5"}
{"record": "161950"}
{"record": "131885589"}
```
您可以建立自訂 JSON 分類器並將 JSON 路徑指定為 `$.other_names[*].name`，藉此根據 JSON 檔案中其他深度巢狀物件 (例如「`other_names`」陣列中的「`name`」欄位) 來建立資料表。儘管產生的結構描述與先前範例類似，但它是依據 JSON 檔案中不同的物件建立而成。結構描述看起來類似如下：  

```
root
|-- record: string
```
若列出資料表的前面幾行，即會顯示以「`name`」陣列中「`other_names`」物件資料為基礎的結構描述：  

```
{"record": "Alaska"}
{"record": "Alaska"}
{"record": "Аляска"}
{"record": "Alaska"}
{"record": "Alaska"}
{"record": "Alaska"}
{"record": "Alaska"}
{"record": "Alaska"}
{"record": "Alaska"}
{"record": "ألاسكا"}
{"record": "ܐܠܐܣܟܐ"}
{"record": "الاسكا"}
{"record": "Alaska"}
{"record": "Alyaska"}
{"record": "Alaska"}
{"record": "Alaska"}
{"record": "Штат Аляска"}
{"record": "Аляска"}
{"record": "Alaska"}
{"record": "আলাস্কা"}
```

## 撰寫 CSV 自訂分類器
<a name="custom-classifier-csv"></a>

 自訂 CSV 分類器可讓您在自訂 csv 分類器欄位中為每一欄指定資料類型。您可以指定每欄的資料類型，用逗號分隔。透過指定資料類型，您可以覆寫爬蟲程式推斷的資料類型，並確保資料將適當地分類。

您可以在該分類器中設定用於處理 CSV 的 SerDe，並且將在資料目錄中套用該 SerDe。

當您建立自訂分類器時，您也可以針對不同的爬蟲程式重複使用分類器。
+  對於只有標題 (沒有資料) 的 csv 檔案，這些檔案將被分類為 UNKNOWN，因為沒有提供足夠的資訊。如果您在 *Column headings* (欄位標題) 中指定 CSV「具有標題」，並提供資料類型，我們可以正確地對這些檔案進行分類。

您可以使用自訂 CSV 分類器來推論各種 CSV 資料類型的結構描述。您可以為分類器提供的自訂屬性包含分隔符號、CSV SerDe 選項、標頭相關選項，以及是否要對資料執行特定驗證。

### AWS Glue 中的自訂分類器值
<a name="classifier-values-csv"></a>

當定義 CSV 分類器時，您要將下列值提供至 AWS Glue 以便建立分類器。此分類器的分類欄位設定為 `csv`。

**分類器名稱**  
分類器名稱。

**CSV SerDe**  
設定用於在分類器中處理 CSV 的 SerDe，並且將在資料目錄中套用該 Serde。選項有「開放式 CSV SerDe」、「延遲簡易 SerDe」和「無」。當您希望爬蟲程式執行偵測時，您可以指定「無」值。

**欄位分隔符號**  
表示用於分隔資料列中每個欄位項目的自訂符號。提供 Unicode 字元。如果無法輸入分隔符號，您可以複製並貼上它。這個方式適用於可列印字元，包括系統不支援的字元 (通常顯示為 □)。

**引號符號**  
用來表示將內容結合成單一欄位值的自訂符號。必須不同於欄位分隔符號。提供 Unicode 字元。如果無法輸入分隔符號，您可以複製並貼上它。這個方式適用於可列印字元，包括系統不支援的字元 (通常顯示為 □)。

**欄位標題**  
指示在 CSV 檔案中應如何偵測出欄位標題的行為。如果您的自訂 CSV 檔案包含欄位標題，請輸入以逗號分隔的欄位標題清單。

**處理選項：允許檔案包含單一欄位**  
啟用處理僅包含一個欄位的檔案。

**處理選項：裁剪空格後再識別欄位值**  
指定在確認欄位值類型之前是否要裁剪值。

**自訂資料類型 - *選用***  
 輸入以逗號分隔的自訂資料類型。指定 CSV 檔案中的自訂資料類型。自訂資料類型必須是受支援的資料類型。支援的資料類型為："BINARY"、"BOOLEAN"、"DATE"、"DECIMAL"、"DOUBLE"、"FLOAT"、"INT"、"LONG"、"SHORT"、"STRING"、"TIMESTAMP"。不受支援的資料類型會顯示錯誤。

# 使用 AWS Glue 主控台建立分類器
<a name="console-classifiers"></a>

分類器可判斷資料的結構描述。您可以編寫自訂分類器並從 AWS Glue指向分類器。

## 建立分類器
<a name="add-classifier-console"></a>

若要在 AWS Glue 主控台新增分類器，請選擇 **Add classifier (新增分類器)**。定義分類器時，您提供以下值：
+ **分類器名稱** – 提供分類器的唯一名稱。
+ **分類器類型** – 此分類器推斷的資料表分類類型。
+ **上次更新** – 上一次更新此分類器的時間。

**分類器名稱**  
提供分類器的唯一名稱。

**分類器類型**  
選擇要建立之分類器的類型。

根據您選擇的分類器類型，設定下列分類器的屬性：

------
#### [ Grok ]
+ **分類** 

  描述分類資料的格式或類型，或提供自訂標籤。
+ **Grok 模式** 

  這是用於將資料剖析為結構化結構描述。grok 模式由描述資料存放區格式的具名模式組成。您使用 AWS Glue 提供的具名內建模式寫入此 grok 模式，自訂寫入的模式，並包含在 **Custom patterns (自訂模式)** 欄位內。雖然 grok 偵錯工具的結果可能不會完全符合 AWS Glue 的結果，我們建議您透過 grok 偵錯工具使用一些範例資料來嘗試模式。您可以從 Web 上找到 grok 偵錯工具。AWS Glue 提供的具名內建模式通常相容於 Web 上提供的 grok 模式。

  建置您的 grok 模式，反覆新增具名模式和在偵錯工具內檢查您的結果。此活動可讓您確信當 AWS Glue 爬蟲程式執行您的 grok 模式時，您的資料可以剖析。
+ **自訂模式** 

  對於 grok 分類器，這些是您編寫的 **Grok 模式**的選擇性建置區塊。內建的模式無法剖析您的資料時，您可能需要編寫自訂模式。這些自訂模式在此欄位中定義，且在 ** Grok 模式**欄位中參考。每個自訂模式都必須在不同的行定義。就如同內建的模式，它包含具名模式定義，使用[常規表達式 (regex)](http://en.wikipedia.org/wiki/Regular_expression) 的語法。

  例如，以下具有 `MESSAGEPREFIX` 名稱，接著是常規表達式定義，以套用到您的資料，判斷是否遵循模式。

  ```
  MESSAGEPREFIX .*-.*-.*-.*-.*
  ```

------
#### [ XML ]
+ **Row 標籤** 

  針對 XML 分類器，此為 XML 標籤名稱，定義 XML 文件中的資料表列。輸入類型的名稱，而不角括號 `< >`。此名稱必須符合 XML 的標籤規則。

  如需詳細資訊，請參閱[撰寫 XML 自訂分類器](custom-classifier.md#custom-classifier-xml)。

------
#### [ JSON ]
+ **JSON 路徑** 

  針對 JSON 分類器，此為連往物件、陣列或數值，定義所建立資料表之資料列的 JSON 物件。使用 AWS Glue 支援的運算子，以點或括號 JSON 語法輸入名稱。

  如需更多詳細資訊，請參閱 [撰寫 JSON 自訂分類器](custom-classifier.md#custom-classifier-json) 中的運算子清單。

------
#### [ CSV ]
+ **欄位分隔符號** 

  表示用於分隔資料列中每個欄位項目的單一字元或符號。從清單中選擇分隔符號，或選擇 `Other` 以輸入自訂分隔符號。
+ **引號符號** 

  用來表示將內容結合成單一欄位值的單一字元或符號。必須不同於欄位分隔符號。從清單中選擇引號，或選擇 `Other` 以輸入自訂引號字元。
+ **欄位標題** 

  指示在 CSV 檔案中應如何偵測出欄位標題的行為。您可以選擇 `Has headings`、`No headings` 或 `Detect headings`。如果您的自訂 CSV 檔案包含欄位標題，請輸入以逗號分隔的欄位標題清單。
+ **允許具有單一欄的檔案** 

  若要被歸類為 CSV，資料必須至少有兩個資料欄和兩個資料列。使用此選項可允許處理僅包含一欄的檔案。
+ **裁剪空格後再識別欄值** 

  此選項指定在確認欄位值類型之前是否要裁剪值。
+  **自訂資料類型** 

   (選用) - 在逗號分隔清單中輸入自訂資料類型。支援的資料類型為："BINARY"、"BOOLEAN"、"DATE"、"DECIMAL"、"DOUBLE"、"FLOAT"、"INT"、"LONG"、"SHORT"、"STRING"、"TIMESTAMP"。
+  **CSV Serde** 

   (選用)：用於在分類器中處理 CSV 的 SerDe，並且將在資料目錄中套用該 Serde。從 `Open CSV SerDe`、`Lazy Simple SerDe` 或 `None` 中選擇。您可以指定希望爬蟲程式執行偵測時的 `None` 值。

------

如需詳細資訊，請參閱[為各種資料格式撰寫自訂分類器](custom-classifier.md)。

## 檢視分類器
<a name="view-classifiers-console"></a>

若要查看您已建立的所有分類器的清單，請開啟位於 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) AWS Glue 主控台，然後選擇 **Classifiers (分類器)** 標籤。

清單顯示有關各分類器的下列屬性：
+ **分類器** - 分類器名稱。建立分類器時，您必須提供其名稱。
+ **分類** – 此分類器推斷的資料表分類類型。
+ **上次更新** – 上一次更新此分類器的時間。

## 管理分類器
<a name="manage-classifiers-console"></a>

您可以在 ** 主控台的 **ClassifiersAWS Glue (分類器) 清單中新增、編輯和刪除分類器。若要查看分類器的詳細資訊，請在清單中選擇分類器的名稱。詳細資訊包含您在建立分類器時所定義的資訊。

# 設定編目程式
<a name="define-crawler"></a>

編目程式會存取您的資料存放區、識別中繼資料，以及在 AWS Glue Data Catalog中建立資料表定義。 AWS Glue 主控台中的**爬蟲程式**窗格會列出您建立的所有爬蟲程式。該清單會針對爬蟲程式最近一次的執行作業，顯示其狀態與指標。

 本主題包含設定編目程式的逐步程序，涵蓋基本層面，例如設定編目程式的參數、定義要網路爬取的資料來源、設定安全性和管理網路爬取的資料。

**Topics**
+ [步驟 1：設定爬蟲程式屬性](define-crawler-set-crawler-properties.md)
+ [步驟 2：選擇資料來源和分類器](define-crawler-choose-data-sources.md)
+ [步驟 3：設定安全設定](define-crawler-configure-security-settings.md)
+ [步驟 4：設定輸出和排程](define-crawler-set-output-and-scheduling.md)
+ [步驟 4：檢閱和建立](define-crawler-review.md)

# 步驟 1：設定爬蟲程式屬性
<a name="define-crawler-set-crawler-properties"></a>

**設定編目程式**

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue\) 開啟 AWS Glue主控台。在導覽窗格中選擇 **Crawlers (爬蟲程式)**。

1.  選擇**建立爬蟲程式**，然後依照**新增爬蟲程式**精靈中的說明進行操作。精靈會引導您建立編目程式所需的步驟。如果您想要新增自訂分類器來定義結構描述，請參閱[定義和管理分類器](add-classifier.md)。

1.  輸入爬蟲程式的名稱和描述 (選用)。或者，您可以使用 **Tag key (標籤金鑰)** 和選用的 **Tag value (標籤值)**，標記您的爬蟲程式。建立之後，標籤金鑰為唯讀。應用標籤至某些資源，有助於您對其進行整理和識別。如需詳細資訊，請參閱 中的 AWS 標籤 AWS Glue。  
**名稱**  
名稱可包含字母 (A-Z)、數字 (0-9)、連字號 (-) 或底線 (\$1)，並且長度上限為 255 個字元。  
**Description**  
說明最多可有 2,048 個字元。  
**標籤**  
您可以使用標籤整理和識別資源。如需詳細資訊，請參閱下列內容：  
   + [AWS 中的標籤 AWS Glue](monitor-tags.md)

# 步驟 2：選擇資料來源和分類器
<a name="define-crawler-choose-data-sources"></a>

接著，設定編目程式的資料來源和分類器。

如需有關受支援資料來源的詳細資訊，請參閱[支援的網路爬取資料來源](crawler-data-stores.md)。

**資料來源組態**  
針對**您的資料是否已映射至 AWS Glue 資料表？**選取適當的選項：選擇「尚未」或「是」。依預設已選取「尚未」。  
爬蟲程式可以直接存取資料存放區做為抓取來源，也可以使用現有的 Data Catalog 資料表做為來源。如果爬蟲程式使用現有的目錄資料表，即會抓取這些目錄資料表指定的資料存放區。  
+ 尚未：選取一或多個要網路爬取的資料來源。爬蟲程式可以在單一執行中抓取多個不同類型的資料存放區 (Amazon S3,、JDBC 等)。

  您一次只可設定一個資料存放區。在您提供連線資訊並包含路徑和排除樣式之後，接著可以選擇加入其他資料存放區。
+ 是：從 AWS Glue Data Catalog 中選取現有資料表。指定要抓取之資料存放區的目錄資料表。爬蟲程式只能在單一執行中抓取目錄資料表，而無法混合其他來源類型。

  指定目錄資料表做為來源的常見原因是您已手動建立資料表 (因為您已經知道資料存放區的結構)，並希望爬蟲程式讓資料表持續更新，包括新增新的分割區。如需了解其他原因的說明，請參閱[使用爬蟲程式更新手動建立的資料目錄資料表](tables-described.md#update-manual-tables)。

  當您指定現有資料表做為爬蟲程式來源類型時，則適用以下條件：
  + 資料庫名稱是選用的。
  + 只允許指定 Amazon S3、Amazon DynamoDB 或 Delta Lake 資料存放區的目錄資料表。
  + 爬蟲程式執行時，不會建立任何新的目錄資料表。系統會視需要更新現有的資料表，包括新增新的分割區。
  + 系統會忽略資料存放區中找到的已刪除物件，而不會刪除任何目錄資料表。反之，爬蟲程式會寫入日誌訊息。(`SchemaChangePolicy.DeleteBehavior=LOG`)
  + 依預設，系統會啟用爬蟲程式組態選項以建立每個 Amazon S3 路徑的單一結構描述，且無法停用。(`TableGroupingPolicy`=`CombineCompatibleSchemas`) 如需詳細資訊，請參閱[為每個 Amazon S3 包含路徑建立單一結構描述](crawler-grouping-policy.md)。
  + 您無法將含有任何其他來源類型的目錄資料表混合為來源 (例如 Amazon S3 或 Amazon DynamoDB)。
  
 若要使用 Delta 資料表，請先使用 Athena DDL 或 AWS Glue API 建立 Delta 資料表。  
 使用 Athena，將位置設定為 Amazon S3 資料夾，並將資料表類型設定為 'DELTA'。  

```
CREATE EXTERNAL TABLE database_name.table_name
LOCATION 's3://bucket/folder/'
TBLPROPERTIES ('table_type' = 'DELTA')
```
 使用 AWS Glue API，在資料表參數映射中指定資料表類型。資料表參數需要包含下列金鑰/值對。如需如何建立資料表的詳細資訊，請參閱 [create\$1table 的 Boto3 文件](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/glue/client/create_table.html)。  

```
{
    "table_type":"delta"
}
```

**資料來源**  
選取或新增爬蟲程式要掃描的資料來源清單。  
 (選用) 如果您選擇 JDBC 作為資料來源，則在指定存放驅動程式資訊的連線存取時，可以使用自己的 JDBC 驅動程式。

**包含路徑**  
 在評估抓取要包含或排除的內容時，爬蟲程式會先評估必要的包含路徑。對於 Amazon S3、MongoDB、MongoDB Atlas、Amazon DocumentDB (with MongoDB compatibility) 和關聯式資料存放區，您必須指定包含路徑。    
對於 Amazon S3 資料存放區  
選擇是否要在此帳戶或在其他帳戶中指定路徑，然後瀏覽以選擇 Amazon S3 路徑。  
對於 Amazon S3 資料存放區，包含路徑語法是 `bucket-name/folder-name/file-name.ext`。要探索儲存貯體中的所有物件，僅指定在包含路徑的儲存貯體名稱。排除模式是相對於包含路徑。  
對於 Delta Lake 的資料儲存  
將一個或多個指向 Delta 資料表的 Amazon S3 路徑指定為：s3://*bucket*/*prefix*/*object*。  
對於 Iceberg 或 Hudi 資料存放區  
將一個或多個包含資料夾且資料夾中具有 Iceberg 或 Hudi 資料表中繼資料的 Amazon S3 路徑，指定為 s3://*儲存貯體*/*字首*。  
對於 Iceberg 和 Hudi 資料存放區，Iceberg/Hudi 資料夾可能位於根資料夾的子資料夾中。爬蟲程式將掃描路徑下所有資料夾中的 Hudi 資料夾。  
對於 JDBC 資料存放區  
輸入 *<database>*/*<schema>*/*<table>* 或 *<database>*/*<table>*，視資料庫產品而定。Oracle 資料庫和 MySQL 不支援路徑中的結構描述。您可以用百分比 (%) 字元取代 *<schema>* 或 *<table>*。例如，對於系統識別碼 (SID) 為 `orcl` 的 Oracle 資料庫，請輸入 `orcl/%` 以匯入連線中命名使用者有權存取的所有資料表。  
此欄位會區分大小寫。
 如果您選擇引入自己的 JDBC 驅動程式版本，AWS Glue 爬蟲程式將使用 AWS Glue 任務和 Amazon S3 儲存貯體中的資源，以確保您提供的驅動程式在環境中執行。帳戶中將反映資源的額外使用量。驅動程式僅限於[新增 AWS Glue 連線](https://docs.aws.amazon.com/glue/latest/dg/console-connections.html)中所述的屬性。  
對於 MongoDB、MongoDB Atlas 或 Amazon DocumentDB 資料存放區  
對於 MongoDB、MongoDB Atlas 和 Amazon DocumentDB (with MongoDB compatibility)，語法是 `database/collection`。
對於 JDBC 資料存放區，語法為 `database-name/schema-name/table-name` 或 `database-name/table-name`。語法取決於資料庫引擎在資料庫中是否支援結構描述。例如，對於資料庫引擎 (如 MySQL 或 Oracle)，請勿在包含路徑中指定 `schema-name`。您可以在包含路徑中針對結構描述或資料表替代百分比符號 (`%`)，以代表資料庫中的所有結構描述或所有資料表。您不能替代包含路徑中資料庫的百分比符號 (`%`)。

**橫向深度上限 (僅適用於 Iceberg 或 Hudi 資料存放區)**  
定義爬蟲程式可在 Amazon S3 路徑中周遊探索 Iceberg 或 Hudi 中繼資料資料夾的 Amazon S3 路徑深度上限。此參數的用途是限制爬蟲程式執行時間。預設值為 10，最大值為 20。

**排除模式**  
這些模式可讓您排除抓取特定檔案或資料表。排除路徑是相對於包含路徑。例如，若要在您的 JDBC 資料存放區中排除資料表，請在排除路徑中輸入資料表的名稱。  
爬蟲程式會使用 AWS Glue 連線 (其中包含 JDBC URI 連線字串) 連接到 JDBC 資料存放區。爬蟲程式只可以使用 AWS Glue 連線中的 JDBC 使用者名稱和密碼來存取資料庫引擎中的物件。*爬蟲程式只能建立其可透過 JDBC 連線存取的表格。*在爬蟲程式使用 JDBC URI 存取資料庫引擎後，您可使用包括路徑來判斷資料庫引擎中哪些資料表是在 Data Catalog 中所建立的。例如，若使用 MySQL，如果您指定 `MyDatabase/%` 的包括路徑，則 `MyDatabase` 中的所有資料表會在 Data Catalog 中建立。存取 Amazon Redshift 時，如果您指定 `MyDatabase/%` 的包括路徑，則資料庫 `MyDatabase` 所有結構描述中的所有資料表會在 Data Catalog 中建立。如果您指定 `MyDatabase/MySchema/%` 的包括路徑，則資料庫 `MyDatabase` 中的所有資料表和結構描述 `MySchema` 會加以建立。  
在指定包含路徑後，您可以指定一個或多個 Unix 樣式的 `glob` 排除模式，從包含路徑包含的抓取中排除物件。這些模式會套用至您的包含路徑，以判斷哪些物件被排除。這些模式也會在爬蟲程式所建立的資料表中儲存為屬性。AWS GluePySpark 延伸，例如 `create_dynamic_frame.from_catalog`，讀取資料表屬性並排除經排除模式定義的物件。  
AWS Glue 支援以下在排除模式中的 `glob` 模式。      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/define-crawler-choose-data-sources.html)
AWS Glue 對 `glob` 排除模式的解譯如下：  
+ 斜線 (`/`) 字元為分隔符號，可將 Amazon S3 金鑰分隔至資料夾階層。
+ 星號 (`*`) 字元符合不超過資料夾邊界之名稱元件的零個或多個字元。
+ 雙星號 (`**`) 符合超過資料夾或結構描述邊界的零個或多個字元。
+ 問號 (`?`) 字元符合名稱元件的單一字元。
+ 反斜線 (`\`) 字元用於逸出可被解譯為特殊字元的字元。表達式 `\\` 符合一個反斜線，而 `\{` 符合左大括弧。
+ 方括號 `[ ]` 會建立括號表達式，符合一組字元中一個名稱元件的單一字元。例如，`[abc]` 符合 `a`、`b` 或 `c`。連字號 (`-`) 可用於指定範圍，因此 `[a-z]` 指定的範圍符合從 `a` 到 `z` (包含)。這些形式可以混合，因此 [`abce-g`] 符合 `a`、`b`、`c`、`e`、`f` 或 `g`。如果方括號 (`[`) 後方的字元為驚嘆號 (`!`)，則此括號表達式為否定。例如，`[!a-c]` 符合 `a`、`b` 或 `c` 以外的字元。

  在括號表達式中，`*`、`?` 和 `\` 字元符合本身。如果連字號 (`-`) 是方括號內的第一個字元，則其符合本身，如果連字號是 `!` 後的第一個字元，則為否定。
+ 大括弧 (`{ }`) 會括住一組子模式，如果群組中的任何子模式符合，則此群組也符合。逗號 (`,`) 字元用於分隔子模式。群組不能巢狀組合。
+ 前置句點或點號字元在相符操作中會視為一般字元。例如，`*` 排除模式符合檔案名稱 `.hidden`。

**Example Amazon S3 排除模式**  
每個排除模式都會以包含路徑來評估。例如，假設您有以下 Amazon S3 目錄結構：  

```
/mybucket/myfolder/
   departments/
      finance.json
      market-us.json
      market-emea.json
      market-ap.json
   employees/
      hr.json
      john.csv
      jane.csv
      juan.txt
```
包含路徑為 `s3://mybucket/myfolder/`，而以下為排除模式的一些範例結果：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/define-crawler-choose-data-sources.html)

**Example 排除 Amazon S3 分割區的子集**  
假設您的資料以天為單位分割，那麼一年中的每一天都是一個獨立的 Amazon S3 分割區。2015 年 1 月有 31 個分割區。如果現在只要抓取 1 月第一週的資料，您就必須排除第 1 至第 7 天以外的所有分割區：  

```
 2015/01/{[!0],0[8-9]}**, 2015/0[2-9]/**, 2015/1[0-2]/**    
```
讓我們看看此全域模式的部分。第一部分的 ` 2015/01/{[!0],0[8-9]}**` 排除了 2015 年第 01 個月不以「0」開頭的所有天數 (除了第 08 天和第 09 天)。請注意，「\$1\$1」的用途是天數模式的尾碼，會超過資料夾邊界至較低層級的資料夾。如果使用「\$1」，則較低的資料夾層級不會被排除。  
第二部分的 ` 2015/0[2-9]/**` 會排除 2015 年第 02 至 09 個月裡的天數。  
第三部分的 `2015/1[0-2]/**` 會排除 2015 年第 10、11、12 個月裡的天數。

**Example JDBC 排除模式**  
假設您以下列的結構描述架構爬取 JDBC 資料庫：  

```
MyDatabase/MySchema/
   HR_us
   HR_fr
   Employees_Table
   Finance
   Market_US_Table
   Market_EMEA_Table
   Market_AP_Table
```
包含路徑為 `MyDatabase/MySchema/%`，而以下為排除模式的一些範例結果：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/define-crawler-choose-data-sources.html)

**其他爬蟲程式來源參數**  
每個來源類型都需要一組不同的附加參數。

**連線**  
選取或新增 AWS Glue 連線。如需連線的詳細資訊，請參閱 [連線至資料](glue-connections.md)。

**其他中繼資料 – 選用 (適用於 JDBC 資料存放區)**  
選取要網路爬取的其他爬蟲程式中繼資料屬性。  
+ 註解：網路爬取相關的資料表層級和資料欄層級註解。
+ 原始類型：將資料表資料欄的原始資料類型保存在其他中繼資料中。作為預設行為，爬蟲程式會將原始資料類型轉換為 Hive 相容的類型。

**JDBC 驅動程式類別名稱：選用 (適用於 JDBC 資料存放區)**  
 針對連線至資料來源的爬蟲程式，輸入自訂 JDBC 驅動程式類別名稱：  
+ Postgres：org.postgresql.Driver
+ MySQL：com.mysql.jdbc.Driver、com.mysql.cj.jdbc.Driver
+ Redshift：com.amazon.redshift.jdbc.Driver、com.amazon.redshift.jdbc42.Driver
+ Oracle：oracle.jdbc.driver.OracleDriver
+ SQL Server：com.microsoft.sqlserver.jdbc.SQLServerDriver

**JDBC 驅動程式 S3 路徑：選用 (適用於 JDBC 資料存放區)**  
選擇 `.jar` 檔案的現有 Amazon S3 路徑。此為針對連線至資料來源的爬蟲程式使用自訂 JDBC 驅動程式時，用來存放 `.jar` 檔案的所在位置。

**啟用資料取樣 (僅適用於 Amazon DynamoDB、MongoDB、MongoDB Atlas 和 Amazon DocumentDB 資料存放區)**  
選取是否只編目資料範例。如果未選取，則會編目整個資料表。當資料表不是高傳輸量資料表時，掃描所有記錄可能需要很長的時間。

**建立用於查詢的資料表 (僅適用於 Delta Lake 資料存放區)**  
選取建立 Delta Lake 資料表的方式：  
+ 建立原生資料表：允許與支援直接查詢 Delta 交易日誌的查詢引擎整合。
+ 建立符號連結資料夾：根據特定組態參數，使用由分割區索引鍵分割的資訊清單檔案建立符號連結清單檔案資料夾。

**掃描速率 – 選用 (僅適用於 DynamoDB 資料存放區)**  
指定爬蟲程式要使用的 DynamoDB 資料表讀取容量單位百分比。讀取容量單位是 DynamoDB 定義的術語，此數值可作為每秒可在該資料表上執行的讀取次數速率限制符號。請輸入介於 0.1 到 1.5 之間的值。如未指定，則會將已佈建的資料表預設為 0.5，並將隨需資料表預設為 1/4 的最大設定容量。請注意，僅佈建容量模式應與 AWS Glue 爬蟲程式搭配使用。  
對於 DynamoDB 的資料儲存，請設定已佈建的容量模式，以便處理資料表的讀取和寫入。 AWS Glue 爬蟲程式不應與隨需容量模式搭配使用。

**網路連線 - 選用 (適用於 Amazon S3、Delta、Iceberg、Hudi 和 Catalog 目標資料存放區)**  
選擇是否包含要用於此 Amazon S3 目標的網路連線。請注意，每個爬蟲程式僅限於一個網路連線，因此任何其他 Amazon S3 目標也會使用相同的連線 (如果保留空白，則無連線)。  
如需連線的詳細資訊，請參閱 [連線至資料](glue-connections.md)。

**僅對檔案的子集和樣本大小進行取樣 (僅適用於 Amazon S3 資料存放區)**  
指定在資料集中網路爬取範例檔案時，每個分葉資料夾中要編目的檔案數目。開啟此功能時，爬蟲程式會隨機選取每個分葉資料夾中要網路爬取的某些檔案，而不是網路爬取此資料集中的所有檔案。  
取樣爬蟲程式最適合先前了解其資料格式，並且知道資料夾中的結構描述不會變更的客戶。開啟此功能會大幅減少爬蟲程式執行時間。  
有效值是介於 1 到 249 之間的整數。如果未指定，則會網路爬取所有檔案。

**後續爬蟲程式執行**  
此欄位是會影響所有 Amazon S3 資料來源的全域欄位。  
+ 網路爬取所有子資料夾：在每次後續網路爬取時，再次網路爬取所有資料夾。
+ 僅網路爬取新的子資料夾：只會網路爬取自上次網路爬取以來新增的 Amazon S3 資料夾。如果結構描述相容，則會將新的分割區新增至現有資料表。如需詳細資訊，請參閱 [排程增量網路爬取以新增分區](incremental-crawls.md)。
+ 根據事件進行網路爬取：依賴 Amazon S3 事件來控制要網路爬取的資料夾。如需詳細資訊，請參閱[使用 Amazon S3 事件通知加速網路爬取](crawler-s3-event-notifications.md)。

**自訂分類器 – 選用**  
定義自訂分類器，再定義爬蟲程式。分類器會檢查指定的檔案是否採用爬蟲程式可以處理的格式。如果是，則分類器會以符合該資料格式的 `StructType` 物件形式，建立結構描述。  
如需詳細資訊，請參閱[定義和管理分類器](add-classifier.md)。

# 步驟 3：設定安全設定
<a name="define-crawler-configure-security-settings"></a>

**IAM 角色**  
爬蟲程式會擔任此角色。它必須具有類似於 AWS 受管政策 的許可`AWSGlueServiceRole`。對於 Amazon S3 和 DynamoDB 來源，它也必須具有存取資料存放區的許可。如果爬蟲程式讀取使用 AWS Key Management Service (AWS KMS) 加密的 Amazon S3 資料，則角色必須具有 AWS KMS 金鑰的解密許可。  
對於 Amazon S3 資料存放區，連接到角色的其他許可將類似下列內容：    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::bucket/object*"
      ]
    }
  ]
}
```
對於 Amazon DynamoDB 資料存放區，連接到角色的其他許可將類似下列內容：    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:DescribeTable",
        "dynamodb:Scan"
      ],
      "Resource": [
        "arn:aws:dynamodb:*:111122223333:table/table-name*"
      ]
    }
  ]
}
```
 若要新增自己的 JDBC 驅動程式，需要新增其他許可。  
+  授予下列任務動作的許可：`CreateJob`、`DeleteJob`、`GetJob`、`GetJobRun`、`StartJobRun`。
+  授予 Amazon S3 動作的許可：`s3:DeleteObjects`、`s3:GetObject`、`s3:ListBucket`、`s3:PutObject`。
**注意**  
如果 Amazon S3 儲存貯體政策已停用，則不需要 `s3:ListBucket`。
+  在 Amazon S3 政策中授予服務主體對儲存貯體/資料夾的存取權。
 Amazon S3 政策範例：    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/driver-parent-folder/driver.jar",
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        }
    ]
}
```
 AWS Glue 建立以下資料夾 (`_crawler` 和 `_glue_job_crawler` 位於與 Amazon S3 儲存貯體中 JDBC 驅動程式相同的層級)。例如，如果驅動程式路徑為 `<s3-path/driver_folder/driver.jar>`，則如果下列資料夾尚不存在，則會建立這些資料夾：  
+  <s3-path/driver\$1folder/\$1crawler> 
+  <s3-path/driver\$1folder/\$1glue\$1job\$1crawler> 
 或者，您可以新增安全組態至爬蟲程式以指定靜態加密選項。  
如需詳細資訊，請參閱[步驟 2：為 AWS Glue 建立 IAM 角色](create-an-iam-role.md)及[Glue AWS 的身分和存取管理](security-iam.md)。

**Lake Formation 組態 – 選用**  
允許爬蟲程式使用 Lake Formation 憑證來網路爬取資料來源。  
核取 **Use Lake Formation credentials for crawling S3 data source** (使用 Lake Formation 憑證網路爬取 S3 資料來源)，可讓爬蟲程式使用 Lake Formation 憑證來網路爬取資料來源。如果資料來源屬於其他帳戶，您必須提供註冊的帳戶 ID。否則，爬蟲程式只會網路爬取與帳戶相關聯的那些資料來源。僅適用於 Amazon S3 和 Data Catalog 資料來源。

**安全組態 – 選用**  
設定包括安全組態。如需詳細資訊，請參閱下列內容：  
+ [加密 寫入的資料 AWS Glue](encryption-security-configuration.md)
在編目程式上設定安全組態後，您可以變更，但無法將其移除。若要降低編目程式的安全層級，請在您的組態內明確將安全功能設定為 `DISABLED`，或建立新的編目程式。

# 步驟 4：設定輸出和排程
<a name="define-crawler-set-output-and-scheduling"></a>

**輸出組態**  
這些選項包括當偵測到資料存放區的結構描述變更、刪除物件等情況，爬蟲程式應該如何處理。如需詳細資訊，請參閱[自訂編目程式行為](crawler-configuration.md)

**爬蟲程式排程**  
您可以在 AWS Glue中隨需執行爬蟲程式或為爬蟲程式和任務定義以時間為基礎的排程。這些排程的定義使用類似 Unix 的 ​cron​ 語法。如需詳細資訊，請參閱[排程爬蟲程式](schedule-crawler.md)。

# 步驟 4：檢閱和建立
<a name="define-crawler-review"></a>

檢閱您設定的爬蟲程式設定，然後建立爬蟲程式。

# 排程爬蟲程式
<a name="schedule-crawler"></a>

您可以隨需或定期執行 AWS Glue 爬蟲程式。當您設定以排程為基礎的編目程式時，可以指定特定的限制條件，例如編目程式執行的頻率、在一週中的哪幾天與什麼時間執行。可以建立 *cron* 格式的自訂排程。如需詳細資訊，請參閱 Wikipedia 中的 [Cron](http://en.wikipedia.org/wiki/Cron)。

設定爬蟲程式的排程時，應考慮 Cron 的功能和限制。例如，如果您選擇在每個月的 31 日執行您的爬蟲程式，請注意有些月份不到 31 天。

**Topics**
+ [建立編目程式排程](create-crawler-schedule.md)
+ [為現有的編目程式建立排程](Update-crawler-schedule.md)

# 建立編目程式排程
<a name="create-crawler-schedule"></a>

您可以使用 AWS Glue 主控台或 為爬蟲程式建立排程 AWS CLI。

------
#### [ AWS 管理主控台 ]

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

1. 在導覽窗格中選擇 **Crawlers (爬蟲程式)**。

1. 遵循[設定編目程式](define-crawler.md)一節中的步驟 1-3。

1. 在[步驟 4：設定輸出和排程](define-crawler-set-output-and-scheduling.md)中，選擇**編目程式排程**以設定執行的頻率。您可以選擇編目程式以每小時、每日、每週、每月執行，或使用 Cron 表達式定義自訂排程。

   Cron 表達式是代表排程模式的字串，由 6 個以空格分隔的欄位組成：\$1 \$1 \$1 \$1 \$1 <minute> <hour> <day of month> <month> <day of week> <year> 

   例如，若要每天在午夜執行任務，Cron 表達式為：0 0 \$1 \$1 ？ \$1

   如需詳細資訊，請參閱 [Cron 表達](https://docs.aws.amazon.com/glue/latest/dg/monitor-data-warehouse-schedule.html#CronExpressions)式。

1. 檢閱您設定的編目程式設定，然後建立按排程執行的編目程式。

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

```
aws glue create-crawler 
 --name myCrawler \
 --role AWSGlueServiceRole-myCrawler  \
 --targets '{"S3Targets":[{Path="s3://amzn-s3-demo-bucket/"}]}' \
 --schedule cron(15 12 * * ? *)
```

------

如需有關使用 Cron 排程工作和爬蟲程式的詳細資訊，請參閱 [任務和爬蟲程式以時間為基礎的排程](monitor-data-warehouse-schedule.md)。

# 為現有的編目程式建立排程
<a name="Update-crawler-schedule"></a>

請依照下列步驟來設定現有編目程式的週期性排程。

------
#### [ AWS 管理主控台 ]

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue\) 開啟 AWS Glue主控台。

1. 在導覽窗格中選擇 **Crawlers (爬蟲程式)**。

1. 從可用清單中選擇您要排程的編目程式。

1. 在**動作**功能表中，選擇**編輯**。

1. 向下捲動至**步驟 4：設定輸出和排程**，然後選擇**編輯**。

1.  在**編目程式排程**下更新您的編目程式排程。

1. 選擇**更新**。

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

使用下列 CLI 命令來更新現有的編目程式組態：

```
aws glue update-crawler-schedule 
   --crawler-name myCrawler
   --schedule cron(15 12 * * ? *)
```

------

# 檢視爬蟲程式結果和詳細資訊
<a name="console-crawlers-details"></a>

 爬蟲程式成功執行後，它會在 Data Catalog 中建立資料表定義。在導覽窗格中選擇 **Tables (資料表)**，以查看爬蟲程式在您指定的資料庫中所建立的資料表。

 您可以檢視爬蟲程式本身的相關資訊，如下所示：
+  AWS Glue 主控台上的**爬蟲程式**頁面會顯示爬蟲程式的下列屬性：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/console-crawlers-details.html)
+  若要檢視爬蟲程式的歷史記錄，請選擇導覽窗格中的 **Crawlers** (爬蟲程式)，以查看您建立的爬蟲程式。從可用的爬蟲程式清單中選擇爬蟲程式。您可以在 **Crawler runs** (爬蟲程式執行) 索引標籤中檢視爬蟲程式屬性以及檢視爬蟲程式歷史記錄。

   「爬蟲程式執行」索引標籤會顯示爬蟲程式每次執行時的相關資訊，包括 **Start time (UTC)** (開始時間 (UTC))、**End time (UTC)** (結束時間 (UTC))、**Duration** (持續時間)、**Status** (狀態)、**DPU hours** (DPU 時數)，以及 **Table changes** (資料表變更)。

  爬蟲程式執行索引標籤僅顯示自爬蟲程式歷史記錄功能啟動日期以來發生的網路爬取，而且最多只會保留 12 個月的網路爬取。不會傳回較舊的網路爬取。
+ 若要查看其他資訊，請選擇爬蟲程式詳細資料頁面中的索引標籤。每個索引標籤都會顯示與爬蟲程式相關的資訊。
  +  **Schedule** (排程)：為爬蟲程式建立的任何排程都會顯示在此處。
  +  **Data sources** (資料來源)：爬蟲程式掃描的所有資料來源都會顯示在此處。
  +  **Classifiers** (分類器)：指派給爬蟲程式的所有分類器都會顯示在此處。
  +  **標籤**：任何建立並指派給 AWS 資源的標籤都會顯示在這裡。

# 爬蟲程式在 Data Catalog 資料表上設定的參數
<a name="table-properties-crawler"></a>

 這些資料表屬性是由 AWS Glue 爬蟲程式設定。我們希望使用者使用 `classification` 和 `compressionType` 屬性。其他屬性 (包括資料表大小估算) 用於內部計算，我們不能保證其準確性或適用於客戶使用案例。變更這些參數可能會改變爬蟲程式的行為，我們不支持此工作流程。


| 屬性索引鍵 | 屬性值 | 
| --- | --- | 
| UPDATED\$1BY\$1CRAWLER | 執行更新的爬蟲程式名稱。 | 
| connectionName | 在 Data Catalog 中，用於連線至資料存放區的爬蟲程式連線名稱。 | 
| recordCount | 根據檔案大小和標題估計資料表中的記錄數。 | 
| skip.header.line.count | 跳過列以跳過標題。在分類為 CSV 的資料表上設定。 | 
| CrawlerSchemaSerializerVersion | 供內部使用 | 
| classification | 由爬蟲程式推斷的資料格式。如需 AWS Glue 爬蟲程式支援的資料格式詳細資訊，請參閱[內建分類器](add-classifier.md#classifier-built-in)。 | 
| CrawlerSchemaDeserializerVersion | 供內部使用 | 
| sizeKey | 網路爬取的資料表中檔案的合併大小。 | 
| averageRecordSize | 資料表中列的平均大小 (位元組)。 | 
| compressionType | 資料表中資料所使用的壓縮類型。如需 AWS Glue 爬蟲程式支援之壓縮類型的詳細資訊，請參閱 [內建分類器](add-classifier.md#classifier-built-in)。 | 
| typeOfData | `file`、`table` 或 `view`。 | 
| objectCount | 資料表的 Amazon S3 路徑下的物件數目。 | 

 這些額外的資料表屬性是由 Snowflake 資料存放區的 AWS Glue 爬蟲程式所設定。


| 屬性索引鍵 | 屬性值 | 
| --- | --- | 
| aws:RawTableLastAltered | 記錄 Snowflake 資料表的最後更改時間戳記。 | 
| ViewOriginalText | 檢視 SQL 陳述式。 | 
| ViewExpandedText | 檢視以 Base64 格式編碼的 SQL 陳述式。 | 
| ExternalTable:S3Location | Snowflake 外部資料表的 Amazon S3 位置。 | 
| ExternalTable:FileFormat | Snowflake 外部資料表的 Amazon S3 檔案格式。 | 

 這些額外的資料表屬性是由 AWS Glue Amazon Redshift、Microsoft SQL Server、MySQL、PostgreSQL 和 Oracle 等 JDBC 類型資料存放區的爬蟲程式所設定。


| 屬性索引鍵 | 屬性值 | 
| --- | --- | 
| aws:RawType | 在將資料存放在 Data Catalog 中時，爬蟲程式會將資料類型轉換為與 Hive 相容的類型，這會多次導致原生資料類型的資訊遺失。爬蟲程式會輸出 `aws:RawType` 參數以提供原生層級的資料類型。 | 
| aws:RawColumnComment | 如果註解與資料庫中的資料欄相關聯，爬蟲程式會在目錄資料表中輸出對應的註解。註解字串被截斷為 255 個位元組。 Microsoft SQL Server 不支援註解。  | 
| aws:RawTableComment | 如果註解與資料庫中的資料表相關聯，爬蟲程式會在目錄資料表中輸出對應的註解。註解字串被截斷為 255 個位元組。 Microsoft SQL Server 不支援註解。 | 

# 自訂編目程式行為
<a name="crawler-configuration"></a>

當您設定 時 AWS Glue 編目程式，您有幾個選項可以定義爬蟲程式的行為。
+ **增量編目程式** – 您可以設定編目程式執行增量編目程式，以僅將新的分區新增至資料表結構描述。
+ **分區索引** – 依預設，編目程式會建立 Amazon S3 和 Delta Lake 目標的分區索引，以提供特定分區的有效查詢。
+ **使用 Amazon S3 事件加速網路爬取時間**– 您可以將編目程式設定為使用 Amazon S3 事件識別兩個編目之間的變更，方法是列出觸發事件的子資料夾中的所有檔案，而不是列出完整的 Amazon S3 或 Data Catalog 目標。
+ **處理結構描述變更** – 您可以防止編目程式對現有的結構描述進行任何結構描述變更。您可以使用 AWS 管理主控台 或 AWS Glue API 來設定爬蟲程式如何處理特定類型的變更。
+ **多個 Amazon S3 路徑的單一結構描述** – 如果資料相容，您可以設定編目程式為每個 S3 路徑建立單一結構描述。
+ **資料表位置和分區層級** – 資料表層級編目程式選項讓您可以靈活地告訴編目程式資料表的位置，以及建立分區的方式。
+ **資料表閾值** – 您可以指定資料表閾值，以指定編目程式可建立的資料表數目上限。
+ **AWS Lake Formation 登入**資料 – 您可以設定爬蟲程式使用 Lake Formation 登入資料來存取 Amazon S3 資料存放區，或具有相同 AWS 帳戶 或另一個中基礎 Amazon S3 位置的資料目錄資料表 AWS 帳戶。

 如需使用 AWS Glue 主控台新增爬蟲程式的詳細資訊，請參閱[設定編目程式](define-crawler.md)。

**Topics**
+ [排程增量網路爬取以新增分區](incremental-crawls.md)
+ [產生分區索引](crawler-configure-partition-indexes.md)
+ [防止編目程式變更現有的結構描述](crawler-schema-changes-prevent.md)
+ [為每個 Amazon S3 包含路徑建立單一結構描述](crawler-grouping-policy.md)
+ [指定資料表位置和分區層級](crawler-table-level.md)
+ [指定編目程式可建立的資料表數目上限](crawler-maximum-number-of-tables.md)
+ [設定編目程式以使用 Lake Formation 憑證](crawler-lf-integ.md)
+ [使用 Amazon S3 事件通知加速網路爬取](crawler-s3-event-notifications.md)

# 排程增量網路爬取以新增分區
<a name="incremental-crawls"></a>

您可以設定 AWS Glue 編目程式 執行增量爬蟲程式，只將新的分割區新增至資料表結構描述。編目程式第一次執行時，會執行完整的網路爬取來處理整個資料來源，以記錄完整的結構描述和 AWS Glue Data Catalog中的所有現有分區。

初始的完整網路爬取之後的後續網路爬取將遞增，編目程式會在其中識別並僅新增自上次網路爬取以來引入的新分區。這種方法會導致網路爬取時間更快，因為編目程式不再需要為每個執行處理整個資料來源，而僅專注於新分區。

**注意**  
增量網路爬取不會偵測現有分區的修改或刪除。此組態最適合具有穩定結構描述的資料來源。如果發生一次性主要結構描述變更，建議暫時設定編目程式來執行完整的網路爬取，以準確擷取新的結構描述，然後切換回增量網路爬取模式。

下圖顯示啟用增量網路爬取設定後，編目程式將僅偵測最新添加的資料夾 (month=March)，並將其新增至目錄。

![\[下圖顯示已新增 3 月的檔案。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/crawlers-s3-folders-new.png)


請依照下列步驟來更新編目程式，以執行增量網路爬取：

------
#### [ AWS 管理主控台 ]

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

1. 選擇 **Data Catalog** 下的**編目程式**。

1. 選擇要設定為增量網路爬取的編目程式。

1. 選擇**編輯**。

1. 選擇**步驟 2。選擇資料來源和分類器**。

1. 選擇要進行增量網路爬取的資料來源。

1. 選擇**編輯**。

1. 在**後續編目程式執行**下選擇**僅網路爬取新的子資料夾**。

1. 選擇**更新**。

若要為編目程式建立排程，請參閱 [排程爬蟲程式](schedule-crawler.md)。

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

```
aws glue update-crawler \
 --name myCrawler \
 --recrawl-policy RecrawlBehavior=CRAWL_NEW_FOLDERS_ONLY \
 --schema-change-policy UpdateBehavior=LOG,DeleteBehavior=LOG
```

------

**備註和限制**  
開啟此選項時，您無法在編輯爬蟲程式程式時變更 Amazon S3 目標資料存放區。此選項會影響特定爬蟲程式組態設定。開啟時，它會強制爬蟲程式的更新行為和刪除行為至 `LOG`。這表示：
+ 若其發現結構描述不相容的物件，則爬蟲程式將不會在 Data Catalog 中新增物件，並會將此詳細資料新增為 CloudWatch Logs 中的日誌。
+ 其將不會在 Data Catalog 中更新已刪除的物件。

# 產生分區索引
<a name="crawler-configure-partition-indexes"></a>

Data Catalog 支援建立分區索引，以提供高效的特定分區查閱。如需詳細資訊，請參閱[建立分區索引](https://docs.aws.amazon.com/glue/latest/dg/partition-indexes.html)。根據預設， AWS Glue 爬蟲程式會建立 Amazon S3 和 Delta Lake 目標的分割區索引。

------
#### [ AWS 管理主控台 ]

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

1. 選擇 **Data Catalog** 下的**編目程式**。

1. 當您定義編目程式時，預設會在**設定輸出和排程**頁面上的**進階選項**下啟用**自動建立分區索引**的選項。

   若要停用此選項，您可以取消選取在主控台中**自動建立分區索引**核取方塊。

1. 完成編目程式組態，然後選擇**建立編目程式**。

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

 您也可以使用 AWS CLI停用此選項，在 `configuration` 參數中設定 `CreatePartitionIndex `。預設值為 true。

```
aws glue update-crawler \
    --name myCrawler \
    --configuration '{"Version": 1.0, "CreatePartitionIndex": false }'
```

------

## 分割區索引的使用說明
<a name="crawler-configure-partition-indexes-usage-notes"></a>
+ 依預設，爬蟲程式建立的資料表沒有變數 `partition_filtering.enabled`。如需詳細資訊，請參閱 [AWS Glue 分割區索引和篩選](https://docs.aws.amazon.com/athena/latest/ug/glue-best-practices.html#glue-best-practices-partition-index)。
+ 不支援為加密分割區建立分割區索引。

# 防止編目程式變更現有的結構描述
<a name="crawler-schema-changes-prevent"></a>

 您可以防止 AWS Glue 編目程式在其執行時對 Data Catalog 進行任何結構描述變更。依預設，編目程式會更新 Data Catalog 中的結構描述，以符合要網路爬取的資料來源。但是，在某些情況下，您可能想要防止編目程式修改現有的結構描述，特別是如果您已轉換或清理資料，而且不希望原始結構描述覆寫變更。

 請依照下列步驟來設定編目程式，不要覆寫資料表定義中的現有結構描述。

------
#### [  AWS 管理主控台  ]

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

1. 選擇 **Data Catalog** 下的**編目程式**。

1. 從清單中選擇編目程式，然後選擇**編輯**。

1. 選擇**步驟 4：設定輸出和排程**。

1. 在**進階選項**下，選擇**僅新增資料欄**或**忽略變更且不更新 Data Catalog 中的資料表**。

1.  此外，您還可以將組態選項設定為**以資料表的中繼資料更新所有新的和現有的分區**。這會將分區結構描述設定為從資料表繼承。

1. 選擇**更新**。

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

下列範例顯示如何將編目程式設定為不變更現有的結構描述，只新增資料欄：

```
aws glue update-crawler \
  --name myCrawler \
  --configuration '{"Version": 1.0, "CrawlerOutput": {"Tables": {"AddOrUpdateBehavior": "MergeNewColumns"}}}'
```

下列範例顯示如何將編目程式設定為不變更現有的結構描述，且不新增資料欄：

```
aws glue update-crawler \
  --name myCrawler \
  --schema-change-policy UpdateBehavior=LOG \
  --configuration '{"Version": 1.0, "CrawlerOutput": {"Partitions": { "AddOrUpdateBehavior": "InheritFromTable" }}}'
```

------
#### [ API ]

如果您不希望爬蟲程式執行時變更資料表結構描述，可將結構描述變更政策設為 `LOG`。

當您使用 API 設定爬蟲程式時，請設定下列參數：
+ 將 `SchemaChangePolicy` 結構中的 `UpdateBehavior` 欄位設為 `LOG`。
+  在爬蟲程式 API 中，以呈現以下 JSON 物件的字串設定 `Configuration` 欄位，例如：

  ```
  {
     "Version": 1.0,
     "CrawlerOutput": {
        "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" }
     }
  }
  ```

------

# 為每個 Amazon S3 包含路徑建立單一結構描述
<a name="crawler-grouping-policy"></a>

依預設，爬蟲程式為 Amazon S3 中存放的資料定義資料表時，其會同時考量資料是否相容與結構描述是否類似。考量的資料相容性因素包括資料是否具有相同的格式類型 (例如 JSON)、相同的壓縮類型 (例如 GZIP)、Amazon S3 路徑結構及其他資料屬性。結構描述相似性是測量個別 Amazon S3 物件的結構描述相似程度。

為協助說明此選項，我們假設您使用了包含路徑 `s3://amzn-s3-demo-bucket/table1/` 來定義爬蟲程式。當爬蟲程式執行時，它會尋找兩個具備以下特點的 JSON 檔案：
+ **檔案 1** - `S3://amzn-s3-demo-bucket/table1/year=2017/data1.json`
+ *檔案內容* - `{“A”: 1, “B”: 2}`
+ *結構描述* - `A:int, B:int`
+ **檔案 2** - `S3://amzn-s3-demo-bucket/table1/year=2018/data2.json`
+ *檔案內容* - `{“C”: 3, “D”: 4}`
+ *結構描述* - `C: int, D: int`

依預設，由於結構描述的沒有足夠相似性，故爬蟲程式會建立兩個資料表，名為 `year_2017` 和 `year_2018`。不過，如果已選擇 **Create a single schema for each S3 path (為每個 S3 路徑建立單一結構描述)**，且如果該資料相容，爬蟲程式會建立一個資料表。該資料表包含結構描述 `A:int,B:int,C:int,D:int` 和 `partitionKey` `year:string`。

------
#### [ AWS 管理主控台 ]

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

1. 選擇 **Data Catalog** 下的**編目程式**。

1. 當您設定新的編目程式時，在**輸出和排程**下，選取「進階」選項下的**為每個 S3 路徑建立單一結構描述**選項。

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

當可能時，您可以設定爬蟲程式為 `CombineCompatibleSchemas` 到常用資料表定義。使用此選項，爬蟲程式仍會考慮資料相容性，但在評估特定包含路徑的 Amazon S3 物件時，會忽略特定結構描述的相似性。

當您使用 設定爬蟲程式時 AWS CLI，請設定下列組態選項：

```
aws glue update-crawler \
   --name myCrawler \
   --configuration '{"Version": 1.0, "Grouping": {"TableGroupingPolicy": "CombineCompatibleSchemas" }}'
```

------
#### [ API ]

當您使用 API 設定爬蟲程式時，請設定下列組態選項：

 在爬蟲程式 API 中，以呈現以下 JSON 物件的字串設定 `Configuration` 欄位，例如：

```
{
   "Version": 1.0,
   "Grouping": {
      "TableGroupingPolicy": "CombineCompatibleSchemas" }
}
```

------

# 指定資料表位置和分區層級
<a name="crawler-table-level"></a>

依預設，編目程式為 Amazon S3 中存放的資料定義資料表時，編目程式會嘗試將結構描述合併在一起並建立頂層資料表 (`year=2019`)。在某些情況下，您可能會預期爬蟲程式為資料夾 `month=Jan` 建立資料表，然而由於同級資料夾 (`month=Mar`) 已合併到相同的資料表中，因此爬蟲程式是建立分割區。

資料表層級爬蟲程式選項讓您可以靈活地告訴爬蟲程式資料表的位置，以及建立分割區的方式。當您指定 **Table level (資料表層級)**，資料表會從 Amazon S3 儲存貯體在該絕對層級建立。

![\[資料表層級指定為層級 2 的爬蟲程式群組。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/crawler-table-level1.jpg)


 在主控台設定爬蟲程式時，您可指定 **Table level (資料表層級)** 爬蟲程式選項的值。值必須是正整數，表示資料表位置 (資料集中的絕對層級)。頂層資料夾的層級為 1。例如，對於路徑 `mydataset/year/month/day/hour`，如果層級設定為 3，則資料表會在位置 `mydataset/year/month`。

------
#### [ AWS 管理主控台 ]

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

1. 選擇 **Data Catalog** 下的**編目程式**。

1. 在您設定編目程式時，在**輸出和排程**下，選擇**進階選項**下的**資料表層級**。

![\[在爬蟲程式組態中指定資料表層級。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/crawler-configuration-console.png)


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

當您使用 設定爬蟲程式時 AWS CLI，請設定 `configuration` 參數，如範例程式碼所示：

```
aws glue update-crawler \
  --name myCrawler \
  --configuration '{"Version": 1.0, "Grouping": { "TableLevelConfiguration": 2 }}'
```

------
#### [ API ]

使用 API 設定爬蟲程式時，以呈現以下 JSON 物件的字串設定 `Configuration` 欄位；例如：

```
configuration = jsonencode(
{
   "Version": 1.0,
   "Grouping": {
            TableLevelConfiguration = 2  
        }
})
```

------
#### [ CloudFormation ]

在此範例中，您在 CloudFormation 範本內的主控台中設定 **Table level** (資料表層級)選項：

```
"Configuration": "{
    \"Version\":1.0,
    \"Grouping\":{\"TableLevelConfiguration\":2}
}"
```

------

# 指定編目程式可建立的資料表數目上限
<a name="crawler-maximum-number-of-tables"></a>

您可以選擇`TableThreshold`透過 AWS Glue 主控台或 指定 ，指定允許爬蟲程式建立的資料表數目上限 AWS CLI。如果爬蟲程式在其網路爬取期間偵測到的資料表大於此輸入值，網路爬取就會失敗，且不會將任何資料寫入資料目錄。

當爬蟲程式偵測並建立的資料表比您預期的要大得多時，此參數非常有用。這可能有多種原因，例如：
+ 使用 AWS Glue 任務填入 Amazon S3 位置時，最終可能會產生與資料夾相同層級的空檔案。在這種情況下，當您在此 Amazon S3 位置執行爬蟲程式時，由於檔案和資料夾存在於相同層級，爬蟲程式會建立多個資料表。
+ 如果未設定 `"TableGroupingPolicy": "CombineCompatibleSchemas"`，您最終可能會得到比預期更多的資料表。

您可以指定 `TableThreshold` 作為大於 0 的整數值。此值的設定是以每個爬蟲程式為基礎。也就是說，對於每個網路爬取，都會考慮此值。例如：爬蟲程式具有設定為 5 的 `TableThreshold` 值。在每個爬蟲程式中，會 AWS Glue 比較使用此資料表閾值 (5) 偵測到的資料表數目，如果偵測到的資料表數目小於 5， 會將資料表 AWS Glue 寫入資料目錄，如果沒有，則爬蟲程式會失敗，而不會寫入資料目錄。

------
#### [ AWS 管理主控台 ]

**若要`TableThreshold`使用 設定 AWS 管理主控台：**

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

1. 設定編目程式時，在**輸出和排程**中，將**資料表閾值上限**設定為允許編目程式產生的資料表數目。  
![\[AWS 主控台的輸出和排程區段，顯示資料表閾值上限參數。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/crawler-max-tables.png)

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

若要`TableThreshold`使用 設定 AWS CLI：

```
aws glue update-crawler \
    --name myCrawler \
    --configuration '{"Version": 1.0, "CrawlerOutput": {"Tables": { "TableThreshold": 5 }}}'
```

------
#### [ API ]

若要使用 API 設定 `TableThreshold`，請執行以下操作：

```
"{"Version":1.0,
"CrawlerOutput":
{"Tables":{"AddOrUpdateBehavior":"MergeNewColumns",
"TableThreshold":5}}}";
```

------

錯誤訊息會記錄下來，以協助您識別資料表路徑並清理資料。在爬蟲程式因為資料表計數大於提供的資料表閾值而失敗的情況下，登入帳戶的範例：

```
Table Threshold value = 28, Tables detected - 29
```

在 CloudWatch 中，我們會將偵測到的所有資料表位置記錄為 INFO 訊息。將錯誤記錄為失敗原因。

```
ERROR com.amazonaws.services.glue.customerLogs.CustomerLogService - CustomerLogService received CustomerFacingException with message 
The number of tables detected by crawler: 29 is greater than the table threshold value provided: 28. Failing crawler without writing to Data Catalog.
com.amazonaws.services.glue.exceptions.CustomerFacingInternalException: The number of tables detected by crawler: 29 is greater than the table threshold value provided: 28. 
Failing crawler without writing to Data Catalog.
```

# 設定編目程式以使用 Lake Formation 憑證
<a name="crawler-lf-integ"></a>

您可以設定爬蟲程式使用 AWS Lake Formation 登入資料來存取 Amazon S3 資料存放區，或具有相同 AWS 帳戶 或另一個 中基礎 Amazon S3 位置的資料目錄資料表 AWS 帳戶。如果爬蟲程式和資料目錄資料表位於同一帳戶中，您可以將現有的資料目錄資料表設定為爬蟲程式的目標。目前，使用 Data Catalog 資料表作為編目程式的目標時，僅允許具有單一目錄資料表的單一目錄目標。

**注意**  
將資料目錄資料表定義為爬蟲程式目標時，請確定資料目錄資料表的基礎位置是 Amazon S3 位置。使用 Lake Formation 憑證的爬蟲程式僅支援具有基礎 Amazon S3 位置的資料目錄目標。

## 當爬蟲程式和已註冊的 Amazon S3 位置或資料目錄資料表位於同一帳戶 (帳戶內網路爬取) 時，需要進行設定
<a name="in-account-crawling"></a>

若要允許爬蟲程式使用 Lake Formation 憑證存取資料存放區或資料目錄資料表，您需要向 Lake Formation 註冊資料位置。此外，爬蟲程式的 IAM 角色必須具備從 Amazon S3 儲存貯體註冊所在的目的地讀取資料的許可。

您可以使用 AWS 管理主控台 或 AWS Command Line Interface () 完成下列組態步驟AWS CLI。

------
#### [ AWS 管理主控台 ]

1. 在設定爬蟲程式以存取爬蟲程式來源之前，請先向 Lake Formation 註冊資料存放區或資料目錄的資料位置。在 Lake Formation 主控台 ([https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)：//) 中，將 Amazon S3 位置註冊為定義爬蟲程式之 中資料湖 AWS 帳戶 的根位置。如需詳細資訊，請參閱 [Registering an Amazon S3 location](https://docs.aws.amazon.com/lake-formation/latest/dg/register-location.html) (註冊 Amazon S3 位置)。

1. 向用於爬蟲程式執行的 IAM 角色授與 **Data location** (資料位置) 許可，以便爬蟲程式可以從 Lake Formation 中的目的地讀取資料。如需詳細資訊，請參閱 [Granting data location permissions (same account)](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-location-permissions-local.html) (授與資料位置許可 (相同帳戶))。

1. 將爬蟲程式角色存取許可 (`Create`) 授與指定作為輸出資料庫的資料庫。如需詳細資訊，請參閱 [Granting database permissions using the Lake Formation console and the named resource method](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-database-permissions.html) (使用 Lake Formation 主控台和具名資源方法授與資料庫許可)。

1. 在 IAM 主控台 ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) 中，建立爬蟲程式的 IAM 角色。將 `lakeformation:GetDataAccess` 政策新增至該角色。

1. 在 AWS Glue 主控台 ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)：//) 中，在設定爬蟲程式時，選取**使用 Lake Formation 登入資料來爬取 Amazon S3 資料來源**的選項。
**注意**  
accountId 欄位對於帳戶內網路爬取而言是選填的。

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

```
aws glue --profile demo create-crawler --debug --cli-input-json '{
    "Name": "prod-test-crawler",
    "Role": "arn:aws:iam::111122223333:role/service-role/AWSGlueServiceRole-prod-test-run-role",
    "DatabaseName": "prod-run-db",
    "Description": "",
    "Targets": {
    "S3Targets":[
                {
                 "Path": "s3://amzn-s3-demo-bucket"
                }
                ]
                },
   "SchemaChangePolicy": {
      "UpdateBehavior": "LOG",
      "DeleteBehavior": "LOG"
  },
  "RecrawlPolicy": {
    "RecrawlBehavior": "CRAWL_EVERYTHING"
  },
  "LineageConfiguration": {
    "CrawlerLineageSettings": "DISABLE"
  },
  "LakeFormationConfiguration": {
    "UseLakeFormationCredentials": true,
    "AccountId": "111122223333"
  },
  "Configuration": {
           "Version": 1.0,
           "CrawlerOutput": {
             "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" },
             "Tables": {"AddOrUpdateBehavior": "MergeNewColumns" }
           },
           "Grouping": { "TableGroupingPolicy": "CombineCompatibleSchemas" }
         },
  "CrawlerSecurityConfiguration": "",
  "Tags": {
    "KeyName": ""
  }
}'
```

------

# 爬蟲程式和註冊的 Amazon S3 位置位於不同帳戶 (跨帳戶網路爬取) 時需要進行設定
<a name="cross-account-crawling"></a>

若要允許爬蟲程式使用 Lake Formation 憑證存取其他帳戶中的資料存放區，您必須先向 Lake Formation 註冊 Amazon S3 資料位置。接著，您可以透過執行下列步驟，將資料位置許可授與爬蟲程式的帳戶。

您可以使用 AWS 管理主控台 或 完成下列步驟 AWS CLI。

------
#### [ AWS 管理主控台 ]

1. 在註冊 Amazon S3 位置的帳戶中 (帳戶 B)：

   1. 向 Lake Formation 註冊 Amazon S3 路徑。如需詳細資訊，請參閱 [Registering Amazon S3 location](https://docs.aws.amazon.com/lake-formation/latest/dg/register-location.html) (註冊 Amazon S3 位置)。

   1.  將 **Data location** (資料位置) 許可授與爬蟲程式執行所在的帳戶 (帳戶 A)。如需詳細資訊，請參閱 [Grant data location permissions](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-location-permissions-local.html) (授與資料位置許可)。

   1. 在 Lake Formation 中建立空的資料庫，並將基礎位置作為目標 Amazon S3 位置。如需詳細資訊，請參閱[建立資料庫](https://docs.aws.amazon.com/lake-formation/latest/dg/creating-database.html)。

   1. 授與帳戶 A (爬蟲程式執行所在的帳戶) 您在上一個步驟中建立的資料庫存取權。如需詳細資訊，請參閱[授與資料庫許可](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-database-permissions.html)。

1. 在爬蟲程式建立並將執行所在的帳戶中 (帳戶 A)：

   1.  使用 AWS RAM 主控台，接受從外部帳戶 （帳戶 B) 共用的資料庫。如需詳細資訊，請參閱[接受來自 的資源共用邀請 AWS Resource Access Manager](https://docs.aws.amazon.com/lake-formation/latest/dg/accepting-ram-invite.html)。

   1.  建立爬蟲程式的 IAM 角色。將 `lakeformation:GetDataAccess` 政策新增至該角色。

   1.  在 Lake Formation 主控台 ([https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)) 中，將目標 Amazon S3 位置的 **Data location** (資料位置) 許可授與用於爬蟲程式執行的 IAM 角色，以便爬蟲程式可以從 Lake Formation 中的目的地讀取資料。如需詳細資訊，請參閱 [Granting data location permissions](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-location-permissions-local.html) (授與資料位置許可)。

   1.  在共用資料庫上建立資源連結。如需詳細資訊，請參閱[建立資源連結](https://docs.aws.amazon.com/lake-formation/latest/dg/create-resource-link-database.html)。

   1.  授與爬蟲程式角色共用資料庫和 (`Describe`) 資源連結的存取許可 (`Create`)。資源連結在爬蟲程式的輸出中指定。

   1.  在 AWS Glue 主控台 ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)：//) 中，在設定爬蟲程式時，選取**使用 Lake Formation 登入資料來爬取 Amazon S3 資料來源**的選項。

      對於跨帳戶爬取，請指定向 Lake Formation 註冊目標 Amazon S3 位置的 AWS 帳戶 ID。對於帳戶內網路爬取，accountId 欄位是選填的。  
![\[IAM role selection and Lake Formation configuration options for AWS Glue 編目程式 security settings.\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/cross-account-crawler.png)

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

```
aws glue --profile demo create-crawler --debug --cli-input-json '{
    "Name": "prod-test-crawler",
    "Role": "arn:aws:iam::111122223333:role/service-role/AWSGlueServiceRole-prod-test-run-role",
    "DatabaseName": "prod-run-db",
    "Description": "",
    "Targets": {
    "S3Targets":[
                {
                 "Path": "s3://amzn-s3-demo-bucket"
                }
                ]
                },
   "SchemaChangePolicy": {
      "UpdateBehavior": "LOG",
      "DeleteBehavior": "LOG"
  },
  "RecrawlPolicy": {
    "RecrawlBehavior": "CRAWL_EVERYTHING"
  },
  "LineageConfiguration": {
    "CrawlerLineageSettings": "DISABLE"
  },
  "LakeFormationConfiguration": {
    "UseLakeFormationCredentials": true,
    "AccountId": "111111111111"
  },
  "Configuration": {
           "Version": 1.0,
           "CrawlerOutput": {
             "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" },
             "Tables": {"AddOrUpdateBehavior": "MergeNewColumns" }
           },
           "Grouping": { "TableGroupingPolicy": "CombineCompatibleSchemas" }
         },
  "CrawlerSecurityConfiguration": "",
  "Tags": {
    "KeyName": ""
  }
}'
```

------

**注意**  
只有 Amazon S3 和資料目錄目標才支援使用 Lake Formation 憑證的爬蟲程式。
對於使用 Lake Formation 憑證販售的目標，基礎 Amazon S3 位置必須屬於同一個儲存貯體。例如，只要所有目標位置都位於同一個儲存貯體 (amzn-s3-demo-bucket1) 下，客戶就可以使用多個目標 (s3://amzn-s3-demo-bucket1/folder1, s3://amzn-s3-demo-bucket1/folder2)。不允許指定不同的儲存貯體 (s3://amzn-s3-demo-bucket1/folder1、s3://amzn-s3-demo-bucket2/folder2)。
目前對於資料目錄目標爬蟲程式而言，僅允許具有單一目錄資料表的單一目錄目標。

# 使用 Amazon S3 事件通知加速網路爬取
<a name="crawler-s3-event-notifications"></a>

您可以將爬蟲程式設定為使用 Amazon S3 事件來尋找任何變更，而不是從 Amazon S3 或 Data Catalog 目標列出物件。此功能可使用 Amazon S3 事件識別兩個編目之間的變更，方法是列出觸發事件的子資料夾中的所有檔案，而不是列出完整的 Amazon S3 或 Data Catalog 目標，藉此改善重新編目時間。

第一個編目會列出目標中的所有 Amazon S3 物件。第一次成功編目之後，您可以選擇手動或按設定的排程重新編目。爬蟲程式將僅列出這些事件中的物件，而不是列出所有物件。

當目標為 Data Catalog 資料表時，編目程式會使用變更來更新 Data Catalog 中的現有資料表 (例如，資料表中的額外分區)。

移動到基於 Amazon S3 事件的爬蟲程式的優點是：
+ 因為不需要列出目標中的所有物件，而是在新增或刪除物件的位置完成特定資料夾清單，從而更快速地重新編目。
+ 減少整體編目成本，因為會在新增或刪除物件的位置完成特定資料夾清單。

Amazon S3 事件編目會根據爬蟲程式排程從 SQS 佇列中使用 Amazon S3 事件來執行。如果佇列中沒有事件，則不會產生任何費用。您可以將 Amazon S3 事件設定為直接轉至 SQS 佇列，或在多個取用者需要相同事件 (即 SNS 和 SQS 的組合) 的情況下設定事件。如需詳細資訊，請參閱[設定 Amazon S3 事件通知的帳戶](#crawler-s3-event-notifications-setup)。

在事件模式下建立並設定爬蟲程式之後，第一次編目會執行完整的 Amazon S3 或 Data Catalog 目標清單，藉此以清單模式執行。下列日誌會在第一次成功編目之後使用 Amazon S3 事件來確認編目的操作：「透過使用 Amazon S3 事件來執行編目。」

在建立 Amazon S3 事件編目並更新可能會影響編目的爬蟲程式屬性之後，編目會以清單模式運作，並新增下列日誌：「編目未在 S3 事件模式下執行」。

**注意**  
每個編目程式取用的訊息數目上限為 10 萬則訊息。

## 考量和限制
<a name="s3event-crawler-limitations"></a>

在您設定編目程式使用 Amazon S3 事件通知尋找任何變更時，適用下列考量和限制。
+  **已刪除分區的重要行為** 

  將 Amazon S3 事件編目程式與 Data Catalog 資料表搭配使用時：
  +  如果使用 `DeletePartition` API 呼叫刪除分區，您還必須刪除該分區下的所有 S3 物件，並在設定 S3 事件通知時選取**所有物件移除事件**。如果未設定刪除事件，編目程式會在下次執行期間重新建立已刪除的分區。
+ 無論是 Amazon S3 目標還是 Data Catalog 目標，爬蟲程式只支援單一目標。
+ 不支援私有 VPC 上的 SQS。
+ 不支援 Amazon S3 取樣。
+ 爬蟲程式目標應該是 Amazon S3 目標的資料夾，或是 Data Catalog 目標的一個或多個 AWS Glue Data Catalog 資料表。
+ 不支援「所有」路徑萬用字元：s3://%
+ 對於 Data Catalog 目標，所有目錄資料表都應指向 Amazon S3 事件模式的相同 Amazon S3 儲存貯體。
+ 對於 Data Catalog 目標，目錄資料表不應指向 Delta Lake 格式的 Amazon S3 位置 (包含 \$1symlink 資料夾或檢查目錄資料表的 `InputFormat`)。

**Topics**
+ [考量和限制](#s3event-crawler-limitations)
+ [設定 Amazon S3 事件通知的帳戶](#crawler-s3-event-notifications-setup)
+ [為 Amazon S3 目標的 Amazon S3 事件通知設定編目程式](crawler-s3-event-notifications-setup-console-s3-target.md)
+ [為 Data Catalog 資料表的 Amazon S3 事件通知設定編目程式](crawler-s3-event-notifications-setup-console-catalog-target.md)

## 設定 Amazon S3 事件通知的帳戶
<a name="crawler-s3-event-notifications-setup"></a>

完成下列設定任務。請注意括號中的值會參考指令碼中的可設定項。

1. 您需要設定 Amazon S3 儲存貯體的事件通知。

   如需詳細資訊，請參閱 [Amazon S3 事件通知](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventNotifications.html)。

1. 若要使用以 Amazon S3 事件為基礎的編目程式，您應該在 Amazon S3 儲存貯體上啟用事件通知，在其中根據字首篩選出事件，這些字首與 S3 目標相同並存放在 SQS 中。您可以透過主控台設定 SQS 和事件通知，方法是遵循[演練：設定儲存貯體的通知](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ways-to-add-notification-config-to-bucket.html)中的步驟。

1. 將下列 SQS 政策新增至編目程式使用的角色。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "VisualEditor0",
         "Effect": "Allow",
         "Action": [
           "sqs:DeleteMessage",
           "sqs:GetQueueUrl",
           "sqs:ListDeadLetterSourceQueues",
           "sqs:ReceiveMessage",
           "sqs:GetQueueAttributes",
           "sqs:ListQueueTags",
           "sqs:SetQueueAttributes",
           "sqs:PurgeQueue"
         ],
         "Resource": "arn:aws:sqs:us-east-1:111122223333:cfn-sqs-queue"
       }
     ]
   }
   ```

------

# 為 Amazon S3 目標的 Amazon S3 事件通知設定編目程式
<a name="crawler-s3-event-notifications-setup-console-s3-target"></a>

請依照下列步驟，使用 AWS 管理主控台 或 為 Amazon S3 目標設定 Amazon S3 事件通知的爬蟲程式 AWS CLI。

------
#### [ AWS 管理主控台 ]

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

1.  設定爬蟲程式屬性。如需詳細資訊，請參閱[在 AWS Glue 主控台上設定爬蟲程式組態選項](https://docs.aws.amazon.com/glue/latest/dg/crawler-configuration.html#crawler-configure-changes-console)。

1.  在 **Data source configuration** (資料來源組態) 區段中，您被問到 *Is your data already mapped to AWS Glue tables?* (您的資料是否已對應至 GLU 資料表？) 

    依預設已選取 **Not yet** (尚未)。將其保留為預設值，因為您使用的是 Amazon S3 資料來源，且資料尚未映射至 AWS Glue 資料表。

1.  在 **Data sources** (資料來源) 區段中，選擇 **Add a data source** (新增資料來源)。  
![\[Data source configuration interface with options to select or add data sources for crawling.\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/crawler-s3-event-console1.png)

1.  在 **Add data source** (新增資料來源) 強制回應視窗中，設定 Amazon S3 資料來源：
   +  **Data source** (資料來源)：依預設，已選取 Amazon S3。
   +  **Network connection** (網路連線) (選用)：選擇 **Add new connection** (新增連線)。
   +  **Location of Amazon S3 data** (Amazon S3 資料的位置)：依預設，已選取 **In this account** (在此帳戶中)。
   +  **Amazon S3 path** (Amazon S3 路徑)：指定在其中網路爬取資料夾和檔案的 Amazon S3 路徑。
   +  **Subsequent crawler runs** (後續爬蟲程式執行)：選擇 **Crawl based on events** (根據事件進行網路爬取) 以針對爬蟲程式使用 Amazon S3 事件通知。
   +  **Include SQS ARN** (包含 SQS ARN)：指定包括有效 SQS ARN 的資料存放區參數。(例如 `arn:aws:sqs:region:account:sqs`)。
   +  **Include dead-letter SQS ARN** (包含無效字母 SQS ARN) (選用)：指定有效的 Amazon 無效字母 SQS ARN。(例如 `arn:aws:sqs:region:account:deadLetterQueue`)。
   +  選擇 **Add an Amazon S3 data source** (新增 Amazon S3 資料來源)。  
![\[Add data source dialog for S3, showing options for network connection and crawl settings.\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/crawler-s3-event-console2.png)

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

 以下是設定爬蟲程式使用事件通知來爬取 Amazon S3 AWS CLI 目標儲存貯體的範例 Amazon S3call。

```
Create Crawler:
aws glue update-crawler \
    --name myCrawler \
    --recrawl-policy RecrawlBehavior=CRAWL_EVENT_MODE \
    --schema-change-policy UpdateBehavior=UPDATE_IN_DATABASE,DeleteBehavior=LOG
    --targets '{"S3Targets":[{"Path":"s3://amzn-s3-demo-bucket/", "EventQueueArn": "arn:aws:sqs:us-east-1:012345678910:MyQueue"}]}'
```

------

# 為 Data Catalog 資料表的 Amazon S3 事件通知設定編目程式
<a name="crawler-s3-event-notifications-setup-console-catalog-target"></a>

當您擁有 Data Catalog 資料表時，使用 AWS Glue 主控台為 Amazon S3 事件通知設定編目程式：

1.  設定爬蟲程式屬性。如需詳細資訊，請參閱[在 AWS Glue 主控台上設定爬蟲程式組態選項](https://docs.aws.amazon.com/glue/latest/dg/crawler-configuration.html#crawler-configure-changes-console)。

1.  在 **Data source configuration** (資料來源組態) 區段中，您被問到 *Is your data already mapped to AWS Glue tables?* (您的資料是否已對應至 GLU 資料表？) 

    選取 **Yes** (是)，從 Data Catalog 中選取現有資料表作為資料來源。

1.  在 **Glue tables** (Glue 資料表) 區段中，選擇 **Add tables** (新增資料表)。  
![\[Data source configuration interface with options to select existing Glue tables or add new ones.\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/crawler-s3-event-console1-cat.png)

1.  在 **Add table** (新增資料表) 模式中，設定資料庫和資料表：
   +  **Network connection** (網路連線) (選用)：選擇 **Add new connection** (新增連線)。
   +  **Database** (資料庫)：在 Data Catalog 中選取資料庫。
   +  **Tables** (資料表)：從 Data Catalog 的資料庫中選取一個或多個資料表。
   +  **Subsequent crawler runs** (後續爬蟲程式執行)：選擇 **Crawl based on events** (根據事件進行網路爬取) 以針對爬蟲程式使用 Amazon S3 事件通知。
   +  **Include SQS ARN** (包含 SQS ARN)：指定包括有效 SQS ARN 的資料存放區參數。(例如 `arn:aws:sqs:region:account:sqs`)。
   +  **Include dead-letter SQS ARN** (包含無效字母 SQS ARN) (選用)：指定有效的 Amazon 無效字母 SQS ARN。(例如 `arn:aws:sqs:region:account:deadLetterQueue`)。
   +  選擇**確認**。  
![\[Add Glue tables dialog with network, database, tables, and crawler options.\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/crawler-s3-event-console2-cat.png)

# 教學課程：新增 AWS Glue 爬蟲程式
<a name="tutorial-add-crawler"></a>

對於這個 AWS Glue 案例，您需要分析主要航空公司的抵達資料，以計算出發機場每月的受歡迎程度。您有以 CSV 格式存放在 Amazon S3 中的 2016 年航班資料。在轉換和分析資料之前，您先將其中繼資料編目至 AWS Glue Data Catalog。

在本教學課程中，讓我們在 Amazon S3 中新增可推斷這些航班記錄中繼資料的爬蟲程式，並在 Data Catalog 中建立資料表。

**Topics**
+ [先決條件](#tutorial-add-crawler-prerequisites)
+ [步驟 1：新增爬蟲程式](#tutorial-add-crawler-step1)
+ [步驟 2：執行爬蟲程式](#tutorial-add-crawler-step2)
+ [步驟 3：檢視 AWS Glue Data Catalog 物件](#tutorial-add-crawler-step3)

## 先決條件
<a name="tutorial-add-crawler-prerequisites"></a>

本教學假設您擁有 AWS 帳戶和 的存取權AWS Glue。

## 步驟 1：新增爬蟲程式
<a name="tutorial-add-crawler-step1"></a>

使用這些步驟來設定和執行爬蟲程式，該爬蟲程式會從存放在 Amazon S3 的 CSV 檔案中擷取中繼資料。

**建立讀取存放在 Amazon S3 上之檔案的爬蟲程式**

1. 在 AWS Glue 服務主控台的左側選單上，選擇**爬蟲程式**。

1. 在爬蟲程式頁面上，選擇**建立爬蟲程式**。這會啟動一系列頁面，提示您輸入爬蟲程式詳細資訊。  
![\[螢幕擷取畫面會顯示爬蟲程式頁面。您可以在此建立爬蟲程式，或編輯、複製、刪除和檢視現有的爬蟲程式。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/crawlers-create_crawler.png)

1. 在爬蟲程式名稱欄位中，輸入 **Flights Data Crawler**，然後選擇 **Next (下一步)**。

   爬蟲程式會呼叫分類器，以推斷資料的結構描述。本教學課程預設使用 CSV 的內建分類器。

1. 對於爬蟲程式來源類型，選擇 **Data stores (資料存放區)**，然後選擇 **Next (下一步)**。

1. 現在讓我們將爬蟲程式指向您的資料。在 **Add a data store (新增資料存放區)** 頁面上，選擇 Amazon S3 資料存放區。本教學課程不使用連線，因此請將 **Connection (連線)** 欄位保留空白 (如果可見)。

   對於 **Crawl data in** (抓取資料位置) 選項，選擇 **Specified path in another account** (指定其他帳戶內的路徑)。然後，對於 **Include path (包含路徑)**，輸入爬蟲程式可以找到航班資料的路徑，也就是 **s3://crawler-public-us-east-1/flight/2016/csv**。輸入路徑後，此欄位的標題會變更為 **Include path (包含路徑)**。選擇**下一步**。

1. 您可以使用單一爬蟲程式來編目多個資料存放區。但是，在本教學課程中，我們只使用一個資料存放區，因此選擇 **No (否)**，然後選擇 **Next (下一步)**。

1. 爬蟲程式需要許可才能存取資料存放區，並在 AWS Glue Data Catalog 中建立物件。若要設定這些許可，請選擇 **Create an IAM role (建立 IAM 角色)**。IAM 角色名稱的開頭為 `AWSGlueServiceRole-`，然後在欄位中輸入角色名稱的最後一部分。輸入 **CrawlerTutorial**，然後選擇 **Next (下一步)**。
**注意**  
若要建立 IAM 角色，您的 AWS 使用者必須擁有 `CreateRole`、`CreatePolicy` 以及 `AttachRolePolicy` 許可。

   精靈會建立名為 的 IAM 角色`AWSGlueServiceRole-CrawlerTutorial`，將 AWS 受管政策連接至`AWSGlueServiceRole`此角色，並新增允許讀取存取 Amazon S3 位置 的內嵌政策`s3://crawler-public-us-east-1/flight/2016/csv`。

1. 建立爬蟲程式的排程。對於 **Frequency (頻率)** 選擇 **Run on demand (隨需執行)**，然後選擇 **Next (下一步)**。

1. 爬蟲程式會在您的 Data Catalog 中建立資料表。資料表包含在 Data Catalog 的資料庫中。首先，選擇 **Add database (新增資料庫)** 建立資料庫。在彈出式視窗中，輸入 **test-flights-db** 做為資料庫名稱，然後選擇 **Create (建立)**。

   接下來，針對 **Prefix added to tables (新增至資料表的字首)** 輸入 **flights**。針對其餘的選項，使用預設值並選擇 **Next (下一步)**。

1. 驗證您在 **Add crawler (新增爬蟲程式)** 精靈中做出的選擇。如果您看到任何錯誤，您可以選擇 **Back (上一步)** 返回上一頁並進行變更。

   檢閱完資訊後，請選擇 **Finish (完成)** 建立爬蟲程式。

## 步驟 2：執行爬蟲程式
<a name="tutorial-add-crawler-step2"></a>

建立爬蟲程式之後，精靈會將您傳送至爬蟲程式檢視頁面。因為您建立具有隨需排程的爬蟲程式，所以您可以選擇執行爬蟲程式。

**執行爬蟲程式**

1. 此頁面頂端附近的橫幅可讓您知道已建立爬蟲程式，並詢問您是否要立即執行它。選擇 **Run it now? (現在執行？)** 執行爬蟲程式。

   橫幅會變更為針對您的爬蟲程式顯示「正在嘗試執行」和「正在執行」訊息。爬蟲程式開始執行後，橫幅就會消失，而且爬蟲程式顯示會更新，以顯示爬蟲程式的 Starting (啟動中) 狀態。一分鐘後，您可以按一下 [重新整理] 圖示來更新資料表中顯示之爬蟲程式的狀態。

1. 爬蟲程式完成時，會出現一個新的橫幅，說明爬蟲程式所做的變更。您可以選擇 **test-flights-db** 連結以檢視 Data Catalog 物件。

## 步驟 3：檢視 AWS Glue Data Catalog 物件
<a name="tutorial-add-crawler-step3"></a>

爬蟲程式會讀取來源位置的資料，並在 Data Catalog 中建立資料表。資料表是呈現您資料的中繼資料定義，包括其結構描述。 Data Catalog 中的資料表不包含資料。相反地，您可以使用這些資料表做為任務定義中的來源或目標。

**檢視爬蟲程式建立的 Data Catalog 物件**

1. 在左側導覽的 **Data catalog ( Data Catalog )** 下，選擇 **Databases (資料庫)**。在這裡，您可以查看爬蟲程式所建立的 `flights-db` 資料庫。

1. 在左側導覽中的 **Data catalog ( Data Catalog )** 及 **Databases (資料庫)** 下方，選擇 **Tables (資料表)**。在這裡，您可以檢視爬蟲程式所建立的 `flightscsv` 資料表。如果您選擇資料表名稱，則可以檢視資料表設定、參數和屬性。在此檢視中向下捲動，您可以檢視結構描述，也就是資料表的欄和資料類型的相關資訊。

1. 如果選擇資料表檢視頁面上的 **View partitions (檢視分割區)**，您可以看到為資料建立的分割區。第一欄是資料分割區索引鍵。

# 手動定義中繼資料
<a name="populate-dg-manual"></a>

 AWS Glue Data Catalog 是中央儲存庫，可存放資料來源和資料集的中繼資料。雖然編目程式可以為支援的資料來源的中繼資料進行自動爬取和填入，但在某些情況下，可能需要在 Data Catalog 中手動定義中繼資料：
+ 不支援的資料格式 – 如果您擁有編目程式不支援的資料來源，則需要在 Data Catalog 中手動定義這些資料來源的中繼資料。
+ 自訂中繼資料需求 – 根據預先定義的規則和慣例 AWS Glue 編目程式 推斷中繼資料。如果您有推 AWS Glue 編目程式 斷中繼資料未涵蓋的特定中繼資料需求，您可以手動定義中繼資料以符合您的需求 
+ 資料治理和標準化 – 在某些情況下，基於資料治理、合規或安全原因，您可能希望對中繼資料定義有更多控制權。手動定義中繼資料可確保中繼資料符合組織的標準和政策。
+ 未來資料擷取的預留位置 – 如果您擁有無法立即使用或存取的資料來源，則可以建立空白結構描述資料表作為預留位置。資料來源變為可用之後，就可以將實際資料填入資料表，同時維持預先定義的結構。

 若要手動定義中繼資料，您可以使用 AWS Glue 主控台、Lake Formation 主控台、 AWS Glue API 或 AWS Command Line Interface (AWS CLI)。您可以建立資料庫、資料表和分區，並指定中繼資料屬性，例如資料欄名稱、資料類型、說明和其他屬性。

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

資料庫用於在 AWS Glue中組織中繼資料資料表。當您在 中定義資料表時 AWS Glue Data Catalog，您可以將其新增至資料庫。資料表一次只能隸屬於一個資料庫。

您的資料庫可包含多個資料表，用來定義來自多種不同資料存放區的資料。此資料可包含 Amazon Simple Storage Service (Amazon S3) 中物件，以及 Amazon Relational Database Service 中的關聯資料表。

**注意**  
當您從 AWS Glue Data Catalog 刪除資料庫，也會刪除資料庫中內含的所有資料表。

 若要檢視資料庫清單，請登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 的 AWS Glue 主控台。選擇 **Databases** (資料庫)，接著在清單中選擇資料庫名稱，以檢視詳細資訊。

 您可以在 ** 主控台的 **DatabasesAWS Glue 標籤新增、編輯、刪除資料庫：
+ 要建立新資料庫，請選擇 **Add database** (新增資料庫) 並提供名稱和描述。為了相容於其他中繼資料存放 (例如 Apache Hive)，名稱會變為小寫字元。
**注意**  
如果您預計從 Amazon Athena 存取資料庫，則應提供只有英數字元和底線字元的名稱。如需詳細資訊，請參閱 [Athena 名稱](https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html#ate-table-database-and-column-names-allow-only-underscore-special-characters)。
+  若要編輯資料庫的描述，請選取資料庫名稱旁的核取方塊，然後選擇 **Edit** (編輯)。
+  若要刪除資料庫，請選取資料庫名稱旁的核取方塊，然後選擇 **Remove** (移除)。
+  若要顯示資料庫中包含的資料表清單，請選擇資料庫名稱，資料庫屬性就會顯示資料庫中的所有資料表。

要變更爬蟲程式寫入的資料庫，您必須先變更爬蟲程式定義。如需詳細資訊，請參閱[使用編目程式填入 Data Catalog](add-crawler.md)。

## 資料庫資源連結
<a name="databases-resource-links"></a>


|  | 
| --- |
| AWS Glue 主控台最近已更新。目前版本的主控台不支援資料庫資源連結。 | 

 Data Catalog 也可以包含資料庫的*資源連結*。資料庫資源連結是本機或共用資料庫的連結。您目前只可以在 AWS Lake Formation建立資源連結。建立資料庫的資源連結後，您可以在任何使用資料庫名稱的地方使用資源連結名稱。連同您擁有或與您共用的資料庫，資料表資源連結會由 `glue:GetDatabases()` 傳回，並顯示為 AWS Glue 主控台中 **Databases (資料庫)** 頁面的項目。

 Data Catalog 也可以包含資料表資源連結。

如需資源連結的詳細資訊，請參閱 *AWS Lake Formation 開發人員指南*中的[建立資源連結](https://docs.aws.amazon.com/lake-formation/latest/dg/creating-resource-links.html)。

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

即使執行爬蟲程式是清查資料存放區中資料的建議方法，您也可以 AWS Glue Data Catalog 手動將中繼資料表新增至 。此方法可讓您對中繼資料定義進行更多控制，並根據特定需求自訂中繼資料定義。

也可手動將資料表新增到 Data Catalog ，方式如下：
+ 使用 AWS Glue 主控台，在 AWS Glue Data Catalog中手動建立資料表。如需詳細資訊，請參閱[使用主控台建立資料表](#console-tables)。
+ 在 [AWS Glue API](aws-glue-api.md) 中使用 `CreateTable` 操作，在 AWS Glue Data Catalog中建立資料表。如需詳細資訊，請參閱[CreateTable 動作 (Python: create\$1table)](aws-glue-api-catalog-tables.md#aws-glue-api-catalog-tables-CreateTable)。
+ 使用 CloudFormation 範本。如需詳細資訊，請參閱[適用於 AWS Glue 的AWS CloudFormation](populate-with-cloudformation-templates.md)。

當您使用主控台或 API 手動定義資料表時，需指定資料表結構描述和分類欄位的值，以表示資料來源中的資料類型和格式。如果是爬蟲程式來建立資料表，資料格式和結構描述就會由內建分類器或自訂分類器決定。如需使用 AWS Glue 主控台建立資料表的詳細資訊，請參閱 [使用主控台建立資料表](#console-tables)。

**Topics**
+ [資料表分割區](#tables-partition)
+ [資料表資源連結](#tables-resource-links)
+ [使用主控台建立資料表](#console-tables)
+ [建立分區索引](partition-indexes.md)
+ [使用爬蟲程式更新手動建立的資料目錄資料表](#update-manual-tables)
+ [Data Catalog 資料表屬性](#table-properties)

## 資料表分割區
<a name="tables-partition"></a>

Amazon Simple Storage Service (Amazon S3) 資料夾的 AWS Glue 資料表定義可描述已分割的資料表。例如，為了改善查詢效能，分割的資料表可能使用月份名稱為金鑰，以將每月資料分隔成不同的檔案。在 AWS Glue 中，資料表定義包含資料表的分割金鑰。AWS Glue 在評估 Amazon S3 資料夾中的資料以編目資料表時，會決定要新增個別資料表或分割資料表。

您可以在資料表上建立分割區索引來擷取分割區的子集，而不是載入資料表中的所有分割區。如需使用分割區索引的詳細資訊，請參閱[建立分區索引](partition-indexes.md)。

要讓 AWS Glue 為 Amazon S3 資料夾建立分割資料表，以下所有條件都必須為 true：
+ 檔案的結構描述類似，由 AWS Glue 決定。
+ 檔案的日期格式相同。
+ 檔案的壓縮格式相同。

例如，您可能擁有一個名稱為 `my-app-bucket` 的 Amazon S3 儲存貯體，用於存放 iOS 和 Android 應用程式的銷售資料。資料按照年、月、日分割。iOS 和 Android 銷售的資料檔案有相同的結構描述、日期格式和壓縮格式。在 中 AWS Glue Data Catalog，AWS Glue爬蟲程式會使用年、月和日分割索引鍵建立一個資料表定義。

以下的 Amazon S3 `my-app-bucket` 清單顯示了一些分割區。`=` 符號用於指派分割區金鑰值。

```
   my-app-bucket/Sales/year=2010/month=feb/day=1/iOS.csv
   my-app-bucket/Sales/year=2010/month=feb/day=1/Android.csv
   my-app-bucket/Sales/year=2010/month=feb/day=2/iOS.csv
   my-app-bucket/Sales/year=2010/month=feb/day=2/Android.csv
   ...
   my-app-bucket/Sales/year=2017/month=feb/day=4/iOS.csv
   my-app-bucket/Sales/year=2017/month=feb/day=4/Android.csv
```

## 資料表資源連結
<a name="tables-resource-links"></a>


|  | 
| --- |
| AWS Glue 主控台最近已更新。目前版本的主控台不支援資料表資源連結。 | 

 Data Catalog 也可以包含資料表的*資源連結*。資料表資源連結是本機或共用資料表的連結。您目前只可以在 AWS Lake Formation建立資源連結。建立資料表的資源連結後，您可以在任何使用資料表名稱的地方使用資源連結名稱。連同您擁有或與您共用的資料表，資料表資源連結會由 `glue:GetTables()` 傳回，並顯示為 AWS Glue 主控台中 **Tables (資料表)** 的項目。

 Data Catalog 也可以包含資料庫資源連結。

如需資源連結的詳細資訊，請參閱 *AWS Lake Formation 開發人員指南*中的[建立資源連結](https://docs.aws.amazon.com/lake-formation/latest/dg/creating-resource-links.html)。

## 使用主控台建立資料表
<a name="console-tables"></a>

中的資料表 AWS Glue Data Catalog 是中繼資料定義，代表資料存放區中的資料。您可在執行爬蟲程式時建立資料表，或者也可以在 AWS Glue 主控台中手動建立資料表。在 ** 主控台中的 **TablesAWS Glue (資料表) 清單，會顯示您資料表中繼資料的值。在建立 ETL (擷取、轉換和載入) 任務時，您可以使用資料表的定義來指定來源與目標。

**注意**  
隨著 AWS 管理主控台的最新變更，您可能需要修改現有的 IAM 角色，才能擁有 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-SearchTables](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-SearchTables)許可。針對新角色建立，`SearchTables` API 許可已新增為預設值。

若要開始使用，請登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 的 AWS Glue 主控台。選擇 **Tables** (資料表) 索引標籤，然後使用 **Add tables** (新增資料表) 按鈕來建立資料表 (藉由使用爬蟲程式或手動輸入屬性)。

### 在主控台上新增資料表
<a name="console-tables-add"></a>

若要使用爬蟲程式來新增資料表，請依序選擇 **Add tables** (新增資料表)、**Add tables using a crawler** (使用爬蟲程式來新增資料表)。然後，依照 **Add crawler** (新增爬蟲程式) 精靈中的說明來進行操作。當爬蟲程式執行時，資料表就會新增至 AWS Glue Data Catalog。如需詳細資訊，請參閱[使用編目程式填入 Data Catalog](add-crawler.md)。

如果您知道在 Data Catalog 中建立 Amazon Simple Storage Service (Amazon S3) 資料表定義所需的屬性，則可以使用資料表精靈來建立。依序選擇 **Add tables** (新增資料表)、**Add table manually** (手動新增資料表)，然後依照 **Add table** (新增資料表) 精靈中的說明來進行操作。

透過主控台來手動新增資料表時，請注意下列事項：
+ 如果您預計從 Amazon Athena 存取資料表，則應提供只有英數字元和底線字元的名稱。如需詳細資訊，請參閱 [Athena 名稱](https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html#ate-table-database-and-column-names-allow-only-underscore-special-characters)。
+ 您的來源資料的位置必須是 Amazon S3 路徑。
+ 資料的資料格式必須符合精靈中列出的其中一種格式。對應的分類 SerDe 和其他資料表屬性會根據選擇的格式自動填入。您可以使用下列格式定義資料表：  
**Avro**  
Apache Avro JSON 二進位格式。  
**CSV**  
字元分隔值。您也可以指定逗號、管道、分號、標籤或 Ctrl-A 的分隔符號。  
**JSON**  
JavaScript 物件標記法。  
**XML**  
可擴展標記語言的格式。指定定義資料中資料列的 XML 標籤。資料欄是在資料列標籤中定義。  
**Parquet**  
Apache Parquet 單欄式儲存。  
**ORC**  
最佳化資料列單欄式 (ORC) 檔案格式。旨在高效存放 Hive 資料的格式。
+ 您可以定義資料表的分割區索引鍵。
+ 目前，透過主控台所建立的分區資料表，不能在 ETL 工作中使用。

### 資料表屬性
<a name="console-tables-attributes"></a>

下列是一些重要的資料表屬性：

**名稱**  
此名稱在資料表建立已決定，您無法變更。在許多的 AWS Glue 操作中，都會參照資料表的名稱。

**資料庫**  
您的資料表所在的容器物件。此物件包含存在於 中的資料表組織， AWS Glue Data Catalog 可能與資料存放區中的組織不同。當您刪除資料庫，也會從 Data Catalog 刪除資料庫中內含的所有資料表。

**Description**  
資料表的說明。您可以撰寫說明，來協助您了解資料表的內容。

**資料表格式**  
指定建立標準 AWS Glue 資料表或 Apache Iceberg 格式的資料表。  
Data Catalog 提供下列資料表最佳化選項，以管理資料表儲存並提高 Iceberg 資料表的查詢效能。  
+ **壓縮** – 合併和重寫資料檔案，移除過時的資料，並將分段資料合併為更大、更有效的檔案。
+ **快照保留 **– 快照是 Iceberg 資料表的時間戳記版本。快照保留組態可讓客戶強制執行保留快照的時間長度，以及要保留的快照數量。設定快照保留最佳化工具可透過移除較舊、不必要的快照及其相關聯的基礎檔案，協助管理儲存體負荷。
+ **孤立檔案刪除** – 孤立檔案是 Iceberg 資料表中繼資料不再參考的檔案。這些檔案可能會隨著時間累積，特別是在資料表刪除或 ETL 任務失敗等操作之後。啟用孤立檔案刪除 AWS Glue 可讓 定期識別和移除這些不必要的檔案，釋放儲存空間。
如需詳細資訊，請參閱[最佳化處理 Iceberg 資料表](table-optimizers.md)。

**最佳化組態**  
可以使用預設的設定或自訂設定來啟用資料表最佳化工具。

**IAM 角色**  
 若要執行資料表最佳化工具，服務會代表您擔任 IAM 角色。您可以使用下拉式選單選擇 IAM 角色。請確認角色具有啟用壓縮的必要權限。  
若要進一步了解 IAM 角色的必要權限，請參閱 [資料表最佳化先決條件](optimization-prerequisites.md)。

**Location**  
指標，指向此資料表定義所代表資料存放區中資料的位置。

**分類**  
建立資料表時所提供的分類值。這通常是在爬蟲程式執行時寫入，用來指定來源資料的格式。

**上次更新**  
此資料表在 Data Catalog 中更新的時間和日期 (UTC)。

**加入日期**  
此資料表新增至 Data Catalog 的時間和日期 (UTC)。

**已棄用**  
如果 AWS Glue 發現 Data Catalog 中的資料表不再存在於其原始資料存放區，會在 Data Catalog 中將此資料表標記為已作廢。如果您執行的任務參照了已作廢的資料表，則任務可能會失敗。針對參照已作廢資料表的任務來進行編輯，將這些做為來源和目標的資料表移除。我們建議您刪除不再需要的已作廢資料表。

**連線**  
如果 AWS Glue 需要連線至您的資料存放區，連線的名稱會與資料表相關。

### 檢視與管理資料表詳細資訊
<a name="console-tables-details"></a>

若要檢視現有資料表的詳細資訊，請在清單中選擇資料表名稱，然後選擇 **Action, View details** (動作，檢視詳細資訊)。

資料表的詳細資訊包括資料表的屬性及其結構描述。此檢視會顯示資料表的結構描述，包括欄名稱 (依資料表定義的順序排列)、資料類型和分區金鑰欄位。如果欄為複雜的類型，您可以選擇 **View properties** (檢視屬性) 來顯示該欄位結構的詳細資訊，如下列範例所示：

```
{
"StorageDescriptor": 
    {
      "cols": {
         "FieldSchema": [
           {
             "name": "primary-1",
             "type": "CHAR",
             "comment": ""
           },
           {
             "name": "second ",
             "type": "STRING",
             "comment": ""
           }
         ]
      },
      "location": "s3://aws-logs-111122223333-us-east-1",
      "inputFormat": "",
      "outputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
      "compressed": "false", 
      "numBuckets": "0",
      "SerDeInfo": {
           "name": "",
           "serializationLib": "org.apache.hadoop.hive.serde2.OpenCSVSerde",
           "parameters": {
               "separatorChar": "|"
            }
      },
      "bucketCols": [],
      "sortCols": [],
      "parameters": {},
      "SkewedInfo": {},
      "storedAsSubDirectories": "false"
    },
    "parameters": {
       "classification": "csv"
    }
}
```

如需關於資料表的屬性 (例如 `StorageDescriptor`) 的詳細資訊，請參閱 [StorageDescriptor 結構](aws-glue-api-catalog-tables.md#aws-glue-api-catalog-tables-StorageDescriptor)。

若要變更資料表的結構描述，請選擇 **Edit schema** (編輯結構描述) 來新增和移除欄、變更欄名稱和變更資料類型。

 若要比較資料表的不同版本 (包括其結構描述)，請選擇 **Compare versions** (比較版本) 來檢視資料表兩種結構描述版本的並列比較。如需詳細資訊，請參閱[比較資料表結構描述版本](#console-tables-schema-comparison)。

若要顯示 Amazon S3 分區中所包含的檔案，請選擇 **View partition (檢視分割區)**。對於 Amazon S3 資料表，**Key (金鑰)** 欄會顯示分區金鑰，用來將來源資料存放區中的資料表分區。分割是一種根據索引鍵資料欄的值將資料表分割為相關部分的方法，例如日期、位置或部門。如需關於分區的詳細資訊，請搜尋網際網路，取得「Hive 分區」的相關資訊。

**注意**  
若要取得檢視資料表詳細資訊的逐步指引，請參閱主控台中的 **Explore table** (了解資料表) 教學。

### 比較資料表結構描述版本
<a name="console-tables-schema-comparison"></a>

 當您比較兩個版本的資料表結構定義時，您可以透過展開和折疊巢狀資料列、並排比較兩個版本的結構定義，以及並排檢視資料表屬性，來比較巢狀資料列變更。

 比較版本 

1.  從 AWS Glue 主控台中，依序選擇**資料表**、**動作**和**比較版本**。  
![\[螢幕擷取畫面會顯示選取後的「動作」按鈕。下拉式功能表會顯示「比較版本」選項。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/catalog-table-compare-versions.png)

1.  選擇版本下拉式選單，以選擇要比較的版本。比較結構描述時，「結構描述」索引標籤會以橙色反白顯示。

1.  當您比較兩個版本之間的資料表時，資料表結構描述會顯示在畫面的左側和右側。這可讓您透過並排比較「資料欄名稱」、「資料類型」、「索引鍵」和「註解」欄位，以視覺化方式判斷變更。發生變更時，彩色圖示會顯示所做變更的類型。
   +  已刪除 – 以紅色圖示顯示，指示資料欄已從舊版資料表結構描述中移除的位置。
   +  已編輯或已移動 – 以藍色圖示顯示，指示資料欄在較新版資料表結構描述中修改或移動的位置。
   +  已新增 – 以綠色圖示顯示，指示資料欄新增至較新版資料表結構描述的位置。
   +  巢狀變更 – 以黃色圖示顯示，指示巢狀資料欄包含變更的位置。選擇要展開的資料欄，並檢視已刪除、已編輯、已移動或已新增的資料欄。  
![\[螢幕擷取畫面會顯示兩個版本之間的資料表結構描述比較 左側是較舊版本。右側是較新版本。刪除圖示位於從較舊版本移除且不再於較新版本提供的資料欄旁邊。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/catalog-table-version-comparison.png)

1.  使用篩選欄位搜尋列，根據您在此輸入的字元顯示欄位。如果您在任一資料表版本中輸入資料欄名稱，則篩選的欄位會顯示在兩個資料表版本中，以顯示發生變更的位置。

1.  若要比較屬性，請選擇**屬性索引標籤**。

1.  若要停止比較版本，請選擇**停止比較**，以返回資料表清單。

# 建立分區索引
<a name="partition-indexes"></a>

隨著時間的推移，數十萬個分割區被新增到資料表中。[GetPartitions API](https://docs.aws.amazon.com/glue/latest/webapi/API_GetPartitions.html) 用於擷取資料表中的分割區。API 會傳回符合請求中所提供表達式的分區。

讓我們以 *sales\$1data* 資料表為例，其由 *Country*、*Category*、*Year*、*Month* 和 *creationDate* 索引鍵分區。如果想要取得 2020 年度 *2020 年 8 月 15 日之後* *Books* 類別的所有銷售項目，則必須使用表達式 "Category = 'Books' and creationDate > '2020-08-15'" 對 Data Catalog 發出 `GetPartitions` 請求。

如果資料表上沒有分割區索引，AWS Glue 會載入資料表的所有分割區，然後使用使用者在 `GetPartitions` 請求中提供的查詢表達式來篩選載入的分割區。查詢需要更多的時間來執行，因為沒有索引的資料表上的分割區數目會增加。使用索引，`GetPartitions` 查詢可嘗試擷取分割區的子集，而不是載入資料表中的所有分割區。

**Topics**
+ [關於分割區索引](#partition-index-1)
+ [建立具有分割區索引的資料表](#partition-index-creating-table)
+ [將分割區索引新增至現有資料表](#partition-index-existing-table)
+ [描述資料表上的分割區索引](#partition-index-describing)
+ [使用分割區索引的限制](#partition-index-limitations)
+ [使用索引進行最佳化的 GetPartitions 呼叫](#partition-index-getpartitions)
+ [與引擎整合](#partition-index-integration-engines)

## 關於分割區索引
<a name="partition-index-1"></a>

在您建立分割區索引時，指定已存在於指定資料表上的分割區索引鍵清單。分割區索引是在資料表中定義的分割區索引鍵的子清單。分割區索引可以在資料表上定義的分割區索引鍵的任何排列上建立。對於上述 *sales\$1data* 資料表，可能的索引包括 (country, category, creationDate)、(country, category, year)、(country, category)、(country)、(category, country, year, month) 等。

 Data Catalog 會依建立索引時提供的順序連接分割區值。當分割區新增至資料表時，索引會一致地建立。可以針對字串 (string、char 和 varchar)、數字 (int、bigint、long、tinyint 和 smallint) 和日期 (yyyy-MM-dd) 資料欄類型建立索引。

**支援的資料類型**
+ 日期 – ISO 格式的日期，例如 `YYYY-MM-DD`。例如，日期 `2020-08-15`。該格式使用連字號 (‐) 來分隔年、月和日。索引的允許日期範圍從 `0000-01-01` 到 `9999-12-31`。
+ 字串 – 用單引號或雙引號括住的字串文字。
+ 字元 – 固定長度的字元資料，介於 1 到 255 的指定長度，例如 char(10)。
+ 可變字元 – 可變長度的字元資料，介於 1 到 65535 的指定長度，例如 varchar(10)。
+ 數值 – int、biint、long、tinyint 和 smallint

數值、字串、日期資料類型的索引支援 =、>、> =、<、<= 以及 between 運算子。索引解決方案目前只支援 `AND` 邏輯運算子。使用索引進行篩選的表達式會忽略具有運算子「LIKE」、「IN」、「OR」和「NOT」的子表達式。篩選忽略的子表達式會在套用索引篩選之後擷取的分割區上完成。

對於新增到資料表中的每個分割區，會有一個相應的索引項目建立。對於具有 'n' 個分割區的資料表，1 個分割區索引會產生 'n' 個分割區索引項目。同一個資料表上的 'm' 個分割區索引會產生 'm\$1n' 個分割區索引項目。每個分割區索引項目將根據目前的 AWS Glue Data Catalog 儲存體的定價政策。如需儲存物件定價的詳細資訊，請參閱 [AWS Glue 定價](https://aws.amazon.com/glue/pricing/)。

## 建立具有分割區索引的資料表
<a name="partition-index-creating-table"></a>

您可以在建立資料表期間建立分割區索引。`CreateTable` 要求會取得 [`PartitionIndex` 物件](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-PartitionIndex)的清單作為輸入。指定資料表上最多可以建立 3 個分割區索引。每個分割區索引都需要一個名稱和為資料表定義的 `partitionKeys` 清單。在資料表上建立的索引可以使用 [`GetPartitionIndexes` API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-GetPartitionIndexes) 擷取

## 將分割區索引新增至現有資料表
<a name="partition-index-existing-table"></a>

若要將分割區索引新增至現有資料表，請使用 `CreatePartitionIndex` 操作。每個 `CreatePartitionIndex` 操作只能建立一個 `PartitionIndex`。新增索引不會影響資料表的可用性，因為資料表會在建立索引時繼續可用。

新增分割區的索引狀態設定為 CREATING，並啟動索引資料的建立。如果建立索引的處理程序成功，indexStatus 會更新為 ACTIVE，並且對於不成功的處理程序，索引狀態會更新為 FAILED。索引建立可能會因多種原因而失敗，您可以使用 `GetPartitionIndexes` 作業擷取失敗詳細資訊。可能失敗如下：
+ ENCRYPTED\$1PARTITION\$1ERROR — 不支援在具有加密分割區的資料表上建立索引。
+ INVALID\$1PARTITION\$1TYPE\$1DATA\$1ERROR — 當 `partitionKey` 值不是對應 `partitionKey` 資料類型的有效值時觀察到。例如：具有 'int' 資料類型的 `partitionKey` 有一個 'foo' 值。
+ MISSING\$1PARTITION\$1VALUE\$1ERROR — 當 `indexedKey` 的 `partitionValue` 不存在時觀察到。當資料表沒有一致地進行分割時，可能會發生這種情況。
+ UNSUPPORTED\$1PARTITION\$1CHARACTER\$1ERROR — 當索引分割區索引鍵的值包含字元 \$1u0000、\$1u0001 或 \$1u0002 時觀察到。
+ INTERAL\$1ERROR — 建立索引時發生內部錯誤。

## 描述資料表上的分割區索引
<a name="partition-index-describing"></a>

若要擷取資料表上建立的分割區索引，請使用 `GetPartitionIndexes` 操作。回應會傳回資料表上的所有索引，以及每個索引的目前狀態 (`IndexStatus`)。

分割區索引的 `IndexStatus` 會是下列其中一項：
+ `CREATING` – 正在建立索引，尚無法使用。
+ `ACTIVE`— 索引已準備就緒可供使用。請求可以使用索引來執行最佳化的查詢。
+ `DELETING` – 正在刪除索引，無法再使用。處於活動狀態的索引可以使用 `DeletePartitionIndex` 請求，該請求將狀態從 ACTIVE 移動到 DELETING。
+ `FAILED` — 在現有資料表上建立索引失敗。每個資料表儲存最後 10 個失敗的索引。

在現有資料表上建立的索引的可能狀態轉換是：
+ CREATING → ACTIVE → DELETING
+ CREATING → FAILED

## 使用分割區索引的限制
<a name="partition-index-limitations"></a>

建立分割區索引之後，請注意下列資料表和分割區功能變更：

**建立新分區 (新增索引之後)**  
在資料表上建立分割區索引之後，新增至資料表的所有新分割區都會驗證索引鍵的資料類型檢查。索引索引鍵的分割區值將針對資料類型格式進行驗證。如果資料類型檢查失敗，建立分割區作業將會失敗。對於 *sales\$1data*，如果針對 (category, year) 索引鍵建立索引，其中 category 為 `string` 類型且 year 為 `int` 類型，則建立具有 YEAR 值為「foo」的新分割區將失敗。

啟用索引之後，新增具有索引索引鍵值的分割區，其字元為 U\$10000、U\$100001 和 U\$10002 將會開始失敗。

**資料表更新**  
在資料表上建立分割區索引之後，您就無法修改現有分割區索引鍵的分割區索引鍵名稱，也無法變更與索引註冊之索引鍵的類型或順序。

## 使用索引進行最佳化的 GetPartitions 呼叫
<a name="partition-index-getpartitions"></a>

當您在具有索引的資料表上呼叫 `GetPartitions`，您可以包含表達式，如果適用， Data Catalog 將使用索引 (如果可能)。索引的第一個索引鍵應該在用於篩選索引的表達式中傳遞。篩選中的索引最佳化會盡最大努力應用。 Data Catalog 會嘗試盡可能使用索引最佳化，但如果遺失索引或不受支援的運算子，它會回退到載入所有分割區的現有實作。

於上述 *sales\$1data* 資料表，讓我們新增索引 [Country, Category, Year]。如果表達式中未傳遞 "Country"，註冊的索引將無法使用索引篩選分割區。您最多可以新增 3 個索引，以支援各種查詢模式。

讓我們舉一些範例表達式，看看索引如何在它們上運作：


| 表達式 | 索引的使用方式 | 
| --- | --- | 
|  Country = 'US'  |  索引將用於篩選分割區。  | 
|  Country = 'US' and Category = 'Shoes'  |  索引將用於篩選分割區。  | 
|  Category = 'Shoes'  |  表達式中沒有提供 "country"，所以不會使用索引。所有分割區將被載入以傳回回應。  | 
|  Country = 'US' and Category = 'Shoes' and Year > '2018'  |  索引將用於篩選分割區。  | 
|  Country = 'US' and Category = 'Shoes' and Year > '2018' and month = 2  |  索引將用於擷取 country = "US" 和 category = "shoes" 和 year > 2018 的所有分割區。然後，將執行月份表達式上的篩選。  | 
|  Country = 'US' AND Category = 'Shoes' OR Year > '2018'  |  由於 `OR` 運算子存在於表達式中，因此不會使用索引。  | 
|  Country = 'US' AND Category = 'Shoes' AND (Year = 2017 OR Year = '2018')  |  索引將用於擷取 country = "US" 和 category = "shoes" 的所有分割區然後執行對年份表達式的篩選。  | 
|  Country in ('US', 'UK') AND Category = 'Shoes'  |  由於目前不支援 `IN` 運算子，因此不會使用索引進行篩選。  | 
|  Country = 'US' AND Category in ('Shoes', 'Books')  |  索引將用於擷取具有 country = "US" 的所有分割區，然後執行對「類別」表達式的篩選。  | 
|  Country = 'US' AND Category in ('Shoes', 'Books') AND (creationDate > '2023-9-01'  |  索引將用於擷取 country = "US" 且 creationDate > '2023-9-01' 的所有分區，然後執行對「類別」表達式的篩選。  | 

## 與引擎整合
<a name="partition-index-integration-engines"></a>

AWS Glue 中的索引處於 ACTIVE 狀態後，Redshift Spectrum、Amazon EMR 和 AWS Glue ETL Spark DataFrames 就可以利用索引來擷取分區。[Athena](https://docs.aws.amazon.com/athena/latest/ug/glue-best-practices.html#glue-best-practices-partition-index) 和 [AWS Glue ETL 動態框架](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html#aws-glue-programming-etl-partitions-cat-predicates)會要求您遵循額外的步驟以利用索引進行查詢改進。

### 啟用分區篩選
<a name="enable-partition-filtering-athena"></a>

若要在 Athena 中啟用分區篩選，需要更新資料表屬性，如下所示：

1. 在 AWS Glue 主控台**的資料目錄**下，選擇**資料表**。

1. 選擇 表格。

1. 在**動作**下，選擇**編輯資料表**。

1. 在**資料表屬性**下，新增下列項目：
   + 索引鍵 –`partition_filtering.enabled`
   + 值 – `true`

1. 選擇**套用**。

或者，也可以在 Athena 中執行 [ALTER TABLE SET PROPERTIES](https://docs.aws.amazon.com/athena/latest/ug/alter-table-set-tblproperties.html) 查詢來設定此參數。

```
ALTER TABLE partition_index.table_with_index
SET TBLPROPERTIES ('partition_filtering.enabled' = 'true')
```

## 使用爬蟲程式更新手動建立的資料目錄資料表
<a name="update-manual-tables"></a>

您可能想要手動建立 AWS Glue Data Catalog 資料表，然後使用AWS Glue爬蟲程式保持更新狀態。按排程執行的爬蟲程式可以新增新的分割區，並更新含有任何結構描述變更的資料表。這也適用於從 Apache Hive 中繼存放區移轉來的資料表。

若要執行此作業，當您定義爬蟲程式時，請指定一或多個現有的 Data Catalog 資料表，而不是指定一或多個資料存放區做為抓取來源。爬蟲程式即會抓取目錄資料表指定的資料存放區。在這種情況下，系統就不會建立任何新的資料表，而會更新您手動建立的資料表。

以下是建議您手動建立目錄資料表，並指定目錄資料表做為爬蟲程式來源的其他原因：
+ 您想選擇目錄資料表名稱，而不倚賴目錄資料表命名演算法。
+ 在檔案格式可能會干擾分割區偵測，但資料來源路徑中誤存該檔案的情況下，您想防止建立新的資料表。

如需詳細資訊，請參閱[步驟 2：選擇資料來源和分類器](define-crawler-choose-data-sources.md)。

## Data Catalog 資料表屬性
<a name="table-properties"></a>

 如 CLI AWS 中已知的資料表屬性或參數，是未經驗證的索引鍵和值字串。您可以在資料表中設定自己的屬性，以支援在 AWS Glue外部使用 Data Catalog。使用 Data Catalog 的其他 服務也可以這樣做。在執行任務或爬蟲程式時 AWS Glue 設定一些資料表屬性。除非另有說明，否則這些屬性僅供內部使用，我們不支援其以當前形式繼續存在，也不支援手動變更這些屬性時的產品行為。

 如需 AWS Glue 爬蟲程式所設定資料表屬性的詳細資訊，請參閱 [爬蟲程式在 Data Catalog 資料表上設定的參數](table-properties-crawler.md)。

# 與 Amazon S3 資料表整合
<a name="glue-federation-s3tables"></a>

AWS Glue Data Catalog 與 Amazon S3 Tables 整合，可讓您使用單一目錄探索、查詢 S3 Tables，並將 S3 Tables 與 Amazon S3 資料湖中的資料聯結。當您將 S3 Tables 與 Data Catalog 整合時，服務會建立聯合目錄結構，將 S3 Tables 資源映射至 AWS Glue 目錄物件：
+ S3 資料表儲存貯體會成為 Data Catalog 中的目錄
+ S3 命名空間會成為 AWS Glue 資料庫
+ S3 資料表會變成 AWS Glue 資料表

## 存取控制
<a name="s3-tables-access-controls"></a>

Data Catalog 支援兩種 S3 Tables 整合的存取控制模式：
+ **IAM 存取控制** – 使用 IAM 政策來控制對 S3 Tables 和 Data Catalog 的存取。在此方法中，您需要 S3 Tables 資源和 Data Catalog 物件的 IAM 許可，才能存取資源。
+ **AWS Lake Formation 存取控制** – 除了 IAM AWS Glue 許可之外，還使用 AWS Lake Formation 授予來控制透過 Data Catalog 對 S3 Tables 的存取。在此模式中，主體需要 IAM 許可才能與 Data Catalog 互動，並且 AWS Lake Formation 授予 會決定主體可存取的目錄資源 （資料庫、資料表、資料欄、資料列）。此模式同時支援粗粒存取控制 （資料庫層級和資料表層級授予） 和精細存取控制 （資料欄層級和資料列層級安全性）。設定已註冊角色並啟用憑證販賣時，委託人不需要 S3 Tables IAM 許可，因為 會使用已註冊角色代表委託人 AWS Lake Formation 提供憑證。 AWS Lake Formation 存取控制也支援第三方分析引擎的憑證販賣。如需詳細資訊，請參閱《 *AWS Lake Formation 開發人員指南*》中的[建立 S3 資料表目錄](https://docs.aws.amazon.com/lake-formation/latest/dg/create-s3-tables-catalog.html)。

您可以隨著需求發展，在存取控制模式之間遷移。

## 自動掛載的目錄階層
<a name="s3-tables-catalog-hierarchy"></a>

當您使用 Amazon S3 管理主控台將 S3 Tables 與 Data Catalog 整合時，主控台會在您帳戶中的 Data Catalog `s3tablescatalog`中建立名為 的聯合目錄 AWS 。 Amazon S3 此聯合目錄可做為該帳戶和區域中所有現有和未來 S3 資料表儲存貯體的父目錄。整合會映射下列階層中的 Amazon S3 資料表儲存貯體資源：
+ **聯合目錄** – `s3tablescatalog`（自動建立）
+ **子目錄** – 每個 S3 資料表儲存貯體都會在 下成為子目錄 `s3tablescatalog`
+ **資料庫** – 資料表儲存貯體中的每個 S3 命名空間都會成為資料庫
+ **資料表** – 命名空間中的每個 S3 資料表都會成為資料表

例如，如果您有一個名為 "analytics-bucket" 的 S3 資料表儲存貯體，其命名空間為 "sales"，其中包含資料表 "transactions"，則資料目錄中的完整路徑為： `s3tablescatalog/analytics-bucket/sales/transactions`

此四部分階層適用於 S3 Tables 和 Data Catalog 位於相同帳戶中的相同 AWS 帳戶案例。對於跨帳戶案例，您可以在 Data Catalog 中手動掛載個別 S3 資料表儲存貯體，這會建立三部分階層。

## 支援的區域
<a name="s3-tables-supported-regions"></a>

S3 Tables 與 Data Catalog 的整合可在下列 AWS 區域使用：


| 區域代碼 | 區域名稱 | 
| --- | --- | 
| us-east-1 | 美國東部 (維吉尼亞北部) | 
| us-east-2 | 美國東部 (俄亥俄) | 
| us-west-1 | 美國西部 (加利佛尼亞北部) | 
| us-west-2 | 美國西部 (奧勒岡) | 
| af-south-1 | 非洲 (開普敦) | 
| ap-east-1 | 亞太地區 (香港) | 
| ap-east-2 | 亞太區域 (台北) | 
| ap-northeast-1 | 亞太地區 (東京) | 
| ap-northeast-2 | 亞太地區 (首爾) | 
| ap-northeast-3 | 亞太地區 (大阪) | 
| ap-south-1 | 亞太地區 (孟買) | 
| ap-south-2 | 亞太地區 (海德拉巴) | 
| ap-southeast-1 | 亞太地區 (新加坡) | 
| ap-southeast-2 | 亞太地區 (悉尼) | 
| ap-southeast-3 | 亞太地區 (雅加達) | 
| ap-southeast-4 | 亞太地區 (墨爾本) | 
| ap-southeast-5 | 亞太地區 (馬來西亞) | 
| ap-southeast-6 | 亞太區域 (紐西蘭) | 
| ap-southeast-7 | 亞太區域 (泰國) | 
| ca-central-1 | 加拿大 (中部) | 
| ca-west-1 | 加拿大西部 (卡加利) | 
| eu-central-1 | 歐洲 (法蘭克福) | 
| eu-central-2 | 歐洲 (蘇黎世) | 
| eu-north-1 | 歐洲 (斯德哥爾摩) | 
| eu-south-1 | 歐洲 (米蘭) | 
| eu-south-2 | 歐洲 (西班牙) | 
| eu-west-1 | 歐洲 (愛爾蘭) | 
| eu-west-2 | 歐洲 (倫敦) | 
| eu-west-3 | Europe (Paris) | 
| il-central-1 | 以色列 (特拉維夫) | 
| mx-central-1 | 墨西哥 (中部) | 
| sa-east-1 | 南美洲 (聖保羅) | 

**Topics**
+ [存取控制](#s3-tables-access-controls)
+ [自動掛載的目錄階層](#s3-tables-catalog-hierarchy)
+ [支援的區域](#s3-tables-supported-regions)
+ [先決條件](s3tables-catalog-prerequisites.md)
+ [啟用 S3 Tables 與 Data Catalog 整合](enable-s3-tables-catalog-integration.md)
+ [將資料庫和資料表新增至 S3 Tables 目錄](create-databases-tables-s3-catalog.md)
+ [共用 S3 Tables 目錄物件](share-s3-tables-catalog.md)
+ [管理 S3 Tables 整合](manage-s3-tables-catalog-integration.md)

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

在 AWS Glue Data Catalog 中建立 S3 Tables 的聯合型錄之前，請確定您的 IAM 主體 （使用者或角色） 具有必要的許可。

## 所需的 IAM 許可
<a name="s3tables-required-iam-permissions"></a>

您的 IAM 主體需要下列許可才能啟用 S3 Tables 整合：

**AWS Glue 許可**：
+ `glue:CreateCatalog` – `s3tablescatalog` 建立聯合目錄時需要
+ `glue:GetCatalog` – 檢視目錄詳細資訊時需要
+ `glue:GetDatabase` – 將 S3 命名空間檢視為資料庫時需要
+ `glue:GetTable` – 檢視 S3 資料表時需要
+ `glue:passConnection` – 授予呼叫委託人將`aws:s3tables`連線委派給 AWS Glue 服務的權利

**S3 Tables 許可** （用於 IAM 存取控制）：
+ `s3tables:CreateTableBucket`
+ `s3tables:GetTableBucket`
+ `s3tables:CreateNamespace`
+ `s3tables:GetNamespace`
+ `s3tables:ListNamespaces`
+ `s3tables:CreateTable`
+ `s3tables:GetTable`
+ `s3tables:ListTables`
+ `s3tables:UpdateTableMetadataLocation`
+ `s3tables:GetTableMetadataLocation`
+ `s3tables:GetTableData`
+ `s3tables:PutTableData`

## IAM 政策範例
<a name="s3tables-iam-policy-example"></a>

下列 IAM 政策提供在 IAM 模式中啟用 S3 Tables 與 Data Catalog 整合所需的最低許可：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "GlueDataCatalogPermissions",
      "Effect": "Allow",
      "Action": [
        "glue:CreateCatalog",
        "glue:GetCatalog",
        "glue:GetDatabase",
        "glue:GetTable"
      ],
      "Resource": [
        "arn:aws:glue:region:account-id:catalog/s3tablescatalog",
        "arn:aws:glue:region:account-id:database/s3tablescatalog/*/*",
        "arn:aws:glue:region:account-id:table/s3tablescatalog/*/*/*"
      ]
    },
    {
      "Sid": "S3TablesDataAccessPermissions",
      "Effect": "Allow",
      "Action": [
        "s3tables:GetTableBucket",
        "s3tables:GetNamespace",
        "s3tables:GetTable",
        "s3tables:GetTableMetadataLocation",
        "s3tables:GetTableData"
      ],
      "Resource": [
        "arn:aws:s3tables:region:account-id:bucket/*",
        "arn:aws:s3tables:region:account-id:bucket/*/table/*"
      ]
    }
  ]
}
```

# 啟用 S3 Tables 與 Data Catalog 整合
<a name="enable-s3-tables-catalog-integration"></a>

您可以使用 Amazon S3 管理主控台或 啟用與 AWS Glue Data Catalog 的 S3 Tables 整合 AWS CLI。 Amazon S3 當您使用主控台啟用整合時， 會 AWS 建立名為 的聯合目錄`s3tablescatalog`，自動探索和掛載 AWS 帳戶和區域中的所有 S3 資料表儲存貯體。

## 使用 Amazon S3 管理主控台啟用 S3 Tables 整合 Amazon S3
<a name="enable-s3-tables-console"></a>

1. 開啟位於 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇**資料表儲存貯體**。

1. 選擇 **建立資料表儲存貯體**。

1. 輸入**資料表儲存貯體名稱**，並確認已選取**啟用整合**核取方塊。

1. 選擇 **建立資料表儲存貯體**。

Amazon S3 會自動整合您在該區域中的資料表儲存貯體。您第一次在任何區域中整合資料表儲存貯體時，Amazon S3 `s3tablescatalog`會在該區域中的資料目錄中建立 。

建立目錄後，帳戶和區域中的所有 S3 資料表儲存貯體都會自動掛載為子目錄。您可以透過導覽至 Data Catalog 中的目錄來檢視資料庫 （命名空間） 和資料表。

## 使用 啟用 S3 Tables 整合 AWS CLI
<a name="enable-s3-tables-cli"></a>

使用 `glue create-catalog`命令來建立`s3tablescatalog`目錄。

```
aws glue create-catalog \
  --name "s3tablescatalog" \
  --catalog-input '{
    "Description": "Federated catalog for S3 Tables",
    "FederatedCatalog": {
      "Identifier": "arn:aws:s3tables:region:account-id:bucket/*",
      "ConnectionName": "aws:s3tables"
    },
    "CreateDatabaseDefaultPermissions": [{
      "Principal": {
        "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
      },
      "Permissions": ["ALL"]
    }],
    "CreateTableDefaultPermissions": [{
      "Principal": {
        "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
      },
      "Permissions": ["ALL"]
    }]
  }'
```

將*區域*取代為 AWS 區域，將*帳戶 ID *取代為 AWS 帳戶 ID。

## 驗證整合
<a name="verify-s3-tables-integration"></a>

建立目錄後，您可以透過列出子目錄來驗證 S3 資料表儲存貯體是否已掛載：

```
aws glue get-catalogs \
  --parent-catalog-id s3tablescatalog
```

# 將資料庫和資料表新增至 S3 Tables 目錄
<a name="create-databases-tables-s3-catalog"></a>

請確定您擁有必要的許可，以列出和建立 區域中 Data Catalog 中的目錄、資料庫和資料表。確保已在 AWS 您的帳戶和區域中啟用 S3 Tables 整合。

## 將資料庫新增至 S3 Tables 目錄
<a name="add-database-s3-tables-catalog"></a>

### 新增資料庫 （主控台）
<a name="add-database-s3-tables-console"></a>

1. 在 https：//[https://console.aws.amazon.com/glue/home](https://console.aws.amazon.com/glue/home) 開啟 AWS Glue 主控台。

1. 在左側的導覽窗格中，選擇**資料庫**。

1. 選擇**新增資料庫**。

1. **在 S3 Tables 聯合目錄中選擇 Glue 資料庫**。

1. 輸入資料庫的唯一名稱。

1. 選取映射至 S3 Tables 中資料表儲存貯體的目標目錄。

1. 選擇 **Create Database (建立資料庫)**。

### 新增資料庫 (AWS CLI)
<a name="add-database-s3-tables-cli"></a>

```
aws glue create-database \
  --region region \
  --catalog-id "account-id:s3tablescatalog/my-catalog" \
  --database-input '{"Name": "my-database"}'
```

## 將資料表新增至 S3 Tables 目錄
<a name="add-table-s3-tables-catalog"></a>

### 新增資料表 （主控台）
<a name="add-table-s3-tables-console"></a>

1. 在 https：//[https://console.aws.amazon.com/glue/home](https://console.aws.amazon.com/glue/home) 開啟 AWS Glue 主控台。

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

1. 在目錄下拉式清單中選取適當的 S3 Tables 目錄。

1. 選擇**新增資料表**。

1. 輸入資料表的唯一名稱。

1. 在目錄下拉式清單中確認已選取正確的 S3 Tables 目錄。

1. 在資料庫下拉式清單中選取資料庫。

1. 透過輸入 JSON 或個別新增每個資料欄來輸入資料表結構描述。

1. 選擇 **Create Table** (建立資料表)。

### 新增資料表 (AWS CLI)
<a name="add-table-s3-tables-cli"></a>

```
aws glue create-table \
  --region region \
  --catalog-id "account-id:s3tablescatalog/my-catalog" \
  --database-name "my-database" \
  --table-input '{
    "Name": "my-table",
    "Parameters": {
      "classification": "",
      "format": "ICEBERG"
    },
    "StorageDescriptor": {
      "Columns": [
        {"Name": "id", "Type": "int", "Parameters": {}},
        {"Name": "val", "Type": "string", "Parameters": {}}
      ]
    }
  }'
```

# 共用 S3 Tables 目錄物件
<a name="share-s3-tables-catalog"></a>

使用 IAM 存取控制時，您可以使用相同帳戶共用 AWS Glue 的資源連結，與其他使用者共用 S3 Tables 目錄物件。對於跨帳戶共用，您可以與其他 AWS 帳戶共用 S3 資料表儲存貯體，而且收件人帳戶中的 IAM 角色或使用者可以使用共用資料表儲存貯體建立 AWS Glue 目錄物件。

## 使用資源連結在相同帳戶中共用
<a name="share-s3-tables-resource-links"></a>

資源連結可讓您在 AWS Glue 預設目錄中顯示的 中建立 AWS Glue 資料庫和資料表`s3tablescatalog`的參考。這有助於組織資料存取或建立資料表的邏輯分組。

### 建立資源連結 （主控台）
<a name="share-s3-tables-resource-link-console"></a>

1. 在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台。

1. 在導覽窗格中，選擇**目錄**。

1. 在**目錄**清單中，選取 **s3tablescatalog**。

1. 從 選取您要共用的資料表`s3tablescatalog`。

1. 選擇**動作**，然後選擇**建立資源連結**。

1. 針對**資源連結名稱**，輸入資源連結的名稱。

1. 針對**目標資料庫**，選取您要建立資源連結的資料庫。

1. 在**描述**，請輸入描述。

1. 選擇**建立**。

資源連結會出現在目標資料庫中，並指向 中的原始資料表`s3tablescatalog`。

### 建立資源連結 (AWS CLI)
<a name="share-s3-tables-resource-link-cli"></a>

建立資料庫資源連結：

```
aws glue create-database \
  --database-name "my-database-resource-link" \
  --database-input '{
    "Name": "sales_data_link",
    "TargetDatabase": {
      "CatalogId": "account-id:s3tablescatalog/analytics-bucket",
      "DatabaseName": "sales"
    }
  }'
```

建立資料表資源連結：

```
aws glue create-table \
  --table-name "my-table-resource-link" \
  --table-input '{
    "Name": "sales_data_link",
    "TargetTable": {
      "CatalogId": "account-id:s3tablescatalog/analytics-bucket",
      "DatabaseName": "sales",
      "Name": "transactions"
    }
  }'
```

# 管理 S3 Tables 整合
<a name="manage-s3-tables-catalog-integration"></a>

## 啟用 AWS Lake Formation
<a name="manage-s3-tables-enable-lf"></a>

當您想要擴展資料控管需求時，您可以 AWS Lake Formation 為 S3 Tables 目錄啟用 。 AWS Lake Formation 提供資料庫樣式的授予，以管理精細的存取、使用標籤型存取擴展許可，以及根據使用者屬性授予許可，例如 S3 Tables 中資料表的群組關聯。

前往 AWS Lake Formation 管理主控台， AWS Lake Formation 為您的 S3 Tables 目錄啟用 AWS Glue。如需詳細資訊，請參閱《 *AWS Lake Formation 開發人員指南*》中的[建立 S3 資料表目錄](https://docs.aws.amazon.com/lake-formation/latest/dg/create-s3-tables-catalog.html)。

## 刪除 S3 Tables 整合
<a name="manage-s3-tables-delete-integration"></a>

您可以透過刪除 Data Catalog 中的目錄整合來刪除 S3 Tables 整合。此操作只會刪除 Data Catalog 中的中繼資料，不會刪除 S3 Tables 中的資源。

確保您擁有列出、編輯和刪除目錄物件的必要許可 AWS Glue。

### 刪除整合 （主控台）
<a name="delete-s3-tables-console"></a>

1. 在 https：//[https://console.aws.amazon.com/glue/home](https://console.aws.amazon.com/glue/home) 開啟 AWS Glue 主控台。

1. 在導覽窗格中，選擇**目錄**。

1. 在**目錄**清單中，選取 **s3tablescatalog**。

1. 選擇 **刪除**。

1. 確認刪除目錄也會刪除資料目錄中所有相關聯的目錄物件。

1. 選擇 **刪除**。

### 刪除整合 (AWS CLI)
<a name="delete-s3-tables-cli"></a>

```
aws glue delete-catalog \
  --region region \
  --catalog-id "s3tablescatalog"
```

# 與其他 AWS 服務整合
<a name="populate-dc-other-services"></a>

 雖然您可以使用 來填入 AWS Glue 編目程式 AWS Glue Data Catalog，但有數個 AWS 服務可以自動與 整合，並為您填入目錄。下列各節提供可填入 Data Catalog 之 AWS 服務支援的特定使用案例的詳細資訊。

**Topics**
+ [AWS Lake Formation](#lf-dc)
+ [Amazon Athena](#ate-dc)

## AWS Lake Formation
<a name="lf-dc"></a>

 AWS Lake Formation 是一項服務，可讓您更輕鬆地在其中設定安全的資料湖 AWS。Lake Formation 建置在 和 Lake Formation 上 AWS Glue，並 AWS Glue 共用相同的 AWS Glue Data Catalog。您可以使用 Lake Formation 註冊 Amazon S3 資料位置，並使用 Lake Formation 主控台在 AWS Glue Data Catalog 中建立資料庫和資料表、定義資料存取政策，以及從集中位置稽核資料湖的資料存取。可以使用 Lake Formation 精細存取控制來管理現有的 Data Catalog 資源和 Amazon S3 資料位置。

使用向 Lake Formation 註冊的資料，您可以安全地跨 IAM 主體、 AWS 帳戶、 AWS 組織和組織單位共用 Data Catalog 資源。

 如需使用 Lake Formation 建立 Data Catalog 資源的詳細資訊，請參閱《 AWS Lake Formation 開發人員指南》中的[建立 Data Catalog 資料表和資料庫](https://docs.aws.amazon.com/lake-formation/latest/dg/populating-catalog.html)。

## Amazon Athena
<a name="ate-dc"></a>

 Amazon Athena 使用 Data Catalog 來儲存和擷取 AWS 帳戶中 Amazon S3 資料的資料表中繼資料。資料表中繼資料可讓 Athena 查詢引擎知道如何尋找、讀取和處理您想要查詢的資料。

 您可以直接使用 Athena `CREATE TABLE`陳述式 AWS Glue Data Catalog 來填入 。可以手動定義和填入 Data Catalog 中的結構描述和分區中繼資料，而不需要執行編目程式。

1. 在 Athena 主控台中，建立將在 Data Catalog 中存放資料表中繼資料的資料庫。

1. 使用 `CREATE EXTERNAL TABLE` 陳述式來定義資料來源的結構描述。

1. 如果資料已分區，請使用 `PARTITIONED BY` 子句來定義任何分區索引鍵。

1. 使用 `LOCATION` 子句來指定存放實際資料檔案的 Amazon S3 路徑。

1. 執行 `CREATE TABLE` 陳述式。

    此查詢會根據您定義的結構描述和分區，在 Data Catalog 中建立資料表中繼資料，而不會對資料進行實際網路爬取。

可以在 Athena 中查詢資料表，其將使用 Data Catalog 中的中繼資料來存取和查詢 Amazon S3 中的資料檔案。

 如需詳細資訊，請參閱《Amazon Athena 使用者指南》中的[建立資料庫和資料表](https://docs.aws.amazon.com/athena/latest/ug/work-with-data.html)。

# Data Catalog 設定
<a name="console-data-catalog-settings"></a>

 Data Catalog 設定包含為您帳戶中的 Data Catalog 設定加密和許可選項的選項。

![\[螢幕擷取畫面顯示 Data Catalog 設定模式。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/data_catalog_settings.png)


**變更資料目錄的精細存取控制**

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

1.  選擇加密選項。
   +  **中繼資料加密** – 勾選此核取方塊，以加密 Data Catalog 中的中繼資料。中繼資料會使用您指定的 AWS Key Management Service (AWS KMS) 金鑰進行靜態加密。如需詳細資訊，請參閱[加密您的資料目錄](encrypt-glue-data-catalog.md)。
   +  **加密連線密碼** – 勾選此核取方塊，以在建立或更新連線時為 AWS Glue 連線物件加密密碼。密碼會使用您指定的 AWS KMS 金鑰加密。傳回密碼時，會加密密碼。此選項套用至資料目錄​中的所有 AWS Glue​ 連線。如果您清除此核取方塊，先前加密的密碼仍會使用建立或更新時使用的金鑰進行加密。如需有關 AWS Glue 連線的詳細資訊，請參閱 [連線至資料](glue-connections.md)。

     當您啟用此選項時，請選擇 AWS KMS 金鑰，或選擇**輸入金鑰 ARN，**並提供金鑰的 Amazon Resource Name (ARN)。以 ` arn:aws:kms:region:account-id:key/key-id ` 的形式輸入 ARN。您也可以提供 ARN 做為金鑰別名，例如 ` arn:aws:kms:region:account-id:alias/alias-name `。
**重要**  
 若選擇此選項，則建立或更新連線的使用者或角色必須擁有指定 KMS 金鑰的 `kms:Encrypt` 許可。​ 

     如需詳細資訊，請參閱[加密連線密碼](encrypt-connection-passwords.md)。

1.  選擇 **Settings (設定)**，然後在 **Permissions (許可)** 編輯器中新增政策陳述式，以變更您帳戶之資料目錄的精細存取控制。一次只有一個政策可以連接至資料目錄。您可以將 JSON 資源政策貼到此控制項中。如需詳細資訊，請參閱[Glue AWS 中的資源型政策](security_iam_service-with-iam.md#security_iam_service-with-iam-resource-based-policies)。

1.  選擇 **Save (儲存)**，以使用您進行的任何變更來更新資料目錄。

 您也可以使用 AWS Glue API 操作來放置、取得和刪除資源政策。如需詳細資訊，請參閱[中的安全 APIs AWS Glue](aws-glue-api-jobs-security.md)。

# 填入並管理交易資料表
<a name="populate-otf"></a>

[Apache Iceberg](https://iceberg.apache.org/)、[Apache Hudi](https://hudi.incubator.apache.org/) 和 Linux Foundation [Delta Lake](https://delta.io/) 是開放原始碼資料表格式，旨在處理 Apache Spark 中的大規模資料分析和資料湖工作負載。

您可以使用 AWS Glue Data Catalog 下列方法在 中填入 Iceberg、Hudi 和 Delta Lake 資料表：
+ AWS Glue 編目程式； – AWS Glue 編目程式可以自動探索和填入資料目錄中的 Iceberg、Hudi 和 Delta Lake 資料表中繼資料。如需詳細資訊，請參閱[使用編目程式填入 Data Catalog](add-crawler.md)。
+ AWS Glue ETL 任務 – 您可以建立 ETL 任務，將資料寫入 Iceberg、Hudi 和 Delta Lake 資料表，並在 Data Catalog 中填入其中繼資料。如需詳細資訊，請參閱[搭配 AWS Glue ETL 任務使用資料湖架構](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-datalake-native-frameworks.html)。
+ AWS Glue 主控台、 AWS Lake Formation 主控台 AWS CLI 或 API – 您可以使用 AWS Glue 主控台、Lake Formation 主控台或 API，在 Data Catalog 中建立和管理 Iceberg 資料表定義。

**Topics**
+ [建立 Apache Iceberg 資料表](#creating-iceberg-tables)
+ [最佳化處理 Iceberg 資料表](table-optimizers.md)
+ [最佳化 Iceberg 資料表的查詢效能](iceberg-column-statistics.md)

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

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

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

您可以使用 AWS Glue 或 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 許可政策。如需詳細資訊，請參閱[管理許可](https://docs.aws.amazon.com/lake-formation/latest/dg/managing-permissions.html)。

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

### 先決條件
<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 位置新增至您的資料湖](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)。

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

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

     如需資料位置許可的詳細資訊，請參閱[基礎資料存取控制](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-underlying-data.html#data-location-permissions)。

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

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

您可以使用 AWS Glue 或 Lake Formation 主控台或本頁所記載 AWS Command Line Interface 的方式建立 Iceberg v1 和 v2 資料表。也可以使用 AWS Glue 編目程式來建立 Iceberg 資料表。如需詳細資訊，請參閱《 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/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台。

1. 在 Data Catalog 下，選擇**資料表**，然後使用**建立資料表**按鈕來指定下列屬性：
   + **資料表名稱** – 輸入資料表名稱。如果使用 Athena 來存取資料表，請使用《Amazon Athena 使用者指南》中的這些[命名秘訣](https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html)。
   + **資料庫** – 選擇現有資料庫或建立新資料庫。
   + **說明** – 資料表的說明。您可以撰寫說明，來協助您了解資料表的內容。
   + **資料表格式** – 對於**資料表格式**，選擇 Apache Iceberg。
   + **啟用壓縮** – 選擇**啟用壓縮**，將資料表中的小型 Amazon S3 物件壓縮為較大的物件。
   + **IAM 角色** – 為了執行壓縮，服務會代表您擔任 IAM 角色。您可以使用下拉式選單選擇 IAM 角色。請確認角色具有啟用壓縮的必要權限。

     若要進一步了解必要的許可，請參閱 [資料表最佳化先決條件](optimization-prerequisites.md)。
   + **位置** – 指定在 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/"
            }
        }'
```

------

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

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

AWS Glue 支援多個資料表最佳化選項，以增強 AWS 分析引擎和 ETL 任務所使用的 Apache Iceberg 資料表管理和效能。這些最佳化工具可提供高效儲存使用率、改善的查詢效能以及有效的資料管理。有三種類型的資料表最佳化工具可用於 AWS Glue：
+ **壓縮** – 資料壓縮會壓縮小型資料檔案，以減少儲存用量並提高讀取效能。合併和重寫資料檔案，以移除過時的資料，並將分段資料合併為更大、更有效的檔案。可以設定壓縮以自動執行。

  Binpack 是 Apache Iceberg 中的預設壓縮策略。其會將較小的資料檔案合併為較大的檔案，以獲得最佳效能。壓縮也支援將類似資料叢集在一起的 sort 和 Z order 策略。sort 會根據指定的資料欄整理資料，從而提高篩選操作的查詢效能。Z-order 會建立已排序的資料集，在同時查詢多個資料欄時可提高查詢效能。所有三種壓縮策略 - bincpak, sort, and Z-order - 可減少查詢引擎掃描的資料量，進而降低查詢處理成本。
+ **快照保留 **– 快照是 Iceberg 資料表的時間戳記版本。快照保留組態可讓客戶強制執行保留快照的時間長度，以及要保留的快照數量。設定快照保留最佳化工具可透過移除較舊、不必要的快照及其相關聯的基礎檔案，協助管理儲存體負荷。
+ **孤立檔案刪除** – 孤立檔案是 Iceberg 資料表中繼資料不再參考的檔案。這些檔案可能會隨著時間累積，特別是在資料表刪除或 ETL 任務失敗等操作之後。啟用孤立檔案刪除 AWS Glue 可讓 定期識別和移除這些不必要的檔案，釋放儲存空間。

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

 下列影片示範如何在 Data Catalog 中設定 Iceberg 資料表的最佳化工具。

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


**Topics**
+ [資料表最佳化先決條件](optimization-prerequisites.md)
+ [目錄層級資料表最佳化工具](catalog-level-optimizers.md)
+ [壓縮最佳化](compaction-management.md)
+ [快照保留最佳化](snapshot-retention-management.md)
+ [刪除孤立檔案](orphan-file-deletion.md)
+ [檢視最佳化詳細資訊](view-optimization-status.md)
+ [檢視 Amazon CloudWatch 指標](view-optimization-metrics.md)
+ [刪除最佳化工具](delete-optimizer.md)
+ [考量和限制](optimizer-notes.md)
+ [資料表最佳化工具的支援區域](regions-optimizers.md)

# 資料表最佳化先決條件
<a name="optimization-prerequisites"></a>

資料表最佳化工具會假設您在為資料表啟用最佳化選項 （壓縮、快照保留和孤立檔案刪除） 時所指定的 AWS Identity and Access Management (IAM) 角色許可。可以為所有最佳化工具建立一個角色，或為每個最佳化工具建立單獨角色。

**注意**  
孤立檔案刪除最佳化工具不需要 `glue:updateTable` 或 `s3:putObject` 許可。快照過期和壓縮最佳化工具需要相同的許可集。

IAM 角色必須具有讀取資料和更新 Data Catalog 中繼資料的權限。您可以建立 IAM 角色，並連接下列內嵌政策：
+ 新增下列內嵌政策，為未註冊資料的位置授予 Amazon S3 讀取/寫入許可 AWS Lake Formation。此政策也包含更新 Data Catalog 中資料表的許可，以及允許 AWS Glue 在日誌中新增 Amazon CloudWatch 日誌和發佈指標的許可。針對 Amazon S3 中未向 Lake Formation 註冊的來源資料，存取權將由 Amazon S3 和 AWS Glue 動作的 IAM 權限政策決定。

  在下列內嵌政策中，請將 `bucket-name` 取代為 Amazon S3 儲存貯體名稱，將 `aws-account-id` 和 `region` 取代為有效的 AWS 帳號和 Data Catalog 的區域，將 `database_name` 取代為資料庫的名稱，以及將 `table_name` 取代為資料表的名稱。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "s3:PutObject",
                  "s3:GetObject",
                  "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": [
                  "glue:UpdateTable",
                  "glue:GetTable"
              ],
              "Resource": [
                  "arn:aws:glue:us-east-1:111122223333:table/<database-name>/<table-name>",
                  "arn:aws:glue:us-east-1:111122223333:database/<database-name>",
                  "arn:aws:glue:us-east-1:111122223333:catalog"
              ]
          },
          {
              "Effect": "Allow",
              "Action": [
                  "logs:CreateLogGroup",
                  "logs:CreateLogStream",
                  "logs:PutLogEvents"
              ],
              "Resource": [
                  "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue/iceberg-compaction/logs:*",
                  "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue/iceberg-retention/logs:*",
                  "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue/iceberg-orphan-file-deletion/logs:*"
              ]
          }
      ]
  }
  ```

------
+ 使用下列政策針對向 Lake Formation 註冊的資料啟用壓縮功能。

  如果最佳化角色沒有在資料表上授權的 `IAM_ALLOWED_PRINCIPALS` 群組許可，則該角色需要資料表的 Lake Formation `ALTER`、`DESCRIBE`、`INSERT` 和 `DELETE` 許可。

  如需有關向 Lake Formation 註冊 Amazon S3 儲存貯體的詳細資訊，請參閱[將 Amazon S3 位置新增至您的資料湖](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)。

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

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "lakeformation:GetDataAccess"
        ],
        "Resource": "*"
      },
      {
        "Effect": "Allow",
        "Action": [
          "glue:UpdateTable",
          "glue:GetTable"
        ],
        "Resource": [
          "arn:aws:glue:us-east-1:111122223333:table/databaseName/tableName",
          "arn:aws:glue:us-east-1:111122223333:database/databaseName",
          "arn:aws:glue:us-east-1:111122223333:catalog"
        ]
      },
      {
        "Effect": "Allow",
        "Action": [
          "logs:CreateLogGroup",
          "logs:CreateLogStream",
          "logs:PutLogEvents"
        ],
        "Resource": [
          "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue/iceberg-compaction/logs:*",
          "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue/iceberg-retention/logs:*",
          "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue/iceberg-orphan-file-deletion/logs:*"
        ]
      }
    ]
  }
  ```

------
+ (選用) 若要使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)進行加密之 Amazon S3 儲存貯體中的資料來最佳化 Iceberg 資料表，則壓縮角色需要解密 Amazon S3 物件的權限，並產生新的資料金鑰以將物件寫入加密的儲存貯體。將下列政策新增至所需的 AWS KMS 金鑰。我們僅支援儲存貯體層級加密。

  ```
  {
      "Effect": "Allow",
      "Principal": {
          "AWS": "arn:aws:iam::<aws-account-id>:role/<optimizer-role-name>"
      },
      "Action": [
          "kms:Decrypt",
          "kms:GenerateDataKey"
      ],
      "Resource": "*"
  }
  ```
+  (選用) 針對向 Lake Formation 註冊的資料位置，用於註冊該位置的角色需要解密 Amazon S3 物件並產生新的資料金鑰以將物件寫入加密儲存貯體的權限。如需詳細資訊，請參閱[註冊加密的 Amazon S3 位置](https://docs.aws.amazon.com/lake-formation/latest/dg/register-encrypted.html)。
+ （選用） 如果 AWS KMS 金鑰存放在不同的 AWS 帳戶中，您需要包含壓縮角色的下列許可。

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

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "kms:Decrypt",
          "kms:GenerateDataKey"
        ],
        "Resource": [
          "arn:aws:kms:us-east-1:111122223333:key/key-id"
        ]
      }
    ]
  }
  ```

------
+  您用來執行壓縮程序的角色必須具有該角色的 `iam:PassRole` 權限。

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

****  

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

------
+ 將下列信任政策新增至 AWS Glue 服務的角色，以擔任 IAM 角色來執行壓縮程序。

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

****  

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

------
+ <a name="catalog-optimizer-requirement"></a> （選用） 若要更新 Data Catalog 設定以啟用目錄層級資料表最佳化，所使用的 IAM 角色必須具有根目錄的 `glue:UpdateCatalog` 許可或 AWS Lake Formation `ALTER CATALOG` 許可。您可以使用 `GetCatalog` API 驗證目錄屬性。

# 目錄層級資料表最佳化工具
<a name="catalog-level-optimizers"></a>

使用一次性目錄組態，您可以為 AWS Glue Data Catalog中所有新的和更新的 Apache Iceberg 資料表設定自動最佳化工具，例如壓縮、快照保留和孤立檔案刪除。目錄層級最佳化工具組態可讓您在目錄內的所有資料表上套用一致的最佳化工具設定，無需為每個資料表個別設定最佳化工具。

資料湖管理員可以在 Lake Formation 主控台中選取預設目錄，並使用 `Table optimization` 選項啟用最佳化工具，以設定資料表最佳化工具。當您在 Data Catalog 中建立新資料表或更新現有資料表時，Data Catalog 會自動執行資料表最佳化，以減少操作負擔。

如果您已在資料表層級設定最佳化，或先前已刪除資料表的資料表最佳化設定，則這些資料表特定設定優先於資料表最佳化的預設目錄設定。如果未在資料表或目錄層級定義組態參數，則會套用 Iceberg 資料表屬性值。此設定適用於快照保留和孤立檔案刪除最佳化工具。

啟用目錄層級最佳化工具時，考慮下列事項：
+ 當您在建立目錄時設定最佳化設定，並隨後透過「更新目錄」請求停用最佳化時，操作會逐級瀏覽目錄內的所有資料表。
+ 如果您已為指定的資料表設定最佳化工具，則目錄層級的停用操作不會影響此資料表。
+ 當您在目錄層級停用最佳化工具時，具有現有最佳化工具組態的資料表將維持其特定設定，並不受目錄層級變更的影響。但是，沒有自己的最佳化工具組態的資料表會從目錄層級繼承已停用的狀態。
+ 由於快照保留和孤立檔案刪除最佳化工具可以以排程為基礎，因此更新會在排程開始時引入隨機延遲。這會導致每個最佳化工具在稍微不同的時間啟動，從而分散負載並降低超出服務限制的可能性。
+ 啟用 AWS Glue Data Catalog 加密時，資料表不會自動繼承目錄層級最佳化工具設定。如果您的目錄已啟用中繼資料加密，您必須為每個資料表個別設定資料表最佳化工具。若要使用目錄層級最佳化工具繼承，目錄上必須停用中繼資料加密。

**Topics**
+ [啟用目錄層級自動最佳化資料表](enable-auto-table-optimizers.md)
+ [檢視目錄層級最佳化](view-catalog-optimizations.md)
+ [停用目錄層級資料表最佳化](disable-auto-table-optimizers.md)

# 啟用目錄層級自動最佳化資料表
<a name="enable-auto-table-optimizers"></a>

 您可以在 Data Catalog 中為所有新 Apache Iceberg 資料表啟用自動最佳化資料表。建立資料表後，您也可以手動明確更新資料表最佳化設定。

 若要更新 Data Catalog 設定以啟用目錄層級最佳化資料表，所使用的 IAM 角色必須具有根目錄的 `glue:UpdateCatalog` 許可。您可以使用 `GetCatalog` API 驗證目錄屬性。

 對於 Lake Formation 受管資料表，目錄最佳化組態期間選取的 IAM 角色需要任何新資料表或更新資料表的 Lake Formation `ALTER`、`DESCRIBE`、`INSERT` 和 `DELETE` 許可。

## 啟用目錄層級最佳化工具 (主控台)
<a name="enable-catalog-optimizers-console"></a>

1. 開啟 Lake Formation 主控台，網址為 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)。

1. 在導覽窗格中，選擇 **Data Catalog**。

1. 選取**目錄**索引標籤。

1. 選擇帳戶層級目錄。

1. 選擇**資料表最佳化**、**資料表最佳化**索引標籤下的**編輯**。您也可以從**動作**中選擇**編輯最佳化**。  
![\[螢幕擷取畫面顯示在目錄層級啟用最佳化的編輯選項。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/catalog-edit-optimizations.png)

1. 在**資料表最佳化**頁面上，設定下列選項：  
![\[螢幕擷取畫面顯示目錄層級的最佳化選項。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/catalog-optimization-options.png)

   1. 設定**壓縮**設定：
      + 啟用/停用壓縮。
      + 選擇具有執行最佳化工具所需許可的 IAM 角色。

        如需 IAM 角色的許可要求的詳細資訊，請參閱[資料表最佳化先決條件](optimization-prerequisites.md)。

   1. 設定**快照保留**設定：
      + 啟用/停用保留。
      + 設定快照保留期間 (天) - 預設值為 5 天。
      + 設定要保留的快照數目 - 預設值為 1 個快照。
      + 啟用/停用清除過期檔案。

   1. 設定**孤立檔案刪除**設定：
      + 啟用/停用孤立檔案刪除。
      + 設定孤立檔案保留期間 (天) - 預設值為 3 天。

1. 選擇**儲存**。

## 透過 啟用目錄層級最佳化工具 AWS CLI
<a name="catalog-auto-optimizers-cli"></a>

使用下列 CLI 命令，透過最佳化工具設定更新現有的目錄：

**Example 透過最佳化工具設定更新目錄**  

```
aws glue update-catalog \
   --name catalog-id \
  --catalog-input \
  '{
    "CatalogId": "111122223333",
    "CatalogInput": {
        "CatalogProperties": {
            "CustomProperties": {
                "ColumnStatistics.Enabled": "false",
                "ColumnStatistics.RoleArn": "arn:aws:iam::111122223333:role/service-role/stats-role-name"
            },
            "IcebergOptimizationProperties": {
                "RoleArn": "arn:aws:iam::111122223333:role/optimizer-role-name",
                "Compaction": {
                    "enabled": "true"
                },
                "Retention": {
                    "enabled": "true",
                    "snapshotRetentionPeriodInDays": "10",
                    "numberOfSnapshotsToRetain": "5",
                    "cleanExpiredFiles": "true"
                },
                "OrphanFileDeletion": {
                    "enabled": "true",
                    "orphanFileRetentionPeriodInDays": "3"
                }
            }
        }
    }
}'
```

如果您遇到目錄層級最佳化工具的問題，請檢查下列項目：
+ 確保 IAM 角色具有正確的許可，如「先決條件」一節中所述。
+ 檢查 CloudWatch 日誌是否有任何與最佳化工具操作相關的錯誤訊息。

   如需詳細資訊，請參閱《*Amazon CloudWatch 使用者指南*》中的[檢視可用指標](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/viewing_metrics_with_cloudwatch.html)。
+ 檢查目錄組態，以確認目錄設定已成功套用。
+ 對於資料表存取失敗，請檢查 CloudWatch 日誌和 EventBridge 通知，以取得詳細的錯誤資訊。

# 檢視目錄層級最佳化
<a name="view-catalog-optimizations"></a>

 啟用目錄層級資料表最佳化時，只要透過 或 `UpdateTable` APIs、 AWS 管理主控台 SDK 或 建立`CreateTable`或更新 Apache Iceberg 資料表 AWS Glue 編目程式，就會為該資料表建立對等的資料表層級設定。

 建立或更新資料表之後，您可以驗證資料表詳細資訊以確認資料表最佳化。`Table optimization` 會顯示設為 `Catalog` 的 `Configuration source` 屬性。

![\[已套用具有目錄層級最佳化組態的 Apache Iceberg 資料表的影像。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/catalog-optimization-enabled.png)


# 停用目錄層級資料表最佳化
<a name="disable-auto-table-optimizers"></a>

 您可以使用 AWS Lake Formation 主控台 `glue:UpdateCatalog` API 來停用新資料表的資料表最佳化。

**在目錄層級停用資料表最佳化**

1. 開啟 Lake Formation 主控台，網址為 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)。

1. 在左側導覽列上，選擇**目錄**。

1. 在**目錄摘要**頁面上，選擇**資料表最佳化**下的**編輯**。

1. 在**編輯最佳化**頁面上，取消選取**最佳化選項**。

1. 選擇**儲存**。

# 壓縮最佳化
<a name="compaction-management"></a>

 使用開放資料表格式 (例如，Apache Iceberg) 的 Amazon S3 資料湖會以 S3 物件形式儲存資料。在資料湖資料表中擁有數千個小型 Amazon S3 物件會增加中繼資料負荷，並影響讀取效能。 為 Iceberg 資料表 AWS Glue Data Catalog 提供受管壓縮，將小型物件壓縮成較大的物件，以便透過 Amazon Athena 和 Amazon EMR 和 AWS Glue ETL 任務等 AWS 分析服務獲得更好的讀取效能。Data Catalog 在不干擾並行查詢的情況下執行壓縮，並僅支援 Parquet 格式資料表的壓縮。

該資料表最佳化工具會持續監控資料表分區區，並在檔案數目和檔案大小超過閾值時啟動壓縮程序。

在 Data Catalog 中，壓縮程序會在資料表或其任何分區具有超過 100 個檔案時啟動。每個檔案都必須小於目標檔案大小的 75%。目標檔案大小由 `write.target-file-size-bytes` 資料表屬性定義，如果未明確設定，則預設為 512 MB。

 如需限制的詳細資訊，請參閱[受管資料壓縮支援的格式和限制](optimizer-notes.md#compaction-notes)。

**Topics**
+ [啟用壓縮最佳化工具](enable-compaction.md)
+ [停用壓縮最佳化工具](disable-compaction.md)

# 啟用壓縮最佳化工具
<a name="enable-compaction"></a>

 您可以使用 AWS Glue 主控台 AWS CLI或 AWS API，為 AWS Glue Data Catalog 中的 Apache Iceberg 資料表啟用壓縮。針對新的資料表，您可以選擇 Apache Iceberg 作為資料表格式，並在您建立資料表時啟用壓縮功能。新資料表依預設會停用壓縮功能。

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

**啟用壓縮功能**

1.  在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台，並以資料湖管理員、資料表建立者或已在資料表上授予 `glue:UpdateTable`和 `lakeformation:GetDataAccess`許可的使用者身分登入。

1. 在導覽面板的 **Data Catalog** 下方，選擇**資料表**。

1. 在**資料表**頁面中，選擇您想要啟用壓縮的開放資料表格式的資料表，然後在**動作**功能表下依次選擇**最佳化**和**啟用**。

   您也可以透過選取**資料表詳細資訊**頁面上的**資料表最佳化**索引標籤，來啟用壓縮。選擇頁面下半區段的**資料表最佳化**索引標籤，然後選擇**啟用壓縮**。

   當您在 Data Catalog 中建立新的 Iceberg 資料表時，也可以使用**啟用最佳化**選項。

1. 在**啟用最佳化**頁面上，選擇**最佳化選項**下的**壓縮**。  
![\[具有「啟用壓縮」選項的 Apache Iceberg 資料表詳細資訊頁面。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/table-enable-compaction.png)

1. 接下來，從下拉式清單中選取 IAM 角色，其許可會在 [資料表最佳化先決條件](optimization-prerequisites.md) 區段中顯示。

   您也可以選擇**建立新 IAM 角色**選項，來建立具有執行壓縮所需許可的自訂角色。

    請依照以下步驟更新現有 IAM 角色：

   1.  若要更新 IAM 角色的權限政策，請在 IAM 主控台中，前往用於執行壓縮程序的 IAM 角色。

   1.  在**新增許可**區段中，選擇「建立政策」。在新開啟的瀏覽器視窗中，建立要搭配您角色使用的新政策。

   1. 在「建立政策」頁面上，選擇 `JSON` 索引標籤。將「先決條件」中顯示的 JSON 程式碼複製到政策編輯器欄位中。

1. 如果您有安全政策組態，其中 Iceberg 資料表最佳化工具需要從特定虛擬私有雲端 (VPC) 存取 Amazon S3 儲存貯體，請建立 AWS Glue 網路連線或使用現有的網路連線。

   如果您尚未設定 AWS Glue VPC 連線，請依照使用 AWS Glue 主控台或 AWS CLI/SDK [建立連接器連線一節中的步驟建立新的連線](https://docs.aws.amazon.com/glue/latest/dg/creating-connections.html)。

1. 選擇壓縮策略。可用選項為：
   + **Binpack** – Binpack 是 Apache Iceberg 中的預設壓縮策略。其會將較小的資料檔案合併為較大的檔案，以獲得最佳效能。
   + **排序** – 在 Apache Iceberg 中排序是一種資料組織技術，可根據指定的資料欄叢集化檔案內的資訊，透過減少需要處理的檔案數目來大幅改善查詢效能。您可以使用排序順序欄位在 Iceberg 的中繼資料中定義排序順序，並且在指定多個資料欄時，資料會以資料欄在排序順序中出現的順序排序，以確保具有類似值的記錄儲存在檔案內。排序壓縮策略透過排序分區內所有檔案的資料，進一步進行最佳化。
   + **Z 排序** – 當您需要依具有相同重要性的多個資料欄排序時，Z 排序是一種整理資料的方式。與優先考慮某一資料欄的傳統排序不同，Z 排序為每個資料欄賦予了平衡的權重，協助您的查詢引擎在搜尋資料時讀取更少的檔案。

     該技術的運作方式是將不同資料欄的值的二進制數字組合在一起。例如，如果您有兩個資料欄中的數字 3 和 4，Z 排序會先將其轉換為二進制 (3 變成 011，4 變成 100)，然後交錯這些數字以建立新的值：011010。此交錯會建立一種模式，讓相關資料實際緊密相鄰。

     Z 排序對於多維查詢特別有效。例如，在跨多個維度查詢時，依收入、州/省和郵遞區號進行 Z 排序的客戶資料表可以提供比分階層排序更優越的效能。此組織允許以收入和地理位置的特定組合為目標的查詢，以快速找到相關資料，同時盡量減少不必要的檔案掃描。

1. **最小輸入檔案** – 觸發壓縮之前，分區中所需的資料檔案數目。

1. **刪除檔案閾值** – 資料檔案在符合壓縮條件之前所需的最少刪除操作。

1. 選擇**啟用最佳化**。

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

 下列範例顯示如何啟用壓縮功能。以有效的帳戶 ID 取代 AWS 帳戶 ID。將資料庫名稱和資料表名稱取代為實際的 Iceberg 資料表名稱和資料庫名稱。將 `roleArn` 取代為 IAM 角色的 AWS Resource Name (ARN)，以及具有執行壓縮程序之必要權限的 IAM 角色名稱。您可以將壓縮策略 `sort` 取代為其他支援的策略，例如 `z-order` 或 `binpack`。

順序」，視您的需求而定。

```
aws glue create-table-optimizer \
  --catalog-id 123456789012 \
  --database-name iceberg_db \
  --table-name iceberg_table \
  --table-optimizer-configuration '{
    "roleArn": "arn:aws:iam::123456789012:role/optimizer_role",
    "enabled": true,
    "vpcConfiguration": {"glueConnectionName": "glue_connection_name"},
    "compactionConfiguration": {
      "icebergConfiguration": {"strategy": "sort"}
    }
  }'\
--type compaction
```

------
#### [ AWS API ]

呼叫 [CreateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-CreateTableOptimizer) 操作以啟用資料表的壓縮。

------

啟用壓縮後，**資料表最佳化**索引標籤會在壓縮執行完成後，顯示下列壓縮詳細資訊：

開始時間  
在 Data Catalog 內啟動壓縮程序的時間。該值為以 UTC 時間為單位的時間戳記。

結束時間  
壓縮程序在 Data Catalog 中結束的時間。該值為以 UTC 時間為單位的時間戳記。

狀態  
壓縮執行的狀態。值會是 success 或 fail。

壓縮的檔案數  
壓縮的檔案總數。

壓縮的位元組數  
壓縮的位元組總數。

# 停用壓縮最佳化工具
<a name="disable-compaction"></a>

 您可以使用 AWS Glue 主控台 或 停用特定 Apache Iceberg 資料表的自動壓縮 AWS CLI。

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

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

1. 在左側導覽的 **Data Catalog** 下，選擇**資料表**。

1. 從資料表清單中，選擇您想要停用壓縮功能的 Iceberg 資料表。

1. 選擇**資料表詳細資訊**頁面下半部分的**資料表最佳化**索引標籤。

1. 從**動作**中，選擇**停用**，然後選擇**壓縮**。

1.  在確認訊息中，選擇**停用壓縮**。您可以在稍後重新啟用壓縮功能。

    當您確認後，壓縮功能會停用，而資料表的壓縮狀態會變回 `Disabled`。

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

在下列範例中，將帳戶 ID 取代為有效的 AWS 帳戶 ID。將資料庫名稱和資料表名稱取代為實際的 Iceberg 資料表名稱和資料庫名稱。將 取代`roleArn`為 IAM 角色 AWS 的資源名稱 (ARN)，以及具有執行壓縮所需許可的 IAM 角色實際名稱。

```
aws glue update-table-optimizer \
  --catalog-id 123456789012 \
  --database-name iceberg_db \
  --table-name iceberg_table \
  --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role", "enabled":'false', "vpcConfiguration":{"glueConnectionName":"glue_connection_name"}}'\ 
  --type compaction
```

------
#### [ AWS API ]

呼叫 [UpdateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-UpdateTableOptimizer) 操作以停用特定資料表的壓縮功能。

------

# 快照保留最佳化
<a name="snapshot-retention-management"></a>

Apache Iceberg 快照保留功能可讓使用者在特定時間點查詢歷史資料，並將不需要的修改還原至其資料表。在 AWS Glue 資料目錄中，快照保留組態會控制這些快照 （資料表資料的版本） 在過期和移除之前保留多久。根據設定的保留期間或要保留的快照數目上限，自動移除較舊的快照，這有助於管理儲存成本和中繼資料負荷。

您可以設定以天為單位的保留期間，以及要為資料表保留的快照數目上限。從資料表中繼資料 AWS Glue 中移除比指定保留期間更舊的快照，同時將最新的快照保持在設定的限制內。從中繼資料移除舊快照後， 會 AWS Glue 刪除不再參考且對過期快照是唯一的對應資料和中繼資料檔案。這只允許剩餘保留快照的時間歷程查詢，同時回收過期快照資料使用的儲存空間。

**Topics**
+ [啟用快照保留最佳化工具](enable-snapshot-retention.md)
+ [更新快照保留最佳化工具](update-snapshot-retention.md)
+ [停用快照保留最佳化工具](disable-snapshot-retention.md)

# 啟用快照保留最佳化工具
<a name="enable-snapshot-retention"></a>

 您可以使用 AWS Glue 主控台 AWS CLI或 AWS API，為 Data Catalog 中的 Apache Iceberg 資料表啟用快照保留最佳化工具。針對新的資料表，您可以選擇 Apache Iceberg 作為資料表格式，並在您建立資料表時啟用快照保留最佳化工具。新資料表的快照保留預設為停用。

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

**啟用快照保留最佳化工具**

1.  在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台，並以資料湖管理員、資料表建立者或已在資料表上授予 `glue:UpdateTable`和 `lakeformation:GetDataAccess`許可的使用者身分登入。

1. 在導覽面板的 **Data Catalog** 下方，選擇**資料表**。

1. 在**資料表**頁面上，選擇要啟用快照保留最佳化工具的 Iceberg 資料表，然後在**動作**功能表下，選擇**最佳化**下的**啟用**。

   您也可以透過選取資料表並開啟**資料表詳細資訊**頁面，來啟用最佳化。選擇頁面下半部分的**資料表最佳化**索引標籤，然後選擇**啟用快照保留**。

1. 在**啟用最佳化**頁面的**最佳化組態**下，您具有兩個選項：**使用預設設定**或**自訂設定**。如果您選擇使用預設設定， AWS Glue 會使用 Iceberg 資料表組態中定義的屬性來決定快照保留期間和要保留的快照數目。如果沒有此組態， 會 AWS Glue 保留一個快照五天，並刪除與過期快照相關聯的檔案。

1.  接著，選擇 AWS Glue 可代表您擔任的 IAM 角色，以執行最佳化工具。如需 IAM 角色所需許可的詳細資訊，請參閱[資料表最佳化先決條件](optimization-prerequisites.md)一節。

   請依照以下步驟更新現有 IAM 角色：

   1.  若要更新 IAM 角色的權限政策，請在 IAM 主控台中，前往用於執行壓縮程序的 IAM 角色。

   1.  在新增許可區段中，選擇「建立政策」。在新開啟的瀏覽器視窗中，建立要搭配您角色使用的新政策。

   1. 在建立政策頁面上，選擇 JSON 標籤。將「先決條件」中顯示的 JSON 程式碼複製到政策編輯器欄位中。

1. 如果您要手動設定**快照保留組態**的值，請選擇**自訂設定**。  
![\[使用「啟用保留」>「自訂設定」選項的 Apache Iceberg 資料表詳細資訊頁面。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/table-enable-retention.png)

1. 選擇方塊 **將選取的 IAM 角色套用至選取的最佳化工具**選項，以對所有啟用的最佳化工具使用單一 IAM 角色。

1. 如果您有安全政策組態，其中 Iceberg 資料表最佳化工具需要從特定虛擬私有雲端 (VPC) 存取 Amazon S3 儲存貯體，請建立 AWS Glue 網路連線或使用現有的網路連線。

   如果您尚未設定 AWS Glue VPC 連線，請依照使用 AWS Glue 主控台或 AWS CLI/SDK [建立連接器連線](https://docs.aws.amazon.com/glue/latest/dg/creating-connections.html)區段中的步驟建立新的連線。

1. 接下來，在**快照保留組態**下，選擇使用 [Iceberg 資料表組態](https://iceberg.apache.org/docs/1.5.2/configuration/#table-behavior-properties)中指定的值，或指定快照保留期間的自訂值 (history.expire.max-snapshot-age-ms)、要保留的快照數目下限 (history.expire.min-snapshots-to-keep)，以及連續快照刪除任務執行之間的小時數。

1.  在資料表最佳化工具從資料表中繼資料中刪除舊快照時，選擇**刪除關聯的檔案**以刪除基礎檔案。

    如果您未選擇此選項，從資料表中繼資料中移除較舊的快照時，關聯的檔案會保留在儲存體中作為孤立檔案。

1. 接著，閱讀注意聲明，然後選擇**我確認**以繼續。
**注意**  
 在 Data Catalog 中，快照保留最佳化工具會遵守由分支和標籤層級保留政策控制的生命週期。如需詳細資訊，請參閱 Iceberg 文件中的[分支和標記](https://iceberg.apache.org/docs/latest/branching/#overview)一節。

1. 檢閱組態，然後選擇**啟用最佳化**。

   等待幾分鐘，讓保留最佳化工具執行，並根據組態使舊快照過期。

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

 若要在 中啟用新 Iceberg 資料表的快照保留 AWS Glue，您需要建立 類型的資料表最佳化工具，`retention`並將 `true`中的 `enabled` 欄位設定為 `table-optimizer-configuration`。您可以使用 AWS CLI 命令`create-table-optimizer`或 來執行此操作`update-table-optimizer`。此外，您需要根據您的要求指定保留組態欄位，例如 `snapshotRetentionPeriodInDays` 和 `numberOfSnapshotsToRetain`。

下列範例示範如何啟用快照保留最佳化工具。將帳戶 ID 取代為有效的 AWS 帳戶 ID。將資料庫名稱和資料表名稱取代為實際的 Iceberg 資料表名稱和資料庫名稱。將 取代`roleArn`為 IAM 角色 AWS 的資源名稱 (ARN)，以及具有執行快照保留最佳化工具所需許可的 IAM 角色名稱。

```
aws glue create-table-optimizer \
  --catalog-id 123456789012 \
  --database-name iceberg_db \
  --table-name iceberg_table \
  --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role","enabled":'true', "vpcConfiguration":{
"glueConnectionName":"glue_connection_name"}, "retentionConfiguration":{"icebergConfiguration":{"snapshotRetentionPeriodInDays":7,"numberOfSnapshotsToRetain":3,"cleanExpiredFiles":'true'}}}'\
  --type retention
```

 此命令會為指定目錄、資料庫和區域中指定的 Iceberg 資料表建立保留最佳化工具。table-optimizer-configuration 指定要使用的 IAM 角色 ARN、啟用最佳化工具，以及設定保留組態。在此範例中，其會保留快照 7 天，至少保留 3 個快照，並清除過期檔案。
+  snapshotRetentionPeriodInDays – 快照過期前保留的天數。預設值為 `5`。
+ numberOfSnapshotsToRetain – 要保留的快照數目下限，即使其早於保留期間。預設值為 `1`。
+ cleanExpiredFiles – 布林值，指出是否要在快照過期後刪除過期的資料檔案。預設值為 `true`。

   設定為 true 時，較舊的快照會從資料表中繼資料中移除，而基礎檔案會刪除。如果將此參數設定為 false，較舊的快照會從資料表中繼資料中移除，但基礎檔案會保留在儲存體中作為孤立檔案。

------
#### [ AWS API ]

呼叫 [CreateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-CreateTableOptimizer) 操作以啟用資料表的快照保留最佳化工具。

------

啟用壓縮功能後，**資料表最佳化**索引標籤會顯示下列壓縮詳細資料 (大約 15-20 分鐘後)：

開始時間  
快照保留最佳化工具啟動的時間。該值為以 UTC 時間為單位的時間戳記。

執行時間  
時間顯示最佳化工具完成任務所需的時間。該值為以 UTC 時間為單位的時間戳記。

狀態  
最佳化工具執行的狀態。值會是 success 或 fail。

刪除的資料檔案數  
刪除的檔案總數。

刪除的資訊清單檔案數  
刪除的資訊清單檔案總數。

刪除的資訊清單數  
刪除的資訊清單總數。

# 更新快照保留最佳化工具
<a name="update-snapshot-retention"></a>

 您可以使用 AWS Glue 主控台 AWS CLI或 UpdateTableOptimizer API，更新特定 Apache Iceberg 資料表快照保留最佳化工具的現有組態。

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

**更新快照保留組態**

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

1. 選擇 **Data Catalog**，然後選擇**資料表**。從資料表清單中，選擇您要更新快照保留最佳化工具組態的 Iceberg 資料表。

1. 在**資料表詳細資訊**頁面的下部，選取**資料表最佳化**索引標籤，然後選擇**編輯**。也可以從頁面右上角的**動作**功能表中選擇**最佳化**下的**編輯**。

1.  在**編輯最佳化**頁面中，進行所需的變更。

1.  選擇**儲存**。

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

 若要使用 更新快照保留最佳化工具 AWS CLI，您可以使用下列命令：

```
aws glue update-table-optimizer \
 --catalog-id 123456789012 \
 --database-name iceberg_db \
 --table-name iceberg_table \
 --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role"","enabled":'true', "vpcConfiguration":{"glueConnectionName":"glue_connection_name"},"retentionConfiguration":{"icebergConfiguration":{"snapshotRetentionPeriodInDays":7,"numberOfSnapshotsToRetain":3,"cleanExpiredFiles":'true'}}}' \
 --type retention
```

 此命令會更新指定目錄、資料庫和區域中指定資料表的保留組態。關鍵參數為：
+  snapshotRetentionPeriodInDays – 快照過期前保留的天數。預設值為 `1`。
+ numberOfSnapshotsToRetain – 要保留的快照數目下限，即使其早於保留期間。預設值為 `5`。
+ cleanExpiredFiles – 布林值，指出是否要在快照過期後刪除過期的資料檔案。預設值為 `true`。

   設定為 true 時，較舊的快照會從資料表中繼資料中移除，並且會刪除其基礎檔案。如果將此參數設定為 false，較舊的快照會從資料表中繼資料中移除，但基礎檔案會保留在儲存體中作為孤立檔案。

------
#### [ API ]

若要更新資料表最佳化工具，可以使用 `UpdateTableOptimizer` API。此 API 可讓您更新現有資料表最佳化工具的組態，以進行壓縮、保留或孤立檔案移除。請求參數包括：
+ catalogId (必要)：包含資料表的目錄 ID 
+  databaseName (選用)：包含資料表的資料庫名稱 
+  tableName (選用)：資料表的名稱 
+  type (必要)：資料表最佳化工具的類型 (壓縮、保留或孤立檔案刪除) 
+  retentionConfiguration (必要)：資料表最佳化工具的更新組態，包括角色 ARN、啟用狀態、保留組態和孤立檔案移除組態。

------

# 停用快照保留最佳化工具
<a name="disable-snapshot-retention"></a>

 您可以使用 AWS Glue 主控台 或 停用特定 Apache Iceberg 資料表的快照保留最佳化工具 AWS CLI。

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

**停用快照保留**

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

1. 選擇 **Data Catalog**，然後選擇**資料表**。從資料表清單中，選擇要停用最佳化工具以保留快照的 Iceberg 資料表。

1. 在**資料表詳細資訊**頁面的下半部分中，選擇**動作**下的**資料表最佳化**和**停用****快照保留**。

   您還可以從頁面右上角的**動作**功能表中選擇**最佳化**下的**停用**。

1.  在確認訊息中，選擇**停用**。您可以稍後重新啟用快照保留最佳化工具。

    在確認後，快照保留最佳化工具會停用，且快照保留的狀態會回復為 `Not enabled`。

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

在下列範例中，將帳戶 ID 取代為有效的 AWS 帳戶 ID。將資料庫名稱和資料表名稱取代為實際的 Iceberg 資料表名稱和資料庫名稱。將 取代`roleArn`為 IAM 角色 AWS 的資源名稱 (ARN)，以及具有執行保留最佳化工具所需許可的 IAM 角色實際名稱。

```
aws glue update-table-optimizer \
  --catalog-id 123456789012 \
  --database-name iceberg_db \
  --table-name iceberg_table \
  --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role", "vpcConfiguration":{"glueConnectionName":"glue_connection_name"}, "enabled":'false'}'\ 
  --type retention
```

------
#### [ AWS API ]

呼叫 [UpdateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-UpdateTableOptimizer) 操作，以停用特定資料表的快照保留最佳化工具。

------

# 刪除孤立檔案
<a name="orphan-file-deletion"></a>

 AWS Glue Data Catalog 可讓您從 Iceberg 資料表中移除孤立檔案。孤立檔案是存在於指定資料表位置下 Amazon S3 資料來源中的未參考檔案，其不會受到 Iceberg 資料表中繼資料追蹤，且早於您設定的存留期限制。由於壓縮、分區刪除或資料表重寫等操作失敗，這些孤立檔案可能會隨著時間累積，並佔用不必要的儲存空間。

中的孤立檔案刪除最佳化工具會 AWS Glue 掃描資料表中繼資料和實際資料檔案、識別孤立檔案，然後刪除它們以回收儲存空間。最佳化工具只會移除在最佳化工具建立日期之後建立並且也符合所設定刪除條件的檔案。絕對不會刪除在最佳化工具建立日期之前或當天建立的檔案。

**孤立檔案刪除邏輯**

1. 日期檢查 – 比較檔案建立日期與最佳化工具建立日期。如果檔案早於或等於最佳化工具建立日期，則會略過檔案。

1. 最佳化工具組態檢查 – 如果檔案晚於最佳化工具建立日期， 則會根據設定的存留期限制評估檔案。如果檔案符合刪除條件，最佳化工具會刪除其。如果檔案不符合條件，則會略過。

 可以在 Data Catalog 中建立孤立檔案刪除資料表最佳化工具，以啟動孤立檔案刪除。

**重要**  
 根據預設，孤立檔案刪除會跨 AWS Glue 資料表位置評估檔案。雖然可以使用 API 參數來設定子字首以限制評估範圍，但必須確保資料表位置不包含來自其他資料來源或資料表的檔案。如果資料表位置與其他資料來源重疊，該服務可能會進行識別，並將不相關的檔案作為孤立檔案進行刪除。

**Topics**
+ [啟用孤立檔案刪除](enable-orphan-file-deletion.md)
+ [更新孤立檔案刪除最佳化工具](update-orphan-file-deletion.md)
+ [停用孤立檔案刪除](disable-orphan-file-deletion.md)

# 啟用孤立檔案刪除
<a name="enable-orphan-file-deletion"></a>

 您可以使用 AWS Glue 主控台 AWS CLI或 AWS API，為 Data Catalog 中的 Apache Iceberg 資料表啟用孤立檔案刪除。針對新的資料表，您可以選擇 Apache Iceberg 作為資料表格式，並在您建立資料表時啟用孤立檔案刪除最佳化工具。新資料表的快照保留預設為停用。

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

**啟用孤立檔案刪除**

1.  在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台，並以資料湖管理員、資料表建立者或已在資料表上授予 `glue:UpdateTable`和 `lakeformation:GetDataAccess`許可的使用者身分登入。

1. 在導覽面板的 **Data Catalog** 下方，選擇**資料表**。

1. 在**資料表**頁面上，選擇您要在其中啟用孤立檔案刪除的 Iceberg 資料表。

   選擇頁面下半部分的**資料表最佳化**索引標籤，然後從**動作**中選擇**啟用**、**孤立檔案刪除**。

   您也可以從頁面右上角**的動作**功能表中選擇**最佳化**下的**啟用**。

1. 在**啟用最佳化**頁面上，選擇**最佳化選項**下的**孤立檔案刪除**。

1. 如果您選擇使用**預設設定**，所有孤立檔案都會在 3 天後刪除。如果您想要將孤立檔案保留特定天數，請選擇**自訂設定**。

1. 接著，選擇具有刪除孤立檔案所需許可的 IAM 角色。

1. 如果您有安全政策組態，其中 Iceberg 資料表最佳化工具需要從特定虛擬私有雲端 (VPC) 存取 Amazon S3 儲存貯體，請建立 AWS Glue 網路連線或使用現有的網路連線。

   如果您尚未設定 AWS Glue VPC 連線，請依照使用 AWS Glue 主控台或 AWS CLI/SDK [建立連接器連線](https://docs.aws.amazon.com/glue/latest/dg/creating-connections.html)區段中的步驟建立新的連線。

1. 如果您選擇**自訂設定**，請在**孤立檔案刪除組態**下，輸入刪除之前保留檔案的天數。您也可以指定兩個連續最佳化工具執行之間的間隔。預設值為 24 小時。

1. 選擇**啟用最佳化**。

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

 若要在 中啟用 Iceberg 資料表的孤立檔案刪除 AWS Glue，您需要建立 類型的資料表最佳化工具，`orphan_file_deletion`並將 `enabled` 欄位設定為 true。若要使用 為 Iceberg 資料表建立孤立檔案刪除最佳化工具 AWS CLI，您可以使用下列命令：

```
aws glue create-table-optimizer \
 --catalog-id 123456789012 \
 --database-name iceberg_db \
 --table-name iceberg_table \
 --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role","enabled":true, "vpcConfiguration":{
"glueConnectionName":"glue_connection_name"}, "orphanFileDeletionConfiguration":{"icebergConfiguration":{"orphanFileRetentionPeriodInDays":3, "location":'S3 location'}}}'\
 --type orphan_file_deletion
```

 此命令會為指定的 Iceberg 資料表建立孤立檔案刪除最佳化工具。關鍵參數為：
+ roleArn – IAM 角色的 ARN，具有存取 S3 儲存貯體和 Glue 資源的許可。
+ enabled – 設定為 true 以啟用最佳化工具。
+ orphanFileRetentionPeriodInDays – 孤立檔案刪除之前保留的天數 (至少 1 天)。
+ 類型 – 設定為 orphan\$1file\$1deletion 以建立孤立檔案刪除最佳化工具。

 建立資料表最佳化工具之後，其會定期執行孤立檔案刪除 (如果啟用，則為每天刪除一次)。您可以使用 `list-table-optimizer-runs` API 檢查執行。孤立檔案刪除任務將識別和刪除未在資料表的 Iceberg 中繼資料中追蹤的檔案。

------
#### [ API ]

呼叫 [CreateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-CreateTableOptimizer) 操作，為特定資料表建立孤立檔案刪除最佳化工具。

------

# 更新孤立檔案刪除最佳化工具
<a name="update-orphan-file-deletion"></a>

 您可以修改孤立檔案刪除最佳化工具的組態，例如使用 AWS Glue 主控台變更孤立檔案的保留期間或最佳化工具使用的 IAM 角色 AWS CLI，或 `UpdateTableOptimizer`操作。

------
#### [ AWS 管理主控台 ]

**若要更新孤立檔案刪除最佳化工具**

1.  選擇 **Data Catalog**，然後選擇**資料表**。從資料表清單中，選擇您要更新孤立檔案刪除最佳化工具組態的資料表。

1. 在**資料表詳細資訊**頁面的下部，選擇**資料表最佳化**，然後選擇**編輯**。

1.  在**編輯最佳化**頁面中，進行所需的變更。

1.  選擇**儲存**。

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

 您可以使用 `update-table-optimizer`呼叫來更新 中的孤立檔案刪除最佳化工具 AWS Glue，您可以使用 呼叫。這可讓您修改 `icebergConfiguration` 欄位中的 `OrphanFileDeletionConfiguration`，您可以在其中指定更新的 `OrphanFileRetentionPeriodInDays` 來設定保留孤立檔案的天數，指定要從中刪除孤立檔案的 Iceberg 資料表位置。

```
aws glue update-table-optimizer \
 --catalog-id 123456789012 \
 --database-name iceberg_db \
 --table-name Iceberg_table \
 --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role","enabled":true, "vpcConfiguration":{"glueConnectionName":"glue_connection_name"},"orphanFileDeletionConfiguration":{"icebergConfiguration":{"orphanFileRetentionPeriodInDays":5}}}' \
 --type orphan_file_deletion
```

------
#### [ API ]

呼叫 [UpdateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-UpdateTableOptimizer) 操作來更新資料表的孤立檔案刪除最佳化工具。

------

 

# 停用孤立檔案刪除
<a name="disable-orphan-file-deletion"></a>

 您可以使用 AWS Glue 主控台或 停用特定 Apache Iceberg 資料表的孤立檔案刪除最佳化工具 AWS CLI。

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

**停用孤立檔案刪除**

1. 選擇 **Data Catalog**，然後選擇**資料表**。從資料表清單中，選擇要停用最佳化工具以刪除孤立檔案的 Iceberg 資料表。

1. 在**資料表詳細資訊**頁面的下半部分，選擇**資料表最佳化**索引標籤。

1. 選擇**動作**，然後選擇**停用**、**孤立檔案刪除**。

   您還可以從**動作**功能表的**最佳化**下選擇**停用**。

1.  在確認訊息中，選擇**停用**。您可以稍後重新啟用孤立檔案刪除最佳化工具。

    確認後，孤立檔案刪除最佳化工具會停用，而孤立檔案刪除的狀態會回復為 `Not enabled`。

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

在下列範例中，將帳戶 ID 取代為有效的 AWS 帳戶 ID。將資料庫名稱和資料表名稱取代為實際的 Iceberg 資料表名稱和資料庫名稱。將 取代`roleArn`為 IAM 角色 AWS 的資源名稱 (ARN)，以及具有停用最佳化工具所需許可的 IAM 角色實際名稱。

```
aws glue update-table-optimizer \
  --catalog-id 123456789012 \
  --database-name iceberg_db \
  --table-name iceberg_table \
  --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role", "enabled":'false'}'\ 
  --type orphan_file_deletion
```

------
#### [ API ]

呼叫 [UpdateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-UpdateTableOptimizer) 操作來停用特定資料表的快照保留最佳化工具。

------

# 檢視最佳化詳細資訊
<a name="view-optimization-status"></a>

您可以在 AWS Glue 主控台、 AWS CLI或使用 AWS API 操作檢視 Apache Iceberg 資料表的最佳化狀態。

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

**檢視 Iceberg 資料表的最佳化狀態 (主控台)**
+ 您可以從 **Data Catalog** 下的資料表清單中選擇 Iceberg 資料表，以在 AWS Glue 主控台上檢視 Iceberg **資料表**的最佳化狀態。在**資料表最佳化**下。選擇**檢視全部**  
![\[具有「啟用壓縮」選項的 Apache Iceberg 資料表詳細資訊頁面。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/table-list-compaction-status.png)

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

您可以使用 檢視最佳化詳細資訊 AWS CLI。

在下列範例中，將帳戶 ID 取代為有效的 AWS 帳戶 ID、資料庫名稱，並將資料表名稱取代為實際的 Iceberg 資料表名稱。對於 `type`，請提供並最佳化類型。可接受的值是 `compaction`、`retention` 和 `orphan-file-deletion`。
+ **取得資料表的上次壓縮執行詳細資料**

  ```
  aws get-table-optimizer \
    --catalog-id 123456789012 \
    --database-name iceberg_db \
    --table-name iceberg_table \
    --type compaction
  ```
+ 使用下列範例擷取特定資料表的最佳化工具歷史記錄。

  ```
  aws list-table-optimizer-runs \
    --catalog-id 123456789012 \
    --database-name iceberg_db \
    --table-name iceberg_table \
    --type compaction
  ```
+ 下列範例顯示如何擷取多個最佳化工具的最佳化執行和組態詳細資料。您最多可以指定 20 個最佳化工具。

  ```
  aws glue batch-get-table-optimizer \
  --entries '[{"catalogId":"123456789012", "databaseName":"iceberg_db", "tableName":"iceberg_table", "type":"compaction"}]'
  ```

------
#### [ API ]
+ 使用 `GetTableOptimizer` 操作來擷取最佳化工具的上次執行詳細資料。
+  使用 `ListTableOptimizerRuns` 操作來擷取特定資料表中特定最佳化工具的歷史記錄。您可以在單一 API 呼叫中指定 20 個最佳化工具。
+ 使用 [BatchGetTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-BatchGetTableOptimizer) 操作來擷取帳戶中多個最佳化工具的組態詳細資料。

------

# 檢視 Amazon CloudWatch 指標
<a name="view-optimization-metrics"></a>

 成功執行資料表最佳化工具之後，該服務會建立有關最佳化任務效能的 Amazon CloudWatch 指標。可以前往 **CloudWatch 指標**，然後選擇**指標**、**所有指標**。您可以依特定命名空間 （例如 AWS Glue)、資料表名稱或資料庫名稱來篩選指標。

 如需詳細資訊，請參閱《*Amazon CloudWatch 使用者指南*》中的[檢視可用指標](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/viewing_metrics_with_cloudwatch.html)。

****壓縮****
+ 壓縮的位元組數 
+ 壓縮的檔案數
+ 分配至任務的 DPU 數 
+ 任務持續時間 (小時) 

****快照保留****
+ 已刪除的資料檔案數 
+ 已刪除的資訊清單檔案數
+ 已刪除的資訊清單數 
+ 任務持續時間 (小時)

****孤立檔案刪除****
+ 已刪除的孤立檔案數 
+ 任務持續時間 (小時) 

# 刪除最佳化工具
<a name="delete-optimizer"></a>

您可以使用 AWS CLI 或 AWS API 操作刪除資料表的最佳化工具及相關中繼資料。

執行下列 AWS CLI 命令來刪除資料表的最佳化歷史記錄。您需要指定最佳化工具 `type` 以及目錄 ID、資料庫名稱和資料表名稱。可接受的值：`compaction`、`retention` 和 `orphan_file_deletion`。

```
aws glue delete-table-optimizer \
  --catalog-id 123456789012 \
  --database-name iceberg_db \
  --table-name iceberg_table \
  --type compaction
```

 使用 `DeleteTableOptimizer` 操作刪除資料表的最佳化工具。

# 考量和限制
<a name="optimizer-notes"></a>

 本節包含在 AWS Glue Data Catalog中使用資料表最佳化工具時應考慮的事項。

## 耐用性和正確性
<a name="durability-correctness"></a>

**S3 資料表位置：**

當多個 AWS Glue Data Catalog 資料表共用相同的 Amazon S3 位置並啟用最佳化工具時，一個資料表的快照保留或孤立檔案刪除最佳化工具可能會刪除另一個資料表仍然參考的檔案。確保啟用最佳化工具的每個資料表都有唯一的 Amazon S3 位置，該位置不會與任何其他資料表共用，包括不同資料庫中的資料表。

**S3 生命週期過期：**

適用於 Iceberg 資料表儲存位置的 Amazon S3 生命週期過期規則可以刪除仍然由作用中快照參考的資訊清單和資料檔案。如果您的儲存貯體具有生命週期過期規則，請確保它們排除 Iceberg 資料表儲存路徑。

## 受管資料壓縮支援的格式和限制
<a name="compaction-notes"></a>

資料壓縮支援各種資料類型和壓縮格式來讀取和寫入資料，包括從加密資料表中讀取資料。

**並行控制：**

 Apache Iceberg 支援樂觀並行控制，允許多個寫入器同時執行操作。在遞交時偵測並解決衝突。使用串流管道時，請透過資料表屬性和壓縮設定來設定適當的重試設定，以有效地處理並行寫入。如需詳細指引，請參閱有關在 [Iceberg 資料表中管理並行寫入](https://aws.amazon.com/blogs/big-data/manage-concurrent-write-conflicts-in-apache-iceberg-on-the-aws-glue-data-catalog/) AWS 的大數據部落格。

**壓縮重試：**

 當壓縮操作連續四次失敗時， AWS Glue 目錄資料表最佳化會自動暫停最佳化工具，以防止不必要的運算資源消耗。首先調查日誌，並嘗試了解壓縮重複失敗的原因。若要繼續壓縮最佳化，您可以透過 AWS Glue 主控台或 API 重新啟用最佳化工具。

 **資料壓縮支援：**
+ **加密** – 資料壓縮僅支援預設的 Amazon S3 加密 (SSE-S3) 和伺服器端 KMS 加密 (SSE-KMS)。
+ **壓縮策略** – Binpack、排序和 Z 順序排序
+ 當儲存基礎資料的 Amazon S3 儲存貯體位於其他帳戶中時，您可以從 Data Catalog 所在的帳戶中執行壓縮程序。若要執行此程序，壓縮角色需要 Amazon S3 儲存貯體的存取權。

 **資料壓縮目前不支援：**
+ **跨帳戶資料表壓縮** – 您無法在跨帳戶資料表上執行壓縮程序。
+ **跨區域戶資料表壓縮** – 您無法在跨區域資料表上執行壓縮。
+ **在資源連結上啟用壓縮功能**
+ **Amazon S3 Express One Zone 儲存類別中的資料表 ** – 您無法在 Amazon S3 Express One Zone Iceberg 資料表上執行壓縮。
+ **Z-order 壓縮策略不支援下列資料類型：**
  + Decimal (小數)
  + TimestampWithoutZone

## 快照保留和孤立檔案刪除最佳化工具的考量
<a name="retention-notes"></a>

下列考量適用於快照保留和孤立檔案刪除最佳化工具。
+ 快照保留和孤立檔案刪除程序的上限為每次執行刪除 1,000,000 個檔案。刪除過期快照時，如果刪除的合格檔案數目超過 1,000,000，則任何超出該閾值的剩餘檔案將繼續以孤立檔案的形式存在於資料表儲存中。
+ 只有在滿足兩個條件時，快照保留最佳化工具才會保留快照：要保留的快照數目下限和指定的保留期間。
+ 快照保留最佳化工具會從 Apache Iceberg 刪除過期的快照中繼資料，以防止進行過期快照的時間歷程查詢，並選擇性地刪除相關聯的資料檔案。
+  孤立檔案刪除最佳化工具會刪除 Iceberg 中繼資料不再參考的孤立資料和中繼資料檔案，前提是其建立時間早於最佳化工具執行後的孤立檔案刪除保留期。
+ Apache Iceberg 透過分支和標籤來促進版本控制，其為特定快照狀態的具名標誌。每個分支和標籤都遵循自己的獨立生命週期，由其各自層級定義的保留政策管理。 AWS Glue Data Catalog 最佳化工具會將這些生命週期政策納入考量，確保遵守指定的保留規則。分支和標籤層級保留政策優先於最佳化工具組態。

   如需詳細資訊，請參閱 Apache Iceberg 文件中的[分支和標記](https://iceberg.apache.org/docs/nightly/branching/)。
+ 快照保留和孤立檔案刪除最佳化工具將根據設定的參數來刪除符合清除資格的檔案。透過在適當的儲存貯體上實作 S3 版本控制和生命週期政策，加強您對檔案刪除的控制。

   如需有關設定版本控制和建立生命週期規則的詳細說明，請參閱[https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)。
+  為了正確判斷孤立檔案，請確保提供的資料表位置和任何子路徑不會與任何其他資料表或資料來源的資料重疊或包含其中的資料。如果路徑重疊，則可能會因為意外刪除檔案而導致無法復原的資料遺失。

## 偵錯 OversizedAllocationException 例外狀況
<a name="debug-exception"></a>

若要解決 `OversizedAllocationException` 例外狀況：
+ 減少向量化讀取器的批量大小並檢查。預設批量大小為 5000。在 `read.parquet.vectorization.batch-size` 中進行控制。
  + 如果即使在多個變化後仍無法運作，則請關閉向量化。在 `read.parquet.vectorization.enabled` 中進行控制。

# 資料表最佳化工具的支援區域
<a name="regions-optimizers"></a>

的資料表最佳化功能 （壓縮、快照保留和孤立檔案刪除） AWS Glue Data Catalog 提供如下 AWS 區域：
+ 亞太地區 (東京)
+ 亞太地區 (首爾)
+ 亞太地區 (孟買)
+ 亞太地區 (新加坡)
+ 亞太地區 (悉尼)
+ 亞太地區 (雅加達)
+ 加拿大 (中部)
+ 歐洲 (愛爾蘭)
+ 歐洲 (倫敦)
+ 歐洲 (法蘭克福)
+ 歐洲 (斯德哥爾摩)
+ 美國東部 (維吉尼亞北部)
+ 美國東部 (俄亥俄)
+ 美國西部 (奧勒岡)
+ 南美洲 (聖保羅)

# 最佳化 Iceberg 資料表的查詢效能
<a name="iceberg-column-statistics"></a>

Apache Iceberg 是適用於大型分析資料集的高效能開放資料表格式。 AWS Glue 支援計算和更新 Iceberg 資料表中每個資料欄的不同值 (NDV) 數目。這些統計資料可為使用大規模資料集的資料工程師和科學家提供更好的查詢最佳化、資料管理和效能效率。

 AWS Glue 估計 Iceberg 資料表每一欄中的不同值數目，並將其存放在與 Iceberg 資料表快照相關聯的 Amazon S3 上的 [Puffin ](https://iceberg.apache.org/puffin-spec/)檔案中。Puffin 是一種 Iceberg 檔案格式，旨在存放諸如索引、統計資料和草圖等中繼資料。將草圖存放在與快照關聯的 Puffin 檔案中，可確保 NDV 統計資料的交易一致性和新鮮度。

您可以將 設定為使用 AWS Glue 主控台或 執行資料欄統計資料產生任務 AWS CLI。當您啟動程序時， 會在背景 AWS Glue 啟動 Spark 任務，並更新 Data Catalog 中的 AWS Glue 資料表中繼資料。您可以使用 AWS Glue 主控台 AWS CLI 或 或呼叫 [GetColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_GetColumnStatisticsForTable.html) API 操作來檢視資料欄統計資料。

**注意**  
如果您使用 AWS Lake Formation 許可來控制對資料表的存取，資料欄統計資料任務擔任的角色需要完整資料表存取權才能產生統計資料。

**Topics**
+ [產生資料欄統計資料的先決條件](iceberg-column-stats-prereqs.md)
+ [為 Iceberg 資料表產生資料欄統計資料](iceberg-generate-column-stats.md)
+ [另請參閱](#see-also-iceberg-stats)

# 產生資料欄統計資料的先決條件
<a name="iceberg-column-stats-prereqs"></a>

若要產生或更新 Iceberg 資料表的資料欄統計資料，統計資料產生任務會代表您擔任 AWS Identity and Access Management (IAM) 角色。根據授與角色的權限，資料欄統計資料產生任務可以從 Amazon S3 資料存放區讀取資料。

當您設定資料欄統計資料產生任務時， AWS Glue 可讓您建立包含`AWSGlueServiceRole` AWS 受管政策加上指定資料來源所需內嵌政策的角色。

如果指定現有角色來產生資料欄統計資料，請確定其包含 `AWSGlueServiceRole` 政策或同等政策 (或此政策的縮減版本)，以及必要的內嵌政策。

如需所需許可的詳細資訊，請參閱[產生資料欄統計資料的先決條件](column-stats-prereqs.md)。

# 為 Iceberg 資料表產生資料欄統計資料
<a name="iceberg-generate-column-stats"></a>

請依照下列步驟，使用 AWS Glue 主控台或 AWS CLI 或 或執行 **StartColumnStatisticsTaskRun** 操作，在 Data Catalog 中設定產生統計資料的排程。

**若要產生資料欄統計資料**

1. 在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 登入 AWS Glue 主控台。

1. 選擇 Data Catalog 下方的**資料表**。

1. 從清單中選擇 Iceberg 資料表。

1. 選擇**動作**功能表下方的**資料欄統計資料**、**隨需產生**。

   您也可選擇**資料表**頁面下半區段之**資料欄統計資料**索引標籤下的**產生統計資料**按鈕。

1. 在**產生統計資料**頁面中，提供統計資料產生詳細資訊。請遵循 [根據排程產生資料欄統計資料](generate-column-stats.md) 部分中的步驟 6-11，為 Iceberg 資料表設定統計資料產生排程。

   也可以遵循 [隨需產生資料欄統計資料](column-stats-on-demand.md) 中的說明，選擇隨需產生資料欄統計資料
**注意**  
取樣選項不適用於 Iceberg 資料表。

   AWS Glue 會將 Iceberg 資料表每個資料欄的不同值數目，計算為遞交至 Amazon S3 位置中指定快照 ID 的新 Puffin 檔案。

## 另請參閱
<a name="see-also-iceberg-stats"></a>
+ [檢視資料欄統計資料](view-column-stats.md)
+ [檢視資料欄統計資料任務執行](view-stats-run.md)
+ [停止資料欄統計資料任務執行](stop-stats-run.md)
+ [刪除資料欄統計資料](delete-column-stats.md)

# 管理 Data Catalog
<a name="manage-catalog"></a>

 AWS Glue Data Catalog 是中央中繼資料儲存庫，可存放 Amazon S3 資料集的結構和操作中繼資料。有效管理 Data Catalog 對於維護資料品質、效能、安全性和管控至關重要。

 透過了解並套用這些 Data Catalog 管理實務，可以確保在資料環境發生變化時，中繼資料能夠保持準確、高效、安全且妥善管理。

本節涵蓋 Data Catalog 管理的下列方面：
+ *更新資料表結構描述和分區* 隨著資料變化，可能需要更新 Data Catalog 中定義的資料表結構描述或分區結構。如需如何使用 AWS Glue ETL 以程式設計方式進行這些更新的詳細資訊，請參閱 [使用 AWS Glue ETL 任務，在 Data Catalog 中更新結構描述並新增新的分區](update-from-job.md)。
+ *管理資料欄統計資料*：準確的資料欄統計資料有助於最佳化查詢計劃並提高效能。如需有關如何產生、更新和管理資料欄統計資料的詳細資訊，請參閱[使用資料欄統計資料最佳化查詢效能](column-statistics.md)。
+  *加密資料目錄*   若要保護敏感中繼資料，您可以使用 AWS Key Management Service () 加密資料目錄AWS KMS。本節說明如何啟用和管理 Data Catalog 的加密。
+ *使用 AWS Lake Formation保護 Data Catalog * Lake Formation 提供全方位的資料湖安全與存取控制方法。可以使用 Lake Formation 來保護和管控對 Data Catalog 和基礎資料的存取。

**Topics**
+ [使用 AWS Glue ETL 任務，在 Data Catalog 中更新結構描述並新增新的分區](update-from-job.md)
+ [使用資料欄統計資料最佳化查詢效能](column-statistics.md)
+ [加密您的資料目錄](catalog-encryption.md)
+ [使用 Lake Formation 保護您的 Data Catalog](secure-catalog.md)
+ [在 中使用 AWS Glue Data Catalog 檢視 AWS Glue](catalog-views.md)

# 使用 AWS Glue ETL 任務，在 Data Catalog 中更新結構描述並新增新的分區
<a name="update-from-job"></a>

您的擷取、轉換和載入 (ETL) 任務可能會在目標資料存放區中建立新的資料表分割區。您的資料集結構描述可能會隨著時間演進，而與 AWS Glue 資料目錄結構描述有所不同。AWS GlueETL 任務目前提供數個功能，您可以在 ETL 指令碼中使用這些功能來更新資料目錄中的 ETL 結構描述和分割區。這些功能可讓您在資料目錄中查看 ETL 運作的結果，無需重新執行爬蟲程式。

## 新分割區
<a name="update-from-job-partitions"></a>

如果您想要在 中檢視新的分割區 AWS Glue Data Catalog，您可以執行下列其中一項操作：
+ 任務完成後，重新執行爬蟲程式，並在爬蟲程式完成後在主控台上檢視新的分割區。
+ 任務完成後，立即在主控台上檢視新的分割區，而不重新執行爬蟲程式。您可以在 ETL 指令碼中加入幾行程式碼，以啟用此功能，如下列範例所示。程式碼會使用 `enableUpdateCatalog` 引數來指出在資料目錄建立新分割區時，要在任務執行期間更新。

**方法 1**  
以選項引數傳遞 `enableUpdateCatalog` 和 `partitionKeys`。  

```
additionalOptions = {"enableUpdateCatalog": True}
additionalOptions["partitionKeys"] = ["region", "year", "month", "day"]


sink = glueContext.write_dynamic_frame_from_catalog(frame=last_transform, database=<target_db_name>,
                                                    table_name=<target_table_name>, transformation_ctx="write_sink",
                                                    additional_options=additionalOptions)
```

```
val options = JsonOptions(Map(
    "path" -> <S3_output_path>, 
    "partitionKeys" -> Seq("region", "year", "month", "day"), 
    "enableUpdateCatalog" -> true))
val sink = glueContext.getCatalogSink(
    database = <target_db_name>, 
    tableName = <target_table_name>, 
    additionalOptions = options)sink.writeDynamicFrame(df)
```

**方法 2**  
以 `getSink()` 傳遞 `enableUpdateCatalog` 和 `partitionKeys`，並呼叫 `DataSink` 物件上的 `setCatalogInfo()`。  

```
sink = glueContext.getSink(
    connection_type="s3", 
    path="<S3_output_path>",
    enableUpdateCatalog=True,
    partitionKeys=["region", "year", "month", "day"])
sink.setFormat("json")
sink.setCatalogInfo(catalogDatabase=<target_db_name>, catalogTableName=<target_table_name>)
sink.writeFrame(last_transform)
```

```
val options = JsonOptions(
   Map("path" -> <S3_output_path>, 
       "partitionKeys" -> Seq("region", "year", "month", "day"), 
       "enableUpdateCatalog" -> true))
val sink = glueContext.getSink("s3", options).withFormat("json")
sink.setCatalogInfo(<target_db_name>, <target_table_name>)
sink.writeDynamicFrame(df)
```

現在，您可以建立新的目錄資料表、使用修改的結構描述更新現有資料表，並使用 AWS Glue ETL 任務在資料目錄新增新的資料表分割區，而無需重新執行爬蟲程式。

## 更新資料表結構描述
<a name="update-from-job-updating-table-schema"></a>

如果您想覆寫資料目錄資料表的結構描述，可以執行以下任一作業：
+ 任務完成後，重新執行爬蟲程式，並確定您的爬蟲程式已設定為更新資料表定義。當爬蟲程式完成時，檢視主控台上的新分割區以及任何結構描述更新。如需詳細資訊，請參閱[使用 API 設定爬蟲程式](https://docs.aws.amazon.com/glue/latest/dg/crawler-configuration.html#crawler-configure-changes-api)。
+ 任務完成後，立即在主控台上檢視修改的結構描述，無需重新執行爬蟲程式。您可以在 ETL 指令碼中加入幾行程式碼，以啟用此功能，如下列範例所示。程式碼使用設為 true 的 `enableUpdateCatalog`，並同時將 `updateBehavior` 設為 `UPDATE_IN_DATABASE`，表示在任務執行期間，在資料目錄中覆寫結構描述並新增新的分割區。

------
#### [ Python ]

```
additionalOptions = {
    "enableUpdateCatalog": True, 
    "updateBehavior": "UPDATE_IN_DATABASE"}
additionalOptions["partitionKeys"] = ["partition_key0", "partition_key1"]

sink = glueContext.write_dynamic_frame_from_catalog(frame=last_transform, database=<dst_db_name>,
    table_name=<dst_tbl_name>, transformation_ctx="write_sink",
    additional_options=additionalOptions)
job.commit()
```

------
#### [ Scala ]

```
val options = JsonOptions(Map(
    "path" -> outputPath, 
    "partitionKeys" -> Seq("partition_0", "partition_1"), 
    "enableUpdateCatalog" -> true))
val sink = glueContext.getCatalogSink(database = nameSpace, tableName = tableName, additionalOptions = options)
sink.writeDynamicFrame(df)
```

------

如果您想防止資料表結構描述遭到覆寫，但仍想要新增新的分割區，您也可以將 `updateBehavior` 值設為 `LOG`。`updateBehavior` 的預設值為 `UPDATE_IN_DATABASE`，因此，如果您未明確定該值，則會覆寫資料表結構描述。

如果 `enableUpdateCatalog` 未設為 true，無論針對 `updateBehavior` 選取哪個選項，ETL 任務都不會在資料目錄中更新資料表。

## 建立新的資料表
<a name="update-from-job-creating-new-tables"></a>

您也可以使用相同選項，在資料目錄中建立新資料表。您可以使用 `setCatalogInfo` 指定資料庫和新的資料表名稱。

------
#### [ Python ]

```
sink = glueContext.getSink(connection_type="s3", path="s3://path/to/data",
    enableUpdateCatalog=True, updateBehavior="UPDATE_IN_DATABASE",
    partitionKeys=["partition_key0", "partition_key1"])
sink.setFormat("<format>")
sink.setCatalogInfo(catalogDatabase=<dst_db_name>, catalogTableName=<dst_tbl_name>)
sink.writeFrame(last_transform)
```

------
#### [ Scala ]

```
val options = JsonOptions(Map(
    "path" -> outputPath, 
    "partitionKeys" -> Seq("<partition_1>", "<partition_2>"), 
    "enableUpdateCatalog" -> true, 
    "updateBehavior" -> "UPDATE_IN_DATABASE"))
val sink = glueContext.getSink(connectionType = "s3", connectionOptions = options).withFormat("<format>")
sink.setCatalogInfo(catalogDatabase = “<dst_db_name>”, catalogTableName = “<dst_tbl_name>”)
sink.writeDynamicFrame(df)
```

------

## 限制
<a name="update-from-job-restrictions"></a>

請注意下列限制：
+ 僅支援 Amazon Simple Storage Service (Amazon S3) 的目標。
+ 控管的資料表不支援 `enableUpdateCatalog` 功能。
+ 僅支援下列格式：`json`、`csv`、`avro` 和 `parquet`。
+ 若要建立或更新具有 `parquet` 分類的資料表，您必須使用適用於 DynamicFrames 的 AWS Glue 最佳化 Parquet 寫入器。這可以透過以下方法之一來達成：
  + 如果要使用 `parquet` 分類來更新目錄中的現有資料表，則在更新之前，資料表的 `"useGlueParquetWriter"` 資料表屬性必須設定為 `true`。您可以透過 AWS Glue APIs/SDK、主控台或 Athena DDL 陳述式來設定此屬性。  
![\[AWS Glue 主控台中的目錄資料表屬性編輯欄位。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/edit-table-property.png)

    設定目錄資料表屬性後，您便可以使用以下程式碼片段，以新資料更新目錄資料表：

    ```
    glueContext.write_dynamic_frame.from_catalog(
        frame=frameToWrite,
        database="dbName",
        table_name="tableName",
        additional_options={
            "enableUpdateCatalog": True,
            "updateBehavior": "UPDATE_IN_DATABASE"
        }
    )
    ```
  + 如果目錄中尚不存在資料表，您可以在指令碼中使用 `getSink()` 方法和 `connection_type="s3"` 將資料表及其分割區新增至目錄中，並將資料寫入 Amazon S3。為您的工作流程提供適當的 `partitionKeys` 和 `compression`。

    ```
    s3sink = glueContext.getSink(
        path="s3://bucket/folder/",
        connection_type="s3",
        updateBehavior="UPDATE_IN_DATABASE",
        partitionKeys=[],
        compression="snappy",
        enableUpdateCatalog=True
    )
        
    s3sink.setCatalogInfo(
        catalogDatabase="dbName", catalogTableName="tableName"
    )
        
    s3sink.setFormat("parquet", useGlueParquetWriter=True)
    s3sink.writeFrame(frameToWrite)
    ```
  + `glueparquet` 格式值是啟用 AWS Glue parquet 寫入器的舊版方法。
+ 將 `updateBehavior` 設為 `LOG` 後，只有在 `DynamicFrame` 結構描述等同於或包含資料目錄資料表結構描述中定義之欄的子集時，才會新增新的分割區。
+ 未分割資料表不支援結構描述更新 (不使用 "partitionKeys" 選項)。
+ 在 ETL 指令碼中傳遞的參數和資料目錄資料表結構描述中的 partitionKeys 之間，您的 partitionKeys 必須等效，而且順序相同。
+ 此功能目前尚不支援更新/建立更新巢狀結構描述的資料表 (例如，結構內的陣列)。

如需詳細資訊，請參閱[Spark 指令碼程式設計](aws-glue-programming.md)。

# 在 ETL 任務中使用 MongoDB 連線
<a name="integrate-with-mongo-db"></a>

您可以為 MongoDB 建立一個連線，然後在 AWS Glue 任務中使用該連線。如需詳細資訊，請參閱 AWS Glue 程式設計指南[MongoDB 連線](aws-glue-programming-etl-connect-mongodb-home.md)中的 。連線 `url`、`username` 和 `password` 儲存在 MongoDB 連線中。其他選項可以在 ETL 任務指令碼中使用 `glueContext.getCatalogSource` 的 `additionalOptions` 參數指定。其他選項包括：
+ `database`：(必要) 讀取的 MongoDB 資料庫。
+ `collection`：(必要) 讀取的 MongoDB 集合。

藉由將 `database` 和 `collection` 資訊放在 ETL 任務指令碼中，您可以在多個任務中使用相同的連線。

1. 建立 MongoDB 資料來源的 AWS Glue Data Catalog 連線。請參閱 ["connectionType": "mongodb"](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html#aws-glue-programming-etl-connect-mongodb) 以取得此連線參數的描述。您可以使用主控台、API 或 CLI 來建立連線。

1. 在 中建立資料庫 AWS Glue Data Catalog ，以存放 MongoDB 資料的資料表定義。如需詳細資訊，請參閱[建立資料庫](define-database.md)。

1. 建立爬蟲程式，使用連接到 MongoDB 的連線中的資訊，網路爬取 MongoDB 中的資料。爬蟲程式會在 中建立資料表 AWS Glue Data Catalog ，描述您在任務中使用的 MongoDB 資料庫中的資料表。如需詳細資訊，請參閱[使用編目程式填入 Data Catalog](add-crawler.md)。

1. 使用自訂指令碼來建立任務。您可以使用主控台、API 或 CLI 來建立它們。如需詳細資訊，請參閱[在 AWS Glue 新增任務](https://docs.aws.amazon.com/glue/latest/dg/add-job.html)。

1. 選擇任務的資料目標。代表資料目標的資料表可在您的資料目錄中定義，或者您的任務可在執行時建立目標資料表。選擇編寫任務時的目標位置。如果目標需要連線，您的任務也會參照此連線。如果您的任務需要多個資料目標，可在之後編輯指令碼以新增來源。

1. 為任務及產生的指令碼提供引數，以自訂任務處理環境。

   這裡提供了從基於資料目錄中定義之資料表結構的 MongoDB 資料庫建立 `DynamicFrame` 的範例。程式碼使用 `additionalOptions` 以提供其他資料來源資訊：

------
#### [  Scala  ]

   ```
   val resultFrame: DynamicFrame = glueContext.getCatalogSource(
           database = catalogDB, 
           tableName = catalogTable, 
           additionalOptions = JsonOptions(Map("database" -> DATABASE_NAME, 
                   "collection" -> COLLECTION_NAME))
         ).getDynamicFrame()
   ```

------
#### [  Python  ]

   ```
   glue_context.create_dynamic_frame_from_catalog(
           database = catalogDB,
           table_name = catalogTable,
           additional_options = {"database":"database_name", 
               "collection":"collection_name"})
   ```

------

1. 隨需或透過觸發執行任務。

# 使用資料欄統計資料最佳化查詢效能
<a name="column-statistics"></a>

您可以計算 Parquet、ORC、JSON、ION、CSV 和 XML 等資料格式 AWS Glue Data Catalog 資料表的資料欄層級統計資料，而無需設定其他資料管道。資料欄統計資料可協助您透過深入了解資料欄內的值，了解資料設定檔。

Data Catalog 支援產生資料欄值的統計資料，例如最小值、最大值、總 null 值、總相異值、值的平均長度和真值的總出現次數。 AWS 分析服務，例如 Amazon Redshift，可以使用 Amazon Athena 這些資料欄統計資料來產生查詢執行計畫，並選擇改善查詢效能的最佳計畫。

產生資料欄統計資料有以下三種情況：

 **自動**   
AWS Glue 支援在目錄層級自動產生資料欄統計資料，以便自動產生 中新資料表的統計資料 AWS Glue Data Catalog。

**已排程**  
AWS Glue 支援排程資料欄統計資料產生，以便可以按照週期性排程自動執行。  
透過排程統計資料計算，資料欄統計資料任務會更新整體資料表層級統計資料 (例如新統計資料的最小值、最大值和平均值)，為查詢引擎提供準確且最新統計資料，以最佳化查詢執行。

**隨需**  
使用此選項可在需要時隨需產生資料欄統計資料。這對於臨機操作分析或在需要立即計算統計資料時非常有用。

您可以設定 使用 AWS Glue 主控台 AWS CLI和 AWS Glue API 操作來執行資料欄統計資料產生任務。當您啟動程序時， 會在背景 AWS Glue 啟動 Spark 任務，並更新 Data Catalog 中的 AWS Glue 資料表中繼資料。您可以使用 AWS Glue 主控台 AWS CLI 或 或呼叫 [GetColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_GetColumnStatisticsForTable.html) API 操作來檢視資料欄統計資料。

**注意**  
如果您正在使用 Lake Formation 權限控制資料表的存取權，則資料欄統計資料任務所擔任的角色將需要完整的資料表存取權，才可產生統計資料。

 下列影片示範如何使用資料欄統計資料來增強查詢效能。

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


**Topics**
+ [產生資料欄統計資料的先決條件](column-stats-prereqs.md)
+ [自動產生資料欄統計資料](auto-column-stats-generation.md)
+ [根據排程產生資料欄統計資料](generate-column-stats.md)
+ [隨需產生資料欄統計資料](column-stats-on-demand.md)
+ [檢視資料欄統計資料](view-column-stats.md)
+ [檢視資料欄統計資料任務執行](view-stats-run.md)
+ [停止資料欄統計資料任務執行](stop-stats-run.md)
+ [刪除資料欄統計資料](delete-column-stats.md)
+ [考量和限制](column-stats-notes.md)

# 產生資料欄統計資料的先決條件
<a name="column-stats-prereqs"></a>

若要產生或更新資料欄統計資料，統計資料產生任務會代表您擔任 AWS Identity and Access Management (IAM) 角色。根據授與角色的權限，資料欄統計資料產生任務可以從 Amazon S3 資料存放區讀取資料。

當您設定資料欄統計資料產生任務時， AWS Glue 可讓您建立包含`AWSGlueServiceRole` AWS 受管政策加上指定資料來源所需內嵌政策的角色。

如果指定現有角色來產生資料欄統計資料，請確定其包含 `AWSGlueServiceRole` 政策或同等政策 (或此政策的縮減版本)，以及必要的內嵌政策。請依照下列步驟來建立新的 IAM 角色：

**注意**  
 若要針對由 Lake Formation 管理的資料表產生統計資料，則用於產生統計資料的 IAM 角色需要取得完整資料表存取權。

當您設定資料欄統計資料產生任務時， AWS Glue 可讓您建立包含`AWSGlueServiceRole` AWS 受管政策加上指定資料來源所需內嵌政策的角色。您也可以建立角色並連接下面的政策中列出的許可，然後將該角色新增至資料欄統計資料產生任務。

**建立產生資料欄統計資料的 IAM 角色**

1. 若要建立 IAM 角色，請參閱[建立 AWS Glue IAM 角色](https://docs.aws.amazon.com/glue/latest/dg/create-an-iam-role.html)。

1. 若要更新現有角色，請在 IAM 主控台中，前往產生資料欄統計資料程序正在使用的 IAM 角色。

1. 在**新增權限**區段，選擇**連接政策**。在新開啟的瀏覽器視窗中，選擇 `AWSGlueServiceRole` AWS 受管政策。

1. 您也需要納入從 Amazon S3 資料位置讀取資料的權限。

   在**新增權限**區段中，選擇**建立政策**。在新開啟的瀏覽器視窗中，建立要搭配您角色使用的新政策。

1. 在**建立政策**頁面中，選擇 **JSON** 索引標籤。將下列 `JSON` 程式碼複製到政策編輯器欄位。
**注意**  
在下列政策中，將帳戶 ID 取代為有效 AWS 帳戶，並將 取代`region`為資料表的區域，並將 取代`bucket-name`為 Amazon S3 儲存貯體名稱。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "S3BucketAccess",
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket",
                   "s3:GetObject"
               ],
               "Resource": [
               	"arn:aws:s3:::amzn-s3-demo-bucket/*",
   							"arn:aws:s3:::amzn-s3-demo-bucket"
               ]
           }
        ]
   }
   ```

------

1. (選用) 如果您正在使用 Lake Formation 權限向資料提供存取權，則 IAM 角色需要 `lakeformation:GetDataAccess` 權限。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "LakeFormationDataAccess",
         "Effect": "Allow",
         "Action": "lakeformation:GetDataAccess",
         "Resource": [
           "*"
         ]
       }
     ]
   }
   ```

------

    如果 Amazon S3 資料位置已向 Lake Formation 註冊，且資料欄統計資料產生任務擔任的 IAM 角色沒有授予資料表的 `IAM_ALLOWED_PRINCIPALS` 群組權限，則該角色需要資料表中的 Lake Formation `ALTER` 和 `DESCRIBE` 權限。用於註冊 Amazon S3 儲存貯體的角色需要資料表中的 Lake Formation `INSERT` 和 `DELETE` 權限。

   如果 Amazon S3 資料位置已向 Lake Formation 註冊，且 IAM 角色沒有授予資料表的 `IAM_ALLOWED_PRINCIPALS` 群組權限，則該角色需要資料表中的 Lake Formation `ALTER`、`DESCRIBE`、`INSERT` 及 `DELETE` 權限。

1. 如果您已啟用目錄層級 `Automatic statistics generation` 選項，IAM 角色必須具有預設 Data Catalog 的 `glue:UpdateCatalog` 許可或 Lake Formation `ALTER CATALOG` 許可。您可以使用 `GetCatalog` 操作來驗證目錄屬性。

1. (選用) 寫入加密 Amazon CloudWatch Logs 的資料欄統計資料產生任務，需要金鑰政策中的下列權限。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "CWLogsKmsPermissions",
         "Effect": "Allow",
         "Action": [
           "logs:CreateLogGroup",
           "logs:CreateLogStream",
           "logs:PutLogEvents",
           "logs:AssociateKmsKey"
         ],
         "Resource": [
           "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue:*"
         ]
       },
       {
         "Sid": "KmsPermissions",
         "Effect": "Allow",
         "Action": [
           "kms:GenerateDataKey",
           "kms:Decrypt",
           "kms:Encrypt"
         ],
         "Resource": [
           "arn:aws:kms:us-east-1:111122223333:key/arn of key used for ETL cloudwatch encryption"
         ],
         "Condition": {
           "StringEquals": {
             "kms:ViaService": [
               "glue.us-east-1.amazonaws.com"
             ]
           }
         }
       }
     ]
   }
   ```

------

1. 您用來執行資料欄統計資料的角色必須具有該角色的 `iam:PassRole` 許可。

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

****  

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

------

1. 建立用於產生資料欄統計資料的 IAM 角色時，該角色也必須具有下列信任政策，使服務可以擔任該角色。

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

****  

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

------

# 自動產生資料欄統計資料
<a name="auto-column-stats-generation"></a>

自動產生資料欄統計資料可讓您排程和自動計算 AWS Glue Data Catalog中新資料表的統計資料。在您啟用自動產生統計資料時，Data Catalog 會探索具有特定資料格式 (例如 Parquet、JSON、CSV、XML、ORC、ION 和 Apache Iceberg) 的新資料表，及其個別儲存貯體路徑。使用一次性目錄組態，Data Catalog 會產生這些資料表的統計資料。

 資料湖管理員可以在 Lake Formation 主控台中選取預設目錄，並使用 `Optimization configuration` 選項啟用資料表統計資料，以設定統計資料產生。當您在 Data Catalog 中建立新資料表或更新現有資料表時，Data Catalog 會每週收集 Apache Iceberg 資料表的不同值 (NDV) 數目，以及其他統計資料，例如其他支援檔案格式的 null、最大值、最小值和平均長度。

如果您已在資料表層級設定統計資料產生，或先前已刪除資料表的統計資料產生設定，則這些資料表特定設定優先於自動產生資料欄統計資料的預設目錄設定。

 自動產生統計資料任務會分析資料表中 50% 的記錄，來計算統計資料。自動產生資料欄統計資料可確保 Data Catalog 維護每週指標，以供 Amazon Athena 和 Amazon Redshift Spectrum 等查詢引擎使用，以提高查詢效能並節省潛在成本。它允許使用 AWS Glue APIs或 主控台排程統計資料產生，提供自動化程序，無需手動介入。

**Topics**
+ [啟用目錄層級自動產生統計資料](enable-auto-column-stats-generation.md)
+ [檢視自動資料表層級設定](view-auto-column-stats-settings.md)
+ [停用產生目錄層級資料欄統計資料](disable-auto-column-stats-generation.md)

# 啟用目錄層級自動產生統計資料
<a name="enable-auto-column-stats-generation"></a>

您可以在 Data Catalog 中，為所有新的 Apache Iceberg 資料表和非 OTF 資料表 (Parquet、JSON、CSV、XML、ORC、ION) 格式的資料表啟用自動列統計資料產生。建立資料表後，您也可以手動明確更新資料欄統計資料設定。

 若要更新 Data Catalog 設定以啟用目錄層級，所使用的 IAM 角色必須具有根目錄的 `glue:UpdateCatalog` 許可或 AWS Lake Formation `ALTER CATALOG` 許可。您可以使用 `GetCatalog` API 驗證目錄屬性。

------
#### [ AWS 管理主控台 ]

**在帳戶層級啟用自動產生資料欄統計資料**

1. 開啟 Lake Formation 主控台，網址為 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)。

1. 在左側導覽列上，選擇**目錄**。

1. 在**目錄摘要**頁面上，選擇**最佳化組態**下的**編輯**。  
![\[螢幕擷取畫面顯示可用來產生資料欄統計資料的選項。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/edit-column-stats-auto.png)

1. 在**資料表最佳化組態**頁面上，選擇**為目錄的資料表啟用自動產生統計資料**選項。  
![\[螢幕擷取畫面顯示可用來產生資料欄統計資料的選項。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/edit-optimization-option.jpg)

1. 選擇現有的 IAM 角色，或建立一個具有執行資料欄統計資料任務所需許可的新角色。

1. 選擇**提交**。

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

您也可以透過 AWS CLI啟用目錄層級統計資料收集。若要使用 設定資料表層級統計資料收集 AWS CLI，請執行下列命令：

```
aws glue update-catalog --cli-input-json '{
    "name": "123456789012",
    "catalogInput": {
        "description": "Updating root catalog with role arn",
        "catalogProperties": {
            "customProperties": {
                "ColumnStatistics.RoleArn": "arn:aws:iam::"123456789012":role/service-role/AWSGlueServiceRole",
                "ColumnStatistics.Enabled": "true"
            }
        }
    }
}'
```

 上述命令呼叫 AWS Glue的 `UpdateCatalog`操作，採用具有下列索引鍵/值對的`CatalogProperties`結構來產生目錄層級統計資料：
+ ColumnStatistics.RoleArn – 用於為產生目錄層級統計資料而觸發的所有任務的 IAM 角色 ARN
+ ColumnStatistics.Enabled – 布林值，指出目錄層級設定是啟用還是停用

------

# 檢視自動資料表層級設定
<a name="view-auto-column-stats-settings"></a>

 啟用目錄層級統計資料收集時，只要透過 或 `UpdateTable` APIs、 AWS 管理主控台 SDK 或 建立或更新 Apache Hive 資料表`CreateTable`或 Apache Iceberg 資料表 AWS Glue 編目程式，就會為該資料表建立同等資料表層級設定。

 啟用產生自動統計資料的資料表必須遵循下列其中一個屬性：
+ 使用開頭為 org.apache.hadoop 且 `TableType` 等於 `EXTERNAL_TABLE` 的 `InputSerdeLibrary`
+ 使用開頭為 `com.amazon.ion` 且 `TableType` 等於 `EXTERNAL_TABLE` 的 `InputSerdeLibrary`
+ 在其參數結構中包含 table\$1type："ICEBERG"。

 建立或更新資料表之後，您可以驗證資料表詳細資訊以確認統計資料產生。`Statistics generation summary` 會顯示 `Schedule` 屬性設定為 `AUTO`，且 `Statistics configuration` 值為 `Inherited from catalog`。Glue 會在內部自動觸發具有下列設定的任何資料表設定。

![\[已套用目錄層級統計資料收集的 Hive 資料表影像，且已收集統計資料。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/auto-stats-summary.png)


# 停用產生目錄層級資料欄統計資料
<a name="disable-auto-column-stats-generation"></a>

 您可以使用 AWS Lake Formation 主控台、 `glue:UpdateCatalogSettings` API 或 `glue:DeleteColumnStatisticsTaskSettings` API 來停用新資料表的自動資料欄統計資料產生。

**在帳戶層級停用自動產生資料欄統計資料**

1. 開啟 Lake Formation 主控台，網址為 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)。

1. 在左側導覽列上，選擇**目錄**。

1. 在**目錄摘要**頁面上，選擇**最佳化組態**下的**編輯**。

1. 在**資料表最佳化組態**頁面上，取消選取**為目錄的資料表啟用自動產生統計資料**選項。

1. 選擇**提交**。

# 根據排程產生資料欄統計資料
<a name="generate-column-stats"></a>

請依照下列步驟，使用 AWS Glue 主控台、 AWS CLI或 [CreateColumnStatisticsTaskSettings](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-CreateColumnStatisticsTaskSettings) 操作，在 中 AWS Glue Data Catalog 設定產生資料欄統計資料的排程。

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

**使用主控台產生資料欄統計資料**

1. 在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 登入 AWS Glue 主控台。

1. 選擇 Data Catalog 資料表。

1. 從清單中選擇資料表。

1. 選擇**資料表**頁面下半部分中的**資料欄統計資料**索引標籤。

1. 您也可以在**動作**的**資料欄統計資料**下選擇**按排程產生**。

1. 在**根據排程產生統計資料**頁面上，透過選擇頻率和開始時間來設定執行資料欄統計資料任務的週期性排程。您可以選擇每小時、每日、每週的頻率，或定義 Cron 表達式來指定排程。

   Cron 表達式是代表排程模式的字串，由 6 個以空格分隔的欄位組成：\$1 \$1 \$1 \$1 \$1 <minute> <hour> <day of month> <month> <day of week> <year>。例如，若要每天在午夜執行任務，Cron 表達式會是：0 0 \$1 \$1 ？ \$1

   如需詳細資訊，請參閱 [Cron 表達](https://docs.aws.amazon.com/glue/latest/dg/monitor-data-warehouse-schedule.html#CronExpressions)式。  
![\[螢幕擷取畫面顯示可用來產生資料欄統計資料的選項。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/generate-column-stats-schedule.png)

1. 接著，選擇資料欄選項以產生統計資料。
   + **所有資料欄**：選擇此選項可產生資料表中所有資料欄的統計資料。
   + **選取的資料欄**：選擇此選項可產生特定資料欄的統計資料。您可以從下拉式清單中選取資料欄。

1. 選擇 IAM 角色或建立具有產生 statistics 許可的現有角色。 AWS Glue 會擔任此角色來產生資料欄統計資料。

   更快的方法是讓 AWS Glue 主控台為您建立角色。其建立的角色專門用於產生資料欄統計資料，並包含 `AWSGlueServiceRole` AWS 受管政策加上指定資料來源所需的內嵌政策。

   如果指定現有角色來產生資料欄統計資料，請確定其包含 `AWSGlueServiceRole` 政策或同等政策 (或此政策的縮減版本)，以及必要的內嵌政策。

1. (選用) 接著，選擇安全組態，針對日誌啟用靜態加密。

1. (選用) 您可以透過僅指示資料表中特定百分比的資料列，來選擇範例大小以產生統計資料。預設值為所有資料列。使用向上和向下箭頭以增加或減少百分比值。

   我們建議在資料表中包含所有資料列，以計算準確的統計資料。只有在接受近似值時，才使用範例資料列產生資料欄統計資料。

1. 選擇**產生統計資料**以執行資料欄統計資料產生任務。

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

您可以使用下列 AWS CLI 範例來建立資料欄統計資料產生排程。database-name、table-name 和 role 是必要的參數，而選用參數是 schedule、column-name-list、catalog-id、sample-size 和 security-configuration。

```
aws glue create-column-statistics-task-settings \ 
 --database-name 'database_name' \ 
 --table-name table_name \ 
 --role 'arn:aws:iam::123456789012:role/stats-role' \ 
 --schedule 'cron(0 0-5 14 * * ?)' \ 
 --column-name-list 'col-1' \  
 --catalog-id '123456789012' \ 
 --sample-size '10.0 ' \
 --security-configuration 'test-security'
```

您也可透過呼叫 [StartColumnStatisticsTaskRun](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-StartColumnStatisticsTaskRun) 操作，以產生資料欄統計資料。

------

# 管理產生資料欄統計資料的排程
<a name="manage-column-stats-schedule"></a>

可以管理排程操作，例如更新、啟動、停止和刪除 AWS Glue中產生資料欄統計資料的排程。您可以使用 AWS Glue 主控台 AWS CLI或[AWS Glue 資料欄統計資料 API 操作](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html)來執行這些任務。

**Topics**
+ [更新資料欄統計資料產生排程](#update-column-stats-shedule)
+ [停止產生資料欄統計資料的排程](#stop-column-stats-schedule)
+ [繼續產生資料欄統計資料的排程](#resume-column-stats-schedule)
+ [刪除資料欄統計資料產生排程](#delete-column-stats-schedule)

## 更新資料欄統計資料產生排程
<a name="update-column-stats-shedule"></a>

可以更新排程，在建立資料欄統計資料產生任務之後觸發其。您可以使用 AWS Glue 主控台 AWS CLI，或執行 [UpdateColumnStatisticsTaskSettings](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-UpdateColumnStatisticsTaskSettings) 操作來更新資料表的排程。可以修改現有排程的參數，例如排程類型 (隨需或排定) 和其他選用參數。

------
#### [ AWS 管理主控台 ]

**若要更新資料欄統計資料產生任務的設定**

1. 在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 登入 AWS Glue 主控台。

1. 選擇您要從資料表清單中更新的資料表。

1. 在資料表詳細資料頁面的下面部分中，選擇**資料欄統計資料**。

1. 在**動作**下，選擇**編輯**以更新排程。

1. 對排程進行所需變更，然後選擇**儲存**。

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

 如果您未在 主控台中使用 AWS Glue統計資料產生功能，您可以使用 `update-column-statistics-task-settings`命令手動更新排程。下列範例顯示如何使用 AWS CLI更新資料欄統計資料。

```
aws glue update-column-statistics-task-settings \ 
 --database-name 'database_name' \ 
 --table-name 'table_name' \ 
 --role arn:aws:iam::123456789012:role/stats_role \ 
 --schedule 'cron(0 0-5 16 * * ?)' \ 
 --column-name-list 'col-1' \
 --sample-size '20.0' \  
 --catalog-id '123456789012'\
 --security-configuration 'test-security'
```

------

## 停止產生資料欄統計資料的排程
<a name="stop-column-stats-schedule"></a>

 如果不再需要增量統計資料，可以停止已排程的產生，以節省資源和成本。暫停排程不會影響先前產生的統計資料。可以在方便時繼續排程。

------
#### [ AWS 管理主控台 ]

**若要停止資料欄統計資料產生任務的排程**

1. 在 AWS Glue 主控台上，選擇 Data Catalog **下的資料表**。

1. 選取包含資料欄統計資料的資料表。

1. 在**資料表詳細資料**頁面中，選擇資料**資料欄統計資料**。

1. 在**動作**下，選擇**已排程產生**，然後選擇**暫停**。

1. 選擇**暫停**以確認。

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

若要使用 停止資料欄統計資料任務執行排程 AWS CLI，您可以使用下列命令：

```
aws glue stop-column-statistics-task-run-schedule \
 --database-name ''database_name' \
 --table-name 'table_name'
```

將 `database_name` 和 `table_name` 取代為您要對其停止資料欄統計資料任務執行排程的資料庫和資料表的實際名稱。

------

## 繼續產生資料欄統計資料的排程
<a name="resume-column-stats-schedule"></a>

 如果您已暫停統計資料產生排程， AWS Glue 可讓您在方便的時候繼續排程。您可以使用 主控台 AWS CLI或 [StartColumnStatisticsTaskRunSchedule](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-StartColumnStatisticsTaskRunSchedule) 操作繼續排程 AWS Glue 。

------
#### [ AWS 管理主控台 ]

**若要繼續產生資料欄統計資料的排程**

1. 在 AWS Glue 主控台上，選擇 Data Catalog **下的資料表**。

1. 選取包含資料欄統計資料的資料表。

1. 在**資料表詳細資料**頁面中，選擇資料**資料欄統計資料**。

1. 在**動作**下，選擇**已排程產生**，然後選擇**繼續**。

1. 選擇**繼續**以確認。

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

將 `database_name` 和 `table_name` 取代為您要對其停止資料欄統計資料任務執行排程的資料庫和資料表的實際名稱。

```
aws glue start-column-statistics-task-run-schedule \
 --database-name 'database_name' \
 --table-name 'table_name'
```

------

## 刪除資料欄統計資料產生排程
<a name="delete-column-stats-schedule"></a>

 儘管通常建議保持最新統計資料以獲得最佳查詢效能，但在某些特定使用案例中，移除自動產生排程可能是有益的。
+ 如果資料保持相對靜態，則現有的資料欄統計資料可能會長時間保持準確，從而減少頻繁更新的需求。刪除排程可防止因重新產生未變更資料的統計資料所導致的不必要的資源耗用和開銷。
+ 偏好手動控制統計資料產生時。透過刪除自動排程，管理員可以在特定間隔或在重大資料變更後選擇性地更新資料欄統計資料，使該程序與其維護策略和資源配置需求保持一致。

------
#### [ AWS 管理主控台 ]

**若要刪除產生資料欄統計資料的排程**

1. 在 AWS Glue 主控台上，選擇 Data Catalog **下的資料表**。

1. 選取包含資料欄統計資料的資料表。

1. 在**資料表詳細資料**頁面中，選擇資料**資料欄統計資料**。

1. 在**動作**下，選擇**已排程產生**，然後選擇**刪除**。

1. 選擇**刪除**以確認。

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

將 `database_name` 和 `table_name` 取代為您要對其停止資料欄統計資料任務執行排程的資料庫和資料表的實際名稱。

可以使用 [DeleteColumnStatisticsTaskSettings](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-DeleteColumnStatisticsTaskSettings) API 操作或 AWS CLI來刪除資料欄統計資料。下列範例示範如何使用 AWS Command Line Interface () 刪除產生資料欄統計資料的排程AWS CLI。

```
aws glue delete-column-statistics-task-settings \
    --database-name 'database_name' \
    --table-name 'table_name'
```

------

# 隨需產生資料欄統計資料
<a name="column-stats-on-demand"></a>

您可以隨需執行 AWS Glue Data Catalog 資料表任務的資料欄統計資料任務，無需設定排程。這選項對於臨機操作分析或在需要立即計算統計資料時非常有用。

請依照下列步驟，使用 AWS Glue 主控台 或 產生 Data Catalog 資料表的隨需資料欄統計資料 AWS CLI。

------
#### [ AWS 管理主控台 ]

**使用主控台產生資料欄統計資料**

1. 在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 登入 AWS Glue 主控台。

1. 選擇 Data Catalog 資料表。

1.  從清單中選擇資料表。

1. 選擇**動作**功能表下方的**產生統計資料**。

   您也可以選擇**資料表**頁面下半部分的**資料欄統計資料**索引標籤下的**產生**、**隨需產生**選項。

1. 遵循 [根據排程產生資料欄統計資料](generate-column-stats.md) 中的步驟 7-11 來產生資料表的資料欄統計資料。

1. 在**產生統計資料**頁面中，指定下列選項：  
![\[螢幕擷取畫面顯示可用來產生資料欄統計資料的選項。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/generate-column-stats.png)
   + **所有資料欄**：選擇此選項可產生資料表中所有資料欄的統計資料。
   + **選取的資料欄**：選擇此選項可產生特定資料欄的統計資料。您可以從下拉式清單中選取資料欄。
   + **IAM 角色**：選擇 **建立新的 IAM 角色**，該角色具有執行資料欄統計資料產生任務所需的許可政策。選擇「檢視許可詳細資訊」以檢閱政策聲明。您也可以從清單中選取 IAM 角色。如需所需許可的詳細資訊，請參閱[產生資料欄統計資料的先決條件](column-stats-prereqs.md)。

     AWS Glue 會擔任您指定之角色的許可，以產生統計資料。

     如需提供 角色的詳細資訊 AWS Glue，請參閱 [的身分型政策 AWS Glue。](https://docs.aws.amazon.com/glue/latest/dg/security_iam_service-with-iam.html#security_iam_service-with-iam-id-based-policies)
   + (選用) 接著，選擇安全組態，針對日誌啟用靜態加密。
   + **範例資料列**：僅從資料表中選擇特定的資料列百分比以產生統計資料。預設值為所有資料列。使用向上和向下箭頭以增加或減少百分比值。
**注意**  
我們建議在資料表中包含所有資料列，以計算準確的統計資料。只有在接受近似值時，才使用範例資料列產生資料欄統計資料。

   選擇**產生統計資料**以執行任務。

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

此命令會觸發針對指定資料表的資料欄統計資料任務執行。您需要提供資料庫名稱、資料表名稱、具有產生統計資料許可的 IAM 角色，以及選擇性提供統計資料計算的資料欄名稱和範例大小百分比。

```
aws glue start-column-statistics-task-run \ 
    --database-name 'database_name \ 
    --table-name 'table_name' \ 
    --role 'arn:aws:iam::123456789012:role/stats-role' \
    --column-name 'col1','col2'  \
    --sample-size 10.0
```

此命令會啟動任務，以為指定的資料表產生資料欄統計資料。

------

## 隨需更新資料欄統計資料
<a name="update-column-stats-on-demand"></a>

 維護最新資料欄統計資料對於查詢最佳化工具產生有效的執行計畫至關重要，可確保改善查詢效能、減少資源消耗，以及改善整體系統效能。在重大資料變更 (例如大量載入或大量修改) 後，此流程尤其重要，因為這可能會使現有統計資料過時。

您需要從 AWS Glue 主控台明確執行**產生統計資料**任務，以重新整理資料欄統計資料。Data Catalog 不會自動重新整理統計資料。

如果您不是在主控台中使用 AWS Glue統計資料產生功能，則可以使用 [UpdateColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateColumnStatisticsForTable.html) API 操作 或 手動更新資料欄統計資料 AWS CLI。下列範例顯示如何使用 AWS CLI更新資料欄統計資料。

```
aws glue update-column-statistics-for-table --cli-input-json:

{
    "CatalogId": "111122223333",
    "DatabaseName": "database_name",
    "TableName": "table_name",
    "ColumnStatisticsList": [
        {
            "ColumnName": "col1",
            "ColumnType": "Boolean",
            "AnalyzedTime": "1970-01-01T00:00:00",
            "StatisticsData": {
                "Type": "BOOLEAN",
                "BooleanColumnStatisticsData": {
                    "NumberOfTrues": 5,
                    "NumberOfFalses": 5,
                    "NumberOfNulls": 0
                }
            }
        }
    ]
}
```

# 檢視資料欄統計資料
<a name="view-column-stats"></a>

成功產生統計資料後，Data Catalog 會將成本型最佳化工具的此資訊儲存在 Amazon Athena 和 Amazon Redshift 中，以在執行查詢時做出最佳選擇。統計資料會根據資料欄類型而異。

------
#### [ AWS 管理主控台 ]

**檢視資料表的資料欄統計資料**
+ 執行資料欄統計資料任務後，**資料表詳細資料頁面**中的**資料欄統計資料**索引標籤會顯示資料表的統計資料。  
![\[螢幕擷取畫面顯示最近一次執行所產生的資料欄。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/view-column-stats.png)

  下列為可用的統計資料：
  + 資料欄名稱：用來產生統計資料的資料欄名稱
  + 上次更新：統計資料產生時的資料和時間
  + 平均長度：資料欄中值的平均長度
  + 相異值：資料欄中的相異值總數。我們會以 5% 相對誤差率預估資料欄中相異值數。
  + 最大值：資料欄中的最大值。
  + 最小值：資料欄中的最小值。
  + 最大長度：資料欄中的最高值長度。
  + Null 值：資料欄中的 Null 值總數。
  + True 值：資料欄中的 true 值總數。
  + False 值：資料欄中的 false 值總數。
  + numFiles：資料表中的檔案總數。可在**進階屬性**索引標籤下使用此值。

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

下列範例顯示如何使用 AWS CLI擷取資料欄統計資料。

```
aws glue get-column-statistics-for-table \
    --database-name database_name \
    --table-name table_name \
    --column-names <column_name>
```

 您可以使用 [GetColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_GetColumnStatisticsForTable.html) API 操作，來檢視資料欄統計資料。

------

# 檢視資料欄統計資料任務執行
<a name="view-stats-run"></a>

執行資料欄統計資料任務之後，您可以使用 AWS Glue 主控台 AWS CLI 或使用 [GetColumnStatisticsTaskRuns](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-GetColumnStatisticsTaskRun) 操作來探索資料表的任務執行詳細資訊。

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

**檢視資料欄統計資料任務執行詳細資料**

1. 在 AWS Glue 主控台上，選擇 Data Catalog **下的資料表**。

1. 選取包含資料欄統計資料的資料表。

1. 在**資料表詳細資料**頁面中，選擇資料**資料欄統計資料**。

1. 選擇**檢視執行**。

   您可以查看與指定資料表相關聯之所有執行的相關資訊。  
![\[螢幕擷取畫面顯示可用來產生資料欄統計資料的選項。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/view-column-stats-task-runs.png)

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

在下列範例中，將 `DatabaseName` 和 `TableName` 值取代為實際的資料庫和資料表名稱。

```
aws glue get-column-statistics-task-runs --input-cli-json file://input.json
{
    "DatabaseName": "database_name",
    "TableName": "table_name"
}
```

------

# 停止資料欄統計資料任務執行
<a name="stop-stats-run"></a>

您可以使用 AWS Glue 主控台 AWS CLI 或使用 [StopColumnStatisticsTaskRun](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-StopColumnStatisticsTaskRun) 操作來停止資料表的資料欄統計資料任務執行。

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

**停止資料行統計資料工作執行**

1. 在 AWS Glue 主控台上，選擇 Data Catalog **下的資料表**。

1. 選取正在執行資料欄統計資料任務的資料表。

1. 在**資料表詳細資料**頁面中，選擇資料**資料欄統計資料**。

1. 選擇**停止**。

   如果您在執行完成前停止任務，系統將不會針對該資料表產生資料欄統計資料。

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

在下列範例中，將 `DatabaseName` 和 `TableName` 值取代為實際的資料庫和資料表名稱。

```
aws glue stop-column-statistics-task-run --input-cli-json file://input.json
{
    "DatabaseName": "database_name",
    "TableName": "table_name"
}
```

------

# 刪除資料欄統計資料
<a name="delete-column-stats"></a>

您可以使用 [DeleteColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_DeleteColumnStatisticsForTable.html) API 操作 或 刪除資料欄統計資料 AWS CLI。下列範例示範如何使用 AWS Command Line Interface () 刪除資料欄統計資料AWS CLI。

```
aws glue delete-column-statistics-for-table \
    --database-name 'database_name' \
    --table-name 'table_name' \
    --column-name 'column_name'
```

# 考量和限制
<a name="column-stats-notes"></a>

下列考量與限制適用於產生資料欄統計資料。

**考量事項**
+ 使用取樣產生統計資料可縮短執行時間，但可能產生不準確的統計資料。
+ Data Catalog 不會儲存不同版本的統計資料。
+ 每個資料表一次僅能執行一個統計資料產生任務。
+ 如果使用向 Data Catalog 註冊的客戶 AWS KMS 金鑰來加密資料表， AWS Glue 會使用相同的金鑰來加密統計資料。

**資料欄統計資料任務支援產生統計資料：**
+ 當 IAM 角色具有完整資料表權限 (IAM 或 Lake Formation) 時。
+ 當 IAM 角色具有使用 Lake Formation 混合存取模式的資料表權限時。

**資料欄統計資料任務不支援產生統計資料：**
+ 具有以 Lake Formation 儲存格為基礎的存取控制的資料表
+ 交易資料湖：Linux Foundation Delta Lake、Apache Hudi
+ 聯合資料庫中的資料表：Hive 中繼存放區、Amazon Redshift 資料共用
+ 巢狀資料欄、陣列及結構資料類型。
+ 從其他帳戶與您共用的資料表

# 加密您的資料目錄
<a name="catalog-encryption"></a>

 您可以使用由 AWS Key Management Service () 管理的加密金鑰來保護存放在 AWS Glue Data Catalog 靜態 中的中繼資料AWS KMS。您可以使用 **Data Catalog 設定**，為新的 Data Catalog 啟用 Data Catalog 加密。您可以視需要啟用或停用現有 Data Catalog 的加密。啟用時， 會 AWS Glue 加密寫入目錄的所有新中繼資料，同時保持未加密的現有中繼資料。

如需加密 Data Catalog 的詳細資訊，請參閱[加密您的資料目錄](encrypt-glue-data-catalog.md)。

# 使用 Lake Formation 保護您的 Data Catalog
<a name="secure-catalog"></a>

 AWS Lake Formation 是一項服務，可讓您更輕鬆地在其中設定安全的資料湖 AWS。其提供一個集中位置，透過定義精細的存取控制許可來建立和安全地管理資料湖。Lake Formation 使用 Data Catalog 來存放和擷取有關資料湖的中繼資料，例如資料表定義、結構描述資訊和資料存取控制設定。

您可以向 Lake Formation 註冊中繼資料表或資料庫的 Amazon S3 資料位置，並使用其來定義 Data Catalog 資源的中繼資料層級許可。也可以使用 Lake Formation，代表整合分析引擎來管理存放在 Amazon S3 中基礎資料的存儲存取許可。

如需詳細資訊，請參閱[什麼是 AWS Lake Formation？](lake-formation/latest/dg/what-is-lake-formation.html)。

# 在 中使用 AWS Glue Data Catalog 檢視 AWS Glue
<a name="catalog-views"></a>

 您可以在 中建立和管理檢視 AWS Glue Data Catalog，通常稱為 AWS Glue Data Catalog 檢視。這些檢視非常有用，因為它們支援多個 SQL 查詢引擎，可讓您跨不同的 AWS 服務存取相同的檢視 Amazon Athena，例如 Amazon Redshift和 AWS Glue。您可以使用以 Apache Iceberg、Apache Hudi 和 Delta Lake 為基礎的檢視。

 透過在 Data Catalog 中建立檢視，您可以在 中使用資源授予和標籤型存取控制 AWS Lake Formation 來授予其存取權。使用這種存取控制方法，您不必在建立檢視時設定對參考的資料表的額外存取權。這種授予許可的方法稱為定義者語意，這些檢視稱為定義者檢視。如需 中存取控制的詳細資訊 AWS Lake Formation，請參閱《 AWS Lake Formation 開發人員指南》中的[授予和撤銷 Data Catalog 資源的許可](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)。

 Data Catalog 檢視對於下列使用案例很有用：
+  **精細的存取控制** – 您可以建立一個檢視，根據使用者需要的許可來限制資料存取。例如，您可以使用 Data Catalog 中的檢視阻止不在 HR 部門工作的員工查看個人身分識別資訊 (PII)。
+  **完整檢視定義** – 透過在 Data Catalog 中的檢視上套用篩選條件，您可以確保檢視中可用的資料記錄一律是完整的。
+  **增強的安全性** – 用於建立檢視的查詢定義必須是完整的，使得 Data Catalog 檢視較不容易受到惡意執行者的 SQL 命令影響。
+  **簡單資料共用** – 使用跨帳戶資料共用，與其他 AWS 帳戶共用資料而不移動資料 AWS Lake Formation。

## 建立 Data Catalog 檢視
<a name="catalog-creating-view"></a>

 您可以使用 AWS CLI 和使用 Spark SQL 的 AWS Glue ETL 指令碼來建立 Data Catalog 檢視。用於建立 Data Catalog 檢視的語法包括將檢視類型指定為 `MULTI DIALECT`，並將 `SECURITY` 述詞指定為 `DEFINER`，以指示定義者檢視。

 建立 Data Catalog 檢視的 SQL 陳述式範例：

```
CREATE PROTECTED MULTI DIALECT VIEW database_name.catalog_view SECURITY DEFINER
AS SELECT order_date, sum(totalprice) AS price
FROM source_table
GROUP BY order_date;
```

 建立 Data Catalog 檢視後，您可以使用 IAM 角色搭配檢視上的 AWS Lake Formation 'SELECT` 許可 Amazon Athena Amazon Redshift，從 或 AWS Glue ETL 任務等服務查詢它。您不需要授予檢視中參考的基礎資料表存取權。

 如需建立和設定 Data Catalog 檢視的詳細資訊，請參閱《 AWS Lake Formation 開發人員指南》中的[建置 AWS Glue Data Catalog 檢視](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html)。

## 受支援的檢視操作
<a name="catalog-supported-view-operations"></a>

 下列命令片段為您顯示使用 Data Catalog 檢視的各種方式：

 **建立檢視** 

 建立 data-catalog 檢視。以下是用於顯示從現有資料表建立檢視的範例：

```
CREATE PROTECTED MULTI DIALECT VIEW catalog_view 
SECURITY DEFINER AS SELECT * FROM my_catalog.my_database.source_table
```

 **ALTER VIEW** 

 可用的語法：

```
ALTER VIEW view_name [FORCE] ADD DIALECT AS query
ALTER VIEW view_name [FORCE] UPDATE DIALECT AS query
ALTER VIEW view_name DROP DIALECT
```

 您可以使用 `FORCE ADD DIALECT`選項，根據新的引擎方言強制更新結構描述和子物件。請注意，如果您不使用 `FORCE` 來更新其他引擎方言，則執行此操作可能會導致查詢錯誤。以下顯示了一個範例：

```
ALTER VIEW catalog_view FORCE ADD DIALECTAS
SELECT order_date, sum(totalprice) AS priceFROM source_tableGROUP BY orderdate;
```

 以下顯示了如何改變檢視以更新方言：

```
ALTER VIEW catalog_view UPDATE DIALECT AS
SELECT count(*) FROM my_catalog.my_database.source_table;
```

 **描述檢視** 

 描述檢視的可用語法：

 `SHOW COLUMNS {FROM|IN} view_name [{FROM|IN} database_name]` – 如果使用者具有描述檢視所需的 AWS Glue 和 AWS Lake Formation 許可，他們可以列出資料欄。以下顯示了用於顯示資料欄的幾個範例命令：

```
SHOW COLUMNS FROM my_database.source_table;    
SHOW COLUMNS IN my_database.source_table;
```

 `DESCRIBE view_name` – 如果使用者具有描述檢視所需的 AWS Glue 和 AWS Lake Formation 許可，他們可以列出檢視中的資料欄及其中繼資料。

 **DROP VIEW** 

 可用的語法：

```
DROP VIEW [ IF EXISTS ] view_name
```

 下列範例顯示了 `DROP` 陳述式，在捨棄檢視之前測試檢視是否存在：

```
DROP VIEW IF EXISTS catalog_view;
```

 `SHOW CREATE VIEW view_name` – 顯示用於建立指定檢視的 SQL 陳述式。以下是用於顯示建立資料目錄檢視的範例：

```
SHOW CREATE TABLE my_database.catalog_view;CREATE PROTECTED MULTI DIALECT VIEW my_catalog.my_database.catalog_view (
  net_profit,
  customer_id,
  item_id,
  sold_date)
TBLPROPERTIES (
  'transient_lastDdlTime' = '1736267222')
SECURITY DEFINER AS SELECT * FROM
my_database.store_sales_partitioned_lf WHERE customer_id IN (SELECT customer_id from source_table limit 10)
```

 **顯示檢視** 

 列出目錄中的所有檢視，例如一般檢視、多方言檢視 (MDV) 和不含 Spark 方言的 MDV。可用的語法如下：

```
SHOW VIEWS [{ FROM | IN } database_name] [LIKE regex_pattern]:
```

 以下顯示了用於顯示檢視的範例命令：

```
SHOW VIEWS IN marketing_analytics LIKE 'catalog_view*';
```

 如需建立和設定資料型錄檢視的詳細資訊，請參閱《 AWS Lake Formation 開發人員指南》中的[建置 AWS Glue 資料型錄檢視](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html)。

## 查詢 Data Catalog 檢視
<a name="catalog-view-query"></a>

 建立 Data Catalog 檢視之後，您可以查詢檢視。在 AWS Glue 任務中設定的 IAM 角色必須在 Data Catalog 檢視上具有 Lake Formation **SELECT** 許可。您不需要授予檢視中參考的基礎資料表存取權。

 完成所有設定之後，您可以查詢檢視。例如，您可以執行下列查詢來存取檢視。

```
SELECT * from my_database.catalog_view LIMIT 10;
```

## 限制
<a name="catalog-view-limitations"></a>

 使用 Data Catalog 檢視時，請考慮下列限制。
+  您只能使用 AWS Glue 5.0 及更高版本建立 Data Catalog 檢視。
+  Data Catalog 檢視定義者必須具有對檢視存取的基礎基本資料表的 `SELECT` 存取權限。如果特定基本資料表對定義者角色施加了任何 Lake Formation 篩選條件，則建立 Data Catalog 檢視會失敗。
+  基本資料表不得具有 AWS Lake Formation中的`IAMAllowedPrincipals` 資料湖許可。如果存在，則錯誤**多方言檢視只能參考沒有 IAMAllowedPrincipals 許可的資料表**。
+  資料表的 Amazon S3 位置必須註冊為 AWS Lake Formation 資料湖位置。如果未註冊資料表，則會發生 `Multi Dialect views may only reference AWS Lake Formation managed tables` 錯誤。如需有關如何在 中註冊 Amazon S3 位置的資訊 AWS Lake Formation，請參閱《 AWS Lake Formation 開發人員指南》中的[註冊 Amazon S3 位置](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)。
+  您只能建立 `PROTECTED` Data Catalog 檢視。不支援 `UNPROTECTED` 檢視。
+  您無法在 Data Catalog 檢視定義中參考另一個 AWS 帳戶中的資料表。您也無法在位於不同區域的相同帳戶中參考資料表。
+  若要跨帳戶或區域共用資料，整個檢視必須使用 AWS Lake Formation 資源連結跨帳戶和跨區域共用。
+  不支援使用者定義的函數 (UDF 或 UDAF)。
+  您無法在 Data Catalog 檢視中參考其他檢視。

# 存取 Data Catalog
<a name="access_catalog"></a>

 您可以使用 AWS Glue Data Catalog （資料目錄） 來探索和了解您的資料。Data Catalog 提供一致的方法來維護結構描述定義、資料類型、位置及其他中繼資料。您可以使用下列方法來存取 Data Catalog：
+ AWS Glue 主控台 – 您可以透過以 Web 為基礎的使用者介面 AWS Glue 主控台存取和管理 Data Catalog。主控台可讓您瀏覽和搜尋資料庫、資料表及其關聯的中繼資料，以及建立、更新和刪除中繼資料定義。
+ AWS Glue 編目程式 – 爬蟲程式是自動掃描資料來源並將中繼資料填入 Data Catalog 的程式。您可以建立和執行爬蟲程式，從各種來源探索和分類資料，例如 Amazon S3、Amazon RDS、Amazon DynamoDB Amazon CloudWatch、 和 JDBC 相容關聯式資料庫，例如 MySQL、PostgreSQL，以及數個非AWS 來源，例如 Snowflake 和 Google BigQuery。
+ AWS Glue APIs – 您可以使用 AWS Glue APIs 以程式設計方式存取 Data Catalog。這些 API 可讓您以程式設計方式與 Data Catalog 互動，從而實現自動化並與其他應用程式和服務整合。
+ AWS Command Line Interface (AWS CLI) – 您可以使用 從命令列 AWS CLI 存取和管理 Data Catalog。CLI 提供用於建立、更新和刪除中繼資料定義以及查詢和擷取中繼資料資訊的命令。
+ 與其他 AWS 服務的整合 – Data Catalog 與各種其他服務整合 AWS ，可讓您存取和利用存放在 目錄中的中繼資料。例如，您可以使用 Amazon Athena 查詢使用 Data Catalog 中中繼資料的資料來源，並使用 AWS Lake Formation 管理 Data Catalog 資源的資料存取和管理。

**Topics**
+ [使用 AWS Glue Iceberg REST 端點連線至 Data Catalog](connect-glu-iceberg-rest.md)
+ [使用 AWS Glue Iceberg REST 延伸端點連線至 Data Catalog](connect-glue-iceberg-rest-ext.md)
+ [AWS Glue Apache Iceberg 規格的 REST APIs](iceberg-rest-apis.md)
+ [從獨立 Spark 應用程式連線至 Data Catalog](connect-gludc-spark.md)
+ [Amazon Redshift 與 Apache Iceberg 之間的資料映射](data-mapping-rs-iceberg.md)
+ [使用 AWS Glue Iceberg REST Catalog APIs時的考量和限制](limitation-glue-iceberg-rest-api.md)

# 使用 AWS Glue Iceberg REST 端點連線至 Data Catalog
<a name="connect-glu-iceberg-rest"></a>

 AWS Glue的 Iceberg REST 端點支援 Apache Iceberg REST 規格中指定的 API 操作。使用 Iceberg REST 用戶端，您可以將在分析引擎上執行的應用程式連線到 Data Catalog 中託管的 REST 目錄。

 端點同時支援 Apache Iceberg 資料表規格 – v1 和 v2，預設為 v2。使用 Iceberg 資料表 v1 規格時，您必須在 API 呼叫中指定 v1。使用 API 操作，您可以存取儲存在 Amazon S3 物件儲存體和 Amazon S3 資料表儲存體中的 Iceberg 資料表。

**端點組態**

您可以使用 服務端點存取 AWS Glue Iceberg REST 目錄。如需區域特定的端點，請參閱 [AWS Glue 服務端點參考指南](https://docs.aws.amazon.com/general/latest/gr/glue.html#glue_region)。例如，在 us-east-1 區域中連線至 AWS Glue 時，您需要設定端點 URI 屬性，如下所示：

```
Endpoint : https://glue.us-east-1.amazonaws.com/iceberg
```

**其他組態屬性** – 使用 Iceberg 用戶端將 Spark 等分析引擎連線至服務端點時，您必須指定下列應用程式組態屬性：

```
catalog_name = "mydatacatalog"
aws_account_id = "123456789012"
aws_region = "us-east-1"
spark = SparkSession.builder \
    ... \
    .config("spark.sql.defaultCatalog", catalog_name) \
    .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.type", "rest") \
    .config(f"spark.sql.catalog.{catalog_name}.uri", "https://glue.{aws_region}.amazonaws.com/iceberg") \
    .config(f"spark.sql.catalog.{catalog_name}.warehouse", "{aws_account_id}") \
    .config(f"spark.sql.catalog.{catalog_name}.rest.sigv4-enabled", "true") \
    .config(f"spark.sql.catalog.{catalog_name}.rest.signing-name", "glue") \    
    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .getOrCreate()
```

AWS Glue Iceberg 端點` https://glue.us-east-1.amazonaws.com/iceberg`支援下列 Iceberg REST APIs：
+ GetConfig
+ ListNamespaces
+ CreateNamespace
+ LoadNamespaceMetadata
+ UpdateNamespaceProperties
+ DeleteNamespace
+ ListTables
+ CreateTable
+ LoadTable
+ TableExists
+ UpdateTable
+ DeleteTable

## 字首和目錄路徑參數
<a name="prefix-catalog-path-parameters"></a>

Iceberg REST 目錄 API 在其請求 URL 中具有自由格式字首。例如，`ListNamespaces`API 呼叫使用 `GET/v1/{prefix}/namespaces` URL format. AWS Glue prefix 一律遵循 `/catalogs/{catalog}`結構，以確保 REST 路徑符合 AWS Glue 多目錄階層。可以根據下列規則衍生 `{catalog}` 路徑參數：


| **存取模式** |  **Glue 目錄 ID 樣式**  |  **字首樣式**  | **預設目錄 ID 範例** |  **範例 REST 路由**  | 
| --- | --- | --- | --- | --- | 
|  存取目前帳戶中的預設目錄  | 非必要 | : |  不適用  |  GET /v1/catalogs/:/namespaces  | 
|  存取特定帳戶中的預設目錄  | accountID | accountID | 111122223333 | GET /v1/catalogs/111122223333/namespaces | 
|  存取目前帳戶中的巢狀目錄  |  catalog1/catalog2  |  catalog1/catalog2  |  rmscatalog1:db1  |  GET /v1/catalogs/rmscatalog1:db1/namespaces  | 
|  存取特定帳戶中的巢狀目錄  |  accountId:catalog1/catalog2  |  accountId:catalog1/catalog2  |  123456789012/rmscatalog1:db1  |  GET /v1/catalogs/123456789012:rmscatalog1:db1/namespaces  | 

只有在您直接呼叫 REST API 時，才需要此目錄 ID 至字首映射。當您透過 引擎使用 AWS Glue Iceberg REST 目錄 APIs 時，您需要在 Iceberg REST AWS Glue 目錄 API 設定的 `warehouse` 參數中指定目錄 ID，或在 AWS Glue 延伸 API 設定的 `glue.id` 參數中指定目錄 ID。例如，請參閱[將 Iceberg 叢集與 Spark 搭配使用](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-iceberg-use-spark-cluster.html)，以了解如何將其與 EMR Spark 搭配使用。

## 命名空間路徑參數
<a name="ns-path-param"></a>

Iceberg REST 目錄 API 路徑中的命名空間可以具有多個層級。但是， AWS Glue 僅支援單一層級命名空間。若要存取多層目錄階層中的命名空間，您可以連線到命名空間上方的多層目錄，以參考命名空間。這允許支援 的 3 部分表示法的任何查詢引擎`catalog.namespace.table`存取多層級目錄階層中的物件 AWS Glue，與使用多層級命名空間相比，沒有相容性問題。

# 使用 AWS Glue Iceberg REST 延伸端點連線至 Data Catalog
<a name="connect-glue-iceberg-rest-ext"></a>

 AWS Glue Iceberg REST 延伸端點提供額外的 APIs，這些 API 不存在於 Apache Iceberg REST 規格中，並提供伺服器端掃描規劃功能。當您存取儲存在 Amazon Redshift 受管儲存體中的資料表時，會使用這些額外的 API。您可以使用 Apache Iceberg AWS Glue Data Catalog 延伸模組從應用程式存取端點。

**端點組態** – 可使用服務端點存取 Redshift 受管儲存中具有資料表的目錄。如需區域特定的端點，請參閱 [AWS Glue 服務端點參考指南](https://docs.aws.amazon.com/general/latest/gr/glue.html#glue_region)。例如，在 us-east-1 AWS Glue 區域中連線至 時，您需要設定端點 URI 屬性，如下所示：

```
Endpoint : https://glue.us-east-1.amazonaws.com/extensions
```

```
catalog_name = "myredshiftcatalog"
aws_account_id = "123456789012"
aws_region = "us-east-1"
spark = SparkSession.builder \
    .config("spark.sql.defaultCatalog", catalog_name) \
    .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.type", "glue") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.id", "{123456789012}:redshiftnamespacecatalog/redshiftdb") \
    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .getOrCreate()
```

# AWS Glue Apache Iceberg 規格的 REST APIs
<a name="iceberg-rest-apis"></a>

本節包含 AWS Glue Iceberg REST 目錄和 AWS Glue 延伸 APIs的規格，以及使用這些 APIs時的考量事項。

對 AWS Glue Data Catalog 端點的 API 請求會使用 AWS Signature 第 4 版 (SigV4) 進行身分驗證。如需 [AWS API 請求的詳細資訊，請參閱簽章版本 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html) 一節 AWS SigV4。

存取 AWS Glue 服務端點和 AWS Glue 中繼資料時，應用程式會擔任需要 IAM 動作的 IAM `glue:getCatalog` 角色。

可以使用 IAM、Lake Formation 或 Lake Formation 混合模式權限來管理對 Data Catalog 及其物件的存取。

Data Catalog 中的聯合目錄具有 Lake Formation 註冊的資料位置。Lake Formation 與 Data Catalog 搭配使用，可提供資料庫式許可，以管理使用者對 Data Catalog 物件的存取。

您可以使用 IAM AWS Lake Formation、 或 Lake Formation 混合模式許可來管理對預設 Data Catalog 及其物件的存取。

若要在 Lake Formation 受管物件中建立、插入或刪除資料，則必須為 IAM 使用者或角色設定特定許可。
+ CREATE\$1CATALOG – 需要建立目錄 
+ CREATE\$1DATABASE – 需要建立資料庫
+ CREATE\$1TABLE – 需要建立資料表
+ DELETE – 需要從資料表刪除資料
+ DESCRIBE – 需要讀取中繼資料 
+ DROP – 需要捨棄/刪除資料表或資料庫
+ INSERT – 當主體需要將資料插入資料表時需要
+ SELECT – 當主體需要從資料表中選取資料時需要

如需詳細資訊，請參閱《 AWS Lake Formation 開發人員指南》中的 [Lake Formation 許可參考](https://docs.aws.amazon.com/lake-formation/latest/dg/lf-permissions-reference.html)。

# GetConfig
<a name="get-config"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | GetConfig | 
| 類型 |  Iceberg REST Catalog API  | 
| REST 路徑 |  GET /iceberg/v1/config  | 
| IAM 動作 |  glue:GetCatalog  | 
| Lake Formation 許可 | 不適用 | 
| CloudTrail 事件 |  glue:GetCatalog  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L67 | 

****考量和限制****
+ `warehouse` 查詢參數必須設定為 AWS Glue 目錄 ID。如果未設定，則會使用目前帳戶中的根目錄來傳回回應。如需詳細資訊，請參閱[字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters)。

# GetCatalog
<a name="get-catalog"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | GetCatalog | 
| 類型 |  AWS Glue 延伸 API  | 
| REST 路徑 |  GET/extensions/v1/catalogs/\$1catalog\$1  | 
| IAM 動作 |  glue:GetCatalog  | 
| Lake Formation 許可 | DESCRIBE | 
| CloudTrail 事件 |  glue:GetCatalog  | 
| Open API 定義 | https://github.com/awslabs/glue-extensions-for-iceberg/blob/main/glue-extensions-api.yaml\$1L40 | 

****考量和限制****
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。

# ListNamespaces
<a name="list-ns"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | ListNamespaces | 
| 類型 |  Iceberg REST Catalog API  | 
| REST 路徑 |  GET/iceberg/v1/catalogs/\$1catalog\$1/namespaces  | 
| IAM 動作 |  glue:GetDatabase  | 
| Lake Formation 許可 | ALL, DESCRIBE, SELECT | 
| CloudTrail 事件 |  glue:GetDatabase  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L205 | 

****考量和限制****
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只會顯示下一級別的命名空間。要列出更深層的命名空間，請在目錄路徑參數中指定巢狀目錄 ID。

# CreateNamespace
<a name="create-ns"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | CreateNamespace | 
| 類型 |  Iceberg REST Catalog API  | 
| REST 路徑 |  POST/iceberg/v1/catalogs/\$1catalog\$1/namespaces  | 
| IAM 動作 |  glue:CreateDatabase  | 
| Lake Formation 許可 | ALL, DESCRIBE, SELECT | 
| CloudTrail 事件 |  glue:CreateDatabase  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L256 | 

****考量和限制****
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能建立單一層級命名空間。若要建立多層級命名空間，您必須反覆建立每個層級，並使用目錄路徑參數連接至該層級。

# StartCreateNamespaceTransaction
<a name="start-create-ns-transaction"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | StartCreateNamespaceTransaction | 
| 類型 |  AWS Glue 延伸項目 API  | 
| REST 路徑 |  POST/extensions/v1/catalogs/\$1catalog\$1/namespaces  | 
| IAM 動作 |  glue:CreateDatabase  | 
| Lake Formation 許可 | ALL, DESCRIBE, SELECT | 
| CloudTrail 事件 |  glue:CreateDatabase  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L256 | 

****考量和限制****
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能建立單一層級命名空間。若要建立多層級命名空間，必須反覆建立每個層級，並使用目錄路徑參數連接至該層級。
+ API 為非同步，並傳回可用於使用 `CheckTransactionStatus` API 呼叫進行追蹤的交易 ID。
+  只有當 `GetCatalog` API 呼叫在回應中包含參數 `use-extensions=true` 時，才能呼叫此 API。

## LoadNamespaceMetadata
<a name="load-ns-metadata"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | LoadNamespaceMetadata | 
| 類型 |  Iceberg REST Catalog API  | 
| REST 路徑 |  GET/iceberg/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1  | 
| IAM 動作 |  glue:GetDatabase  | 
| Lake Formation 許可 | ALL, DESCRIBE, SELECT | 
| CloudTrail 事件 |  glue:GetDatabase  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L302 | 

****考量和限制****
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱 [命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param) 一節。

## UpdateNamespaceProperties
<a name="w2aac20c29c16c21c13"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | UpdateNamespaceProperties | 
| 類型 |  Iceberg REST Catalog API  | 
| REST 路徑 |  POST /iceberg/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1/properties  | 
| IAM 動作 |  glue:UpdateDatabase  | 
| Lake Formation 許可 | ALL, ALTER | 
| CloudTrail 事件 |  glue:UpdateDatabase  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L400 | 

****考量和限制****
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱 [命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param) 一節。

# DeleteNamespace
<a name="delete-ns"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | DeleteNamespace | 
| 類型 |  Iceberg REST Catalog API  | 
| REST 路徑 |  DELETE/iceberg/v1/catalogs/\$1catalog\$1/namespces/\$1ns\$1  | 
| IAM 動作 |  glue:DeleteDatabase  | 
| Lake Formation 許可 | ALL, DROP | 
| CloudTrail 事件 |  glue:DeleteDatabase  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L365 | 

****考量和限制****
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱[命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param)一節。
+ 如果資料庫中有物件，操作將會失敗。
+ API 為非同步，並傳回可用於使用 `CheckTransactionStatus` API 呼叫進行追蹤的交易 ID。
+  只有 `GetCatalog` API 呼叫在回應中指示 `use-extensions=true` 時，才能使用 API。

# StartDeleteNamespaceTransaction
<a name="start-delete-ns-transaction"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | StartDeleteNamespaceTransaction | 
| 類型 |  AWS Glue 延伸項目 API  | 
| REST 路徑 |  DELETE /extensions/v1/catalogs/\$1catalog\$1/namespces/\$1ns\$1  | 
| IAM 動作 |  glue:DeleteDatabase  | 
| Lake Formation 許可 | ALL, DROP | 
| CloudTrail 事件 |  glue:DeleteDatabase  | 
| Open API 定義 | https://github.com/awslabs/glue-extensions-for-iceberg/blob/main/glue-extensions-api.yaml\$1L85 | 

****考量和限制****
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱[命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param)一節。
+ 如果資料庫中有物件，操作將會失敗。
+ API 為非同步，並傳回可用於使用 `CheckTransactionStatus` API 呼叫進行追蹤的交易 ID。
+  只有 `GetCatalog` API 呼叫在回應中指示 `use-extensions=true` 時，才能使用 API。

# ListTables
<a name="list-tables"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | ListTables | 
| 類型 |  Iceberg REST Catalog API  | 
| REST 路徑 |  GET /iceberg/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1/tables  | 
| IAM 動作 |  glue:GetTables  | 
| Lake Formation 許可 | ALL, SELECT, DESCRIBE | 
| CloudTrail 事件 |  glue:GetTables  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L463 | 

****考量和限制****
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱[命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param)一節。
+ 將列出包括非 Iceberg 資料表在內的所有資料表。若要確定資料表是否可以載入為 Iceberg 資料表，請呼叫 `LoadTable`操作。

# CreateTable
<a name="create-table"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | CreateTable | 
| 類型 |  Iceberg REST Catalog API  | 
| REST 路徑 |  GET /iceberg/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1/tables  | 
| IAM 動作 |  glue:CreateTable  | 
| Lake Formation 許可 | ALL, CREATE\$1TABLE | 
| CloudTrail 事件 |  glue:CreateTable  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L497 | 

****考量和限制****
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱[命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param)一節。
+ 不支援具有暫存的 `CreateTable`。如果指定 `stageCreate` 查詢參數，操作將會失敗。這表示不支援 `CREATE TABLE AS SELECT` 等操作，您可以使用 `CREATE TABLE` 和 `INSERT INTO` 的組合作為解決方法。
+ `CreateTable` API 操作不支援選項 `state-create = TRUE`。

# StartCreateTableTransaction
<a name="start-create-table-transaction"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | CreateTable | 
| 類型 |  AWS Glue 延伸項目 API  | 
| REST 路徑 |  POST/extensions/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1/tables  | 
| IAM 動作 |  glue:CreateTable  | 
| Lake Formation 許可 | ALL, CREATE\$1TABLE | 
| CloudTrail 事件 |  glue:CreateTable  | 
| Open API 定義 | https://github.com/awslabs/glue-extensions-for-iceberg/blob/main/glue-extensions-api.yaml\$1L107 | 

****考量和限制****
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱[命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param)一節。
+ 不支援具有暫存的 `CreateTable`。如果指定 `stageCreate` 查詢參數，操作將會失敗。這表示不支援 `CREATE TABLE AS SELECT` 等操作，使用者應使用 `CREATE TABLE` 和 `INSERT INTO` 的組合來解決問題。
+ API 為非同步，並傳回可用於使用 `CheckTransactionStatus` API 呼叫進行追蹤的交易 ID。
+  只有 `GetCatalog` API 呼叫在回應中指示 `use-extensions=true` 時，才能使用 API。

# LoadTable
<a name="load-table"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | LoadTable | 
| Type |  Iceberg REST Catalog API  | 
| REST 路徑 |  GET /iceberg/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1/tables/\$1table\$1  | 
| IAM 動作 |  glue:GetTable  | 
| Lake Formation 許可 | ALL, SELECT, DESCRIBE | 
| CloudTrail 事件 |  glue:GetTable  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L616 | 

**考量事項**
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱[命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param)一節。
+ 不支援具有暫存的 `CreateTable`。如果指定 `stageCreate` 查詢參數，操作將會失敗。這表示不支援 `CREATE TABLE AS SELECT` 等操作，使用者應使用 `CREATE TABLE` 和 `INSERT INTO` 的組合來解決問題。
+ API 為非同步，並傳回可用於使用 `CheckTransactionStatus` API 呼叫進行追蹤的交易 ID。
+  只有 `GetCatalog` API 呼叫在回應中指示 `use-extensions=true` 時，才能使用 API。

# ExtendedLoadTable
<a name="extended-load-table"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | LoadTable | 
| Type |  AWS Glue 延伸項目 API  | 
| REST 路徑 |  GET /extensions/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1/tables/\$1table\$1  | 
| IAM 動作 |  glue:GetTable  | 
| Lake Formation 許可 | ALL, SELECT, DESCRIBE | 
| CloudTrail 事件 |  glue:GetTable  | 
| Open API 定義 | https://github.com/awslabs/glue-extensions-for-iceberg/blob/main/glue-extensions-api.yaml\$1L134 | 

**考量事項**
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱[命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param)一節。
+ 快照查詢參數僅支援 `all` 模式。
+ 與 `LoadTable` API 相比，`ExtendedLoadTable` API 有下列不同：
  +  並不嚴格要求所有字段都可用。
  + 在回應的組態欄位中提供下列額外參數：  
**額外參數**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/extended-load-table.html)

# PreplanTable
<a name="preplan-table"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | PreplanTable | 
| Type |  AWS Glue 延伸項目 API  | 
| REST 路徑 |  POST /extensions/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1/tables/\$1table\$1/preplan  | 
| IAM 動作 |  glue:GetTable  | 
| Lake Formation 許可 | ALL, SELECT, DESCRIBE | 
| CloudTrail 事件 |  glue:GetTable  | 
| Open API 定義 | https://github.com/awslabs/glue-extensions-for-iceberg/blob/main/glue-extensions-api.yaml\$1L211 | 

**考量事項**
+ 目錄路徑參數應遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 一節中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱[命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param)一節。
+ 此 API 的呼叫者務必根據頁面字符來判斷是否有要擷取的剩餘結果。如果伺服器端仍在處理中，但在指定的回應時間內無法產生任何結果，則可能產生頁面項空白但具有分頁字符的回應。
+  只有在 `ExtendedLoadTable` API 回應包含 `aws.server-side-capabilities.scan-planning=true` 時，才能使用此 API。

# PlanTable
<a name="plan-table"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | PlanTable | 
| Type |  AWS Glue 延伸項目 API  | 
| REST 路徑 |  POST /extensions/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1/tables/\$1table\$1/plan  | 
| IAM 動作 |  glue:GetTable  | 
| Lake Formation 許可 | ALL, SELECT, DESCRIBE | 
| CloudTrail 事件 |  glue:GetTable  | 
| Open API 定義 | https://github.com/awslabs/glue-extensions-for-iceberg/blob/main/glue-extensions-api.yaml\$1L243 | 

**考量事項**
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱[命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param)一節。
+ 此 API 的呼叫者務必根據頁面字符來判斷是否有要擷取的剩餘結果。如果伺服器端仍在處理中，但在指定的回應時間內無法產生任何結果，則可能產生頁面項空白但具有分頁字符的回應。
+  只有在 `ExtendedLoadTable` API 回應包含 `aws.server-side-capabilities.scan-planning=true` 時，才能使用此 API。

# TableExists
<a name="table-exists"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | TableExists | 
| Type |  Iceberg REST Catalog API  | 
| REST 路徑 |  HEAD/iceberg/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1/tables/\$1table\$1  | 
| IAM 動作 |  glue:GetTable  | 
| Lake Formation 許可 | ALL, SELECT, DESCRIBE | 
| CloudTrail 事件 |  glue:GetTable  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L833 | 

**考量事項**
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱 [命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param) 一節。

# UpdateTable
<a name="update-table"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | UpdateTable | 
| Type |  Iceberg REST Catalog API  | 
| REST 路徑 |  POST /iceberg/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1/tables/\$1table\$1  | 
| IAM 動作 |  glue:UpdateTable  | 
| Lake Formation 許可 | ALL, ALTER | 
| CloudTrail 事件 |  glue:UpdateTable  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L677 | 

**考量事項**
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱 [命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param) 一節。

# StartUpdateTableTransaction
<a name="start-update-table-transaction"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | StartUpdateTableTransaction | 
| Type | AWS Glue 延伸 API | 
| REST 路徑 |  POST/extensions/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1/tables/\$1table\$1  | 
| IAM 動作 |  glue:UpdateTable  | 
| Lake Formation 許可 |  ALL, ALTER  | 
| CloudTrail 事件 |  glue:UpdateTable  | 
| Open API 定義 | https://github.com/awslabs/glue-extensions-for-iceberg/blob/main/glue-extensions-api.yaml\$1L154 | 

**考量事項**
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱[命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param)一節。
+ API 為非同步，並傳回可用於使用 `CheckTransactionStatus` API 呼叫進行追蹤的交易 ID。
+  也可以透過此 API 執行 `RenamTable` 操作。發生這種情況時，呼叫者也必須擁有 ahve glue：CreateTable 或 LakeFormation CREATE\$1TABLE 許可，才能重新命名資料表。
+  只有在 `ExtendedLoadTable` API 回應包含 `aws.server-side-capabilities.scan-planning=true` 時，才能使用此 API。

# DeleteTable
<a name="delete-table"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | DeleteTable | 
| Type |  Iceberg REST Catalog API  | 
| REST 路徑 |  DELETE/iceberg/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1/tables/\$1table\$1  | 
| IAM 動作 |  glue:DeleteTable  | 
| Lake Formation 許可 | ALL, DROP | 
| CloudTrail 事件 |  glue:DeleteTable  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L793 | 

**考量事項**
+ 目錄路徑參數應遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 一節中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱[命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param)一節。
+ `DeleteTable` API 操作支援清除選項。在清除設定為 `true` 時，資料表資料會刪除，否則不會刪除資料。對於 Amazon S3 中的資料表，操作不會刪除資料表資料。當資料表儲存在 Amazon S3 中且 `purge = TRUE,` 時，操作會失敗。

  對於儲存在 Amazon Redshift 受管儲存體中的資料表，操作會刪除資料表資料，類似於 Amazon Redshift 中 `DROP TABLE` 的行為。當資料表儲存在 Amazon Redshift 中且 `purge = FALSE` 時，操作會失敗。
+ 不支援 `purgeRequest=true`。

# StartDeleteTableTransaction
<a name="start-delete-table-transaction"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | StartDeleteTableTransaction | 
| Type |  AWS Glue 延伸項目 API  | 
| REST 路徑 |  DELETE /extensions/v1/catalogs/\$1catalog\$1/namespaces/\$1ns\$1/tables/\$1table\$1  | 
| IAM 動作 |  glue:DeleteTable  | 
| Lake Formation 許可 | ALL, DROP | 
| CloudTrail 事件 |  glue:DeleteTable  | 
| Open API 定義 | https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml\$1L793 | 

**考量事項**
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。
+ 只能在 REST 路徑參數中指定單一層級命名空間。如需詳細資訊，請參閱[命名空間路徑參數](connect-glu-iceberg-rest.md#ns-path-param)一節。
+ 不支援 `purgeRequest=false`。
+  API 是非同步的，並傳回可透過 `CheckTransactionStatus` 追蹤的交易 ID。

# CheckTransactionStatus
<a name="check-transaction-status"></a>


**一般資訊**  

|  |  | 
| --- |--- |
| 操作名稱 | CheckTransactionStatus | 
| Type |  AWS Glue 延伸項目 API  | 
| REST 路徑 |  POST/extensions/v1/transactions/status  | 
| IAM 動作 |  與啟動交易的動作相同的許可  | 
| Lake Formation 許可 | 與啟動交易的動作相同的許可 | 
| Open API 定義 | https://github.com/awslabs/glue-extensions-for-iceberg/blob/main/glue-extensions-api.yaml\$1L273 | 

**考量事項**
+ 目錄路徑參數必須遵循 [字首和目錄路徑參數](connect-glu-iceberg-rest.md#prefix-catalog-path-parameters) 部分中所述的樣式。

# 從獨立 Spark 應用程式連線至 Data Catalog
<a name="connect-gludc-spark"></a>

您可以使用 Apache Iceberg 連接器從獨立應用程式連線至 Data Catalog。

1. 為 Spark 應用程式建立 IAM 角色。

1. 使用 AWS Glue Iceberg 連接器連接到 Iceberg Rest 端點。

   ```
   # configure your application. Refer to https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html for best practices on configuring environment variables.
   export AWS_ACCESS_KEY_ID=$(aws configure get appUser.aws_access_key_id)
   export AWS_SECRET_ACCESS_KEY=$(aws configure get appUser.aws_secret_access_key)
   export AWS_SESSION_TOKEN=$(aws configure get appUser.aws_secret_token)
   
   export AWS_REGION=us-east-1
   export REGION=us-east-1
   export AWS_ACCOUNT_ID = {specify your aws account id here}
   
   ~/spark-3.5.3-bin-hadoop3/bin/spark-shell \
       --packages org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.6.0 \
       --conf "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \
       --conf "spark.sql.defaultCatalog=spark_catalog" \
       --conf "spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkCatalog" \
       --conf "spark.sql.catalog.spark_catalog.type=rest" \
       --conf "spark.sql.catalog.spark_catalog.uri=https://glue.us-east-1.amazonaws.com/iceberg" \
       --conf "spark.sql.catalog.spark_catalog.warehouse = {AWS_ACCOUNT_ID}" \
       --conf "spark.sql.catalog.spark_catalog.rest.sigv4-enabled=true" \
       --conf "spark.sql.catalog.spark_catalog.rest.signing-name=glue" \
       --conf "spark.sql.catalog.spark_catalog.rest.signing-region=us-east-1" \
       --conf "spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO" \
       --conf "spark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.SimpleAWSCredentialProvider"
   ```

1. 查詢 Data Catalog 中的資料。

   ```
   spark.sql("create database myicebergdb").show()
   spark.sql("""CREATE TABLE myicebergdb.mytbl (name string) USING iceberg location 's3://bucket_name/mytbl'""")
   spark.sql("insert into myicebergdb.mytbl values('demo') ").show()
   ```

# Amazon Redshift 與 Apache Iceberg 之間的資料映射
<a name="data-mapping-rs-iceberg"></a>

Redshift 和 Iceberg 支援各種資料類型。下列相容性矩陣概述在這兩個資料系統之間映射資料時的支援和限制。如需個別資料系統中支援的資料類型的詳細資訊，請參閱 [Amazon Redshift 資料類型](https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html)和 [Apache Iceberg 資料表規格](https://iceberg.apache.org/spec/#primitive-types)。


| Redshift 資料類型 | 別名 | Iceberg 資料類型 | 
| --- | --- | --- | 
| SMALLINT | INT2 | int | 
| INTEGER | INT、INT4 | int | 
| BIGINT | INT8 | long | 
| DECIMAL | NUMERIC | decimal | 
| REAL | FLOAT4 | float | 
| REAL | FLOAT4 | float | 
| DOUBLE PRECISION | FLOAT8、FLOAT | double | 
| CHAR | CHARACTER、NCHAR | string | 
| VARCHAR | CHARACTER VARYING、NVARCHAR | string | 
| BPCHAR |  | string | 
| TEXT |  | string | 
| DATE |  | date | 
| TIME | TIME WITHOUT TIMEZONE | time | 
| TIME | TIME WITH TIMEZONE | 不支援 | 
| TIMESTAMP | TIMESTAMP WITHOUT TIMEZONE | TIMESTAMP | 
| TIMESTAMPZ | TIMESTAMP WITH TIMEZONE | TIMESTAMPZ | 
| INTERVAL YEAR TO MONTH |  | 不支援 | 
| INTERVAL DAY TO SECOND |  | 不支援 | 
| BOOLEAN | BOOL | bool | 
| HLLSKETCH |  | 不支援 | 
| SUPER |  | 不支援 | 
| VARBYTE | VARBINARY、BINARY VARYING | binary | 
| GEOMETRY |  | 不支援 | 
| GEOGRAPHY |  | 不支援 | 

# 使用 AWS Glue Iceberg REST Catalog APIs時的考量和限制
<a name="limitation-glue-iceberg-rest-api"></a>

以下是使用 Apache Iceberg REST Catalog 資料定義語言 (DDL) 操作行為時的考量和限制。

**考量事項**
+  **`RenameTable` API 行為** – Amazon Redshift 中的資料表支援 `RenameTable` 操作，但 Amazon S3 中不支援。
+  **Amazon Redshift 中命名空間和資料表的 DDL 操作** – Amazon Redshift 中命名空間和資料表的建立、更新、刪除操作是非同步操作，因為其取決於 Amazon Redshift 受管工作群組何時可用，以及是否有衝突的 DDL 和 DML 交易正在進行，並且操作必須等待鎖定，然後再嘗試遞交變更。

**限制**
+  AWS Glue Iceberg REST Catalog 不支援在 Apache Iceberg REST 規格中檢視 APIs。

# AWS Glue Data Catalog 最佳實務
<a name="best-practice-catalog"></a>

 本節涵蓋有效管理和使用 的最佳實務 AWS Glue Data Catalog。它強調有效率的爬蟲程式使用、中繼資料組織、安全性、效能最佳化、自動化、資料控管，以及與其他 AWS 服務的整合等實務。
+ **有效使用編目程式** – 定期執行編目程式，以使 Data Catalog 與資料來源的變更保持同步。使用增量網路爬取來頻繁變更資料來源，以改善效能。設定編目程式，以在偵測到變更時自動新增分區或更新結構描述。
+ **組織和命名中繼資料表** – 在 Data Catalog 中為資料庫和資料表建立一致的命名慣例。將相關資料來源分組到邏輯資料庫或資料夾中，以便更好地組織。使用描述性名稱來傳達每個資料表的目的和內容。
+ **有效管理結構描述 ** – 利用 AWS Glue 爬蟲程式的結構描述推論功能。在套用結構描述變更之前，檢閱並更新這些變更，以避免破壞下游應用程式。使用結構描述演變功能來正常處理結構描述變更。
+ **保護 Data Catalog** – 啟用 Data Catalog 的靜態和傳輸中資料加密。實作精細分級的存取控制政策，以限制對敏感資料的存取。定期稽核和檢閱 Data Catalog 許可和活動日誌。
+ **與其他 AWS 服務整合** Data Catalog 使用 Data Catalog 做為 Amazon Athena、Redshift Spectrum 和 等服務的集中式中繼資料層 AWS Lake Formation。利用 AWS Glue ETL 任務將資料轉換和載入到各種資料存放區，同時在 Data Catalog 中維護中繼資料。
+  **監控和最佳化效能** Data Catalog 使用 Amazon CloudWatch 指標監控爬蟲程式和 ETL 任務的效能。在 Data Catalog 中分區大型資料集，以改善查詢效能。針對經常存取的中繼資料實作效能最佳化。
+  **使用 AWS Glue 文件和最佳實務保持更新** Data Catalog 定期檢查 AWS Glue 文件 AWS Glue 和資源，以取得最新的更新、最佳實務和建議。參加 AWS Glue 網路研討會、研討會和其他活動，向專家學習並隨時了解新功能。

# 在 中監控 Data Catalog 用量指標 Amazon CloudWatch
<a name="data-catalog-cloudwatch-metrics"></a>

AWS Glue Data Catalog 使用量指標現在可搭配 使用 Amazon CloudWatch，簡化監控和了解 Data Catalog 中的資源使用率。您現在可以立即查看目錄、資料庫、資料表、分區和連線的 Glue Catalog API 使用情況，讓您更輕鬆地維持對 Data Catalog 的監督。

## Data Catalog 指標概觀
<a name="data-catalog-metrics-overview"></a>

AWS Glue Data Catalog 會自動將用量指標發佈至 Amazon CloudWatch。透過 CloudWatch 指標整合，您可以每分鐘追蹤關鍵績效指標，包括：
+ 資料表請求數
+ 建立的分區索引數
+ 更新的連線數
+ 更新的統計資料

這些指標可協助您識別瓶頸、偵測異常，並做出資料驅動型決策，以改善整體資料目錄可靠性。您也可以設定 CloudWatch 警示，以在指標超過指定的閾值時接收通知，以便主動管理您的部署。

## 將指標新增至 CloudWatch 儀表板
<a name="glue-data-catalog-metrics-dashboard"></a>

您可以建立自訂儀表板來監控 AWS Glue Data Catalog 資源，並設定警示，以便在任何異常活動時收到通知。

您可以遵循下列步驟，將 Data Catalog 指標新增至 CloudWatch 儀表板：

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，選擇**指標**。

1. 選擇**所有指標**。

1. 選擇**用量＞依 AWS 資源**。

1. 依 **Glue** 篩選以查看可用的指標。

1. 選取要新增至您的儀表板的指標。

1. 將目錄、資料庫、資料表、分區和連線的指標新增至 CloudWatch 圖表。  
![\[AWS Glue Data Catalog CloudWatch 儀表板中的 指標\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/glue-cloudwatch-metrics.png)

您可以設定自訂警示，在 API 用量超過定義的閾值時自動觸發，以識別資料目錄用量中的異常。

如需設定警示的詳細說明，請參閱[建立 Metrics Insights CloudWatch 警示](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-metrics-insights-alarm-create.html)。

# AWS Glue 結構描述登錄檔
<a name="schema-registry"></a>

**注意**  
AWS Glue AWS Glue 主控台中的下列區域不支援結構描述登錄檔：中東 （阿拉伯聯合大公國）。

AWS Glue 結構描述登錄檔可讓您集中探索、控制和發展資料串流結構描述。*結構描述*定義資料記錄的結構和格式。搭配 AWS Glue 結構描述登錄檔，您可以使用方便的 Apache Kafka、[Amazon Managed Streaming for Apache Kafka](https://aws.amazon.com/msk/)、[Amazon Kinesis Data Streams](https://aws.amazon.com/kinesis/data-streams/)、[Amazon Managed Service for Apache Flink](https://aws.amazon.com/kinesis/data-analytics/) 和 [AWS Lambda](https://aws.amazon.com/lambda/) 整合，在資料串流應用程式上管理和強制執行結構描述。

[結構描述登錄檔支援 AVRO (v1.11.4) 資料格式、JSON 資料格式 (具有 ](https://json-schema.org/)JSON 結構描述格式[ (適用於結構描述 (規格 Draft-04、Draft-06 和 Draft-07)) 並使用 ](https://github.com/everit-org/json-schema)Everit 程式庫`extensions`進行 JSON 結構描述驗證)，Protocol Buffers (Protobuf) 版本 proto2 和 proto3 不支援 或 `groups`，支援 Java 語言，且即將推出對其他資料格式和語言的支援。支援的功能包括相容性、透過中繼資料取得結構描述、自動註冊結構描述、IAM 相容性，以及選用的 ZLIB 壓縮，以減少儲存和資料傳輸。結構描述登錄檔是無伺服器且可免費使用。

使用結構描述作為生產者與消費者之間的資料格式合約，可改善資料控管、更高品質的資料，並讓資料消費者能夠彈性相容上游變更。

結構描述登錄檔允許不同的系統共用序列化和還原序列化的結構描述。例如，假設您擁有資料的生產者和消費者。生產者在發佈資料時知道結構描述。結構描述登錄檔提供某些系統，如 Amazon MSK 或 Apache Kafka 的序列化程式和還原序列化程式。

 如需詳細資訊，請參閱[結構描述登錄檔的運作方式](schema-registry-works.md)。

**Topics**
+ [結構描述](#schema-registry-schemas)
+ [登錄檔](#schema-registry-registries)
+ [結構描述版本控制和相容性](#schema-registry-compatibility)
+ [開源 Serde 程式庫](#schema-registry-serde-libraries)
+ [結構描述登錄檔的配額](#schema-registry-quotas)
+ [結構描述登錄檔的運作方式](schema-registry-works.md)
+ [結構描述登錄檔入門](schema-registry-gs.md)

## 結構描述
<a name="schema-registry-schemas"></a>

*結構描述*定義資料記錄的結構和格式。結構描述是可靠的資料發佈、耗用或儲存的版本化規格。

在 Avro 的這個範例結構描述中，格式和結構由配置和欄位名稱定義，欄位名稱的格式由資料類型定義 (例如，`string`、`int`)。

```
{
    "type": "record",
    "namespace": "ABC_Organization",
    "name": "Employee",
    "fields": [
        {
            "name": "Name",
            "type": "string"
        },
        {
            "name": "Age",
            "type": "int"
        },
        {
            "name": "address",
            "type": {
                "type": "record",
                "name": "addressRecord",
                "fields": [
                    {
                        "name": "street",
                        "type": "string"
                    },
                    {
                        "name": "zipcode",
                        "type": "int" 
                    }
                ]
            }
        }
    ]
}
```

在 JSON Schema Draft-07 for JSON 此範例中，格式是由 [JSON 結構描述組織](https://json-schema.org/)所定義。

```
{
	"$id": "https://example.com/person.schema.json",
	"$schema": "http://json-schema.org/draft-07/schema#",
	"title": "Person",
	"type": "object",
	"properties": {
		"firstName": {
			"type": "string",
			"description": "The person's first name."
		},
		"lastName": {
			"type": "string",
			"description": "The person's last name."
		},
		"age": {
			"description": "Age in years which must be equal to or greater than zero.",
			"type": "integer",
			"minimum": 0
		}
	}
}
```

在這個 Protobuf 範例中，格式由[協定緩衝區語言的版本 2 (proto2)](https://developers.google.com/protocol-buffers/docs/reference/proto2-spec) 定義。

```
syntax = "proto2";

package tutorial;

option java_multiple_files = true;
option java_package = "com.example.tutorial.protos";
option java_outer_classname = "AddressBookProtos";

message Person {
  optional string name = 1;
  optional int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    optional string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}
```

## 登錄檔
<a name="schema-registry-registries"></a>

*登錄檔*是結構描述的邏輯容器。登錄檔允許您組織您的結構描述，以及管理應用程式的存取控制。登錄檔具有 Amazon Resource Name (ARN)，可讓您組織和設定登錄檔中結構描述操作的不同存取許可。

您可以使用預設登錄檔，或視需要建立許多新的登錄檔。


**AWS Glue 結構描述登錄檔階層**  

|  | 
| --- |
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/schema-registry.html)  | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/schema-registry.html)  | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/schema-registry.html)  | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/schema-registry.html)  | 

## 結構描述版本控制和相容性
<a name="schema-registry-compatibility"></a>

每個結構描述可以有多個版本。版本控制是由套用在結構描述上的相容性規則所控制。結構描述登錄檔會根據此規則檢查登錄新結構描述版本的要求，然後才能成功。

標示為檢查點的結構描述版本是用來判斷註冊新結構描述版本的相容性。第一次建立結構描述時，預設檢查點將是第一個版本。當結構描述隨著更多版本發展，您可以使用 CLI/SDK 將檢查點變更為使用 `UpdateSchema` API，它遵循一組約束。在主控台中，編輯結構描述定義或相容性模式預設會將檢查點變更為最新版本。

相容性模式可讓您控制結構描述可以或不可以隨著時間變化的方式。這些模式形成應用程式產生和使用資料之間的合約。當新版的結構描述提交至登錄檔時，會使用套用至結構描述名稱的相容性規則來判斷是否可以接受新版本。共有 8 種相容性模式：NONE、DISABLED、BACKWARD、BACKWARD\$1ALL、FORWARD、FORWARD\$1ALL、FULL、FULL\$1ALL。

在 Avro 資料格式中，欄位可以是選用的或必要的。選用欄位是其中 `Type` 包含 null。必要欄位的 `Type` 沒有 null。

在 Protobuf 資料格式中，proto2 語法中的欄位可以是選用 (包括重複) 或必要欄位，而 proto3 語法中的所有欄位均是選用 (包括重複) 欄位。所有相容性規則均是根據對協定緩衝區規範的理解以及 [Google 協定緩衝區文件](https://developers.google.com/protocol-buffers/docs/overview#updating)中的指導所決定。
+ *NONE*：未套用相容性模式。您可以在開發案例中使用此選項，或者如果您不知道要套用至結構描述的相容性模式。任何新增的版本都會被接受，而不經過相容性檢查。
+ *DISABLED*：此相容性選項可防止特定結構描述的版本控制。無法新增新版本。
+ *BACKWARD*：建議使用此相容性選項，因為它允許消費者讀取目前和先前的結構描述版本。當您刪除欄位或新增選用欄位時，您可以使用此選項來檢查與先前結構描述版本的相容性。一個典型的 BACKWARD 使用案例是，當您的應用程式為最新的結構描述而建立時。

**AVRO**  
例如，假設您有一個由名字 (必要)、姓氏 (必要)、電子郵件 (必要) 和電話號碼 (選用) 所定義的結構描述。

  如果您的下一個結構描述版本移除必要的電子郵件欄位，將可成功註冊。BACKWARD 相容性要求消費者能夠讀取目前和先前的結構描述版本。您的消費者將能夠讀取新的結構描述，因為舊訊息中的額外電子郵件欄位被忽略。

  如果您有新增必要欄位 (例如郵遞區號) 的提議新結構描述版本，則不會成功註冊 BACKWARD 相容性。新版本的消費者將無法在結構描述變更之前讀取舊訊息，因為他們缺少必要的郵遞區號欄位。但是，如果在新的結構描述中將郵遞區號欄位設定為選用，則提議的版本將成功註冊，因為消費者可以在沒有選用郵遞區碼欄位的情況下讀取舊的結構描述。

**JSON**  
例如，假設您有一個由名字 (選用)、姓氏 (選用)、電子郵件 (選用) 和電話號碼 (選用) 所定義的結構描述版本。

  如果您的下一個結構描述版本新增了選用的電話號碼屬性，只要原始結構描述版本不允許透過將 `additionalProperties` 欄位設定為 false 的任何其他屬性，這就會成功註冊。BACKWARD 相容性要求消費者能夠讀取目前和先前的結構描述版本。您的消費者將能夠讀取電話號碼屬性不存在的原始結構描述產生的資料。

  如果您有新增選用電話號碼屬性的提議新結構描述版本，當原始結構描述版本將 `additionalProperties` 欄位設定為 true 時 (即允許任何其他屬性)，這將無法成功註冊 BACKWARD 相容性。新版本的消費者將無法在結構描述變更之前讀取舊訊息，因為他們無法讀取具有不同類型 (例如是字串而不是數字) 之電話號碼屬性的資料。

**PROTOBUF**  
例如，假設您有一個由訊息 `Person` 與 proto2 語法下的 `first name` (必要)、`last name` (必要)、`email` (必要) 和 `phone number` (選用) 等欄位所定義的結構描述版本。

  與 AVRO 案例類似，如果您的下一個結構描述版本移除必要的 `email` 欄位，該版本可成功註冊。BACKWARD 相容性要求消費者能夠讀取目前和先前的結構描述版本。舊訊息中的額外 `email` 欄位會被忽略，您的消費者將能夠讀取新的結構描述。

  如果您有新增了必要欄位 (例如 `zip code`) 的提議新結構描述版本，根據 BACKWARD 相容性規則，該版本無法成功註冊。新版本的消費者將無法讀取結構描述變更之前的舊訊息，因為它們缺少必要的 `zip code` 欄位。但是，如果在新的結構描述中將 `zip code` 欄位設定為選用，則提議的版本可成功註冊，因為消費者可以讀取不含 `zip code` 選用欄位的結構描述。

  在 GrPC 使用案例中，新增新 RPC 服務或 RPC 方法是向後相容的變更。例如，假設您有一個由 RPC 服務 `MyService` 使用 `Foo` 和 `Bar` 兩種 RPC 方法所定義的結構描述版本。

  如果您的下一個結構描述版本新增了名為 `Baz` 的新 RPC 方法，該版本可成功註冊。因為新加入的 RPC 方法 `Baz` 為可選方法，根據 BACKWARD 相容性規則，您的消費者將能夠讀取原始結構描述產生的資料。

  如果您有移除了現有 RPC 方法 `Foo` 的提議新結構描述版本，根據 BACKWARD 相容性規則，該版本無法成功註冊。新版本的消費者將無法讀取結構描述變更之前的舊訊息，因為他們無法使用 gRPC 應用程式中不存在的 RPC 方法 `Foo` 來理解和讀取資料。
+ *BACKWARD\$1ALL*：此相容性選項可讓消費者同時讀取目前和所有先前的結構描述版本。當您刪除欄位或新增選用欄位時，您可以使用此選項來檢查所有先前結構描述版本的相容性。
+ *FORWARD*：此相容性選項可讓消費者同時讀取目前和後續的結構描述版本，但不一定是較新的版本。當您新增欄位或刪除選用欄位時，您可以使用此選項來檢查與上一個結構描述版本的相容性。FORWARD 的典型使用案例是您的應用程式已經為之前的結構描述建立，並且應該能夠處理更新的結構描述。

**AVRO**  
例如，假設您有一個由名字 (必要)、姓氏 (必要)、電子郵件 (選用) 定義的結構描述版本。

  如果您有一個新的結構描述版本新增了必要欄位，例如電話號碼，該版本可成功註冊。FORWARD 相容性要求消費者能夠使用舊版本來讀取以新結構描述產生的資料。

  如果您有刪除了必要名字欄位的提議結構描述版本，根據 FORWARD 相容性規則，該版本無法成功註冊。您在以前版本上的消費者將無法讀取提議的結構描述，因為他們缺少必要的名字欄位。但是，如果名字欄位最初是選用的，那麼提議的新結構描述將成功註冊，因為消費者可以根據沒有選用名字欄位的新結構描述讀取資料。

**JSON**  
例如，假設您有一個由名字 (選用)、姓氏 (選用)、電子郵件 (選用) 和電話號碼 (選用) 所定義的結構描述版本。

  如果您有移除選用電話號碼屬性的新結構描述版本，只要新結構描述版本不允許透過將 `additionalProperties` 欄位設定為 false 的任何其他屬性，這就會成功註冊。FORWARD 相容性要求消費者能夠使用舊版本來讀取以新結構描述產生的資料。

  如果您有刪除選用電話號碼屬性的提議結構描述版本，則當新的結構描述版本將 `additionalProperties` 欄位設定為 true，即允許任何額外的屬性，這不會成功註冊 FORWARD 相容性。舊版本的消費者將無法讀取提議的結構描述，因為他們可能具有不同類型的電話號碼屬性，例如是字串而不是數字。

**PROTOBUF**  
例如，假設您有一個由訊息 `Person` 與 proto2 語法下的 `first name` (必要)、`last name` (必要) 和 `email` (選用) 等欄位所定義的結構描述版本。

  與 AVRO 案例類似，如果您有一個新的結構描述版本新增了必要欄位，例如 `phone number`，該版本可成功註冊。FORWARD 相容性要求消費者能夠使用舊版本來讀取以新結構描述產生的資料。

  如果您有刪除了必要 `first name` 欄位的提議結構描述版本，根據 FORWARD 相容性規則，該版本無法成功註冊。您在以前版本上的消費者將無法讀取提議的結構描述，因為它們缺少必要的 `first name` 欄位。但是，如果 `first name` 欄位最初是選用欄位，則提議的新結構描述可成功註冊，因為消費者可以讀取沒有 `first name` 選用欄位的新結構描述資料。

  在 gRPC 使用案例中，移除 RPC 服務或 RPC 方法是向前相容的變更。例如，假設您有一個由 RPC 服務 `MyService` 使用 `Foo` 和 `Bar` 兩種 RPC 方法所定義的結構描述版本。

  如果您的下一個結構描述版本刪除了名為 `Foo` 的現有 RPC 方法，根據 FORWARD 相容性規則，該版本可成功註冊，因為消費者可以使用舊版本來讀取新結構描述產生的資料。如果您有新增了 RPC 方法 `Baz` 的提議新結構描述版本，根據 FORWARD 相容性規則，該版本無法成功註冊。您以前版本上的消費者將無法讀取提議的結構描述，因為它們缺少 RPC 方法 `Baz`。
+ *FORWARD\$1ALL*：此相容性選項可讓消費者讀取任何新註冊結構描述的生產者所寫入的資料。當您需要新增欄位或刪除選用欄位，並檢查與所有先前結構描述版本的相容性時，您可以使用此選項。
+ *FULL*：此相容性選項可讓消費者讀取使用前一個或下一個版本的結構描述，但不能讀取更舊或更新版本的生產者所寫入的資料。當您新增或移除選用欄位時，您可以使用此選項來檢查與上一個結構描述版本的相容性。
+ *FULL\$1ALL*：此相容性選項可讓消費者讀取生產者使用所有先前的結構描述版本所寫入的資料。當您新增或移除選用欄位時，您可以使用此選項來檢查所有先前結構描述版本的相容性。

## 開源 Serde 程式庫
<a name="schema-registry-serde-libraries"></a>

AWS 提供開放原始碼 Serde 程式庫做為序列化和還原序列化資料的架構。這些程式庫的開源設計允許通用的開源應用程式和架構在他們的專案中支援這些程式庫。

如需 Serde 函式庫如何運作的詳細資訊，請參閱[結構描述登錄檔的運作方式](schema-registry-works.md)。

## 結構描述登錄檔的配額
<a name="schema-registry-quotas"></a>

配額也稱為 中的限制 AWS，是 AWS 帳戶中資源、動作和項目的最大值。下列是 AWS Glue 中結構描述登錄檔的軟性限制。

**結構描述版本中繼資料索引鍵-值對**  
每個 AWS 區域每個 SchemaVersion 最多可以有 10 個鍵值對。

您可以使用 [QuerySchemaVersionMetadata 動作 (Python: query\$1schema\$1version\$1metadata)](aws-glue-api-schema-registry-api.md#aws-glue-api-schema-registry-api-QuerySchemaVersionMetadata) 或 [PutSchemaVersionMetadata 動作 (Python: put\$1schema\$1version\$1metadata)](aws-glue-api-schema-registry-api.md#aws-glue-api-schema-registry-api-PutSchemaVersionMetadata) API 檢視或設定索引鍵值中繼資料配對。

下列是 AWS Glue 中結構描述登錄檔的硬性限制。

**登錄檔**  
此帳戶每個 AWS 區域最多可以有 100 個登錄檔。

**SchemaVersion**  
此帳戶每個 AWS 區域最多可以有 10000 個結構描述版本。

每個新結構描述都會建立新的結構描述版本，因此如果每個結構描述只有一個版本，理論上每個區域每個帳戶最多可以有 10000 個結構描述。

**結構描述承載**  
結構描述裝載的大小限制為 170 KB。

# 結構描述登錄檔的運作方式
<a name="schema-registry-works"></a>

本節說明結構描述登錄檔中的序列化和還原序列化處理程序的運作方式。

1. 註冊結構描述：如果結構描述不存在於登錄檔中，則可以使用等於目的地名稱的結構描述名稱來註冊結構描述 (例如，test\$1topic、test\$1stream、prod\$1firehose)，或者生產者可以提供結構描述的自訂名稱。生產者也可以將索引鍵/值對新增至結構描述做為中繼資料，例如來源：msk\$1kafka\$1topic\$1A，或在結構描述建立時將 AWS 標籤套用至結構描述。結構描述註冊後，結構描述登錄檔會將結構描述版本 ID 傳回至序列化程式。如果結構描述存在，但序列化程式正在使用不存在的新版本，結構描述登錄檔會檢查結構描述參考相容性規則，以確保新版本是相容性的，然後再將它註冊為新版本。

   註冊結構描述的方法有兩種：手動註冊和自動註冊。您可以透過 AWS Glue 主控台或 CLI/SDK 手動註冊結構描述。

   當序列化程式設定中開啟自動註冊時，將執行結構描述的自動註冊。如果在生產者組態中沒有提供 `REGISTRY_NAME`，則自動註冊將在預設登錄檔 (default-registry) 下註冊新的結構描述版本。請參閱[安裝 SerDe 程式庫](schema-registry-gs-serde.md)，以取得有關指定自動註冊屬性的資訊。

1. 序列化程式會針對結構描述驗證資料記錄：當產生資料的應用程式已註冊其結構描述時，結構描述登錄檔序列化程式會驗證應用程式所產生的記錄是以符合已註冊的結構描述的欄位和資料類型構成。如果記錄的結構描述不符合註冊的結構描述，序列化程式將傳回例外狀況，應用程式將無法將記錄傳遞到目的地。

   如果沒有結構描述存在，且結構描述名稱未透過生產者組態提供，則結構描述會以與主題名稱 (如果是 Apache Kafka 或 Amazon MSK) 或串流名稱 (如果是 Kinesis Data Streams) 相同的名稱建立結構描述。

   每個記錄都有結構描述定義和資料。結構描述定義會根據結構描述登錄檔中的現有結構描述和版本進行查詢。

   依預設，生產者快取已註冊結構描述的結構描述定義和結構描述版本 ID。如果記錄的結構描述版本定義不符合快取中的可用內容，生產者將嘗試使用結構描述登錄檔來驗證結構描述。如果結構描述版本有效，則其版本 ID 和定義將在生產者本機快取。

   您可以在[安裝 SerDe 程式庫](schema-registry-gs-serde.md)的步驟 \$13 的選用生產者屬性中調整預設快取期間 (24 小時)。

1. 序列化和傳遞記錄：如果記錄符合結構描述，序列化程式會使用結構描述版本 ID 來裝飾每個記錄，根據選取的資料格式序列化記錄 (AVRO、JSON、Protobuf 或即將推出的其他格式) 壓縮記錄 (選用生產者組態)，並將其傳遞給目的地。

1. 消費者還原序列化資料：讀取此資料的消費者使用結構描述登錄檔還原序列化程式庫，從記錄承載剖析結構描述版本 ID。

1. 還原序列化程式可能會從結構描述登錄檔要求結構描述：如果這是還原序列化程式第一次看到具有特定結構描述版本 ID 的記錄，則使用結構描述版本 ID，還原序列化程式會從結構描述登錄檔要求結構描述，並在本機快取消費者。如果結構描述登錄檔無法還原序列化記錄，消費者可以從記錄記錄中記錄資料，然後繼續，或停止應用程式。

1. 還原序列化程式使用結構描述來還原序列化記錄：當還原序列化程式從結構描述登錄檔擷取結構描述版本 ID 時，還原序列化程式會解壓縮記錄 (如果產生者傳送的記錄已壓縮)，並使用結構描述來還原序列化記錄。應用程式現在會處理記錄。

**注意**  
加密：您的用戶端透過 API 呼叫與結構描述登錄檔進行通訊，這些呼叫會使用透過 HTTPS 的 TLS 加密來加密傳輸中的資料。儲存在結構描述登錄檔中的結構描述一律使用 service-managed AWS Key Management Service (AWS KMS) 金鑰進行靜態加密。

**注意**  
使用者授權：結構描述登錄檔支援身分型 IAM 政策。

# 結構描述登錄檔入門
<a name="schema-registry-gs"></a>

以下章節將提供概觀，並逐步引導您設定和使用結構描述登錄檔。如需結構描述登錄檔概念和要素的詳細資訊，請參閱[AWS Glue 結構描述登錄檔](schema-registry.md)。

**Topics**
+ [安裝 SerDe 程式庫](schema-registry-gs-serde.md)
+ [與 AWS Glue 結構描述登錄檔整合](schema-registry-integrations.md)
+ [從第三方結構描述登錄檔移轉至 AWS Glue 結構描述登錄檔](schema-registry-integrations-migration.md)

# 安裝 SerDe 程式庫
<a name="schema-registry-gs-serde"></a>

SerDe 程式庫提供序列化和還原序列化資料的架構。

您將為產生資料的應用程式安裝開源序列化程式 (統稱為「序列化程式」)。序列化程式會處理序列化、壓縮以及與結構描述登錄檔的互動。序列化程式會自動從寫入結構描述登錄檔相容目的地的記錄擷取結構描述，例如 Amazon MSK。同樣地，您將在使用資料的應用程式上安裝開源還原序列化程式。

# Java 實作
<a name="schema-registry-gs-serde-java"></a>

**注意**  
必要條件：在完成下列步驟前，您必須擁有執行中的 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 或 Apache Kafka 叢集。您的生產者和消費者需要在 Java 8 或更高版本上執行。

若要在生產者和消費者上安裝程式庫：

1. 在生產者和消費者的 pom.xml 檔案中，透過下面的程式碼新增此相依性：

   ```
   <dependency>
       <groupId>software.amazon.glue</groupId>
       <artifactId>schema-registry-serde</artifactId>
       <version>1.1.5</version>
   </dependency>
   ```

   或者，您也可以複製 [AWS Glue 結構描述登錄檔 Github 儲存庫](https://github.com/awslabs/aws-glue-schema-registry)。

1. 使用這些必要屬性設定您的生產者：

   ```
   props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); // Can replace StringSerializer.class.getName()) with any other key serializer that you may use
   props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, GlueSchemaRegistryKafkaSerializer.class.getName());
   props.put(AWSSchemaRegistryConstants.AWS_REGION, "us-east-2");
   properties.put(AWSSchemaRegistryConstants.DATA_FORMAT, "JSON"); // OR "AVRO"
   ```

   如果沒有現有的結構描述，則需要開啟自動註冊 (下一個步驟)。如果您確實有一個想套用的結構描述，那麼請用您的結構描述名稱替換「my-schema」。如果結構描述自動註冊關閉，則也必須提供「registry-name」。如果結構描述是在「default-registry」下建立的，則登錄檔名稱可以省略。

1. (選用) 設定這些選用生產者屬性中的任何一個。如需詳細的屬性說明，請參閱[讀我檔案](https://github.com/awslabs/aws-glue-schema-registry/blob/master/README.md)。

   ```
   props.put(AWSSchemaRegistryConstants.SCHEMA_AUTO_REGISTRATION_SETTING, "true"); // If not passed, uses "false"
   props.put(AWSSchemaRegistryConstants.SCHEMA_NAME, "my-schema"); // If not passed, uses transport name (topic name in case of Kafka, or stream name in case of Kinesis Data Streams)
   props.put(AWSSchemaRegistryConstants.REGISTRY_NAME, "my-registry"); // If not passed, uses "default-registry"
   props.put(AWSSchemaRegistryConstants.CACHE_TIME_TO_LIVE_MILLIS, "86400000"); // If not passed, uses 86400000 (24 Hours)
   props.put(AWSSchemaRegistryConstants.CACHE_SIZE, "10"); // default value is 200
   props.put(AWSSchemaRegistryConstants.COMPATIBILITY_SETTING, Compatibility.FULL); // Pass a compatibility mode. If not passed, uses Compatibility.BACKWARD
   props.put(AWSSchemaRegistryConstants.DESCRIPTION, "This registry is used for several purposes."); // If not passed, constructs a description
   props.put(AWSSchemaRegistryConstants.COMPRESSION_TYPE, AWSSchemaRegistryConstants.COMPRESSION.ZLIB); // If not passed, records are sent uncompressed
   ```

   自動註冊會在預設登錄檔 (「default-registry」) 下註冊結構描述版本。如果在上一個步驟中未指定 `SCHEMA_NAME`，則主題名稱會被推斷為 `SCHEMA_NAME`。

   如需相容性模式的詳細資訊，請參閱[結構描述版本控制和相容性](schema-registry.md#schema-registry-compatibility)。

1. 使用下列必要屬性設定您的消費者：

   ```
   props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
   props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, GlueSchemaRegistryKafkaDeserializer.class.getName());
   props.put(AWSSchemaRegistryConstants.AWS_REGION, "us-east-2"); // Pass an AWS 區域
   props.put(AWSSchemaRegistryConstants.AVRO_RECORD_TYPE, AvroRecordType.GENERIC_RECORD.getName()); // Only required for AVRO data format
   ```

1. (選用) 設定這些選用的消費者屬性。如需詳細的屬性說明，請參閱[讀我檔案](https://github.com/awslabs/aws-glue-schema-registry/blob/master/README.md)。

   ```
   properties.put(AWSSchemaRegistryConstants.CACHE_TIME_TO_LIVE_MILLIS, "86400000"); // If not passed, uses 86400000
   props.put(AWSSchemaRegistryConstants.CACHE_SIZE, "10"); // default value is 200
   props.put(AWSSchemaRegistryConstants.SECONDARY_DESERIALIZER, "com.amazonaws.services.schemaregistry.deserializers.external.ThirdPartyDeserializer"); // For migration fall back scenario
   ```

# C\$1 實作
<a name="schema-registry-gs-serde-csharp"></a>

**注意**  
必要條件：在完成下列步驟前，您必須擁有執行中的 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 或 Apache Kafka 叢集。您的生產者和消費者需要在 .NET 8.0 或更高版本上執行。

## 安裝
<a name="schema-registry-gs-serde-csharp-install"></a>

對於 C\$1 應用程式，請使用下列其中一種方法安裝 AWS Glue 結構描述登錄檔 SerDe NuGet 套件：

**.NET CLI：**  
使用下列命令來安裝套件：

```
dotnet add package Aws.Glue.SchemaRegistry --version 1.0.0-<rid>
```

其中 `<rid>` 可以是 `1.0.0-linux-x64`，`1.0.0-linux-musl-x64`或 `1.0.0-linux-arm64`

**PackageReference （在您的 .csproj 檔案中）：**  
將下列項目新增至您的專案檔案：

```
<PackageReference Include="Aws.Glue.SchemaRegistry" Version="1.0.0-<rid>" />
```

其中 `<rid>` 可以是 `1.0.0-linux-x64`，`1.0.0-linux-musl-x64`或 `1.0.0-linux-arm64`

## 組態檔案設定
<a name="schema-registry-gs-serde-csharp-config"></a>

使用必要的設定建立組態屬性檔案 （例如 `gsr-config.properties`)：

**最小組態：**  
以下顯示最低組態範例：

```
region=us-east-1
registry.name=default-registry
dataFormat=AVRO
schemaAutoRegistrationEnabled=true
```

## 針對 Kafka SerDes 使用 C\$1 Glue 結構描述用戶端程式庫
<a name="schema-registry-gs-serde-csharp-kafka"></a>

**序列化程式用量範例：**  
下列範例示範如何使用 序列化程式：

```
private static readonly string PROTOBUF_CONFIG_PATH = "<PATH_TO_CONFIG_FILE>";
var protobufSerializer = new GlueSchemaRegistryKafkaSerializer(PROTOBUF_CONFIG_PATH);
var serialized = protobufSerializer.Serialize(message, message.Descriptor.FullName);
// send serialized bytes to Kafka using producer.Produce(serialized)
```

**還原序列化程式用量範例：**  
下列範例示範如何使用還原序列化程式：

```
private static readonly string PROTOBUF_CONFIG_PATH = "<PATH_TO_CONFIG_FILE>";
var dataConfig = new GlueSchemaRegistryDataFormatConfiguration(
    new Dictionary<string, dynamic>
    {
        {
            GlueSchemaRegistryConstants.ProtobufMessageDescriptor, message.Descriptor
        }
    }
);
var protobufDeserializer = new GlueSchemaRegistryKafkaDeserializer(PROTOBUF_CONFIG_PATH, dataConfig);

// read message from Kafka using serialized = consumer.Consume()
var deserializedObject = protobufDeserializer.Deserialize(message.Descriptor.FullName, serialized);
```

## 搭配 KafkaFlow for SerDes 使用 C\$1 Glue 結構描述用戶端程式庫
<a name="schema-registry-gs-serde-csharp-kafkaflow"></a>

**序列化程式用量範例：**  
下列範例示範如何使用序列化程式設定 KafkaFlow：

```
services.AddKafka(kafka => kafka
    .UseConsoleLog()
    .AddCluster(cluster => cluster
        .WithBrokers(new[] { "localhost:9092" })
        .AddProducer<CustomerProducer>(producer => producer
            .DefaultTopic("customer-events")
            .AddMiddlewares(m => m
                .AddSerializer<GlueSchemaRegistryKafkaFlowProtobufSerializer<Customer>>(
                    () => new GlueSchemaRegistryKafkaFlowProtobufSerializer<Customer>("config/gsr-config.properties")
                )
            )
        )
    )
);
```

**還原序列化程式用量範例：**  
下列範例示範如何使用還原序列化程式設定 KafkaFlow：

```
.AddConsumer(consumer => consumer
    .Topic("customer-events")
    .WithGroupId("customer-group")
    .WithBufferSize(100)
    .WithWorkersCount(10)
    .AddMiddlewares(middlewares => middlewares
        .AddDeserializer<GlueSchemaRegistryKafkaFlowProtobufDeserializer<Customer>>(
            () => new GlueSchemaRegistryKafkaFlowProtobufDeserializer<Customer>("config/gsr-config.properties")
        )
        .AddTypedHandlers(h => h.AddHandler<CustomerHandler>())
    )
)
```

## 選用生產者屬性
<a name="schema-registry-gs-serde-csharp-optional"></a>

您可以使用其他選用屬性來擴展組態檔案：

```
# Auto-registration (if not passed, uses "false")
schemaAutoRegistrationEnabled=true

# Schema name (if not passed, uses topic name)
schema.name=my-schema

# Registry name (if not passed, uses "default-registry")
registry.name=my-registry

# Cache settings
cacheTimeToLiveMillis=86400000
cacheSize=200

# Compatibility mode (if not passed, uses BACKWARD)
compatibility=FULL

# Registry description
description=This registry is used for several purposes.

# Compression (if not passed, records are sent uncompressed)
compressionType=ZLIB
```

## 支援的資料格式
<a name="schema-registry-gs-serde-supported-formats"></a>

Java 和 C\$1 實作都支援相同的資料格式：
+ *AVRO*：Apache Avro 二進位格式
+ *JSON*：JSON 結構描述格式
+ *PROTOBUF*：通訊協定緩衝區格式

## 備註
<a name="schema-registry-gs-serde-csharp-notes"></a>
+ 若要開始使用程式庫，請造訪 https：//[https://www.nuget.org/packages/AWS.Glue.SchemaRegistry](https://www.nuget.org/packages/AWS.Glue.SchemaRegistry)
+ 來源碼可在 https：//[https://github.com/awslabs/aws-glue-schema-registry](https://github.com/awslabs/aws-glue-schema-registry) 取得

# 建立登錄檔
<a name="schema-registry-gs3"></a>

您可以使用預設登錄檔，或使用 AWS Glue API 或 AWS Glue 主控台建立任意數量的新登錄檔。

**AWS Glue API**  
您可以使用這些步驟，用 AWS Glue API 執行此任務。

若要將 AWS CLI 用於AWS Glue結構描述登錄檔 APIs，請務必將 更新 AWS CLI 為最新版本。

 若要新增登錄檔，請使用 [CreateRegistry 動作 (Python: create\$1registry)](aws-glue-api-schema-registry-api.md#aws-glue-api-schema-registry-api-CreateRegistry) API。指定 `RegistryName` 作為要建立的登錄檔的名稱，最大長度為 255，只能包含字母、數字、連字號、底線、金額符號或井號。

將 `Description` 指定為字串，長度不可超過 2048 個位元組，需符合 [URI 位址多行字串模式](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-common.html#aws-glue-api-common-_string-patterns)。

(選用) 為登錄檔指定一個或多個 `Tags`，作為索引鍵-值對的映射陣列。

```
aws glue create-registry --registry-name registryName1 --description description
```

建立登錄檔後，系統會指派 Amazon Resource Name (ARN)，您可以在 API 回應的 `RegistryArn` 中檢視。現在您已建立登錄檔，請為該登錄檔建立一或多個結構描述。

**AWS Glue 主控台**  
新增新的登錄檔AWS Glue主控台：

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue\) 開啟 AWS Glue主控台。

1. 在導覽窗格的 **Data catalog** 下，選擇 **Schema registries** (結構描述登錄檔)。

1. 選擇 **Add registry (新增登錄檔)**。

1. 輸入**登錄名稱**，由字母、數字、連字號或底線組成。無法變更此名稱。

1. 輸入登錄檔的 **Description (描述)** (選用)。

1. 或者，將一或多個標籤套用到您的登錄檔。選擇 **Add new tag (新增標籤)**，然後指定 **Tag key (標籤鍵)** 以及選用的 **Tag value (標籤值)**。

1. 選擇 **Add registry (新增登錄檔)**。

![\[建立登錄檔的範例。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/schema_reg_create_registry.png)


建立登錄檔後，系統會指派 Amazon Resource Name (ARN)，您可以在 **Schema registries (結構描述登錄檔)** 的清單中選擇登錄檔來查看。現在您已建立登錄檔，請為該登錄檔建立一或多個結構描述。

# 處理 JSON 的特定記錄 (JAVA POJO)
<a name="schema-registry-gs-json-java-pojo"></a>

您可以使用純舊 Java 物件 (POJO) 並將該物件作為記錄傳遞。這類似於 AVRO 中的特定記錄的概念。[mbknor-jackson-jsonschema](https://github.com/mbknor/mbknor-jackson-jsonSchema) 可以為傳遞的 POJO 產生 JSON 結構描述。此程式庫也可以在 JSON 結構描述中注入其他資訊。

AWS Glue 結構描述登錄檔程式庫會使用注入的「className」欄位，在結構描述中提供完全分類的類別名稱。「className」欄位由還原序列化程式用於還原序列化為該類別的物件。

```
 Example class :

@JsonSchemaDescription("This is a car")
@JsonSchemaTitle("Simple Car Schema")
@Builder
@AllArgsConstructor
@EqualsAndHashCode
// Fully qualified class name to be added to an additionally injected property
// called className for deserializer to determine which class to deserialize
// the bytes into
@JsonSchemaInject(
        strings = {@JsonSchemaString(path = "className",
                value = "com.amazonaws.services.schemaregistry.integrationtests.generators.Car")}
)
// List of annotations to help infer JSON Schema are defined by https://github.com/mbknor/mbknor-jackson-jsonSchema
public class Car {
    @JsonProperty(required = true)
    private String make;

    @JsonProperty(required = true)
    private String model;

    @JsonSchemaDefault("true")
    @JsonProperty
    public boolean used;

    @JsonSchemaInject(ints = {@JsonSchemaInt(path = "multipleOf", value = 1000)})
    @Max(200000)
    @JsonProperty
    private int miles;

    @Min(2000)
    @JsonProperty
    private int year;

    @JsonProperty
    private Date purchaseDate;

    @JsonProperty
    @JsonFormat(shape = JsonFormat.Shape.NUMBER)
    private Date listedDate;

    @JsonProperty
    private String[] owners;

    @JsonProperty
    private Collection<Float> serviceChecks;

    // Empty constructor is required by Jackson to deserialize bytes
    // into an Object of this class
    public Car() {}
}
```

# 建立結構描述
<a name="schema-registry-gs4"></a>

您可以使用 AWS Glue API 或 AWS Glue 主控台建立結構描述。

**AWS Glue API**  
您可以使用這些步驟，用 AWS Glue API 執行此任務。

若要新增結構描述，請使用 [CreateSchema 動作 (Python: create\$1schema)](aws-glue-api-schema-registry-api.md#aws-glue-api-schema-registry-api-CreateSchema) API。

指定 `RegistryId` 結構來指出結構描述的登錄檔。或者，省略 `RegistryId` 以使用預設登錄檔。

指定由字母、數字、連字號或底線組成的 `SchemaName`，以及指定 `DataFormat` 為 **AVRO** 或 **JSON**。在結構描述上設定 `DataFormat` 後就不可改變。

指定 `Compatibility` 模式：
+ *向後 (建議使用)* — 消費者可以同時讀取目前版本和先前版本。
+ *全部向後* — 消費者可以讀取目前版本和所有先前版本。
+ *向前* — 消費者可以讀取目前和後續版本。
+ *全部向前* — 消費者可以讀取目前版本和所有後續版本。
+ *完整* — 向後和向前的組合。
+ *完整全部* — 全部向後與全部向前的組合。
+ *無* — 不會執行相容性檢查。
+ *已停用* — 防止此結構描述的任何版本控制。

選用地指定結構描述的 `Tags`。

指定 `SchemaDefinition` 可定義 Avro、JSON 或 Protobuf 資料格式的結構描述。請參閱範例。

對於 Avro 資料格式：

```
aws glue create-schema --registry-id RegistryName="registryName1" --schema-name testschema --compatibility NONE --data-format AVRO --schema-definition "{\"type\": \"record\", \"name\": \"r1\", \"fields\": [ {\"name\": \"f1\", \"type\": \"int\"}, {\"name\": \"f2\", \"type\": \"string\"} ]}"
```

```
aws glue create-schema --registry-id RegistryArn="arn:aws:glue:us-east-2:901234567890:registry/registryName1" --schema-name testschema --compatibility NONE --data-format AVRO  --schema-definition "{\"type\": \"record\", \"name\": \"r1\", \"fields\": [ {\"name\": \"f1\", \"type\": \"int\"}, {\"name\": \"f2\", \"type\": \"string\"} ]}"
```

對於 JSON 資料格式：

```
aws glue create-schema --registry-id RegistryName="registryName" --schema-name testSchemaJson --compatibility NONE --data-format JSON --schema-definition "{\"$schema\": \"http://json-schema.org/draft-07/schema#\",\"type\":\"object\",\"properties\":{\"f1\":{\"type\":\"string\"}}}"
```

```
aws glue create-schema --registry-id RegistryArn="arn:aws:glue:us-east-2:901234567890:registry/registryName" --schema-name testSchemaJson --compatibility NONE --data-format JSON --schema-definition "{\"$schema\": \"http://json-schema.org/draft-07/schema#\",\"type\":\"object\",\"properties\":{\"f1\":{\"type\":\"string\"}}}"
```

對於 Protobuf 資料格式：

```
aws glue create-schema --registry-id RegistryName="registryName" --schema-name testSchemaProtobuf --compatibility NONE --data-format PROTOBUF --schema-definition "syntax = \"proto2\";package org.test;message Basic { optional int32 basic = 1;}"
```

```
aws glue create-schema --registry-id RegistryArn="arn:aws:glue:us-east-2:901234567890:registry/registryName" --schema-name testSchemaProtobuf --compatibility NONE --data-format PROTOBUF --schema-definition "syntax = \"proto2\";package org.test;message Basic { optional int32 basic = 1;}"
```

**AWS Glue 主控台**  
若要使用 AWS Glue 主控台來新增結構描述：

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

1. 在導覽窗格中，於 **Data catalog** 下選擇 **Schemas (Data Catalog)** (結構描述 Data Catalog)。

1. 選擇 **Add schema (新增結構描述)**。

1. 輸入 **Schema name (結構描述名稱)**，由字母、數字、連字號、底線、金額符號或井號組成。無法變更此名稱。

1. 選擇 **Registry (登錄檔)**，其中結構描述會從下拉式選單儲存。建立後，無法變更父登錄檔。

1. 將 **Data format (資料格式)** 保留為 *Apache Avro* 或 *JSON*。此格式會套用至此結構描述的所有版本。

1. 選擇 **Compatibility mode (相容性模式)**。
   + *向後 (建議使用)* — 接收者可以讀取目前和以前的版本。
   + *全部向後* — 接收者可以讀取目前和所有以前的版本。
   + *向前* — 傳送者可以寫入目前和先前的版本。
   + *全部向前* — 傳送者可以寫入目前和所有先前的版本。
   + *完整* — 向後和向前的組合。
   + *完整全部* — 全部向後與全部向前的組合。
   + *無* — 不執行相容性檢查。
   + *已停用* — 防止此結構描述的任何版本控制。

1. 為登錄檔輸入選用 **Description (描述)**，最多 250 個字元。  
![\[建立資料結構描述的範例。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/schema_reg_create_schema.png)

1. 或者，將一或多個標籤套用到您的結構描述。選擇 **Add new tag (新增標籤)**，然後指定 **Tag key (標籤鍵)** 以及選用的 **Tag value (標籤值)**。

1. 在 **First schema version (第一個結構描述版本)** 方塊中，輸入或貼上您的初始結構描述。

   如需 Avro 格式，請參閱[使用 Avro 資料格式](#schema-registry-avro)

   如需 JSON 格式的資訊，請參閱[使用 JSON 資料格式](#schema-registry-json)

1. 選用地選擇 **Add metadata (新增中繼資料)** 以新增版本中繼資料來標註或分類您的結構描述版本。

1. 選擇 **Create schema and version (建立結構描述和版本)**。

![\[建立資料結構描述的範例。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/schema_reg_create_schema2.png)


結構描述隨即建立，並顯示在 **Schemas (結構描述)** 清單下。

## 使用 Avro 資料格式
<a name="schema-registry-avro"></a>

Avro 提供資料序列化和資料交換服務。Avro 儲存在 JSON 格式的資料定義，使得它易於閱讀和解釋。資料本身會以二進位格式儲存。

如需定義 Apache Avro 結構描述的相關資訊，請參閱 [Apache Avro 規格](http://avro.apache.org/docs/current/spec.html)。

## 使用 JSON 資料格式
<a name="schema-registry-json"></a>

資料可以用 JSON 格式來序列化。[JSON 結構描述格式](https://json-schema.org/)定義了 JSON 結構描述格式的標準。

# 更新結構描述或登錄檔
<a name="schema-registry-gs5"></a>

建立後，您可以編輯結構描述、結構描述版本或登錄檔。

## 更新登錄檔
<a name="schema-registry-gs5a"></a>

您可以使用 AWS Glue API 或 AWS Glue 主控台更新登錄檔。無法編輯現有登錄檔的名稱。您可以編輯登錄檔的描述。

**AWS Glue API**  
若要更新現有的登錄檔，請使用 [UpdateRegistry 動作 (Python: update\$1registry)](aws-glue-api-schema-registry-api.md#aws-glue-api-schema-registry-api-UpdateRegistry) API。

指定 `RegistryId` 結構，以指出您要更新的登錄檔。傳遞 `Description` 以變更登錄檔的描述。

```
aws glue update-registry --description updatedDescription --registry-id RegistryArn="arn:aws:glue:us-east-2:901234567890:registry/registryName1"
```

**AWS Glue 主控台**  
使用 AWS Glue 主控台更新登錄檔：

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue\) 開啟 AWS Glue主控台。

1. 在導覽窗格的 **Data catalog** 下，選擇 **Schema registries** (結構描述登錄檔)。

1. 從登錄檔清單中選擇登錄檔，方法是勾選其方塊。

1. 在 **Actions (動作)** 選單上，選擇 **Edit registry (編輯登錄檔)**。

# 更新結構描述
<a name="schema-registry-gs5b"></a>

您可以更新結構描述的描述或相容性設定。

若要更新現有的結構描述，請使用 [UpdateSchema 動作 (Python: update\$1schema)](aws-glue-api-schema-registry-api.md#aws-glue-api-schema-registry-api-UpdateSchema) API。

指定 `SchemaId` 結構描述，以指出您要更新的結構描述。必須提供其中一個 `VersionNumber` 或 `Compatibility`。

程式碼範例 11：

```
aws glue update-schema --description testDescription --schema-id SchemaName="testSchema1",RegistryName="registryName1" --schema-version-number LatestVersion=true --compatibility NONE
```

```
aws glue update-schema --description testDescription --schema-id SchemaArn="arn:aws:glue:us-east-2:901234567890:schema/registryName1/testSchema1" --schema-version-number LatestVersion=true --compatibility NONE
```

# 新增結構描述版本
<a name="schema-registry-gs5c"></a>

當您新增結構描述版本時，您需要比較版本以確保新結構描述可被接受。

若要將新版本新增到現有結構描述，請使用 [RegisterSchemaVersion 動作 (Python: register\$1schema\$1version)](aws-glue-api-schema-registry-api.md#aws-glue-api-schema-registry-api-RegisterSchemaVersion) API。

指定 `SchemaId` 結構來指示您想要新增版本的結構描述，以及 `SchemaDefinition` 來定義結構描述。

程式碼範例 12：

```
aws glue register-schema-version --schema-definition "{\"type\": \"record\", \"name\": \"r1\", \"fields\": [ {\"name\": \"f1\", \"type\": \"int\"}, {\"name\": \"f2\", \"type\": \"string\"} ]}" --schema-id SchemaArn="arn:aws:glue:us-east-1:901234567890:schema/registryName/testschema"
```

```
aws glue register-schema-version --schema-definition "{\"type\": \"record\", \"name\": \"r1\", \"fields\": [ {\"name\": \"f1\", \"type\": \"int\"}, {\"name\": \"f2\", \"type\": \"string\"} ]}" --schema-id SchemaName="testschema",RegistryName="testregistry"
```

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue\) 開啟 AWS Glue主控台。

1. 在導覽窗格中，於 **Data catalog** 下選擇 **Schemas (Data Catalog)** (結構描述 Data Catalog)。

1. 從結構描述清單中選擇結構描述，方法是勾選其方塊。

1. 從清單中選擇一或多個結構描述，方法是勾選其方塊。

1. 在 **Action (動作)** 選單中，選擇 **Register new version (註冊新版本)**。

1. 在 **New version (新版本)** 方塊中，輸入或貼上新的結構描述。

1. 選擇 **Compare with previous version (與舊版本比較)** 以查看與以前的結構描述版本的差異。

1. 選用地選擇 **Add metadata (新增中繼資料)** 以新增版本中繼資料來標註或分類您的結構描述版本。輸入 **Key (索引鍵)** 和選用的 **Value (值)**。

1. 選擇 **Register version (註冊版本)**。

![\[新增結構描述版本。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/schema_reg_add_schema_version.png)


結構描述版本會顯示在版本清單中。如果版本變更了相容性模式，版本將被標記為檢查點。

## 結構描述版本比較的範例
<a name="schema-registry-gs5c1"></a>

當您選擇 **Compare with previous version (與舊版本比較)**，您會看到上一個版本和新版本一起顯示。變更的資訊將會反白顯示如下：
+ *黃色*：表示已變更的資訊。
+ *綠色*：表示在最新版本中新增的內容。
+ *紅色*：表示在最新版本中移除的內容。

您也可以與更舊版本進行比較。

![\[結構描述版本比較的範例。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/schema_reg_version_comparison.png)


# 刪除結構描述或登錄檔
<a name="schema-registry-gs7"></a>

刪除結構描述、結構描述版本或登錄檔是無法復原的永久動作。

## 刪除結構描述
<a name="schema-registry-gs7a"></a>

當結構描述不再用於登錄檔、使用 或 [DeleteSchema 動作 (Python: delete\$1schema)](aws-glue-api-schema-registry-api.md#aws-glue-api-schema-registry-api-DeleteSchema) API 時 AWS 管理主控台，您可能想要將其刪除。

刪除一或多個結構描述是無法復原的永久動作。請確定已不再需要結構描述。

若要從登錄檔刪除結構描述，請呼叫 [DeleteSchema 動作 (Python: delete\$1schema)](aws-glue-api-schema-registry-api.md#aws-glue-api-schema-registry-api-DeleteSchema) API, 指定 `SchemaId` 結構來識別結構描述。

例如：

```
aws glue delete-schema --schema-id SchemaArn="arn:aws:glue:us-east-2:901234567890:schema/registryName1/schemaname"
```

```
aws glue delete-schema --schema-id SchemaName="TestSchema6-deleteschemabyname",RegistryName="default-registry"
```

**AWS Glue 主控台**  
從 AWS Glue 主控台刪除結構描述：

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue\) 開啟 AWS Glue主控台。

1. 在導覽窗格的 **Data catalog** 下，選擇 **Schema registries** (結構描述登錄檔)。

1. 從登錄檔清單中選擇包含結構描述的登錄檔。

1. 從清單中選擇一或多個結構描述，方法是勾選其方塊。

1. 在 **Action (動作)** 選單中，選擇 **Delete schema (刪除結構描述)**。

1. 在欄位中輸入文字 **Delete** 以確認刪除。

1. 選擇 **刪除**。

您指定的結構描述會從登錄檔中刪除。

## 刪除結構描述版本
<a name="schema-registry-gs7b"></a>

當結構描述累積在登錄檔中時，您可能想要使用 或 [DeleteSchemaVersions 動作 (Python: delete\$1schema\$1versions)](aws-glue-api-schema-registry-api.md#aws-glue-api-schema-registry-api-DeleteSchemaVersions) API AWS 管理主控台刪除不需要的結構描述版本。刪除一或多個結構描述版本是無法復原的永久動作。請確定不再需要結構描述版本。

刪除結構描述版本時，請注意以下限制：
+ 您無法刪除檢查點的版本。
+ 連續版本的範圍不能超過 25。
+ 最新結構描述版本不可處於待定狀態。

指定 `SchemaId` 結構來識別結構描述，並指定 `Versions` 作為要刪除的版本範圍。如需指定版本或版本範圍的詳細資訊，請參閱[DeleteRegistry 動作 (Python: delete\$1registry)](aws-glue-api-schema-registry-api.md#aws-glue-api-schema-registry-api-DeleteRegistry)。您指定的結構描述版本會從登錄檔中刪除。

在此呼叫後呼叫 [ListSchemaVersions 動作 (Python: list\$1schema\$1versions)](aws-glue-api-schema-registry-api.md#aws-glue-api-schema-registry-api-ListSchemaVersions) API 將列出已刪除版本的狀態。

例如：

```
aws glue delete-schema-versions --schema-id SchemaName="TestSchema6",RegistryName="default-registry" --versions "1-1"
```

```
aws glue delete-schema-versions --schema-id SchemaArn="arn:aws:glue:us-east-2:901234567890:schema/default-registry/TestSchema6-NON-Existent" --versions "1-1"
```

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue\) 開啟 AWS Glue主控台。

1. 在導覽窗格的 **Data catalog** 下，選擇 **Schema registries** (結構描述登錄檔)。

1. 從登錄檔清單中選擇包含結構描述的登錄檔。

1. 從清單中選擇一或多個結構描述，方法是勾選其方塊。

1. 在 **Action (動作)** 選單中，選擇 **Delete schema (刪除結構描述)**。

1. 在欄位中輸入文字 **Delete** 以確認刪除。

1. 選擇 **刪除**。

您指定的結構描述版本會從登錄檔中刪除。

# 刪除登錄檔
<a name="schema-registry-gs7c"></a>

當登錄檔包含的結構描述不應再組織在該登錄檔下時，您可能會想要刪除登錄檔。您將需要將這些結構描述重新指派到另一個登錄檔。

刪除一或多個登錄檔是無法復原的永久動作。請確定登錄檔不再需要。

預設登錄檔可以使用 AWS CLI來刪除。

**AWS Glue API**  
若要刪除整個登錄檔，包括結構描述及其所有版本，請呼叫 [DeleteRegistry 動作 (Python: delete\$1registry)](aws-glue-api-schema-registry-api.md#aws-glue-api-schema-registry-api-DeleteRegistry) API。指定 `RegistryId` 結構描述以識別登錄檔。

例如：

```
aws glue delete-registry --registry-id RegistryArn="arn:aws:glue:us-east-2:901234567890:registry/registryName1"
```

```
aws glue delete-registry --registry-id RegistryName="TestRegistry-deletebyname"
```

若要取得刪除操作的狀態，您可以在非同步呼叫之後呼叫 `GetRegistry` API。

**AWS Glue 主控台**  
若要從 AWS Glue 主控台刪除登錄檔：

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue\) 開啟 AWS Glue主控台。

1. 在導覽窗格的 **Data catalog** 下，選擇 **Schema registries** (結構描述登錄檔)。

1. 從清單中選擇登錄檔，方法是勾選其方塊。

1. 在 **Actions (動作)** 選單中，選擇 **Delete registry (刪除登錄檔)**。

1. 在欄位中輸入文字 **Delete** 以確認刪除。

1. 選擇 **刪除**。

您選取的登錄檔會從 AWS Glue 刪除。

## 序列化程式的 IAM 範例
<a name="schema-registry-gs1"></a>

**注意**  
AWS 受管政策會授予常見使用案例的必要許可。如需使用受管政策來管理結構描述登錄檔的相關資訊，請參閱[AWS 的 受管 （預先定義） 政策 AWS Glue](security-iam-awsmanpol.md#access-policy-examples-aws-managed)。

對於序列化程式，您應該建立類似於下面的最小政策，以便您能夠找到特定結構描述定義的 `schemaVersionId`。請注意，您應該有登錄檔的讀取許可，才能讀取登錄檔中的結構描述。您可以使用 `Resource` 子句，限制可以讀取的登錄檔。

程式碼範例 13：

```
{
    "Sid" : "GetSchemaByDefinition",
    "Effect" : "Allow",
    "Action" :
	[
        "glue:GetSchemaByDefinition"
    ],
        "Resource" : ["arn:aws:glue:us-east-2:012345678:registry/registryname-1",
                      "arn:aws:glue:us-east-2:012345678:schema/registryname-1/schemaname-1",
                      "arn:aws:glue:us-east-2:012345678:schema/registryname-1/schemaname-2"
                     ]
}
```

此外，您還可以允許生產者透過包括以下額外的方法來建立新的結構描述和版本。請注意，您應該能夠檢查登錄檔以新增/刪除/演變其中的結構描述。您可以使用 `Resource` 子句，限制可以檢查的登錄檔。

程式碼範例 14：

```
{
    "Sid" : "RegisterSchemaWithMetadata",
    "Effect" : "Allow",
    "Action" :
	[
        "glue:GetSchemaByDefinition",
        "glue:CreateSchema",
        "glue:RegisterSchemaVersion",
        "glue:PutSchemaVersionMetadata",
    ],
    "Resource" : ["arn:aws:glue:aws-region:123456789012:registry/registryname-1",
                  "arn:aws:glue:aws-region:123456789012:schema/registryname-1/schemaname-1",
                  "arn:aws:glue:aws-region:123456789012:schema/registryname-1/schemaname-2"
                 ]
}
```

## 還原序列化程式的 IAM 範例
<a name="schema-registry-gs1b"></a>

對於還原序列化程式 (消費者方面)，您應該建立類似下面的政策，以允許還原序列化程式從結構描述登錄檔中擷取結構描述以進行還原序列化。請注意，您應該能夠檢查登錄檔以擷取其中的結構描述。

程式碼範例 15：

```
{
    "Sid" : "GetSchemaVersion",
    "Effect" : "Allow",
    "Action" :
	[
        "glue:GetSchemaVersion"
    ],
    "Resource" : ["*"]
}
```

## 使用 的私有連線 AWS PrivateLink
<a name="schema-registry-gs-private"></a>

您可以使用 AWS Glue 透過定義 的介面 VPC 端點 AWS PrivateLink ，將資料生產者的 VPC 連線至 AWS Glue。使用 VPC 介面端點時，VPC 和 AWS Glue 之間的通訊完全在 AWS 網路中執行。如需詳細資訊，請參閱[使用 AWS Glue 搭配 VPC 端點](https://docs.aws.amazon.com/glue/latest/dg/vpc-endpoint.html)。

# 存取 Amazon CloudWatch 指標
<a name="schema-registry-gs-monitoring"></a>

Amazon CloudWatch 指標可作為 CloudWatch 的免費方案的一部分使用。您可以在 CloudWatch 主控台中存取這些指標。API 層級指標包括 CreateSchema (成功和延遲)、GetSchemaByDefinition (成功和延遲)、GetSchemaVersion (成功和延遲)、RegisterSchemaVersion (成功和延遲)、PutSchemaVersionMetadata (成功和延遲)。資源層級指標包括 Registry.ThrottledByLimit、SchemaVersion.ThrottledByLimit、SchemaVersion.Size。

# 結構描述登錄的範例 CloudFormation 範本
<a name="schema-registry-integrations-cfn"></a>

以下是在 中建立結構描述登錄檔資源的範例範本 CloudFormation。若要在您的帳戶中建立此堆疊，請將上述範本複製到檔案 `SampleTemplate.yaml`，然後執行下列命令：

```
aws cloudformation create-stack --stack-name ABCSchemaRegistryStack --template-body "'cat SampleTemplate.yaml'"
```

此範例使用 `AWS::Glue::Registry` 建立登錄檔、使用 `AWS::Glue::Schema` 建立結構描述、使用 `AWS::Glue::SchemaVersion` 建立結構描述版本，以及使用 `AWS::Glue::SchemaVersionMetadata` 填入結構描述版本中繼資料。

```
Description: "A sample CloudFormation template for creating Schema Registry resources."
Resources:
  ABCRegistry:
    Type: "AWS::Glue::Registry"
    Properties:
      Name: "ABCSchemaRegistry"
      Description: "ABC Corp. Schema Registry"
      Tags:
        Project: "Foo"
  ABCSchema:
    Type: "AWS::Glue::Schema"
    Properties:
      Registry:
        Arn: !Ref ABCRegistry
      Name: "TestSchema"
      Compatibility: "NONE"
      DataFormat: "AVRO"
      SchemaDefinition: >
        {"namespace":"foo.avro","type":"record","name":"user","fields":[{"name":"name","type":"string"},{"name":"favorite_number","type":"int"}]}
      Tags:
        Project: "Foo"
  SecondSchemaVersion:
    Type: "AWS::Glue::SchemaVersion"
    Properties:
      Schema:
        SchemaArn: !Ref ABCSchema
      SchemaDefinition: >
        {"namespace":"foo.avro","type":"record","name":"user","fields":[{"name":"status","type":"string", "default":"ON"}, {"name":"name","type":"string"},{"name":"favorite_number","type":"int"}]}
  FirstSchemaVersionMetadata:
    Type: "AWS::Glue::SchemaVersionMetadata"
    Properties:
      SchemaVersionId: !GetAtt ABCSchema.InitialSchemaVersionId
      Key: "Application"
      Value: "Kinesis"
  SecondSchemaVersionMetadata:
    Type: "AWS::Glue::SchemaVersionMetadata"
    Properties:
      SchemaVersionId: !Ref SecondSchemaVersion
      Key: "Application"
      Value: "Kinesis"
```

# 與 AWS Glue 結構描述登錄檔整合
<a name="schema-registry-integrations"></a>

這些章節說明與 AWS Glue 結構描述登錄檔的整合。這些章節中的範例顯示了 AVRO 資料格式的結構描述。如需更多範例 (包括具有 JSON 資料格式的結構描述)，請參閱[AWS Glue 結構描述登錄檔開源儲存庫](https://github.com/awslabs/aws-glue-schema-registry)中的整合測試和讀我資訊。

**Topics**
+ [使用案例：將結構描述登錄檔連線到 Amazon MSK 或 Apache Kafka](#schema-registry-integrations-amazon-msk)
+ [使用案例：將 Amazon Kinesis Data Streams 與 AWS Glue 結構描述登錄檔整合](#schema-registry-integrations-kds)
+ [使用案例：Amazon Managed Service for Apache Flink](#schema-registry-integrations-kinesis-data-analytics-apache-flink)
+ [使用案例：與 整合 AWS Lambda](#schema-registry-integrations-aws-lambda)
+ [使用案例： AWS Glue Data Catalog](#schema-registry-integrations-aws-glue-data-catalog)
+ [使用案例：AWS Glue 串流](#schema-registry-integrations-aws-glue-streaming)
+ [使用案例：Apache Kafka Streams](#schema-registry-integrations-apache-kafka-streams)

## 使用案例：將結構描述登錄檔連線到 Amazon MSK 或 Apache Kafka
<a name="schema-registry-integrations-amazon-msk"></a>

假設您正在將資料寫入 Apache Kafka 主題，並且您可以按照下列步驟開始使用。

1. 建立具有至少一個主題的 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 或 Apache Kafka 叢集。如果是建立 Amazon MSK 叢集，您可以使用 AWS 管理主控台。請遵循以下說明：*Amazon Managed Streaming for Apache Kafka 開發人員指南*中的 [Amazon MSK 入門](https://docs.aws.amazon.com/msk/latest/developerguide/getting-started.html)。

1. 遵循上述的[安裝 SerDe 程式庫](schema-registry-gs-serde.md)步驟。

1. 若要建立結構描述登錄檔、結構描述或結構描述版本，請依照這份文件的[結構描述登錄檔入門](schema-registry-gs.md)一節指示進行。

1. 啟動您的生產者和消費者以使用結構描述登錄檔來從/向 Amazon MSK 或 Apache Kafka 主題寫入和讀取記錄。範例生產者和消費者程式碼可以在 Serde 程式庫的[讀我檔案](https://github.com/awslabs/aws-glue-schema-registry/blob/master/README.md)找到。生產者上的結構描述登錄檔程式庫會自動序列化記錄，並使用結構描述版本 ID 裝飾記錄。

1. 如果已輸入此記錄的結構描述，或者如果開啟自動註冊，則結構描述將已在結構描述登錄檔中註冊。

1. 消費者使用 AWS Glue 結構描述登錄檔程式庫從 Amazon MSK 或 Apache Kafka 主題讀取，會自動從結構描述登錄檔查詢結構描述。

## 使用案例：將 Amazon Kinesis Data Streams 與 AWS Glue 結構描述登錄檔整合
<a name="schema-registry-integrations-kds"></a>

此整合要求您擁有現有的 Amazon Kinesis 資料串流。如需詳細資訊，請參閱 *Amazon Kinesis Data Streams 開發人員指南*中的 [Amazon Kinesis Data Streams 入門](https://docs.aws.amazon.com/streams/latest/dev/getting-started.html)。

您可以透過兩種方式與 Kinesis 資料串流中的資料互動。
+ 透過 Java 中的 Kinesis Producer Library (KPL) 和 Kinesis Client Library (KCL) 程式庫。不提供多語言支援。
+ 透過 適用於 Java 的 AWS SDK中提供的 `PutRecords`、`PutRecord` 以及 `GetRecords` Kinesis Data Streams API。

如果您目前使用 KPL/KCL 程式庫，我們建議您繼續使用該方法。有更新的 KCL 和 KPL 版本與結構描述登錄檔整合，如範例所示。否則，您可以使用範例程式碼來利用 AWS Glue 結構描述登錄檔 (如果直接使用 KDS API)。

結構描述登錄檔整合只適用於 KPL v0.14.2 或更高版本和 KCL v2.3 或更高版本。結構描述登錄檔與 JSON 資料格式整合適用於 KPL v0.14.8 或更高版本和 KCL v2.3.6 或更高版本。

### 使用 Kinesis SDK V2 與資料互動
<a name="schema-registry-integrations-kds-sdk-v2"></a>

本節說明如何使用 Kinesis SDK V2 與 Kinesis 互動

```
// Example JSON Record, you can construct a AVRO record also
private static final JsonDataWithSchema record = JsonDataWithSchema.builder(schemaString, payloadString);
private static final DataFormat dataFormat = DataFormat.JSON;

//Configurations for Schema Registry
GlueSchemaRegistryConfiguration gsrConfig = new GlueSchemaRegistryConfiguration("us-east-1");

GlueSchemaRegistrySerializer glueSchemaRegistrySerializer =
        new GlueSchemaRegistrySerializerImpl(awsCredentialsProvider, gsrConfig);
GlueSchemaRegistryDataFormatSerializer dataFormatSerializer =
        new GlueSchemaRegistrySerializerFactory().getInstance(dataFormat, gsrConfig);

Schema gsrSchema =
        new Schema(dataFormatSerializer.getSchemaDefinition(record), dataFormat.name(), "MySchema");

byte[] serializedBytes = dataFormatSerializer.serialize(record);

byte[] gsrEncodedBytes = glueSchemaRegistrySerializer.encode(streamName, gsrSchema, serializedBytes);

PutRecordRequest putRecordRequest = PutRecordRequest.builder()
        .streamName(streamName)
        .partitionKey("partitionKey")
        .data(SdkBytes.fromByteArray(gsrEncodedBytes))
        .build();
shardId = kinesisClient.putRecord(putRecordRequest)
        .get()
        .shardId();

GlueSchemaRegistryDeserializer glueSchemaRegistryDeserializer = new GlueSchemaRegistryDeserializerImpl(awsCredentialsProvider, gsrConfig);

GlueSchemaRegistryDataFormatDeserializer gsrDataFormatDeserializer =
        glueSchemaRegistryDeserializerFactory.getInstance(dataFormat, gsrConfig);

GetShardIteratorRequest getShardIteratorRequest = GetShardIteratorRequest.builder()
        .streamName(streamName)
        .shardId(shardId)
        .shardIteratorType(ShardIteratorType.TRIM_HORIZON)
        .build();

String shardIterator = kinesisClient.getShardIterator(getShardIteratorRequest)
        .get()
        .shardIterator();

GetRecordsRequest getRecordRequest = GetRecordsRequest.builder()
        .shardIterator(shardIterator)
        .build();
GetRecordsResponse recordsResponse = kinesisClient.getRecords(getRecordRequest)
        .get();

List<Object> consumerRecords = new ArrayList<>();
List<Record> recordsFromKinesis = recordsResponse.records();

for (int i = 0; i < recordsFromKinesis.size(); i++) {
    byte[] consumedBytes = recordsFromKinesis.get(i)
            .data()
            .asByteArray();

    Schema gsrSchema = glueSchemaRegistryDeserializer.getSchema(consumedBytes);
    Object decodedRecord = gsrDataFormatDeserializer.deserialize(ByteBuffer.wrap(consumedBytes),
                                                                    gsrSchema.getSchemaDefinition());
    consumerRecords.add(decodedRecord);
}
```

### 使用 KPL/KCL 程式庫與資料互動
<a name="schema-registry-integrations-kds-libraries"></a>

本節說明使用 KPL/KCL 程式庫將 Kinesis Data Streams 與結構描述登錄檔整合。如需使用 KPL/KCL 的詳細資訊，請參閱 *Amazon Kinesis Data Streams 開發人員指南*中的[使用 Amazon Kinesis Producer Library 開發生產者](https://docs.aws.amazon.com/streams/latest/dev/developing-producers-with-kpl.html)。

#### 在 KPL 中設定結構描述登錄檔
<a name="schema-registry-integrations-kds-libraries-kpl"></a>

1. 定義 AWS Glue 結構描述登錄檔中撰寫的資料的結構描述定義、資料格式和結構描述名稱。

1. 選用地設定 `GlueSchemaRegistryConfiguration` 物件。

1. 將結構描述物件傳遞給 `addUserRecord API`。

   ```
   private static final String SCHEMA_DEFINITION = "{"namespace": "example.avro",\n"
   + " "type": "record",\n"
   + " "name": "User",\n"
   + " "fields": [\n"
   + " {"name": "name", "type": "string"},\n"
   + " {"name": "favorite_number", "type": ["int", "null"]},\n"
   + " {"name": "favorite_color", "type": ["string", "null"]}\n"
   + " ]\n"
   + "}";
   
   KinesisProducerConfiguration config = new KinesisProducerConfiguration();
   config.setRegion("us-west-1")
   
   //[Optional] configuration for Schema Registry.
   
   GlueSchemaRegistryConfiguration schemaRegistryConfig =
   new GlueSchemaRegistryConfiguration("us-west-1");
   
   schemaRegistryConfig.setCompression(true);
   
   config.setGlueSchemaRegistryConfiguration(schemaRegistryConfig);
   
   ///Optional configuration ends.
   
   final KinesisProducer producer =
         new KinesisProducer(config);
   
   final ByteBuffer data = getDataToSend();
   
   com.amazonaws.services.schemaregistry.common.Schema gsrSchema =
       new Schema(SCHEMA_DEFINITION, DataFormat.AVRO.toString(), "demoSchema");
   
   ListenableFuture<UserRecordResult> f = producer.addUserRecord(
   config.getStreamName(), TIMESTAMP, Utils.randomExplicitHashKey(), data, gsrSchema);
   
   private static ByteBuffer getDataToSend() {
         org.apache.avro.Schema avroSchema =
           new org.apache.avro.Schema.Parser().parse(SCHEMA_DEFINITION);
   
         GenericRecord user = new GenericData.Record(avroSchema);
         user.put("name", "Emily");
         user.put("favorite_number", 32);
         user.put("favorite_color", "green");
   
         ByteArrayOutputStream outBytes = new ByteArrayOutputStream();
         Encoder encoder = EncoderFactory.get().directBinaryEncoder(outBytes, null);
         new GenericDatumWriter<>(avroSchema).write(user, encoder);
         encoder.flush();
         return ByteBuffer.wrap(outBytes.toByteArray());
    }
   ```

#### 設定 Kinesis client library
<a name="schema-registry-integrations-kds-libraries-kcl"></a>

您將用 Java 開發 Kinesis Client Library 消費者。如需詳細資訊，請參閱 *Amazon Kinesis Data Streams 開發人員指南*中的[以 Java 開發 Kinesis Client Library 消費者](https://docs.aws.amazon.com/streams/latest/dev/kcl2-standard-consumer-java-example.html)。

1. 傳遞 `GlueSchemaRegistryConfiguration` 物件，建立 `GlueSchemaRegistryDeserializer` 的執行個體。

1. 傳遞 `GlueSchemaRegistryDeserializer` 至 `retrievalConfig.glueSchemaRegistryDeserializer`。

1. 透過呼叫 `kinesisClientRecord.getSchema()` 存取內送訊息的結構描述。

   ```
   GlueSchemaRegistryConfiguration schemaRegistryConfig =
       new GlueSchemaRegistryConfiguration(this.region.toString());
   
    GlueSchemaRegistryDeserializer glueSchemaRegistryDeserializer =
       new GlueSchemaRegistryDeserializerImpl(DefaultCredentialsProvider.builder().build(), schemaRegistryConfig);
   
    RetrievalConfig retrievalConfig = configsBuilder.retrievalConfig().retrievalSpecificConfig(new PollingConfig(streamName, kinesisClient));
    retrievalConfig.glueSchemaRegistryDeserializer(glueSchemaRegistryDeserializer);
   
     Scheduler scheduler = new Scheduler(
               configsBuilder.checkpointConfig(),
               configsBuilder.coordinatorConfig(),
               configsBuilder.leaseManagementConfig(),
               configsBuilder.lifecycleConfig(),
               configsBuilder.metricsConfig(),
               configsBuilder.processorConfig(),
               retrievalConfig
           );
   
    public void processRecords(ProcessRecordsInput processRecordsInput) {
               MDC.put(SHARD_ID_MDC_KEY, shardId);
               try {
                   log.info("Processing {} record(s)",
                   processRecordsInput.records().size());
                   processRecordsInput.records()
                   .forEach(
                       r ->
                           log.info("Processed record pk: {} -- Seq: {} : data {} with schema: {}",
                           r.partitionKey(), r.sequenceNumber(), recordToAvroObj(r).toString(), r.getSchema()));
               } catch (Throwable t) {
                   log.error("Caught throwable while processing records. Aborting.");
                   Runtime.getRuntime().halt(1);
               } finally {
                   MDC.remove(SHARD_ID_MDC_KEY);
               }
    }
   
    private GenericRecord recordToAvroObj(KinesisClientRecord r) {
       byte[] data = new byte[r.data().remaining()];
       r.data().get(data, 0, data.length);
       org.apache.avro.Schema schema = new org.apache.avro.Schema.Parser().parse(r.schema().getSchemaDefinition());
       DatumReader datumReader = new GenericDatumReader<>(schema);
   
       BinaryDecoder binaryDecoder = DecoderFactory.get().binaryDecoder(data, 0, data.length, null);
       return (GenericRecord) datumReader.read(null, binaryDecoder);
    }
   ```

#### 使用 Kinesis Data Streams API 與資料互動
<a name="schema-registry-integrations-kds-apis"></a>

本節說明使用 Kinesis Data Streams API 將 Kinesis Data Streams 與結構描述登錄檔整合。

1. 更新這些 Maven 相依性：

   ```
   <dependencyManagement>
           <dependencies>
               <dependency>
                   <groupId>com.amazonaws</groupId>
                   <artifactId>aws-java-sdk-bom</artifactId>
                   <version>1.11.884</version>
                   <type>pom</type>
                   <scope>import</scope>
               </dependency>
           </dependencies>
       </dependencyManagement>
   
       <dependencies>
           <dependency>
               <groupId>com.amazonaws</groupId>
               <artifactId>aws-java-sdk-kinesis</artifactId>
           </dependency>
   
           <dependency>
               <groupId>software.amazon.glue</groupId>
               <artifactId>schema-registry-serde</artifactId>
               <version>1.1.5</version>
           </dependency>
   
           <dependency>
               <groupId>com.fasterxml.jackson.dataformat</groupId>
               <artifactId>jackson-dataformat-cbor</artifactId>
               <version>2.11.3</version>
           </dependency>
       </dependencies>
   ```

1. 在生產者中，使用 Kinesis Data Streams 中的 `PutRecords` 或 `PutRecord` API 新增結構描述標頭資訊。

   ```
   //The following lines add a Schema Header to the record
           com.amazonaws.services.schemaregistry.common.Schema awsSchema =
               new com.amazonaws.services.schemaregistry.common.Schema(schemaDefinition, DataFormat.AVRO.name(),
                   schemaName);
           GlueSchemaRegistrySerializerImpl glueSchemaRegistrySerializer =
               new GlueSchemaRegistrySerializerImpl(DefaultCredentialsProvider.builder().build(), new GlueSchemaRegistryConfiguration(getConfigs()));
           byte[] recordWithSchemaHeader =
               glueSchemaRegistrySerializer.encode(streamName, awsSchema, recordAsBytes);
   ```

1. 在生產者中，使用 `PutRecords` 或 `PutRecord` API，將記錄放入資料串流中。

1. 在消費者中，從標頭移除結構描述記錄，並序列化 Avro 結構描述記錄。

   ```
   //The following lines remove Schema Header from record
           GlueSchemaRegistryDeserializerImpl glueSchemaRegistryDeserializer =
               new GlueSchemaRegistryDeserializerImpl(DefaultCredentialsProvider.builder().build(), getConfigs());
           byte[] recordWithSchemaHeaderBytes = new byte[recordWithSchemaHeader.remaining()];
           recordWithSchemaHeader.get(recordWithSchemaHeaderBytes, 0, recordWithSchemaHeaderBytes.length);
           com.amazonaws.services.schemaregistry.common.Schema awsSchema =
               glueSchemaRegistryDeserializer.getSchema(recordWithSchemaHeaderBytes);
           byte[] record = glueSchemaRegistryDeserializer.getData(recordWithSchemaHeaderBytes);
   
           //The following lines serialize an AVRO schema record
           if (DataFormat.AVRO.name().equals(awsSchema.getDataFormat())) {
               Schema avroSchema = new org.apache.avro.Schema.Parser().parse(awsSchema.getSchemaDefinition());
               Object genericRecord = convertBytesToRecord(avroSchema, record);
               System.out.println(genericRecord);
           }
   ```

#### 使用 Kinesis Data Streams API 與資料互動
<a name="schema-registry-integrations-kds-apis-reference"></a>

以下是使用 `PutRecords` 和 `GetRecords` API 的範例程式碼。

```
//Full sample code
import com.amazonaws.services.schemaregistry.deserializers.GlueSchemaRegistryDeserializerImpl;
import com.amazonaws.services.schemaregistry.serializers.GlueSchemaRegistrySerializerImpl;
import com.amazonaws.services.schemaregistry.utils.AVROUtils;
import com.amazonaws.services.schemaregistry.utils.AWSSchemaRegistryConstants;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.generic.GenericDatumWriter;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.Decoder;
import org.apache.avro.io.DecoderFactory;
import org.apache.avro.io.Encoder;
import org.apache.avro.io.EncoderFactory;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.services.glue.model.DataFormat;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;


public class PutAndGetExampleWithEncodedData {
    static final String regionName = "us-east-2";
    static final String streamName = "testStream1";
    static final String schemaName = "User-Topic";
    static final String AVRO_USER_SCHEMA_FILE = "src/main/resources/user.avsc";
    KinesisApi kinesisApi = new KinesisApi();

    void runSampleForPutRecord() throws IOException {
        Object testRecord = getTestRecord();
        byte[] recordAsBytes = convertRecordToBytes(testRecord);
        String schemaDefinition = AVROUtils.getInstance().getSchemaDefinition(testRecord);

        //The following lines add a Schema Header to a record
        com.amazonaws.services.schemaregistry.common.Schema awsSchema =
            new com.amazonaws.services.schemaregistry.common.Schema(schemaDefinition, DataFormat.AVRO.name(),
                schemaName);
        GlueSchemaRegistrySerializerImpl glueSchemaRegistrySerializer =
            new GlueSchemaRegistrySerializerImpl(DefaultCredentialsProvider.builder().build(), new GlueSchemaRegistryConfiguration(regionName));
        byte[] recordWithSchemaHeader =
            glueSchemaRegistrySerializer.encode(streamName, awsSchema, recordAsBytes);

        //Use PutRecords api to pass a list of records
        kinesisApi.putRecords(Collections.singletonList(recordWithSchemaHeader), streamName, regionName);

        //OR
        //Use PutRecord api to pass single record
        //kinesisApi.putRecord(recordWithSchemaHeader, streamName, regionName);
    }

    byte[] runSampleForGetRecord() throws IOException {
        ByteBuffer recordWithSchemaHeader = kinesisApi.getRecords(streamName, regionName);

        //The following lines remove the schema registry header
        GlueSchemaRegistryDeserializerImpl glueSchemaRegistryDeserializer =
            new GlueSchemaRegistryDeserializerImpl(DefaultCredentialsProvider.builder().build(), new GlueSchemaRegistryConfiguration(regionName));
        byte[] recordWithSchemaHeaderBytes = new byte[recordWithSchemaHeader.remaining()];
        recordWithSchemaHeader.get(recordWithSchemaHeaderBytes, 0, recordWithSchemaHeaderBytes.length);

        com.amazonaws.services.schemaregistry.common.Schema awsSchema =
            glueSchemaRegistryDeserializer.getSchema(recordWithSchemaHeaderBytes);

        byte[] record = glueSchemaRegistryDeserializer.getData(recordWithSchemaHeaderBytes);

        //The following lines serialize an AVRO schema record
        if (DataFormat.AVRO.name().equals(awsSchema.getDataFormat())) {
            Schema avroSchema = new org.apache.avro.Schema.Parser().parse(awsSchema.getSchemaDefinition());
            Object genericRecord = convertBytesToRecord(avroSchema, record);
            System.out.println(genericRecord);
        }

        return record;
    }

    private byte[] convertRecordToBytes(final Object record) throws IOException {
        ByteArrayOutputStream recordAsBytes = new ByteArrayOutputStream();
        Encoder encoder = EncoderFactory.get().directBinaryEncoder(recordAsBytes, null);
        GenericDatumWriter datumWriter = new GenericDatumWriter<>(AVROUtils.getInstance().getSchema(record));
        datumWriter.write(record, encoder);
        encoder.flush();
        return recordAsBytes.toByteArray();
    }

    private GenericRecord convertBytesToRecord(Schema avroSchema, byte[] record) throws IOException {
        final GenericDatumReader<GenericRecord> datumReader = new GenericDatumReader<>(avroSchema);
        Decoder decoder = DecoderFactory.get().binaryDecoder(record, null);
        GenericRecord genericRecord = datumReader.read(null, decoder);
        return genericRecord;
    }

    private Map<String, String> getMetadata() {
        Map<String, String> metadata = new HashMap<>();
        metadata.put("event-source-1", "topic1");
        metadata.put("event-source-2", "topic2");
        metadata.put("event-source-3", "topic3");
        metadata.put("event-source-4", "topic4");
        metadata.put("event-source-5", "topic5");
        return metadata;
    }

    private GlueSchemaRegistryConfiguration getConfigs() {
        GlueSchemaRegistryConfiguration configs = new GlueSchemaRegistryConfiguration(regionName);
        configs.setSchemaName(schemaName);
        configs.setAutoRegistration(true);
        configs.setMetadata(getMetadata());
        return configs;
    }

    private Object getTestRecord() throws IOException {
        GenericRecord genericRecord;
        Schema.Parser parser = new Schema.Parser();
        Schema avroSchema = parser.parse(new File(AVRO_USER_SCHEMA_FILE));

        genericRecord = new GenericData.Record(avroSchema);
        genericRecord.put("name", "testName");
        genericRecord.put("favorite_number", 99);
        genericRecord.put("favorite_color", "red");

        return genericRecord;
    }
}
```

## 使用案例：Amazon Managed Service for Apache Flink
<a name="schema-registry-integrations-kinesis-data-analytics-apache-flink"></a>

Apache Flink 是一個流行的開源架構和分散式處理引擎，用於對未限制和有限制資料串流進行狀態計算。Amazon Managed Service for Apache Flink 是一種全受管 AWS 服務，可讓您建置和管理 Apache Flink 應用程式來處理串流資料。

開源 Apache Flink 提供一些來源和接收器。例如，預先定義的資料來源包括從檔案、目錄和通訊端讀取，以及從集合和迭代器擷取資料。Apache Flink DataStream Connector 為 Apache Flink 提供與各種第三方系統連接的程式碼，例如 Apache Kafka 或 Kinesis 做為來源和/或接收器。

如需詳細資訊，請參閱 [Amazon Kinesis Data Analytics 開發人員指南](https://docs.aws.amazon.com/kinesisanalytics/latest/java/what-is.html)。

### Apache Flink Kafka 連接器
<a name="schema-registry-integrations-kafka-connector"></a>

Apache Flink 提供 Apache Kafka 資料串流連接器，用於使用恰好一次的保證從 Kafka 主題讀取資料以及寫入資料至 Kafka 主題。Flink 的 Kafka 消費者 `FlinkKafkaConsumer` 提供從一個或多個 Kafka 主題的讀取存取權。Apache Flink 的 Kafka 生產者 `FlinkKafkaProducer` 允許寫入記錄串流到一個或多個 Kafka 主題。如需詳細資訊，請參閱 [Apache Kafka 連接器](https://ci.apache.org/projects/flink/flink-docs-stable/dev/connectors/kafka.html)。

### Apache Flink Kinesis 串流連接器
<a name="schema-registry-integrations-kinesis-connector"></a>

Kinesis Data Streams 連接器可存取 Amazon Kinesis Data Streams。`FlinkKinesisConsumer` 是完全一次性的平行串流資料來源，可訂閱相同 AWS 服務區域內的多個 Kinesis 串流，並在任務執行時透明地處理串流的重新分片。消費者的每個子工作都負責從多個 Kinesis 分片擷取資料記錄。每個子工作擷取的碎片數量將隨著碎片關閉並由 Kinesis 建立而改變。`FlinkKinesisProducer` 使用 Kinesis Producer Library (KPL) 將 Apache Flink 串流中的資料放入 Kinesis 串流中。如需詳細資訊，請參閱 [Amazon Kinesis Streams Connector](https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/connectors/kinesis.html)。

如需詳細資訊，請參閱 [AWS Glue 結構描述 GitHub 儲存庫](https://github.com/awslabs/aws-glue-schema-registry)。

### 與 Apache Flink 整合
<a name="schema-registry-integrations-apache-flink-integrate"></a>

結構描述登錄檔提供的 SerDes 程式庫與 Apache Flink 整合。若要使用 Apache Flink，您需要實作稱為 `GlueSchemaRegistryAvroSerializationSchema` 和 `GlueSchemaRegistryAvroDeserializationSchema` 的 [https://github.com/apache/flink/blob/master/flink-streaming-java/src/main/java/org/apache/flink/streaming/util/serialization/SerializationSchema.java](https://github.com/apache/flink/blob/master/flink-streaming-java/src/main/java/org/apache/flink/streaming/util/serialization/SerializationSchema.java) 和 [https://github.com/apache/flink/blob/8674b69964eae50cad024f2c5caf92a71bf21a09/flink-core/src/main/java/org/apache/flink/api/common/serialization/DeserializationSchema.java](https://github.com/apache/flink/blob/8674b69964eae50cad024f2c5caf92a71bf21a09/flink-core/src/main/java/org/apache/flink/api/common/serialization/DeserializationSchema.java) 介面，然後將介面插入 Apache Flink 連接器。

### 新增 AWS Glue 結構描述登錄檔相依性到 Apache Flink 應用程式
<a name="schema-registry-integrations-kinesis-data-analytics-dependencies"></a>

在 Apache Flink 應用程式中將整合相依性設定為 AWS Glue 結構描述登錄檔：

1. 將相依性新增到 `pom.xml` 檔案。

   ```
   <dependency>
       <groupId>software.amazon.glue</groupId>
       <artifactId>schema-registry-flink-serde</artifactId>
       <version>1.0.0</version>
   </dependency>
   ```

#### 將 Kafka 或 Amazon MSK 與 Apache Flink 整合
<a name="schema-registry-integrations-kda-integrate-msk"></a>

您可以使用 Managed Service for Apache Flink，搭配 Kafka 作為來源或搭配 Kafka 作為接收器。

**Kafka 作為來源**  
下圖顯示將 Kinesis Data Streams 與 Managed Service for Apache Flink 整合，並將 Kafka 作為來源。

![\[Kafka 作為來源。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/gsr-kafka-source.png)


**Kafka 做為接收器**  
下圖顯示將 Kinesis Data Streams 與 Managed Service for Apache Flink 整合，並將 Kafka 作為接收器。

![\[Kafka 做為接收器。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/gsr-kafka-sink.png)


若要整合 Kafka (或 Amazon MSK) 與 Managed Service for Apache Flink，搭配 Kafka 作為來源或搭配 Kafka 作為接收器，請對程式碼進行下列變更。將粗體程式碼區塊新增到類似區段中的各自程式碼中。

如果 Kafka 是來源，請使用還原序列化程式程式碼 (區塊 2)。如果 Kafka 是接收器，請使用序列化程式程式碼 (區塊 3)。

```
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

String topic = "topic";
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");
properties.setProperty("group.id", "test");

// block 1
Map<String, Object> configs = new HashMap<>();
configs.put(AWSSchemaRegistryConstants.AWS_REGION, "aws-region");
configs.put(AWSSchemaRegistryConstants.SCHEMA_AUTO_REGISTRATION_SETTING, true);
configs.put(AWSSchemaRegistryConstants.AVRO_RECORD_TYPE, AvroRecordType.GENERIC_RECORD.getName());

FlinkKafkaConsumer<GenericRecord> consumer = new FlinkKafkaConsumer<>(
    topic,
    // block 2
    GlueSchemaRegistryAvroDeserializationSchema.forGeneric(schema, configs),
    properties);

FlinkKafkaProducer<GenericRecord> producer = new FlinkKafkaProducer<>(
    topic,
    // block 3
    GlueSchemaRegistryAvroSerializationSchema.forGeneric(schema, topic, configs),
    properties);

DataStream<GenericRecord> stream = env.addSource(consumer);
stream.addSink(producer);
env.execute();
```

#### 將 Kinesis Data Streams 與 Apache Flink 整合
<a name="schema-registry-integrations-integrate-kds"></a>

您可以使用 Managed Service for Apache Flink，搭配 Kinesis Data Streams 作為來源或接收器。

**Kinesis Data Streams 做為來源**  
下圖顯示將 Kinesis Data Streams 與 Managed Service for Apache Flink 整合，並將 Kinesis Data Streams 作為來源。

![\[Kinesis Data Streams 做為來源。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/gsr-kinesis-source.png)


**Kinesis Data Streams 做為接收器**  
下圖顯示將 Kinesis Data Streams 與 Managed Service for Apache Flink 整合，並將 Kinesis Data Streams 作為接收器。

![\[Kinesis Data Streams 做為接收器。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/gsr-kinesis-sink.png)


若要將 Kinesis Data Streams 與 Managed Service for Apache Flink 整合，並將 Kinesis Data Streams 作為來源或將 Kinesis Data Streams 作為接收器，請對程式碼進行下列變更。將粗體程式碼區塊新增到類似區段中的各自程式碼中。

如果 Kinesis Data Streams 是來源，請使用還原序列化程式程式碼 (區塊 2)。如果 Kinesis Data Streams 是接收器，請使用序列化程式程式碼 (區塊 3)。

```
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

String streamName = "stream";
Properties consumerConfig = new Properties();
consumerConfig.put(AWSConfigConstants.AWS_REGION, "aws-region");
consumerConfig.put(AWSConfigConstants.AWS_ACCESS_KEY_ID, "aws_access_key_id");
consumerConfig.put(AWSConfigConstants.AWS_SECRET_ACCESS_KEY, "aws_secret_access_key");
consumerConfig.put(ConsumerConfigConstants.STREAM_INITIAL_POSITION, "LATEST");

// block 1
Map<String, Object> configs = new HashMap<>();
configs.put(AWSSchemaRegistryConstants.AWS_REGION, "aws-region");
configs.put(AWSSchemaRegistryConstants.SCHEMA_AUTO_REGISTRATION_SETTING, true);
configs.put(AWSSchemaRegistryConstants.AVRO_RECORD_TYPE, AvroRecordType.GENERIC_RECORD.getName());

FlinkKinesisConsumer<GenericRecord> consumer = new FlinkKinesisConsumer<>(
    streamName,
    // block 2
    GlueSchemaRegistryAvroDeserializationSchema.forGeneric(schema, configs),
    properties);

FlinkKinesisProducer<GenericRecord> producer = new FlinkKinesisProducer<>(
    // block 3
    GlueSchemaRegistryAvroSerializationSchema.forGeneric(schema, topic, configs),
    properties);
producer.setDefaultStream(streamName);
producer.setDefaultPartition("0");

DataStream<GenericRecord> stream = env.addSource(consumer);
stream.addSink(producer);
env.execute();
```

## 使用案例：與 整合 AWS Lambda
<a name="schema-registry-integrations-aws-lambda"></a>

若要使用 AWS Lambda函數做為 Apache Kafka/Amazon MSK 取用者，並使用AWS Glue結構描述登錄檔還原序列化 Avro 編碼的訊息，請造訪 [MSK 實驗室頁面](https://amazonmsk-labs.workshop.aws/en/msklambda/gsrschemareg.html)。

## 使用案例： AWS Glue Data Catalog
<a name="schema-registry-integrations-aws-glue-data-catalog"></a>

AWS Glue 資料表支援您可以手動指定的結構描述，也可以參考 AWS Glue 結構描述登錄檔。結構描述登錄檔與 Data Catalog 整合，可讓您在建立或更新 Data Catalog 中的 AWS Glue 資料表或分割區時選用地使用儲存在結構描述登錄檔中的結構描述。若要識別結構描述登錄檔中的結構描述定義，您至少需要知道它所屬結構描述的 ARN。包含結構描述定義的結構描述版本，可以透過其 UUID 或版本號碼來參考。總有一個結構描述版本，即「最新」版本，可以在不知道其版本號碼或 UUID 的情況下查詢。

呼叫 `CreateTable` 或 `UpdateTable` 操作時，您將傳遞一個 `TableInput` 結構，其中包含 `StorageDescriptor`，它可能有一個新增到結構描述登錄檔中現有結構描述的 `SchemaReference`。同樣地，當您呼叫 `GetTable` 或 `GetPartition` API，回應可能包含結構描述和 `SchemaReference`。使用結構描述參考建立資料表或分割區時，Data Catalog 會嘗試擷取此結構描述參考的結構描述。如果它無法在結構描述登錄檔中找到結構描述，它會在 `GetTable` 回應中傳回空的結構描述；否則回應將同時具有結構描述和結構描述參考。

您可以在 AWS Glue 主控台中執行下列動作。

若要執行這些操作並建立、更新或檢視結構描述資訊，您必須向提供 `GetSchemaVersion` API 許可的呼叫使用者授予 IAM 角色。

### 新增資料表或更新資料表的結構描述
<a name="schema-registry-integrations-aws-glue-data-catalog-table"></a>

從現有的結構描述新增資料表，會將資料表繫結至特定的結構描述版本。註冊新的結構描述版本後，您可以從 AWS Glue 主控台 View table (檢視資料表) 頁面或使用 [UpdateTable 動作 (Python: update\$1table)](aws-glue-api-catalog-tables.md#aws-glue-api-catalog-tables-UpdateTable) API 更新此資料表定義。

#### 從現有的結構描述新增資料表
<a name="schema-registry-integrations-aws-glue-data-catalog-table-existing"></a>

您可以使用 AWS Glue 主控台或 `CreateTable` API，從登錄檔中的結構描述版本建立 AWS Glue 資料表。

**AWS Glue API**  
呼叫 `CreateTable` API 時，您將傳遞包含 `StorageDescriptor` 的 `TableInput`，它對於結構描述登錄檔中現有的結構描述會有一個 `SchemaReference`。

**AWS Glue 主控台**  
使用 AWS Glue 主控台建立資料表

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue\) 開啟 AWS Glue主控台。

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

1. 在 **Add Tables (新增資料表)** 選單中，選擇 **Add table from existing schema (從現有結構描述新增資料表)**。

1. 根據《AWS Glue 開發人員指南》設定資料表屬性和資料存放區。

1. 在 **Choose a Glue schema (選擇 Glue 結構描述)** 頁面上，選取結構描述所在的 **Registry (登錄檔)**。

1. 選擇 **Schema name (結構描述名稱)**，然後選取要套用之結構描述的 **Version (版本)**。

1. 檢閱結構描述預覽，然後選擇 **Next (下一步)**。

1. 檢閱和建立資料表。

套用至資料表的結構描述和版本會顯示在資料表清單的 **Glue schema (Glue 結構描述)** 欄。您可以檢視資料表以查看更多詳細資訊。

#### 更新資料表的結構描述
<a name="schema-registry-integrations-aws-glue-data-catalog-table-updating"></a>

有新的結構描述版本可用時，您可能需要使用 [UpdateTable 動作 (Python: update\$1table)](aws-glue-api-catalog-tables.md#aws-glue-api-catalog-tables-UpdateTable) API 或 AWS Glue 主控台來更新資料表的結構描述。

**重要**  
更新具有手動指定之 AWS Glue 結構描述的現有資料表的結構描述時，結構描述登錄檔中參考的新結構描述可能不相容。這可能會導致您的任務失敗。

**AWS Glue API**  
呼叫 `UpdateTable` API 時，您將傳遞包含 `StorageDescriptor` 的 `TableInput`，它對於結構描述登錄檔中現有的結構描述會有一個 `SchemaReference`。

**AWS Glue 主控台**  
從 AWS Glue 主控台更新資料表的結構描述：

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue\) 開啟 AWS Glue主控台。

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

1. 從資料表清單中檢視資料表。

1. 按一下 **Update schema (更新結構描述)**，通知您有關新版本的方塊。

1. 檢閱目前資料結構描述和新資料結構描述之間的差異。

1. 選擇 **Show all schema differences (顯示所有結構描述差異)** 以查看更多詳細資訊。

1. 選擇 **Save table (儲存資料表)** 以接受新的版本。

## 使用案例：AWS Glue 串流
<a name="schema-registry-integrations-aws-glue-streaming"></a>

AWS Glue 串流會消耗來自串流來源的資料，並在寫入輸出接收器之前執行 ETL 操作。輸入串流來源可以使用資料表來指定，也可以透過指定來源配置的方式直接指定。

在該結構描述存在於 AWS Glue 結構描述登錄檔的情況下，AWS Glue 串流支援針對串流來源所建立的 Data Catalog 資料表。您可以在 AWS Glue 結構描述登錄檔中建立結構描述，並使用此結構描述來建立具有串流來源的 AWS Glue 表格。此 AWS Glue 表格可以用來作為 AWS Glue 串流任務的輸入，以供還原序列化輸入串流中的資料之用。

請注意，當 AWS Glue 結構描述登錄檔中的結構描述變更時，您必須重新啟動 AWS Glue 串流任務需求以反映結構描述中的變更。

## 使用案例：Apache Kafka Streams
<a name="schema-registry-integrations-apache-kafka-streams"></a>

Apache Kafka Streams API 是用於處理和分析 Apache Kafka 中儲存資料的用戶端程式庫。本節介紹 Apache Kafka Streams 與 AWS Glue 結構描述登錄檔的整合，可讓您在資料串流應用程式上管理和強制執行結構描述。如需 Apache Kafka Streams 的詳細資訊，請參閱 [Apache Kafka Streams](https://kafka.apache.org/documentation/streams/)。

### 與 SerDes 程式庫整合
<a name="schema-registry-integrations-apache-kafka-streams-integrate"></a>

有一個 `GlueSchemaRegistryKafkaStreamsSerde` 類別，您可用於設定串流應用程式。

#### Kafka Streams 應用程式範例程式碼
<a name="schema-registry-integrations-apache-kafka-streams-application"></a>

在 Apache Kafka Streams 應用程式中使用 AWS Glue 結構描述登錄檔：

1. 設定 Kafka Streams 應用程式。

   ```
   final Properties props = new Properties();
       props.put(StreamsConfig.APPLICATION_ID_CONFIG, "avro-streams");
       props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
       props.put(StreamsConfig.CACHE_MAX_BYTES_BUFFERING_CONFIG, 0);
       props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
       props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, AWSKafkaAvroSerDe.class.getName());
       props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
   
       props.put(AWSSchemaRegistryConstants.AWS_REGION, "aws-region");
       props.put(AWSSchemaRegistryConstants.SCHEMA_AUTO_REGISTRATION_SETTING, true);
       props.put(AWSSchemaRegistryConstants.AVRO_RECORD_TYPE, AvroRecordType.GENERIC_RECORD.getName());
   	props.put(AWSSchemaRegistryConstants.DATA_FORMAT, DataFormat.AVRO.name());
   ```

1. 從主題 avro-input 建立串流。

   ```
   StreamsBuilder builder = new StreamsBuilder();
   final KStream<String, GenericRecord> source = builder.stream("avro-input");
   ```

1. 處理資料記錄 (範例會篩選出 favorite\$1color 值為 pink 或 amount 值為 15 的記錄)。

   ```
   final KStream<String, GenericRecord> result = source
       .filter((key, value) -> !"pink".equals(String.valueOf(value.get("favorite_color"))));
       .filter((key, value) -> !"15.0".equals(String.valueOf(value.get("amount"))));
   ```

1. 將結果寫回主題 avro-output。

   ```
   result.to("avro-output");
   ```

1. 啟動 Apache Kafka Streams 應用程式。

   ```
   KafkaStreams streams = new KafkaStreams(builder.build(), props);
   streams.start();
   ```

#### 實作結果
<a name="schema-registry-integrations-apache-kafka-streams-results"></a>

這些結果顯示記錄篩選程序，其在步驟 3 中篩選出 favorite\$1color 為「pink」或值為「15.0」的記錄。

篩選前的記錄：

```
{"name": "Sansa", "favorite_number": 99, "favorite_color": "white"}
{"name": "Harry", "favorite_number": 10, "favorite_color": "black"}
{"name": "Hermione", "favorite_number": 1, "favorite_color": "red"}
{"name": "Ron", "favorite_number": 0, "favorite_color": "pink"}
{"name": "Jay", "favorite_number": 0, "favorite_color": "pink"}

{"id": "commute_1","amount": 3.5}
{"id": "grocery_1","amount": 25.5}
{"id": "entertainment_1","amount": 19.2}
{"id": "entertainment_2","amount": 105}
	{"id": "commute_1","amount": 15}
```

篩選後的記錄：

```
{"name": "Sansa", "favorite_number": 99, "favorite_color": "white"}
{"name": "Harry", "favorite_number": 10, "favorite_color": "black"}
{"name": "Hermione", "favorite_number": 1, "favorite_color": "red"}
{"name": "Ron", "favorite_number": 0, "favorite_color": "pink"}

{"id": "commute_1","amount": 3.5}
{"id": "grocery_1","amount": 25.5}
{"id": "entertainment_1","amount": 19.2}
{"id": "entertainment_2","amount": 105}
```

### 使用案例：Apache Kafka Connect
<a name="schema-registry-integrations-apache-kafka-connect"></a>

將 Apache Kafka Connect 與 AWS Glue 結構描述登錄檔整合，可讓您從連接器取得結構描述資訊。Apache Kafka 轉換器指定 Apache Kafka 中的資料的格式，以及如何將其轉換成 Apache Kafka Connect 資料。每個 Apache Kafka Connect 使用者將需要根據他們希望他們的資料在載入或儲存到 Apache Kafka 時的格式，設定這些轉換器。透過這種方式，您可以定義自己的轉換器，將 Apache Kafka Connect 資料轉換為 AWS Glue 結構描述登錄檔中使用的類型 (例如：Avro) 並利用我們的序列化程式註冊其結構描述並進行序列化。然後轉換器也能夠使用我們的還原序列化程式將從 Apache Kafka 接收到的資料還原序列化，並將其轉換回 Apache Kafka Connect 資料。範例工作流程圖如下所示。

![\[Apache Kafka Connect 工作流程。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/schema_reg_int_kafka_connect.png)


1. 安裝 `aws-glue-schema-registry` 專案，方法是複製 [AWS Glue 結構描述登錄檔的 Github 儲存庫](https://github.com/awslabs/aws-glue-schema-registry)。

   ```
   git clone git@github.com:awslabs/aws-glue-schema-registry.git
   cd aws-glue-schema-registry
   mvn clean install
   mvn dependency:copy-dependencies
   ```

1. 如果您打算在*獨立*模式中使用 Apache Kafka Connect，請使用此步驟的下列指示來更新 **connect-standalone.properties**。如果您打算在*分散式*模式中使用 Apache Kafka Connect，請使用相同的說明更新 **connect-avro-distributed.properties**。

   1. 將這些屬性也新增到 Apache Kafka 連接屬性檔案：

      ```
      key.converter.region=aws-region
      value.converter.region=aws-region
      key.converter.schemaAutoRegistrationEnabled=true
      value.converter.schemaAutoRegistrationEnabled=true
      key.converter.avroRecordType=GENERIC_RECORD
      value.converter.avroRecordType=GENERIC_RECORD
      ```

   1. 將下面的命令新增到 **kafka-run-class.sh** 的 **Launch mode (啟動模式)** 區段下：

      ```
      -cp $CLASSPATH:"<your AWS GlueSchema Registry base directory>/target/dependency/*"
      ```

1. 將下面的命令新增到 **kafka-run-class.sh** 的 **Launch mode (啟動模式)** 區段下

   ```
   -cp $CLASSPATH:"<your AWS GlueSchema Registry base directory>/target/dependency/*" 
   ```

   它應該如下所示：

   ```
   # Launch mode
   if [ "x$DAEMON_MODE" = "xtrue" ]; then
     nohup "$JAVA" $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_JMX_OPTS $KAFKA_LOG4J_OPTS -cp $CLASSPATH:"/Users/johndoe/aws-glue-schema-registry/target/dependency/*" $KAFKA_OPTS "$@" > "$CONSOLE_OUTPUT_FILE" 2>&1 < /dev/null &
   else
     exec "$JAVA" $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_JMX_OPTS $KAFKA_LOG4J_OPTS -cp $CLASSPATH:"/Users/johndoe/aws-glue-schema-registry/target/dependency/*" $KAFKA_OPTS "$@"
   fi
   ```

1. 如果使用 bash，執行下面的命令來在您的 bash\$1profile 中設定您的 CLASSPATH。對於任何其他 Shell，請相應地更新環境。

   ```
   echo 'export GSR_LIB_BASE_DIR=<>' >>~/.bash_profile
   echo 'export GSR_LIB_VERSION=1.0.0' >>~/.bash_profile
   echo 'export KAFKA_HOME=<your Apache Kafka installation directory>' >>~/.bash_profile
   echo 'export CLASSPATH=$CLASSPATH:$GSR_LIB_BASE_DIR/avro-kafkaconnect-converter/target/schema-registry-kafkaconnect-converter-$GSR_LIB_VERSION.jar:$GSR_LIB_BASE_DIR/common/target/schema-registry-common-$GSR_LIB_VERSION.jar:$GSR_LIB_BASE_DIR/avro-serializer-deserializer/target/schema-registry-serde-$GSR_LIB_VERSION.jar' >>~/.bash_profile
   source ~/.bash_profile
   ```

1. (選用) 如果您想要使用簡單的檔案來源進行測試，請複製檔案來源連接器。

   ```
   git clone https://github.com/mmolimar/kafka-connect-fs.git
   cd kafka-connect-fs/
   ```

   1. 在來源連接器組態下，將資料格式編輯為 Avro、檔案讀取器編輯為 `AvroFileReader` 並從您正在讀取的檔案路徑中更新範例 Avro 物件。例如：

      ```
      vim config/kafka-connect-fs.properties
      ```

      ```
      fs.uris=<path to a sample avro object>
      policy.regexp=^.*\.avro$
      file_reader.class=com.github.mmolimar.kafka.connect.fs.file.reader.AvroFileReader
      ```

   1. 安裝來源連接器。

      ```
      mvn clean package
      echo "export CLASSPATH=\$CLASSPATH:\"\$(find target/ -type f -name '*.jar'| grep '\-package' | tr '\n' ':')\"" >>~/.bash_profile
      source ~/.bash_profile
      ```

   1. 更新 `<your Apache Kafka installation directory>/config/connect-file-sink.properties` 下的接收器屬性會更新主題名稱和輸出檔案名稱。

      ```
      file=<output file full path>
      topics=<my topic>
      ```

1. 啟動來源連接器 (在此範例中，它是檔案來源連接器)。

   ```
   $KAFKA_HOME/bin/connect-standalone.sh $KAFKA_HOME/config/connect-standalone.properties config/kafka-connect-fs.properties
   ```

1. 執行接收器連接器 (在此範例中，它是檔案接收器連接器)。

   ```
   $KAFKA_HOME/bin/connect-standalone.sh $KAFKA_HOME/config/connect-standalone.properties $KAFKA_HOME/config/connect-file-sink.properties
   ```

   如需範例 Kafka Connect 用法，請參閱 [AWS Glue 結構描述登錄檔的 Github 儲存庫](https://github.com/awslabs/aws-glue-schema-registry/tree/master/integration-tests)中 integration-tests 資料夾下的 run-local-tests.sh 指令碼。

# 從第三方結構描述登錄檔移轉至 AWS Glue 結構描述登錄檔
<a name="schema-registry-integrations-migration"></a>

從第三方結構描述登錄檔移轉至 AWS Glue 結構描述登錄檔，對現有、目前的第三方結構描述登錄檔具有相依性。如果在使用第三方結構描述登錄檔傳送的 Apache Kafka 主題中有記錄，則消費者需要第三方結構描述登錄檔來還原序列化這些記錄。`AWSKafkaAvroDeserializer` 提供指定次要還原序列化程式類別的能力，此類別指向第三方還原序列化程式並用於還原序列化這些記錄。

淘汰第三方結構描述有兩個條件。首先，只有在使用第三方結構描述登錄檔的 Apache Kafka 主題中的記錄不再被任何消費者需要後，才會發生淘汰。其次，取決於針對這些主題指定的保留期間，Apache Kafka 主題的老化可能會導致淘汰。請注意，如果您有無限保留的主題，您仍然可以移轉至 AWS Glue 結構描述登錄檔，但您將無法淘汰第三方結構描述登錄檔。因應措施是，您可以使用應用程式或 Mirror Maker 2 讀取目前主題，並使用 AWS Glue 結構描述登錄檔產生新主題。

從第三方結構描述登錄檔移轉至 AWS Glue 結構描述登錄檔：

1. 建立 AWS Glue 結構描述登錄檔中的登錄檔，或使用預設登錄檔。

1. 停止消費者。修改它以包含 AWS Glue 結構描述登錄檔做為主要的還原序列化程式，並包含第三方結構描述登錄檔做為次要。
   + 設定消費者屬性。在此範例中，secondary\$1deserializer 設定為不同的還原序列化程式。行為如下：消費者從 Amazon MSK 擷取記錄，並首先嘗試使用 `AWSKafkaAvroDeserializer`。如果無法為 AWS Glue 結構描述登錄檔讀取包含 Avro 結構描述 ID 的魔術位元組結構描述，則 `AWSKafkaAvroDeserializer` 會嘗試使用 secondary\$1deserializer 中提供的還原序列化程式類別。次要還原序列化程式專屬的屬性也需要在消費者屬性中提供，例如 schema\$1registry\$1url\$1config 和 specific\$1avro\$1reader\$1config，如下所示。

     ```
     consumerProps.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
     consumerProps.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, AWSKafkaAvroDeserializer.class.getName());
     consumerProps.setProperty(AWSSchemaRegistryConstants.AWS_REGION, KafkaClickstreamConsumer.gsrRegion);
     consumerProps.setProperty(AWSSchemaRegistryConstants.SECONDARY_DESERIALIZER, KafkaAvroDeserializer.class.getName());
     consumerProps.setProperty(KafkaAvroDeserializerConfig.SCHEMA_REGISTRY_URL_CONFIG, "URL for third-party schema registry");
     consumerProps.setProperty(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, "true");
     ```

1. 重新啟動消費者。

1. 停止生產者並將生產者指向 AWS Glue 結構描述登錄檔。

   1. 設定生產者屬性。在這個範例中，生產者將使用 default-registry 和自動註冊結構描述版本。

      ```
      producerProps.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
      producerProps.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, AWSKafkaAvroSerializer.class.getName());
      producerProps.setProperty(AWSSchemaRegistryConstants.AWS_REGION, "us-east-2");
      producerProps.setProperty(AWSSchemaRegistryConstants.AVRO_RECORD_TYPE, AvroRecordType.SPECIFIC_RECORD.getName());
      producerProps.setProperty(AWSSchemaRegistryConstants.SCHEMA_AUTO_REGISTRATION_SETTING, "true");
      ```

1. (選用) 手動將現有的結構描述和結構描述版本從目前的第三方結構描述登錄檔移至 AWS Glue 結構描述登錄檔，無論是 AWS Glue 結構描述登錄檔中的預設登錄檔或 AWS Glue 結構描述登錄檔中的特定非預設登錄檔。這可以透過從第三方結構描述登錄檔匯出 JSON 格式的結構描述，並使用 AWS 管理主控台 或 在AWS Glue結構描述登錄檔中建立新的結構描述來完成 AWS CLI。

    如果您需要使用 AWS CLI 和 為新建立的結構描述版本啟用與先前結構描述版本的相容性檢查 AWS 管理主控台，或者生產者以開啟結構描述版本自動註冊的新結構描述傳送訊息時，此步驟可能很重要。

1. 啟動生產者。