

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

# 使用 Athena SQL
<a name="using-athena-sql"></a>

您可以透過 Athena SQL 在 Amazon S3 中使用 [AWS Glue Data Catalog](data-sources-glue.md) ([外部 Hive 中繼存放區](connect-to-data-source-hive.md)) 就地查詢資料，或使用各種[預先建置的連接器](connectors-available.md)連接到其他資料來源進行[聯合查詢](federated-queries.md)。

您也可以：
+ 使用 [Athena 的 JDBC 和 ODBC 驅動程式](https://docs.aws.amazon.com/athena/latest/ug/athena-bi-tools-jdbc-odbc.html)連接到商業智慧工具和其他應用程式。
+ 查詢 [AWS 服務日誌](querying-aws-service-logs.md)。
+ 查詢 [Apache Iceberg 資料表](querying-iceberg.md) (包括時間歷程查詢) 和 [Apache Hudi 資料集](querying-hudi.md)。
+ 查詢[地理空間資料](querying-geospatial-data.md)。
+ 使用來自 Amazon SageMaker AI 的[機器學習推論](https://docs.aws.amazon.com/athena/latest/ug/querying-mlmodel.html)查詢。
+ 使用您自己的[使用者定義的函數](https://docs.aws.amazon.com/athena/latest/ug/querying-udf.html)查詢。
+ 使用[分割區投影](https://docs.aws.amazon.com/athena/latest/ug/partition-projection.html)可加速高度分割資料表的查詢處理，並自動化分割區管理。

**Topics**
+ [了解 Athena 中的資料表、資料庫和資料目錄](understanding-tables-databases-and-the-data-catalog.md)
+ [開始使用](getting-started.md)
+ [連線至資料來源](work-with-data-stores.md)
+ [使用 ODBC 和 JDBC 驅動器連接至 Amazon Athena](athena-bi-tools-jdbc-odbc.md)
+ [建立資料庫和資料表](work-with-data.md)
+ [從查詢結果建立資料表 (CTAS)](ctas.md)
+ [使用 SerDes](serde-reference.md)
+ [在 Amazon Athena 中執行 SQL 查詢](querying-athena-tables.md)
+ [使用 Athena ACID 交易](acid-transactions.md)
+ [Amazon Athena 安全性](security.md)
+ [工作負載管理](workload-management.md)
+ [Athena 引擎版本控制](engine-versions.md)
+ [Athena 的 SQL 參考](ddl-sql-reference.md)
+ [對 Athena 中的問題進行疑難排解](troubleshooting-athena.md)
+ [程式碼範例](code-samples.md)

# 了解 Athena 中的資料表、資料庫和資料目錄
<a name="understanding-tables-databases-and-the-data-catalog"></a>

在 Athena 中，目錄、資料庫和資料表是中繼資料定義的容器，用於定義基礎來源資料的結構描述。

Athena 使用下列術語來表示資料物件的階層：
+ **資料來源** – 一組資料庫
+ **資料表** – 一組資料表
+ **表格** – 組織為一組資料列或資料欄的資料

有時候，這些物件也會指稱為替代但對等的名稱，如下所示：
+ 資料來源有時被稱為目錄。
+ 資料庫有時被稱為結構描述。

**注意**  
該術語可能會因您搭配 Athena 使用的聯合資料來源而異。如需詳細資訊，請參閱[了解聯合資料表名稱限定詞](tables-qualifiers.md)。

對於每個資料集，Athena 中必須存在資料表。資料表中的中繼資料可讓 Athena 知道資料位於 Amazon S3 中的何處，並指定資料的結構，例如資料欄名稱、資料類型和資料表名稱。資料庫是資料表的邏輯群組，也只保存資料集的中繼資料和結構描述資訊。

對於您想要查詢的每個資料集，Athena 必須有基礎資料表，以用於取得和傳回查詢結果。因此，在查詢資料之前，必須在 Athena 中註冊資料表。註冊是在您自動或手動建立資料表時進行。

您可以使用 AWS Glue 爬蟲程式自動建立資料表。如需有關 AWS Glue 和編目程式的詳細資訊，請參閱 [使用 AWS Glue Data Catalog 連線到您的資料](data-sources-glue.md)。當 AWS Glue 建立資料表時，它會在自己的 AWS Glue Data Catalog 中註冊該資料表。Athena 使用 AWS Glue 資料目錄來存放和擷取此中繼資料，供您執行查詢以分析基礎資料集時使用。

無論資料表的建立方式為何，資料表建立程序都會向 Athena 註冊資料集。此註冊發生在 中 AWS Glue Data Catalog ，可讓 Athena 對資料執行查詢。在 Athena 查詢編輯器中，此目錄 (或資料來源) 會指稱為標籤 `AwsDataCatalog`。

在建立資料表之後，您可以使用 [SQL SELECT](select.md) 陳述式來查詢該資料表，包括取得[來源資料的特定檔案位置](select.md#select-path)。您的查詢結果會存放在 Amazon S3 中[您指定的查詢結果位置](query-results-specify-location.md)。

您可以在 Amazon Web Services 帳戶中存取 AWS Glue Data Catalog。其他 AWS 服務 可以共用 AWS Glue Data Catalog，因此您可以查看整個組織使用 Athena 建立的資料庫和資料表，反之亦然。
+ 手動建立資料表：
  + 使用 Athena 主控台執行**建立資料表精靈**。
  + 使用 Athena 主控台在查詢編輯器中撰寫 Hive DDL 陳述式。
  + 使用 Athena API 或 CLI，以執行採用 DDL 陳述式的 SQL 查詢字串。
  + 使用 Athena JDBC 或 ODBC 驅動程式。

手動建立資料表和資料庫時，Athena 會在幕後使用 HiveQL 資料定義語言 (DDL) 陳述式 (例如 `CREATE TABLE`、`CREATE DATABASE` 和 `DROP TABLE`)，在 AWS Glue Data Catalog中建立資料表和資料庫。

若要開始使用，您可以使用 Athena 主控台中的教學課程，或遵循 Athena 文件中的逐步指南。
+ 若要使用 Athena 主控台中的教學課程，請選擇主控台右上角的資訊圖示，然後選擇**教學課程**索引標籤。
+ 如需在 Athena 查詢編輯器中建立資料表和撰寫查詢的逐步教學課程，請參閱 [開始使用](getting-started.md)。

# 開始使用
<a name="getting-started"></a>

此教學課程會逐步解說如何使用 Amazon Athena 來查詢資料。您將會根據在 Amazon Simple Storage Service 中存放的範例資料來建立資料表、查詢資料表，並檢查查詢結果。

此教學課程中使用線上資源，因此將向您就執行的查詢收費。您不需為本教學課程所使用的位置中的範例資料付費，但如果您上傳自己的資料檔案至 Amazon S3，則需付費。

## 先決條件
<a name="getting-started-prerequisites"></a>
+ 若您尚未註冊，[請先註冊 AWS 帳戶](setting-up.md#sign-up-for-aws)。
+ 使用您用於 Athena 的相同 AWS 區域 （例如，美國西部 （奧勒岡）) 和帳戶，依照步驟在 [Amazon S3 中建立儲存貯](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html)體，以保留您的 Athena 查詢結果。您可將此儲存貯體設定為您的查詢輸出位置。

**Topics**
+ [先決條件](#getting-started-prerequisites)
+ [步驟 1：建立資料庫](step-1-create-a-database.md)
+ [步驟 2：建立資料表](step-2-create-a-table.md)
+ [步驟 3：查詢資料](step-3-query-data.md)
+ [步驟 4：使用具名查詢](step-4-use-named-queries.md)
+ [步驟 5：使用鍵盤快速鍵和預先輸入的建議](step-5-using-keyboard-shortcuts.md)
+ [步驟 6：連線至其他資料來源](step-6-connect-to-other-data-sources.md)

# 步驟 1：建立資料庫
<a name="step-1-create-a-database"></a>

首先，您需要在 Athena 中建立資料庫。

**建立 Athena 資料庫**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果這是您第一次造訪您目前 AWS 區域中的 Athena 主控台，請選擇 **Explore the query editor** (探索查詢編輯器) 以開啟查詢編輯器。此外，Athena 會於查詢編輯器中開啟。

1. 選擇 **Edit Settings** (編輯設定) 以在 Amazon S3 中設定查詢結果位置。  
![\[選擇編輯設定。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-choose-view-settings.png)

1. 對於 **Manage settings** (管理設定)，請執行下列其中一項動作：
   + 在 **Location of query result** (查詢結果的位置) 方塊中，輸入您在 Amazon S3 中為查詢結果建立的儲存貯體路徑。在路徑中加上 `s3://` 作為字首。
   + 選擇 **Browse S3** (瀏覽 S3)，選擇您在目前區域建立的 Amazon S3 儲存貯體，然後選擇 **Choose** (選擇)。  
![\[在 Amazon S3 中指定要從 Athena 接收查詢結果的位置。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-setting-results-location.png)

1. 選擇**儲存**。

1. 選擇 **Editor** (編輯器) 以切換至查詢編輯器。  
![\[選擇 Editor (編輯器)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-choose-editor.png)

1. 在導覽窗格的右側，您可以使用 Athena 查詢編輯器來輸入和執行查詢和陳述式。

1. 若要建立名為 `mydatabase` 的資料庫，請輸入以下 CREATE DATABASE 陳述式。

   ```
   CREATE DATABASE mydatabase
   ```

1. 選擇 **Run** (執行) 或按 **Ctrl\$1ENTER**。

1. 從左側的 **Database** (資料庫) 清單中，選擇 `mydatabase` 設為您目前的資料庫。

# 步驟 2：建立資料表
<a name="step-2-create-a-table"></a>

現在您有一個資料庫，您可以為其建立 Athena 資料表。您建立的資料表將以位置 `s3://athena-examples-myregion/cloudfront/plaintext/` 中的 Amazon CloudFront 日誌資料為基準，其中 *myregion* 是目前 AWS 區域所在位置。

日誌資料範例採用製表符分隔值 (TSV) 格式，這表示製表符字元會用作分隔符號來分隔欄位。資料看起來會如以下範例：出於可讀性考量，摘錄中的製表符已轉換為空格並縮短了最終欄位。

```
2014-07-05 20:00:09 DFW3 4260 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-1.jpeg 200 - Mozilla/5.0[...]
2014-07-05 20:00:09 DFW3 4252 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-2.jpeg 200 - Mozilla/5.0[...]
2014-07-05 20:00:10 AMS1 4261 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-3.jpeg 200 - Mozilla/5.0[...]
```

若要讓 Athena 能讀取此資料，您可以建立簡單直接的 `CREATE EXTERNAL TABLE` 陳述式 (如以下所示)。建立資料表的陳述式會定義與資料對應的資料欄、指定資料的分隔方式，並指定 Amazon S3 中包含資料範例的位置。請注意，由於 Athena 預期要掃描資料夾中的所有檔案，因此 `LOCATION` 子句會指定 Amazon S3 資料夾位置，而不是特定檔案。

目前請勿使用此範例，因為它具有一個重要限制，我們會在稍後進行解釋。

```
CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs (
  `Date` DATE,
  Time STRING,
  Location STRING,
  Bytes INT,
  RequestIP STRING,
  Method STRING,
  Host STRING,
  Uri STRING,
  Status INT,
  Referrer STRING,
  ClientInfo STRING
  ) 
  ROW FORMAT DELIMITED
  FIELDS TERMINATED BY '\t'
  LINES TERMINATED BY '\n'
  LOCATION 's3://athena-examples-my-region/cloudfront/plaintext/';
```

此範例會建立名為 `cloudfront_logs` 的資料表，並為每個欄位指定名稱和資料類型。這些欄位會成為資料表中的資料欄。由於 `date` 是[保留字](reserved-words.md#list-of-ddl-reserved-words)，它透過反引號 (`) 字符轉義。`ROW FORMAT DELIMITED` 代表 Athena 將使用名為 [LazySimpleSerDe](lazy-simple-serde.md) 的預設程式庫來完成解析資料的實際工作。此範例也會指定欄位以製表符分隔 (`FIELDS TERMINATED BY '\t'`），且檔案中的每個記錄以新行字元（`LINES TERMINATED BY '\n`) 結尾。最後，`LOCATION` 子句會指定要讀取的實際資料所在的 Amazon S3 中的路徑。

如果您有自己的製表符或逗號分隔的資料，則可以使用 `CREATE TABLE` 陳述式，例如剛剛呈現的範例，只要您的欄位不包含巢狀資訊。不過，如果您的資料欄 (例如 `ClientInfo`) 包含使用不同分隔符號的巢狀資訊，則需要不同的方法。

**從 ClientInfo 欄位擷取資料**  
查看範例資料，以下是最終欄位 `ClientInfo` 的完整範例：

```
Mozilla/5.0%20(Android;%20U;%20Windows%20NT%205.1;%20en-US;%20rv:1.9.0.9)%20Gecko/2009040821%20IE/3.0.9
```

如您所見，此欄位為多重值。由於剛剛呈現的範例 `CREATE TABLE` 陳述式將製表符指定為欄位分隔符號，則無法將 `ClientInfo` 欄位內的單獨元件分解為單獨的資料欄。因此，需要新的 `CREATE TABLE` 陳述式。

若要根據 `ClientInfo` 欄位內的數值建立資料欄，您可以使用包含 regex 群組的[規則表達式](https://en.wikipedia.org/wiki/Regular_expression) (regex)。您指定的 regex 群組會成為單獨的資料表資料欄。若要在 `CREATE TABLE` 陳述式中使用 regex，則請使用如下所示的語法。此語法指示 Athena 使用 [Regex SerDe](regex-serde.md) 程式庫和您指定的規則表達式。

```
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
  WITH SERDEPROPERTIES ("input.regex" = "regular_expression")
```

規則表達式對於根據複雜的 CSV 或 TSV 資料建立資料表非常有用，但是很難寫入和維護。幸運的是，還有其他程式庫可用於 JSON、Parquet 和 ORC 等格式。如需詳細資訊，請參閱[為您的資料選擇 SerDe](supported-serdes.md)。

現在您已準備好要開始在 Athena 查詢編輯器中建立資料表。所以該 `CREATE TABLE` 陳述式和 regex 正好提供給您。

**如何在 Athena 中建立資料表**

1. 在導覽窗格中，針對 **Database** (資料庫)，請確認 `mydatabase` 已選取。

1. 若要在查詢編輯器中給自己更多空間，您可以選擇箭頭圖示來收合導覽窗格。  
![\[選擇箭頭以收合導覽窗格。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-collapse-nav-pane.png)

1. 如需建立新查詢的索引標籤，請選擇加號 (**\$1**) 以登入查詢編輯器。一次最多可以開啟十個查詢標籤。  
![\[選擇加號圖示以建立新查詢。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-new-query-tab.png)

1. 如需關閉一個或多個查詢索引標籤，請選擇加號旁邊的箭頭。如需一次關閉所有索引標籤，請選擇箭頭，然後選擇 **Close all tabs** (關閉所有索引標籤)。  
![\[選擇箭頭圖示，便可關閉一個或多個查詢索引標籤。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/close-all-query-editor-tabs.png)

1. 在查詢窗格中，輸入下列 `CREATE EXTERNAL TABLE` 陳述式。Regex 會細分來自日誌資料中 `ClientInfo` 欄位的作業系統、瀏覽器和瀏覽器版本資訊。
**注意**  
下列範例中使用的 regex 旨在與 `athena-examples` Amazon S3 位置中公開的範例 CloudFront 日誌資料搭配使用，且僅供示範之用。如需有關查詢標準和即時 CloudFront 日誌檔案的最新 regex，請參閱 [查詢 Amazon CloudFront 日誌](cloudfront-logs.md)。

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs (
     `Date` DATE,
     Time STRING,
     Location STRING,
     Bytes INT,
     RequestIP STRING,
     Method STRING,
     Host STRING,
     Uri STRING,
     Status INT,
     Referrer STRING,
     os STRING,
     Browser STRING,
     BrowserVersion STRING
     ) 
     ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
     WITH SERDEPROPERTIES (
     "input.regex" = "^(?!#)([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+[^\(]+[\(]([^\;]+).*\%20([^\/]+)[\/](.*)$"
     ) LOCATION 's3://athena-examples-myregion/cloudfront/plaintext/';
   ```

1. 在 `LOCATION`陳述式中，將 *myregion* 取代 AWS 區域 為您目前正在使用的 （例如，`us-west-1`)。

1. 選擇**執行**。

   系統會建立資料表 `cloudfront_logs`，且資料表顯示在 `mydatabase` 資料庫的 **Tables** (資料表) 清單下。

# 步驟 3：查詢資料
<a name="step-3-query-data"></a>

現在您已在 Athena 中根據 Amazon S3 的資料建立 `cloudfront_logs` 資料表，您可以對資料表執行 SQL 查詢，並在 Athena 中查看結果。如需有關在 Athena 中使用 SQL 的詳細資訊，請參閱 [Athena 的 SQL 參考](ddl-sql-reference.md)。

**若要執行查詢**

1. 選擇加號 (**\$1**) 打開一個新的查詢索引標籤，並在查詢窗格中輸入以下 SQL 陳述式。

   ```
   SELECT os, COUNT(*) count 
   FROM cloudfront_logs 
   WHERE date BETWEEN date '2014-07-05' AND date '2014-08-05' 
   GROUP BY os
   ```

1. 選擇**執行**。

   結果類似如下：  
![\[在 Athena 主控台中檢視查詢結果。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-query-results.png)

1. 若要儲存查詢結果到 `.csv` 檔案，請選擇 **Download resutls (下載結果)**。  
![\[下載 CSV 格式的查詢結果。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-query-results-download-csv.png)

1. 若要檢視或執行先前的查詢，請選擇 **Recent queries** (近期查詢) 索引標籤。  
![\[選擇 Recent queries (近期查詢) 以檢視先前的查詢。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-recent-queries.png)

1. 若要從 **Recent queries** (近期查詢) 索引標籤下載先前查詢的結果，請選取查詢，然後選擇 **Download results** (下載結果)。查詢會保留 45 天。  
![\[在 Athena 主控台中檢視和下載近期查詢。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-recent-queries-tab-download.png)

1. 若要將一個或多個最近使用的 SQL 查詢字串下載至 CSV 檔案，請選擇 **Download CSV** (下載 CSV)。  
![\[將最近的查詢字串下載至 CSV 檔案。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-recent-queries-tab-download-csv.png)

   如需詳細資訊，請參閱[使用查詢結果和近期查詢](querying.md)。

# 步驟 4：使用具名查詢
<a name="step-4-use-named-queries"></a>

您可以使用名稱儲存您在查詢編輯器中建立或編輯的查詢。Athena 會將這些查詢儲存在 **Saved queries** (已儲存的查詢) 索引標籤。您可以使用 **Saved queries** (已儲存的查詢) 索引標籤重新呼叫、執行、重新命名或刪除已儲存的查詢。如需詳細資訊，請參閱[使用已儲存的查詢](saved-queries.md)。

# 步驟 5：使用鍵盤快速鍵和預先輸入的建議
<a name="step-5-using-keyboard-shortcuts"></a>

Athena 查詢編輯器為各種動作提供了不同的鍵盤快速鍵，例如執行查詢、格式化查詢、列操作以及尋找及取代。如需詳細資訊和快速鍵的完整清單，請參閱 *AWS 大數據部落格*中的[使用 Amazon Athena 查詢編輯器中的鍵盤快速鍵提高生產力](https://aws.amazon.com/blogs/big-data/improve-productivity-by-using-keyboard-shortcuts-in-amazon-athena-query-editor/)。

Athena 查詢編輯器支援預先輸入的程式碼建議，以獲得更快的查詢編寫體驗。為協助您更準確且更有效率地編寫 SQL 查詢，其提供了以下功能：
+ 當您輸入時，將會即時顯示關鍵字、本機變數、程式碼片段和目錄項目。
+ 當您輸入資料庫名稱或資料表名稱，並在其後加上一個點時，編輯器會輕鬆顯示可供選擇的資料表和資料欄清單。
+ 將滑鼠游標移至程式碼片段建議上時，該概要會顯示程式碼片段語法和用法的簡要概觀。
+ 為提高程式碼可讀性，關鍵字及其醒目提示規則也已更新，符合 Trino 和 Hive 的最新語法。

此功能預設為啟用。若要啟用或停用此功能，請使用查詢編輯器視窗右下角的**程式碼編輯器偏好設定** (齒輪圖示)。

# 步驟 6：連線至其他資料來源
<a name="step-6-connect-to-other-data-sources"></a>

本教學課程使用 Amazon S3 中 CSV 格式的資料來源。如需搭配 使用 Athena 的詳細資訊 AWS Glue，請參閱 [使用 AWS Glue Data Catalog 連線到您的資料](data-sources-glue.md)。您也可以使用 ODBC 和 JDBC 驅動程式、外部 Hive 中繼存放區和 Athena 資料來源連接器，將 Athena 連接到各種資料來源。如需詳細資訊，請參閱[連線至資料來源](work-with-data-stores.md)。

# 連線至資料來源
<a name="work-with-data-stores"></a>

您可以使用 Amazon Athena 來查詢*資料集*中以不同位置和格式存放的資料。此資料集可能是 CSV，JSON，Avro、Parquet 或其他格式。

您在 Athena 中用來執行查詢的資料表和資料庫是以*中繼資料*為基礎。中繼資料是資料集中的基礎資料的相關資料。該中繼資料如何描述您的資料集，就稱為*結構描述*。例如，資料表名稱、資料表中的資料欄名稱及每一欄的資料類型都是結構描述 (儲存為中繼資料)，用於描述基礎資料集。在 Athena 中，用來組織中繼資料的系統稱為*資料目錄*或*中繼存放區*。資料集和描述它的資料目錄合稱為*資料來源*。

中繼資料與基礎資料集的關係取決於您使用的資料來源類型。關聯式資料來源 (例如 MySQL、PostgreSQL 和 SQL Server) 將中繼資料與資料集緊密整合。在這些系統中，中繼資料最常於寫入資料時寫入。其他資料來源 (例如使用 [Hive](https://hive.apache.org) 建置) 可讓您在讀取資料集時，即時定義中繼資料。資料集可以為多種格式，例如 CSV、JSON、Parquet 或 Avro。

Athena 原生支援 AWS Glue Data Catalog。 AWS Glue Data Catalog 是建置在其他資料集和資料來源上的資料目錄，例如 Amazon S3、Amazon Redshift 和 Amazon DynamoDB。您也可以使用各種連接器，將 Athena 連接至其他資料來源。

**Topics**
+ [使用 AWS Glue Data Catalog 連線到您的資料](data-sources-glue.md)
+ [使用 Amazon Athena 聯合查詢](federated-queries.md)
+ [在 Athena 中使用 Amazon DataZone](datazone-using.md)
+ [使用外部 Hive 中繼存放區](connect-to-data-source-hive.md)
+ [管理資料來源](data-sources-managing.md)

# 使用 AWS Glue Data Catalog 連線到您的資料
<a name="data-sources-glue"></a>

Athena 使用 AWS Glue Data Catalog 來存放儲存在 Amazon S3 中資料的中繼資料，例如資料表和資料欄名稱。此中繼資料資訊會變成在 Athena 查詢編輯器中顯示的資料庫、資料表和檢視。

搭配 使用 Athena 時 AWS Glue Data Catalog，您可以使用 AWS Glue 來建立要在 Athena 中查詢的資料庫和資料表 （結構描述），也可以使用 Athena 來建立結構描述，然後在 AWS Glue 和相關服務中使用它們。

若要定義 的結構描述資訊 AWS Glue，您可以在 Athena 主控台中使用表單、在 Athena 中使用查詢編輯器，或在 AWS Glue console 中建立 AWS Glue 爬蟲程式。 AWS Glue 爬蟲程式會自動從 Amazon S3 中的資料推斷資料庫和資料表結構描述。使用表單可提供更多自訂選項。撰寫您自己的 `CREATE TABLE` 陳述式需要投入更多精力，但能提供充分控制。如需詳細資訊，請參閱[CREATE TABLE](create-table.md)。

## 其他資源
<a name="glue-additional-resources"></a>
+ 如需 的詳細資訊 AWS Glue Data Catalog，請參閱《 *AWS Glue 開發人員指南*》中的 中的[資料目錄和爬蟲程式 AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/catalog-and-crawler.html)。
+ 如需示範如何使用 AWS Glue 和 Athena 處理 XML 資料的說明性文章，請參閱 AWS 大數據部落格中的[使用 和 Amazon Athena 處理和分析高度巢狀 AWS Glue 和大型 XML 檔案](https://aws.amazon.com/blogs/big-data/process-and-analyze-highly-nested-and-large-xml-files-using-aws-glue-and-amazon-athena/)。
+ 需支付個別費用 AWS Glue。如需詳細資訊，請參閱 [AWS Glue 定價](https://aws.amazon.com/glue/pricing)。

**Topics**
+ [其他資源](#glue-additional-resources)
+ [在 Athena 中註冊和使用資料目錄](gdc-register.md)
+ [從另一個帳戶註冊 Data Catalog](data-sources-glue-cross-account.md)
+ [使用 IAM 政策控制對資料目錄的存取](datacatalogs-iam-policy.md)
+ [使用 Athena 主控台中的表單來新增 AWS Glue 資料表](data-sources-glue-manual-table.md)
+ [使用編目程式新增資料表](schema-crawlers.md)
+ [使用 AWS Glue 分割區索引和篩選來最佳化查詢](glue-best-practices-partition-index.md)
+ [使用 AWS CLI 重新建立 AWS Glue 資料庫及其資料表](glue-recreate-db-and-tables-cli.md)
+ [建立用於 ETL 任務的資料表](schema-classifier.md)
+ [在 中使用 CSV 資料 AWS Glue](schema-csv.md)
+ [在 中使用地理空間資料 AWS Glue](schema-geospatial.md)

# 在 Athena 中註冊和使用資料目錄
<a name="gdc-register"></a>

Athena 支援掛載和連接至多個資料目錄。
+ 您可以在 中掛載 Amazon Redshift 資料 AWS Glue Data Catalog ，並從 Athena 查詢資料，而無需複製或移動資料。如需詳細資訊，請參閱[將 Amazon Redshift 資料帶入 AWS Glue Data Catalog](https://docs.aws.amazon.com/lake-formation/latest/dg/managing-namespaces-datacatalog.html)。
+  使用 AWS Glue 連線將 AWS Glue Data Catalog 連接到外部資料來源，並使用 Lake Formation 建立聯合目錄，透過精細存取控制集中管理對資料的許可。如需詳細資訊，請參閱[將您的連線註冊為 Glue Data Catalog](register-connection-as-gdc.md)。
+ 從 Amazon S3 Tables 儲存貯體建立目錄，並使用 Lake Formation 集中管理存取許可，以及限制使用者存取資料表儲存貯體中的物件。如需詳細資訊，請參閱《Amazon S3 開發人員指南》中的[使用 Amazon S3 Tables 和資料表儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables.html)。

**注意**  
對於任何 Glue 目錄，您只能註冊多層級目錄，例如 `123412341234:my_catalog/my_child`。您無法註冊單一層級目錄，例如 `123412341234:linkcontainer` 或 `my_catalog`。單一層級目錄只能使用 Glue 資料目錄直接在 Athena 查詢中進行查詢。如需詳細資訊，請參閱[在 Athena 中查詢 AWS Glue 資料目錄](gdc-register-query-the-data-source.md)。

**Topics**
+ [在 Athena 中註冊 Redshift 資料目錄](gdc-register-rs.md)
+ [在 Athena 中註冊聯合目錄](gdc-register-federated.md)
+ [從 Athena 註冊 S3 Tables 儲存貯體目錄和查詢資料表](gdc-register-s3-table-bucket-cat.md)
+ [在 Athena 中查詢 AWS Glue 資料目錄](gdc-register-query-the-data-source.md)

# 在 Athena 中註冊 Redshift 資料目錄
<a name="gdc-register-rs"></a>

Athena 可以讀取和寫入存放在 Redshift 叢集或已在 AWS Glue Data Catalog中註冊的無伺服器命名空間中的資料。這可與 搭配運作 AWS Lake Formation，可提供集中式安全與控管，確保跨不同查詢引擎持續管理資料存取，並維護共用 Redshift 資料的精細存取控制。

## 考量和限制
<a name="gdc-register-rs-considerations-and-limitations"></a>
+ **具體化視觀表** – Amazon Redshift 具體化視觀表可從 Athena 查詢，但不支援使用 Athena 或 Spark 建立具體化視觀表。
+ 不支援 DDL 操作，包括在 Amazon Redshift 受管儲存資料表上設定 AWS Glue Data Catalog 組態和操作。

## 先決條件
<a name="gdc-register-rs-prerequisites"></a>

在從 Athena 查詢 AWS Glue 資料目錄之前，請先完成下列任務：

1. 建立 Amazon Redshift 叢集或無伺服器命名空間，並將其註冊至 AWS Glue Data Catalog。如需詳細資訊，請參閱《Amazon Redshift 管理指南》中的[將叢集註冊至 AWS Glue Data Catalog](https://docs.aws.amazon.com/redshift/latest/mgmt/register-cluster.html) 或[將命名空間註冊至 AWS Glue Data Catalog](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless_datasharing-register-namespace.html)。

1.  AWS Lake Formation 從註冊的命名空間在 中建立資料目錄。如需詳細資訊，請參閱[《 開發人員指南》中的建立 Amazon Redshift 聯合目錄](https://docs.aws.amazon.com/lake-formation/latest/dg/create-ns-catalog.html)。 AWS Lake Formation 

1. (選用) 使用 Lake Formation 在目錄上設定精細存取控制。如需詳細資訊，請參閱[《 開發人員指南》中的將您的資料帶入 AWS Glue Data Catalog](https://docs.aws.amazon.com/lake-formation/latest/dg/bring-your-data-overview.html) 。 AWS Lake Formation 

## 向 Athena 主控台註冊 Redshift 資料目錄
<a name="gdc-register-rs-console-steps"></a>

要向 Athena 主控台註冊 Redshift 資料目錄，請遵循下列步驟。

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) 開啟 Athena 主控台。

1. 在導覽窗格中，選擇**資料來源和目錄**。

1. 在**資料來源和目錄**頁面上，選擇**建立資料來源**。

1. 對於**選擇資料來源**，選擇 **Amazon S3 - AWS Glue Data Catalog**。

1. 在 **AWS Glue Data Catalog** 區段中，對於**資料來源帳戶**，選擇**此帳戶中的AWS Glue Data Catalog **。

1. 針對**建立資料表或註冊目錄**，選擇**註冊新的 AWS Glue 目錄**。

1. 在**資料來源詳細資訊**區段中，對於**資料來源名稱**，輸入要用來在 SQL 查詢中指定資料來源的名稱，或使用產生的預設名稱。

1. 針對**目錄**，選擇**瀏覽**以搜尋相同帳戶中的 AWS Glue 目錄清單。如果沒有看到任何現有的目錄，請在 [AWS Glue 主控台](https://console.aws.amazon.com/glue/)中建立一個。

1. 在**瀏覽 AWS Glue 目錄**對話方塊中，選取您要使用的目錄，然後選擇**選擇**。

1. (選用) 對於**標籤**，輸入您希望與資料來源關聯的鍵值對。

1. 選擇**下一步**。

1. 在**檢閱和建立**頁面上，驗證您輸入的資訊是否正確無誤，然後選擇**建立資料來源**。

# 在 Athena 中註冊聯合目錄
<a name="gdc-register-federated"></a>

建立聯合資料來源的連線後，您可以將其註冊為聯合資料目錄，以簡化資料探索，並使用 Lake Formation 管理具有精細許可的資料存取。如需詳細資訊，請參閱[將您的連線註冊為 Glue Data Catalog](register-connection-as-gdc.md)。

## 考量和限制
<a name="gdc-register-federated-consideration"></a>
+ 聯合目錄不支援 DDL 操作。
+ 您可以註冊下列連接器，以與 整合 AWS Glue 以進行精細存取控制：
  + [Azure Data Lake 儲存體](connectors-adls-gen2.md)
  + [Azure Synapse](connectors-azure-synapse.md)
  + [BigQuery](connectors-bigquery.md)
  + [CMDB](connectors-cmdb.md)
  + [Db2](connectors-ibm-db2.md)
  + [Db2 iSeries](connectors-ibm-db2-as400.md)
  + [DocumentDB](connectors-docdb.md)
  + [DynamoDB](connectors-dynamodb.md)
  + [Google 雲端儲存](connectors-gcs.md)
  + [HBase](connectors-hbase.md)
  + [MySQL](connectors-mysql.md)
  + [OpenSearch](connectors-opensearch.md)
  + [Oracle](connectors-oracle.md)
  + [PostgreSQL](connectors-postgresql.md)
  + [Redshift](connectors-redshift.md)
  + [SAP HANA](connectors-sap-hana.md)
  + [Snowflake](connectors-snowflake.md)
  + [SQL Server](connectors-microsoft-sql-server.md)
  + [Timestream](connectors-timestream.md)
  + [TPC-DS](connectors-tpcds.md)
+ 為 Glue 連線聯合建立資源連結時，[資源連結](https://docs.aws.amazon.com/lake-formation/latest/dg/create-resource-link-database.html)的名稱必須與生產者的資料庫名稱相同。
+ 目前，即使資料來源不區分大小寫，也只能辨識小寫的資料表和資料欄名稱。

# 從 Athena 註冊 S3 Tables 儲存貯體目錄和查詢資料表
<a name="gdc-register-s3-table-bucket-cat"></a>

Amazon S3 Tables 儲存貯體是 Amazon S3 中的儲存貯體類型，專門用於在 Apache Iceberg 資料表中存放表格式資料。資料表儲存貯體可自動化資料表管理任務，例如壓縮、快照管理和垃圾回收，進而持續最佳化查詢效能並將成本降至最低。無論您是剛開始，還是在 Iceberg 環境中已擁有數千個資料表，資料表儲存貯體都可以簡化任何規模的資料湖。如需詳細資訊，請參閱[資料表儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets.html)。

## 考量和限制
<a name="gdc-register-s3-table-consideration"></a>
+ S3 Tables 支援 Iceberg 資料表支援的所有 DDL 操作，除了以下例外：
  + 不支援 `ALTER TABLE RENAME`、`CREATE VIEW` 和 `ALTER DATABASE`。
  + `OPTIMIZE` 和 `VACUUM` – 您可以在 S3 中管理壓縮和快照管理。如需詳細資訊，請參閱 [S3 Tables 維護文件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-maintenance.html)。
+ 不支援對註冊為 Athena 資料來源的 S3 Tables 進行 DDL 查詢。
+ 不支援查詢結果重複使用。
+ 在已啟用 SSE-KMS、CSE-KMS 加密的工作群組中，您無法在 S3 Tables 上執行寫入操作，例如 `INSERT`、`UPDATE`、`DELETE` 或 `MERGE`。
+ 在已啟用 S3 請求者支付選項的工作群組中，您無法在 S3 Tables 上執行 DML 操作。

## 從 Athena 查詢 S3 Tables
<a name="gdc-register-s3-table-prereq-setup"></a>

**在 Athena 中查詢 S3 Tables 之前，請先完成以下先決條件步驟**

1. 建立 S3 資料表儲存貯體。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》中的[建立資料表儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets-create.html)。

1. 請確定資料表儲存貯體與 的整合 AWS Glue Data Catalog 成功。如需必要的許可和設定步驟，請參閱《 AWS Glue 開發人員指南》中的 [ S3 Tables 整合和啟用 S3 Tables 與 Glue Data Catalog 整合的先決條件](https://docs.aws.amazon.com/glue/latest/dg/s3tables-catalog-prerequisites.html)。 [ S3 ](https://docs.aws.amazon.com/glue/latest/dg/enable-s3-tables-catalog-integration.html) 

1. 對於您使用 Athena 執行查詢的委託人，請使用下列其中一種方法授予 S3 Table 目錄的許可：

   **選項 1：使用 IAM 許可**

   使用 IAM 存取控制時，您的主體需要 AWS Glue Data Catalog 資源和 Amazon S3 Tables 資源的許可。

   下列清單包含對 Athena 中的 S3 資料表執行任何支援的 DDL 或 DML 操作所需的所有`s3tables`許可：
   + `s3tables:GetTableBucket`
   + `s3tables:GetNamespace`
   + `s3tables:GetTable`
   + `s3tables:GetTableData`
   + `s3tables:PutTableData`
   + `s3tables:ListNamespaces`
   + `s3tables:ListTables`
   + `s3tables:DeleteNamespace`
   + `s3tables:DeleteTable`
   + `s3tables:CreateNamespace`
   + `s3tables:CreateTable`
   + `s3tables:UpdateTableMetadataLocation`

   將這些許可套用至特定的 S3 資料表儲存貯體和 S3 資料表資源，或使用 `*`做為資源，以授予您帳戶中所有資料表儲存貯體和資料表的存取權。這些許可可以與 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html)受管政策結合，以啟用完整的功能。

   **選項 2：使用 Lake Formation 許可**

   或者，若要啟用精細存取控制，您可以透過 Lake Formation 主控台或 授予 S3 Table 目錄的 Lake Formation 許可 AWS CLI。這需要將您的 S3 資料表儲存貯體註冊為 Lake Formation 資料位置。如需詳細資訊，請參閱 Lake Formation 開發人員指南[中的建立 Amazon S3 Tables 目錄 AWS Glue Data Catalog](https://docs.aws.amazon.com/lake-formation/latest/dg/create-s3-tables-catalog.html)。

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

   1. 開啟位於 的 AWS Lake Formation 主控台[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)，並以資料湖管理員身分登入。如需如何建立資料湖管理員的詳細資訊，請參閱[建立資料湖管理員](https://docs.aws.amazon.com/lake-formation/latest/dg/initial-lf-config.html#create-data-lake-admin)。

   1. 在導覽窗格中，選擇**資料許可**，然後選擇**授予**。

   1. 在**授予許可**頁面的**主體**下，選擇要用來從 Athena 提交查詢的主體。

   1. 在 **LF-標籤或型錄資源**下，選擇**已命名的的資料型錄資源**。

   1. 針對**目錄**，請選擇您從資料表儲存貯體整合中建立的 Glue 資料目錄。例如，*<accoundID>*:s3tablescatalog/*amzn-s3-demo-bucket*。

   1. 對於**目錄許可**，選擇**超級**。

   1. 選擇 **Grant** (授予)。

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

   使用 Lake Formation 資料湖管理員角色執行下列命令，以授予您用於從 Athena 提交查詢的主體存取權。

   ```
   aws lakeformation grant-permissions \
   --region <region (Example,us-east-1)> \
   --cli-input-json \
   '{
       "Principal": {
           "DataLakePrincipalIdentifier": "<user or role ARN (Example, arn:aws:iam::<Account ID>:role/ExampleRole>"
       },
       "Resource": {
           "Catalog": {
               "Id":"<Account ID>:s3tablescatalog/amzn-s3-demo-bucket"
           }
       },
       "Permissions": ["ALL"]
   }'
   ```

------

**提交 S3 Tables 的查詢**

1. 使用上文授予的使用者/角色從 Athena 提交 `CREATE DATABASE` 查詢。在此範例中，`s3tablescatalog` 是從整合建立的父 Glue Data Catalog，` s3tablescatalog/amzn-s3-demo-bucket` 是為每個 S3 Tables 儲存貯體建立的子 Glue Data Catalog。您進行查詢的方式有兩種。

------
#### [ Option 1 ]

   直接從主控台或 指定子 Glue Data Catalog (`s3tablescatalog/amzn-s3-demo-bucket`) AWS CLI。

   **使用 AWS 管理主控台**

   1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) 開啟 Athena 主控台。

   1. 在左側導覽中，對於**資料來源名稱**，選擇 **AwsDataCatalog**。

   1. 對於**目錄**，選擇 **s3tablescatalog/*amzn-s3-demo-bucket***。

   1. 在查詢編輯器中，輸入類似 `CREATE DATABASE test_namespace` 的查詢。

   **使用 AWS CLI**

   執行下列命令。

   ```
   aws athena start-query-execution \ 
   --query-string 'CREATE DATABASE `test_namespace`' \ 
   --query-execution-context '{"Catalog": "s3tablescatalog/amzn-s3-demo-bucket"}' \
   --work-group "primary"
   ```

------
#### [ Option 2 ]

   在 Athena 主控台中，從子 Glue Data Catalog 建立 Athena 資料目錄，並在查詢中將其指定為目錄。如需詳細資訊，請參閱[將 S3 Tables 儲存貯體目錄註冊為 Athena 資料來源](#gdc-register-s3-table-console-steps)。

------

1. 使用您在先前步驟中建立的資料庫，使用 `CREATE TABLE` 建立資料表。下列範例會在您先前在 `s3tablescatalog/amzn-s3-demo-bucket` Glue 目錄中建立的 *`test_namespace`* 資料庫中建立資料表。

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

   1. 在左側導覽中，對於**資料來源名稱**，選擇 **AwsDataCatalog**。

   1. 對於**目錄**，選擇 **s3tablescatalog/*amzn-s3-demo-bucket***。

   1. 對於**資料庫**，選擇 **test\$1namespace**。

   1. 在查詢編輯器中，執行下列查詢。

      ```
      CREATE TABLE daily_sales (
              sale_date date,
              product_category
              string, sales_amount double)
      PARTITIONED BY (month(sale_date))
      TBLPROPERTIES ('table_type' = 'iceberg')
      ```

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

   執行下列命令。

   ```
   aws athena start-query-execution \
   --query-string "CREATE TABLE daily_sales (
           sale_date date,
           product_category
           string, sales_amount double)
   PARTITIONED BY (month(sale_date))
   TBLPROPERTIES ('table_type' = 'iceberg')" \
   --query-execution-context '{"Catalog": "s3tablescatalog/amzn-s3-demo-bucket", "Database":"test_namespace"}' \
   --work-group "primary"
   ```

------

1. 將資料插入您在上一個步驟中建立的資料表。

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

   1. 在左側導覽中，對於**資料來源名稱**，選擇 **AwsDataCatalog**。

   1. 對於**目錄**，選擇 **s3tablescatalog/*amzn-s3-demo-bucket***。

   1. 對於**資料庫**，選擇 **test\$1namespace**。

   1. 在查詢編輯器中，執行下列查詢。

      ```
      INSERT INTO daily_sales
      VALUES 
          (DATE '2024-01-15', 'Laptop', 900.00),
          (DATE '2024-01-15', 'Monitor', 250.00),
          (DATE '2024-01-16', 'Laptop', 1350.00),
          (DATE '2024-02-01', 'Monitor', 300.00);
      ```

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

   執行下列命令。

   ```
   aws athena start-query-execution \
   --query-string "INSERT INTO \"s3tablescatalog/amzn-s3-demo-bucket\".test_namespace.daily_sales
   VALUES 
   (DATE '2024-01-15', 'Laptop', 900.00),
   (DATE '2024-01-15', 'Monitor', 250.00),
   (DATE '2024-01-16', 'Laptop', 1350.00),
   (DATE '2024-02-01', 'Monitor', 300.00)"\ 
   --work-group "primary"
   ```

------

1. 將資料插入資料表後，即可進行查詢。

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

   1. 在左側導覽中，對於**資料來源名稱**，選擇 **AwsDataCatalog**。

   1. 對於**目錄**，選擇 **s3tablescatalog/*amzn-s3-demo-bucket***。

   1. 對於**資料庫**，選擇 **test\$1namespace**。

   1. 在查詢編輯器中，執行下列查詢。

      ```
      SELECT
          product_category,
          COUNT(*) AS units_sold,
          SUM(sales_amount) AS total_revenue,
          AVG(sales_amount) AS average_price
      FROM
          daily_sales
      WHERE
          sale_date BETWEEN DATE '2024-02-01' 
                       AND DATE '2024-02-29'
      GROUP BY
          product_category
      ORDER BY
          total_revenue DESC
      ```

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

   執行下列命令。

   ```
   aws athena start-query-execution \
   --query-string "SELECT product_category,
       COUNT(*) AS units_sold,
       SUM(sales_amount) AS total_revenue,
       AVG(sales_amount) AS average_price
   FROM \"s3tablescatalog/amzn-s3-demo-bucket\".test_namespace.daily_sales
   WHERE sale_date BETWEEN DATE '2024-02-01' AND DATE '2024-02-29'
   GROUP BY product_category
   ORDER BY total_revenue DESC"\
   --work-group "primary"
   ```

------

## 在 Athena 中建立 S3 Tables
<a name="gdc-create-s3-tables-athena"></a>

Athena 支援使用 `CREATE DATABASE` 陳述式在現有的 S3 Table 命名空間中或在 Athena 中建立的命名空間中建立資料表。若要從 Athena 建立 S3 資料表，則語法與[建立一般 Iceberg 資料表](querying-iceberg-creating-tables.md)時相同，只是您不需要指定 `LOCATION`，如下列範例所示。

```
CREATE TABLE
[db_name.]table_name (col_name data_type [COMMENT col_comment] [, ...] )
[PARTITIONED BY (col_name | transform, ... )]
[TBLPROPERTIES ([, property_name=property_value] )]
```

您也可以使用 CREATE TABLE AS SELECT (CTAS) 陳述式建立 S3 Tables。如需詳細資訊，請參閱[S3 Tables 的 CTAS](#ctas-s3-tables)。

## 將 S3 Tables 儲存貯體目錄註冊為 Athena 資料來源
<a name="gdc-register-s3-table-console-steps"></a>

要向 Athena 主控台註冊 S3 Tables 儲存貯體目錄，請遵循下列步驟。

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) 開啟 Athena 主控台。

1. 在導覽窗格中，選擇**資料來源和目錄**。

1. 在**資料來源和目錄**頁面上，選擇**建立資料來源**。

1. 對於**選擇資料來源**，選擇 **Amazon S3 - AWS Glue Data Catalog**。

1. 在 **AWS Glue Data Catalog** 區段中，對於**資料來源帳戶**，選擇**此帳戶中的AWS Glue Data Catalog **。

1. 針對**建立資料表或註冊目錄**，選擇**註冊新的 AWS Glue 目錄**。

1. 在**資料來源詳細資訊**區段中，對於**資料來源名稱**，輸入要用來在 SQL 查詢中指定資料來源的名稱，或使用產生的預設名稱。

1. 針對**目錄**，選擇**瀏覽**以搜尋相同帳戶中的 AWS Glue 目錄清單。如果沒有看到任何現有的目錄，請在 [AWS Glue 主控台](https://console.aws.amazon.com/glue/)中建立一個。

1. 在**瀏覽 AWS Glue 目錄**對話方塊中，選取您要使用的目錄，然後選擇**選擇**。

1. (選用) 對於**標籤**，輸入您希望與資料來源關聯的鍵值對。

1. 選擇**下一步**。

1. 在**檢閱和建立**頁面上，驗證您輸入的資訊是否正確無誤，然後選擇**建立資料來源**。

## S3 Tables 的 CTAS
<a name="ctas-s3-tables"></a>

Amazon Athena 現在支援對 S3 Tables 執行 CREATE TABLE AS SELECT (CTAS) 操作。這項功能可讓您根據 SELECT 查詢的結果建立新的 S3 Tables。

與標準 Athena 資料表相比，為 S3 資料表建立 CTAS 查詢時，有幾項重要差異：
+ 您必須省略位置屬性，因為 S3 Tables 會自動管理自己的儲存位置。
+ `table_type` 屬性預設為 `ICEBERG`，因此您無需在查詢中明確進行指定。
+ 如果您未指定格式，則系統會自動使用 `PARQUET` 作為資料的預設格式。
+ 所有其他屬性都遵循與一般 Iceberg 資料表相同的語法。

使用 CTAS 建立 S3 資料表之前，請確定您已在 IAM 或 中設定必要的許可 AWS Lake Formation。具體而言，您需要許可才能在 S3 Tables 目錄中建立資料表。如果沒有這些許可，您的 CTAS 操作將會失敗。

**注意**  
如果您的 CTAS 查詢失敗，您可能需要使用 [S3 Tables API](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-delete.html) 刪除資料表，然後才能嘗試重新執行查詢。您無法使用 Athena `DROP TABLE` 陳述式來移除部分由查詢建立的資料表。

**範例**

```
CREATE TABLE "s3tablescatalog/amzn-s3-demo-bucket"."namespace"."s3-table-name"
WITH (
    format = 'PARQUET'
)
AS SELECT *
FROM source_table;
```

# 在 Athena 中查詢 AWS Glue 資料目錄
<a name="gdc-register-query-the-data-source"></a>

若要從 Athena 查詢資料目錄，請執行下列其中一項動作。
+ 在 Athena 中將目錄註冊為資料來源，然後使用資料來源名稱查詢目錄。在這種用法中，下列查詢是相同的。

  ```
  SELECT * FROM my_data_source.my_database.my_table
  ```
+ 如果您要查詢尚未註冊為 Athena 資料來源的目錄，您可以在 `SELECT` 查詢中提供目錄的完整路徑，如下列範例所示。

  ```
  SELECT * FROM "my_catalog/my_subcatalog".my_database.my_table
  ```
+ 您也可以透過 執行此操作 AWS 管理主控台。

  1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) 開啟 Athena 主控台

  1. 在查詢編輯器中，對於**資料來源**，選擇 **AwsDataCatalog**。

  1. 對於**目錄**，選擇您要使用的目錄的名稱。

  1. 對於**資料庫**，選擇包含您要查詢的資料表的資料庫。

  1. 輸入類似 `SELECT * FROM my_table` 的查詢，然後選擇**執行**。

# 從另一個帳戶註冊 Data Catalog
<a name="data-sources-glue-cross-account"></a>

您可以使用 Athena 的跨帳戶 AWS Glue 目錄功能，從非您自己的帳戶註冊 AWS Glue 目錄。在您為 AWS Glue 設定所需的 IAM 許可，並將目錄註冊為 Athena `DataCatalog` 資源後，您可以使用 Athena 來執行跨帳戶查詢。如需有關設定所需許可的詳細資訊，請參閱[設定 AWS Glue 資料目錄的跨帳戶存取](security-iam-cross-account-glue-catalog-access.md)。

下列程序說明如何使用 Athena 在 Amazon Web Services AWS Glue Data Catalog 帳戶中設定 ，而非您自己的資料來源。

## 從主控台註冊
<a name="data-sources-glue-cross-account-console"></a>

1. 請按照 [設定 AWS Glue 資料目錄的跨帳戶存取](security-iam-cross-account-glue-catalog-access.md) 中的步驟，確保您已獲得許可，能查詢其他帳戶中的資料目錄。

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 選擇**資料來源和目錄**。

1. 在右上角，選擇 **Create data source** (建立資料來源)。

1. 在**選擇資料來源**頁面上，針對**資料來源**選擇 **S3 - AWS Glue Data Catalog**，然後選擇**下一步**。

1. 在 **Enter data source details** (輸入資料來源詳細資訊) 頁面上的 **AWS Glue Data Catalog** 區段，針對**選擇 AWS Glue Data Catalog**，在另一個帳户選擇 **AWS Glue Data Catalog **。

1. 在 **Data source details** (資料來源詳細資訊) 輸入以下資訊：
   + **Data source name** (資料來源名稱) – 輸入您希望在 SQL 查詢中使用的名稱，以參考其他帳戶中的資料目錄。
   + **Description** (描述) – (選填) 輸入其他帳戶裡資料目錄的描述。
   + **Catalog ID** (目錄 ID) – 輸入資料目錄所屬帳戶的 12 位數 Amazon Web Services 帳戶 ID。Amazon Web Services 帳戶 ID 即為目錄 ID。

1. (選用) 在 **Tags** (標籤)中，輸入您希望與資料來源相關聯的鍵值對。如需標籤的詳細資訊，請參閱[標記 Athena 資源](tags.md)。

1. 選擇**下一步**。

1. 在 **Review and create** (檢閱並建立) 頁面上，檢閱您提供的資訊，然後選擇 **Create data source** (建立資料來源)。**Data source details** (資料來源詳細資訊) 頁面列出了註冊資料型錄的資料庫和標籤。

1. 選擇**資料來源和目錄**。您註冊的資料型錄列於 **Data Source Name** (資料來源名稱) 資料欄。

1. 若要檢視或編輯資料型錄的相關資訊，請選擇型錄，然後選擇 **Actions** (動作)、**Edit** (編輯)。

1. 若要刪除新資料型錄，請選擇型錄，然後選擇 **Actions** (動作)、**Delete** (刪除)。

## 使用 API 操作註冊
<a name="data-sources-glue-cross-account-api"></a>

1. 下列`CreateDataCatalog`請求內文會註冊 AWS Glue 目錄以進行跨帳戶存取：

   ```
   # Example CreateDataCatalog request to register a cross-account Glue catalog:
   {
       "Description": "Cross-account Glue catalog",
       "Name": "ownerCatalog",
       "Parameters": {"catalog-id" : "<catalogid>"  # Owner's account ID
       },
       "Type": "GLUE"
   }
   ```

1. 以下範本程式碼會使用 Java 用戶端來建立 `DataCatalog` 物件。

   ```
   # Sample code to create the DataCatalog through Java client
   CreateDataCatalogRequest request = new CreateDataCatalogRequest()
       .withName("ownerCatalog")
       .withType(DataCatalogType.GLUE)
       .withParameters(ImmutableMap.of("catalog-id", "<catalogid>"));
   
   athenaClient.createDataCatalog(request);
   ```

   在這些步驟之後，借用者應會在呼叫 [ListDataCatalogs](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListDataCatalogs.html) API 操作時看到 *`ownerCatalog`*。

## 使用 註冊 AWS CLI
<a name="data-sources-glue-cross-account-cli"></a>

使用下列範例 CLI 命令從 AWS Glue Data Catalog 另一個帳戶註冊

```
aws athena create-data-catalog \
  --name cross_account_catalog \
  --type GLUE \
  --description "Cross Account Catalog" \
  --parameters catalog-id=<catalogid>
```

如需詳細資訊，請參閱 *AWS 大數據部落格*中的[使用 Amazon Athena 查詢跨帳戶 AWS Glue Data Catalog](https://aws.amazon.com/blogs/big-data/query-cross-account-aws-glue-data-catalogs-using-amazon-athena/)。

# 使用 IAM 政策控制對資料目錄的存取
<a name="datacatalogs-iam-policy"></a>

若要控制對資料目錄的存取，請使用資源層級 IAM 許可或身分型 IAM 政策。

下列程序專用於 Athena。

如需 IAM 特定的資訊，請參閱本節最後列出的連結。如需範例 JSON 資料目錄政策的相關資訊，請參閱[資料目錄範例政策](datacatalogs-example-policies.md)。

**若要在 IAM 主控台中使用視覺化編輯器來建立資料目錄政策**

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

1. 在左邊的導覽窗格中，選擇 **Policies** (政策)，然後選擇 **Create policy** (建立政策)。

1. 在 **Visual editor** (視覺化編輯器) 標籤上，選擇 **Choose a service** (選擇一項服務)。接著選擇 Athena 以新增到政策。

1. 選擇 **Select actions** (選取動作)，然後選擇要新增到政策的動作。視覺化編輯器會顯示 Athena 中可用的動作。如需詳細資訊，請參閱《服務授權參考》**中的 [Amazon Athena 的動作、資源和條件索引鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html)。

1. 選擇 **add actions** (新增動作) 來輸入特定動作，或使用萬用字元 (\$1) 來指定多個動作。

   預設情況下，您建立的政策允許執行選擇的操作。對於 Athena 中的 `datacatalog` 資源，如果您選擇的一個或多個動作支援資源層級許可，則編輯器會列出 `datacatalog` 資源。

1. 選擇 **Resources (資源)** 來為您的政策指定資料目錄。如需 JSON 資料目錄政策範例，請參閱[資料目錄範例政策](datacatalogs-example-policies.md)。

1. 如下所示指定 `datacatalog` 資源：

   ```
   arn:aws:athena:<region>:<user-account>:datacatalog/<datacatalog-name>
   ```

1. 選擇 **Review policy** (檢閱政策)，然後為您正在建立的政策輸入 **Name** (名稱) 與 **Description** (描述) (選用)。檢閱政策摘要來確認您已授予想要的許可。

1. 選擇 **Create policy** (建立政策) 儲存您的新政策。

1. 將此以身分為基礎的政策連接到使用者、群組或角色，並指定其可存取的 `datacatalog` 資源。

如需詳細資訊，請參閱《服務授權參考》**與《IAM 使用者指南》**中的下列主題：
+ [Amazon Athena 的操作、資料和條件索引鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html)
+ [使用視覺化編輯器來建立政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor)
+ [新增和移除 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)
+ [控制資源的存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_controlling.html#access_controlling-resources)

如需 JSON 資料目錄政策範例，請參閱[資料目錄範例政策](datacatalogs-example-policies.md)。

如需 AWS Glue 許可和 AWS Glue 爬蟲程式許可的相關資訊，請參閱《 *AWS Glue 開發人員指南*》中的[設定 和爬蟲程式先決條件的 IAM 許可 AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/getting-started-access.html)。 [https://docs.aws.amazon.com/glue/latest/dg/crawler-prereqs.html](https://docs.aws.amazon.com/glue/latest/dg/crawler-prereqs.html)

如需 Amazon Athena 動作的完整清單，請參閱《[Amazon Athena API 參考](https://docs.aws.amazon.com/athena/latest/APIReference/)》中的 API 動作名稱。

# 資料目錄範例政策
<a name="datacatalogs-example-policies"></a>

本節包含可讓您在資料目錄上用來啟用各種動作的政策範例。

資料目錄是由 Athena 管理的 IAM 資源。因此，如果您的資料目錄政策使用 `datacatalog` 做為輸入的動作，您必須指定資料目錄的 ARN，如下所示：

```
"Resource": [arn:aws:athena:<region>:<user-account>:datacatalog/<datacatalog-name>]
```

`<datacatalog-name>` 是資料目錄的名稱。例如，對於名為 `test_datacatalog` 的資料目錄，將其指定為資源，如下所示：

```
"Resource": ["arn:aws:athena:us-east-1:123456789012:datacatalog/test_datacatalog"]
```

如需 Amazon Athena 動作的完整清單，請參閱《[Amazon Athena API 參考](https://docs.aws.amazon.com/athena/latest/APIReference/)》中的 API 動作名稱。如需有關 IAM 政策的詳細資訊，請參閱《IAM 使用者指南》**中的[使用視覺化編輯器來建立政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor)。如需有關為工作群組建立 IAM 政策的詳細資訊，請參閱[使用 IAM 政策控制對資料目錄的存取](datacatalogs-iam-policy.md)。
+ [Example Policy for Full Access to All Data Catalogs](#datacatalog-policy-full-access-to-all-data-catalogs)
+ [Example Policy for Full Access to a Specified Data Catalog](#datacatalog-policy-full-access-to-a-specified-catalog)
+ [Example Policy for Querying a Specified Data Catalog](#datacatalog-policy-querying-a-specified-data-catalog)
+ [Example Policy for Management Operations on a Specified Data Catalog](#datacatalog-policy-management-operations-on-a-specified-catalog)
+ [Example Policy for Listing Data Catalogs](#datacatalog-policy-listing-data-catalogs)
+ [Example Policy for Metadata Operations on Data Catalogs](#datacatalog-policy-metadata-operations)

**Example 適用於完整存取所有資料目錄的政策範例**  
以下政策允許完整存取帳戶中可能存在的所有資料目錄資源。對於您的帳戶中必須為所有其他使用者管理資料目錄的那些使用者，我們建議您使用此政策。    
****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "athena:*"
         ],
         "Resource":[
            "*"
         ]
      }
   ]
}
```

**Example 適用於完整存取指定資料目錄的政策範例**  
以下政策允許完整存取名為 `datacatalogA` 的單一特定的資料目錄資源。對於能夠完全控制特定資料目錄的使用者，您可以使用此政策。    
****  

```
{ "Version":"2012-10-17",		 	 	  "Statement":[ { "Effect":"Allow", "Action":[
   "athena:ListDataCatalogs", "athena:ListWorkGroups", "athena:GetDatabase", "athena:ListDatabases",
   "athena:ListTableMetadata", "athena:GetTableMetadata" ], "Resource":"*" }, { "Effect":"Allow",
   "Action":[ "athena:StartQueryExecution", "athena:GetQueryResults", "athena:DeleteNamedQuery",
   "athena:GetNamedQuery", "athena:ListQueryExecutions", "athena:StopQueryExecution",
   "athena:GetQueryResultsStream", "athena:ListNamedQueries", "athena:CreateNamedQuery",
   "athena:GetQueryExecution", "athena:BatchGetNamedQuery", "athena:BatchGetQueryExecution",
   "athena:DeleteWorkGroup", "athena:UpdateWorkGroup", "athena:GetWorkGroup",
   "athena:CreateWorkGroup" ], "Resource":[
      "arn:aws:athena:us-east-1:123456789012:workgroup/*"
   ] }, { "Effect":"Allow", "Action":[ "athena:CreateDataCatalog", "athena:DeleteDataCatalog",
   "athena:GetDataCatalog", "athena:GetDatabase", "athena:GetTableMetadata", "athena:ListDatabases",
   "athena:ListTableMetadata", "athena:UpdateDataCatalog" ],
      "Resource":"arn:aws:athena:us-east-1:123456789012:datacatalog/datacatalogA"
   } ] }
```

**Example 適用於查詢指定資料目錄的政策範例**  
在以下政策中，允許使用者在指定的 `datacatalogA` 中執行查詢。不允許使用者對資料目錄本身執行管理任務，例如更新或刪除。    
****  

```
{ "Version":"2012-10-17",		 	 	  "Statement":[ { "Effect":"Allow", "Action":[
   "athena:StartQueryExecution" ], "Resource":[
      "arn:aws:athena:us-east-1:123456789012:workgroup/*"
   ] }, { "Effect":"Allow", "Action":[ "athena:GetDataCatalog" ], "Resource":[
      "arn:aws:athena:us-east-1:123456789012:datacatalog/datacatalogA"
   ] } ] }
```

**Example 適用於指定資料目錄上管理操作的政策範例**  
在以下政策中，允許使用者建立、刪除、取得詳細資訊和更新資料目錄 `datacatalogA`。    
****  

```
{ "Version":"2012-10-17",		 	 	  "Statement": [ { "Effect": "Allow", "Action": [
    "athena:CreateDataCatalog", "athena:GetDataCatalog", "athena:DeleteDataCatalog",
    "athena:UpdateDataCatalog" ], "Resource": [
        "arn:aws:athena:us-east-1:123456789012:datacatalog/datacatalogA"
    ] } ] }
```

**Example 適用於列出資料目錄的政策範例**  
以下政策可讓所有使用者列出所有資料目錄：    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListDataCatalogs"
            ],
            "Resource": "*"
        }
    ]
}
```

**Example 適用於資料目錄上中繼資料操作的政策範例**  
下列政策允許對資料目錄進行中繼資料操作：    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:GetDatabase",
                "athena:GetTableMetadata",
                "athena:ListDatabases",
                "athena:ListTableMetadata"
            ],
            "Resource": "*"
        }
    ]
}
```

# 使用 Athena 主控台中的表單來新增 AWS Glue 資料表
<a name="data-sources-glue-manual-table"></a>

下列程序會說明如何利用 Athena 主控台，使用 **Create Table From S3 bucket data** (從 S3 儲存貯體資料建立資料表) 表單新增資料表。

**新增資料表和使用表單輸入結構描述資訊**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在查詢編輯器中，選擇位在 **Tables and views** (資料表和檢視) 旁的 **Create** (建立)，然後選擇 **S3 bucket data** (S3 儲存貯體資料)。

1. 在 **Create Table From S3 bucket data** (從 S3 儲存貯體資料建立資料表) 表單上，對於 **Table name** (資料表名稱)，輸入資料表的名稱。如需有關 Athena 中資料庫名稱、資料表名稱和資料欄名稱可接受字元的資訊，請參閱 [為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)。

1. 對於 **Database configuration** (資料庫組態)，選擇現有資料庫或建立新資料庫。

1. 對於 **Location of Input Data Set** (輸入資料集的位置)，請指定 Amazon S3 中的資料夾路徑，該資料夾包含您要處理的資料集。請勿在路徑中包含檔案名稱。Athena 會掃描您指定之資料夾中的所有檔案。如果您的資料已經進行分割 (例如，

    s3://amzn-s3-demo-bucket/logs/year=2004/month=12/day=11/)，僅輸入基本路徑 (例如，s3://amzn-s3-demo-bucket/logs/)。

1. 在 **Data Format** (資料格式) 中，請選擇下列選項：
   + 對於 **Table type** (資料表類型)，選擇 **Apache Hive**、**Apache Iceberg** 或 **Delta Lake**。Athena 預設使用 Apache Hive 資料表類型。如需有關在 Athena 中查詢 Apache Iceberg 的詳細資訊，請參閱 [查詢 Apache Iceberg 資料表](querying-iceberg.md)。如需有關在 Athena 中使用 Delta Lake 資料表的詳細資訊，請參閱 [查詢 Linux Foundation Delta Lake 資料表](delta-lake-tables.md)。
   + 在 **File format** (檔案格式) 中，選擇資料所在的檔案或使用的日誌格式。
     + 對於 **Text File with Custom Delimiters (含自訂分隔符號的文字檔)** 選項，指定 **Field terminator (欄位結束字元)** (亦即資料欄分隔符號)。或者，您可以指定標記陣列類型結尾的 **Collection terminator** (集合結束符號)，或指定標記地圖資料類型結尾的 **Collection terminator** (集合結束符號)。
   + **SerDe library** (SerDe 程式庫) – SerDe (序列化程式-還原序列化程式) 程式庫會解析特定的資料格式，以便 Athena 可以為其建立資料表。對於大多數格式，系統會為您選擇預設的 SerDe 程式庫。對於下列格式，請根據您的需求選擇程式庫：
     + **Apache Web 日誌** – 選擇 **RegexSerDe** 或 **GrokSerDe** 程式庫。對於 RegexSerDe，請在 **Regex definition** (Regex 定義) 方塊中提供規則表達式。對於 GrokSerDe，請為 `input.format` SerDe 屬性提供一系列具名規則表達式。具名的規則表達式比規則表達式更容易讀取和維護。如需詳細資訊，請參閱[查詢存放在 Amazon S3 中的 Apache 日誌](querying-apache-logs.md)。
     + **CSV** – 如果您的逗號分隔資料不包含以雙引號括住的值，或資料使用 `java.sql.Timestamp` 格式，請選擇 **LazySimpleSerDe**。如果您的資料包含引號或使用 UNIX 數值格式的 `TIMESTAMP` (例如 `1564610311`)，請選擇 **OpenCSVSerDe**。如需詳細資訊，請參閱[適用於 CSV、TSV 和自訂分隔檔案的 Lazy Simple SerDe](lazy-simple-serde.md)及[用於處理 CSV 的 Open CSV SerDe](csv-serde.md)。
     + **JSON** – 選擇 **OpenX** 或 **Hive** JSON SerDe 程式庫。這兩種格式都預期每個 JSON 文件都以單行文字表示，而且欄位不以換行字元分隔。OpenX SerDe 提供了一些額外屬性。如需這些屬性的相關資訊，請參閱[OpenX JSON SerDe](openx-json-serde.md)。如需有關 Hive SerDe 的資訊，請參閱 [Hive JSON SerDe](hive-json-serde.md)。

     如需有關在 Athena 中使用 SerDe 程式庫的詳細資訊，請參閱[為您的資料選擇 SerDe](supported-serdes.md)。

1. 在 **SerDe properties** (SerDe 屬性) 中，請根據您使用的 SerDe 程式庫和您的需求，新增、編輯或移除屬性和值。
   + 若要新增 SerDe 屬性，請選擇 **Add SerDe property** (新增 SerDe 屬性)。
   + 在 **Name** (名稱) 欄位中，輸入屬性的名稱。
   + 在 **Value** (值) 欄位中，輸入屬性的值。
   + 若要移除 SerDe 屬性，請選擇 **Remove** (移除)。

1. 在 **Table properties** (資料表屬性) 中，請根據您的需求選擇或編輯資料表屬性。
   + 在 **Write compression** (寫入壓縮) 中，選擇壓縮選項。是否提供寫入壓縮選項和可用壓縮選項取決於資料格式。如需詳細資訊，請參閱[在 Athena 中使用壓縮](compression-formats.md)。
   + 如果基礎資料是在 Amazon S3 中加密，在 **Encryption** (加密) 中，選取 **Encrypted data set** (加密的資料集)。此選項會在 `CREATE TABLE` 陳述式中將 `has_encrypted_data` 資料表屬性設定為 true。

1. 在 **Column details** (資料欄詳細資訊) 中，輸入要新增至資料表的資料欄名稱和資料類型。
   + 若要一次新增更多資料欄，請選擇 **Add a column (新增資料欄)**。
   + 若要快速新增更多資料欄，請選擇 **Bulk add columns (大量新增資料欄)**。在文字方塊中，輸入逗號分隔的資料欄清單，格式為 *column\$1name* *data\$1type*, *column\$1name* *data\$1type*[, ...]，然後選擇 **Add** (新增)。

1. (選用) 對於 **Partition details** (分割區詳情)，新增一個或多個資料欄名稱和資料類型。分割會根據資料欄值將相關資料保存在一起，有助於減少每次查詢掃描的資料量。如需分割的相關資訊，請參閱[分割您的資料](partitions.md)。

1. (選用) 在 **Bucketing** (歸納) 中，您可以指定包含要組合在一起的資料列的一個或多個資料欄，然後將這些資料列放入多個儲存貯體中。這可允許您在指定已歸納的資料欄值時僅查詢要讀取的儲存貯體。
   + 在 **Buckets** (儲存貯體) 中，請選取具有大量唯一值 (例如主索引鍵) 且經常用來篩選查詢中資料的一個或多個資料欄。
   + 在 **Number of buckets** (儲存貯體數量) 中，輸入可讓檔案具有最佳大小的儲存貯體數量。如需詳細資訊，請參閱 AWS 大數據部落格中的 [Amazon Athena 的前 10 個效能調校秘訣](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/)。
   + 若要指定歸納的資料欄，`CREATE TABLE` 陳述式會使用下列語法：

     ```
     CLUSTERED BY (bucketed_columns) INTO number_of_buckets BUCKETS
     ```
**注意**  
**Bucketing** (歸納) 選項不適用於 **Iceberg** 資料表類型。

1. **Preview table query** (預覽資料表查詢) 方塊顯示由您所輸入到表單中的資訊產生的 `CREATE TABLE` 陳述式。無法直接編輯預覽陳述式。若要變更陳述式，請修改預覽上方的表單欄位，或不使用表單，在查詢編輯器中[直接建立陳述式](creating-tables-how-to.md#to-create-a-table-using-hive-ddl)。

1. 選擇 **Create table** (建立資料表) 以在查詢編輯器中執行產生的陳述式並建立資料表。

# 使用編目程式新增資料表
<a name="schema-crawlers"></a>

AWS Glue 爬蟲程式可協助探索資料集的結構描述，並將其註冊為 AWS Glue Data Catalog 中的資料表。爬蟲程式可逐一瀏覽您的資料，並判斷結構描述。此外，爬蟲程式可偵測和登錄分割區。如需詳細資訊，請參閱《AWS Glue 開發人員指南》**中的[定義爬蟲程式](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html)。可從 Athena 查詢來自已成功編目的資料的資料表。

**注意**  
Athena 無法辨識您為 AWS Glue 爬蟲程式指定的[排除模式](https://docs.aws.amazon.com/glue/latest/dg/define-crawler.html#crawler-data-stores-exclude)。例如，如果您的 Simple Storage Service (Amazon S3) 儲存貯體同時包含 `.csv` 和 `.json` 檔案，並且您將 `.json` 檔案從爬蟲程式中排除，Athena 會查詢這兩個檔案群組。若要避免這種情況，請將您要排除的檔案放在不同的位置。

## 建立 AWS Glue 爬蟲程式
<a name="data-sources-glue-crawler-setup"></a>

您可以從 Athena 主控台開始建立爬蟲程式，然後以整合方式使用 AWS Glue 主控台。建立爬蟲程式時，需要在 Amazon S3 中指定要網路爬取的資料位置。

**從 Athena 主控台 AWS Glue 開始在 中建立爬蟲程式**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在查詢編輯器中，選擇位於**資料表和檢視**旁的**建立**，然後選擇 **AWS Glue 爬蟲程式**。

1. 在 **AWS Glue** 主控台的 **Add crawler (新增爬蟲程式)** 頁面上，依照步驟建立爬蟲程式。如需詳細資訊，請參閱本指南中的[使用 AWS Glue 爬蟲程式](#schema-crawlers)和《 *AWS Glue 開發人員指南*》中的[填入 AWS Glue Data Catalog](https://docs.aws.amazon.com/glue/latest/dg/populate-catalog-methods.html) 。

**注意**  
Athena 無法辨識您為 AWS Glue 爬蟲程式指定的[排除模式](https://docs.aws.amazon.com/glue/latest/dg/define-crawler.html#crawler-data-stores-exclude)。例如，如果您的 Simple Storage Service (Amazon S3) 儲存貯體同時包含 `.csv` 和 `.json` 檔案，並且您將 `.json` 檔案從爬蟲程式中排除，Athena 會查詢這兩個檔案群組。若要避免這種情況，請將您要排除的檔案放在不同的位置。

在爬蟲程式之後， AWS Glue 爬蟲程式會自動指派特定資料表中繼資料，以協助使其與其他外部技術相容，例如 Apache Hive、Presto 和 Spark。有時爬蟲程式可能不正確地指派中繼資料屬性。使用 Athena 查詢資料表 AWS Glue 之前，手動更正 中的屬性。如需詳細資訊，請參閱《AWS Glue 開發人員指南》中的**[檢視與編輯資料表詳細資訊](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html#console-tables-details)。

AWS Glue 當 CSV 檔案的每個資料欄位有引號時， 可能會錯誤指派中繼資料，導致 `serializationLib` 屬性錯誤。如需詳細資訊，請參閱[處理以引號括住的 CSV 資料](schema-csv.md#schema-csv-quotes)。

# 對編目程式使用多個資料來源
<a name="schema-crawlers-data-sources"></a>

當 AWS Glue 爬蟲程式掃描 Amazon S3 並偵測多個目錄時，它會使用啟發式來判斷資料表的根目錄在目錄結構中的位置，以及哪些目錄是資料表的分割區。在某些情況下，在兩個或多個目錄偵測到類似的結構描述時，爬蟲程式可能會將它們視為分割區，而不是個別的資料表。協助爬蟲程式探索個別資料表的其中一種方法是，將每個資料表的根目錄新增為爬蟲程式的資料存放區。

Amazon S3 中的下列分割區為範例：

```
s3://amzn-s3-demo-bucket/folder1/table1/partition1/file.txt
s3://amzn-s3-demo-bucket/folder1/table1/partition2/file.txt
s3://amzn-s3-demo-bucket/folder1/table1/partition3/file.txt
s3://amzn-s3-demo-bucket/folder1/table2/partition4/file.txt
s3://amzn-s3-demo-bucket/folder1/table2/partition5/file.txt
```

如果 `table1`和 的結構描述`table2`類似，且單一資料來源在 `s3://amzn-s3-demo-bucket/folder1/`中設定為 AWS Glue，爬蟲程式可能會建立具有兩個分割區資料欄的單一資料表：一個包含 `table1`和 的分割區資料欄`table2`，以及第二個包含`partition1`透過 的分割區資料欄`partition5`。

若要讓 AWS Glue 爬蟲程式建立兩個不同的資料表，請將爬蟲程式設定為有兩個資料來源 `s3://amzn-s3-demo-bucket/folder1/table1/`和 `s3://amzn-s3-demo-bucket/folder1/table2`，如下列程序所示。

**若要將 S3 資料存放區新增至 中的現有爬蟲程式 AWS Glue**

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

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

1. 選擇您的爬蟲程式連結，然後選擇 **Edit** (編輯)。

1. 對於 **Step 2: Choose data sources and classifiers** (步驟 2：選擇資料來源和分類器)，選擇 **Edit** (編輯)。

1. 對於**資料來源和目錄**，選擇**新增資料來源**。

1. 在 **Add data source** (新增資料來源) 對話方塊中，用於**S3 path** (S3 路徑)，選擇 **Browse** (瀏覽)。

1. 選取您想要使用的儲存貯體，然後選擇 **Choose** (選擇)。

   您新增的資料來源會顯示在 **Data sources** (資料來源)的清單中。

1. 選擇**下一步**。

1. 在 **Configure Security Settings** (設定安全設定) 頁面上，建立或選擇爬蟲程式的 IAM 角色，然後選擇**Next (下一步)**。

1. 確定 S3 路徑結尾為尾端斜線，然後選擇 **Add an S3 data source** (新增 S3 資料來源)。

1. 在 **Set output and scheduling** (設定輸出與排程) 頁面上，針對 **Output configuration** (輸出組態)，選擇目標資料庫。

1. 選擇**下一步**。

1. 在 **Review** (檢閱和更新) 頁面上，檢閱您所做的選擇。若要編輯步驟，請選擇 **Edit** (編輯)。

1.  選擇**更新**。

# 排程爬蟲程式，讓 AWS Glue Data Catalog 和 Amazon S3 保持同步
<a name="schema-crawlers-schedule"></a>

AWS Glue 爬蟲程式可以設定為按排程或隨需執行。如需詳細資訊，請參閱《AWS Glue 開發人員指南》**中的[任務和爬蟲程式的時間排程](https://docs.aws.amazon.com/glue/latest/dg/monitor-data-warehouse-schedule.html)。

如果您有資料在固定時間抵達分割的資料表，您可以設定 AWS Glue 爬蟲程式，以按排程執行，以偵測和更新資料表分割區。您不再需要花費大量時間和金錢執行 `MSCK REPAIR` 命令，也不需要再手動執行 `ALTER TABLE ADD PARTITION` 命令。如需詳細資訊，請參閱《AWS Glue 開發人員指南》**中的[資料表分割區](https://docs.aws.amazon.com/glue/latest/dg/tables-described.html#tables-partition)。

# 使用 AWS Glue 分割區索引和篩選來最佳化查詢
<a name="glue-best-practices-partition-index"></a>

當 Athena 查詢已分割的資料表時，會擷取和篩選可用資料表分割區至與您的查詢相關的子集。隨著新資料和分割區的增加，處理分割區需要更長的時間，執行查詢的時間可能會增加。如果您有一個具有大量分割區的資料表，並且分割區的數量隨著時間的推移而增加，請考慮使用 AWS Glue 分割區索引和篩選。分割區索引允許 Athena 最佳化分割區處理，並改善高度已分割的資料表的查詢效能。在資料表屬性中設定分割區篩選，一共有兩個步驟：

1. 在 AWS Glue建立分割區索引。

1. 啟用資料表的分割區篩選。

## 建立分割區索引
<a name="glue-best-practices-partition-index-creating"></a>

如需在 中建立分割區索引的步驟 AWS Glue，請參閱《 AWS Glue 開發人員指南》中的[使用分割區索引](https://docs.aws.amazon.com/glue/latest/dg/partition-indexes.html)。如需 中分割區索引的限制 AWS Glue，請參閱該頁面上的[關於分割區索引](https://docs.aws.amazon.com/glue/latest/dg/partition-indexes.html#partition-index-1)一節。

## 啟用分割區篩選
<a name="glue-best-practices-partition-filtering-enabling"></a>

如需啟用資料表的分割區篩選，您必須在 AWS Glue設定新資料表屬性。如需如何在 中設定資料表屬性的步驟 AWS Glue，請參閱[設定分割區投影](https://docs.aws.amazon.com/athena/latest/ug/partition-projection-setting-up.html)頁面。當您在 中編輯資料表詳細資訊時 AWS Glue，請將下列索引鍵/值對新增至**資料表屬性**區段：
+ 對於 **Key** (索引鍵)，新增 `partition_filtering.enabled`。
+ 對於 **Value** (數值)，新增 `true`

您可以將 `partition_filtering.enabled` 設定為 `false`，隨時停用此資料表上的分割區篩選。

完成上述步驟後，您可以返回 Athena 主控台以查詢資料。

如需使用分割區索引和篩選的詳細資訊，請參閱*AWS 大數據部落格*中的[使用 AWS Glue Data Catalog 分割區索引改善 Amazon Athena 查詢效能](https://aws.amazon.com/blogs/big-data/improve-amazon-athena-query-performance-using-aws-glue-data-catalog-partition-indexes/)。

# 使用 AWS CLI 重新建立 AWS Glue 資料庫及其資料表
<a name="glue-recreate-db-and-tables-cli"></a>

無法直接重新命名 AWS Glue 資料庫，但您可以複製其定義、修改定義，並使用定義以不同名稱重新建立資料庫。同樣地，您可以複製舊資料庫中資料表的定義、修改定義，並使用修改後的定義重新建立新資料庫中的資料表。

**注意**  
 顯示的方法不會複製資料表分割區。

下列 Windows 程序假設您的 AWS CLI 已設定為 JSON 輸出。若要變更 中的預設輸出格式 AWS CLI，請執行 `aws configure`。

**使用 複製 AWS Glue 資料庫 AWS CLI**

1. 在命令提示字元中，執行下列 AWS CLI 命令來擷取您要複製的 AWS Glue 資料庫定義。

   ```
   aws glue get-database --name database_name
   ```

   如需有關 `get-database` 命令的詳細資訊，請參閱 [get-database](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-database.html)。

1. 將 JSON 輸出儲存到桌面上的檔案中，該檔案包含新資料庫的名稱 (例如 `new_database_name.json`)。

1. 在文字編輯器中開啟 `new_database_name.json` 檔案。

1. 在 JSON 檔案中，執行下列步驟：

   1. 移除檔案結尾的外部 `{ "Database":` 項目和對應的大括弧 `}`。

   1. 將 `Name` 項目變更為新的資料庫名稱。

   1. 移除 `CatalogId` 欄位。

1. 儲存檔案。

1. 在命令提示字元中，執行下列 AWS CLI 命令來使用修改過的資料庫定義檔案，以新名稱建立資料庫。

   ```
   aws glue create-database --database-input "file://~/Desktop\new_database_name.json"
   ```

   如需有關 `create-database` 命令的詳細資訊，請參閱 [create-database](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/create-database.html)。如需有關從檔案載入 AWS CLI 參數的資訊，請參閱*AWS Command Line Interface 《 使用者指南*》中的[從檔案載入 AWS CLI 參數](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-file.html)。

1. 若要驗證是否已在 中建立新資料庫 AWS Glue，請執行下列命令：

   ```
   aws glue get-database --name new_database_name
   ```

現在，您已準備好取得要複製到新資料庫的資料表的定義、修改定義，並使用修改後的定義在新資料庫中重新建立資料表。此程序不會變更資料表名稱。

**使用 複製 AWS Glue 資料表 AWS CLI**

1. 在命令提示字元中，執行下列 AWS CLI 命令。

   ```
   aws glue get-table --database-name database_name --name table_name
   ```

   如需有關 `get-table` 命令的詳細資訊，請參閱 [get-table](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-table.html)。

1. 將 JSON 輸出儲存到 Windows 桌面上的檔案中，該檔案包含資料表名稱 (例如 *table\$1name*.json)。

1. 在文字編輯器中開啟該檔案。

1. 在 JSON 檔案中，移除檔案結尾的外部 `{"Table": ` 項目和對應的大括弧 `}`。

1. 在 JSON 檔案中，移除下列項目及其值：
   + `DatabaseName` – 因為 `create-table` CLI 命令使用 `--database-name` 參數，所以不需要此項目。
   + `CreateTime`
   + `UpdateTime`
   + `CreatedBy`
   + `IsRegisteredWithLakeFormation`
   + `CatalogId`
   + `VersionId`

1. 儲存資料表定義檔案。

1. 在命令提示字元中，執行下列 AWS CLI 命令以在新資料庫中重新建立資料表：

   ```
   aws glue create-table --database-name new_database_name --table-input "file://~/Desktop\table_name.json"     
   ```

   如需有關 `create-table` 命令的詳細資訊，請參閱 [create-table](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/create-table.html)。

   資料表現在會出現在 中的新資料庫中 AWS Glue ，並且可以從 Athena 查詢。

1. 重複步驟，以將每個其他資料表複製到 AWS Glue中的新資料庫。

# 建立用於 ETL 任務的資料表
<a name="schema-classifier"></a>

您可以使用 Athena 建立 AWS Glue 可用於 ETL 任務的資料表。 AWS Glue jobs 會執行 ETL 操作。 AWS Glue 任務會執行指令碼，從來源擷取資料、轉換資料，並將其載入目標。如需詳細資訊，請參閱[《 開發人員指南》中的在 AWS Glue 中編寫任務](https://docs.aws.amazon.com/glue/latest/dg/author-job-glue.html)。 *AWS Glue *

## 為 AWS Glue ETL 任務建立 Athena 資料表
<a name="schema-etl-tables"></a>

您在 Athena 中建立的資料表必須新增一個資料表屬性，稱為 `classification`，它可以識別資料格式。這可讓 AWS Glue 對 ETL 任務使用資料表。分類值可以是 `avro`、`csv`、`json`、`orc`、`parquet` 或 `xml`。Athena 中的 `CREATE TABLE` 陳述式範例如下所示：

```
CREATE EXTERNAL TABLE sampleTable (
  column1 INT,
  column2 INT
  ) STORED AS PARQUET
  TBLPROPERTIES (
  'classification'='parquet')
```

如果在建立`classification`資料表時未新增資料表屬性，您可以使用 AWS Glue 主控台新增它。

**使用 AWS Glue 主控台新增分類表屬性**

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

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

1. 選擇您想要編輯的資料表連結，然後選擇 **Action** (動作)、**Edit table** (編輯資料表)。

1. 向下捲動到 **Table properties** (資料表屬性) 的區段中。

1. 選擇**新增**。

1. 在 **Key** (索引鍵) 欄位，輸入 **classification**。

1. 在 **Value** (值) 欄位，輸入資料類型 (例如，**json**)。

1. 選擇**儲存**。

   在 **Table details** (資料表詳細資訊) 區段中，您輸入的資料類型會顯示在 **Classification** (分類) 表格的欄位。

如需詳細資訊，請參閱《AWS Glue 開發人員指南》**中的[使用資料表](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html)。

## 使用 ETL 任務來最佳化查詢效能
<a name="schema-etl-performance"></a>

AWS Glue 任務可協助您將資料轉換為可在 Athena 中最佳化查詢效能的格式。資料格式對於 Athena 中的查詢效能和查詢成本有重大影響。

AWS Glue 支援寫入 Parquet 和 ORC 資料格式。您可以使用此功能來轉換資料，以便在 Athena 中使用。如需有關使用 Parquet 和 ORC 以及其他提高效能的方式的詳細資訊，請參閱 [Amazon Athena 的十大效能調校秘訣](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/)。

**注意**  
為了降低 Athena 無法讀取 AWS Glue ETL 任務產生的 `SMALLINT`和 `TINYINT` 資料類型的可能性，請在建立將資料轉換為 ORC 的 ETL 任務`TINYINT``INT`時，將 `SMALLINT`和 轉換為 。

## 自動化 ETL AWS Glue 的任務
<a name="schema-etl-automate"></a>

您可以設定 AWS Glue ETL 任務根據觸發條件自動執行。當來自外部的資料 AWS 推送至 Amazon S3 儲存貯體時，此功能非常適合在 Athena 中查詢，否則為次佳格式。如需詳細資訊，請參閱《 *AWS Glue 開發人員指南*》中的[觸發 AWS Glue 任務](https://docs.aws.amazon.com/glue/latest/dg/trigger-job.html)。

# 在 中使用 CSV 資料 AWS Glue
<a name="schema-csv"></a>

此頁面說明如何使用 從每個資料欄的資料值有引號的 CSV 檔案 AWS Glue ，或從包含標頭值的 CSV 檔案建立結構描述。

## 處理以引號括住的 CSV 資料
<a name="schema-csv-quotes"></a>

假設一個 CSV 檔案中的資料欄位以雙引號括住，如下列範例所示。

```
"John","Doe","123-555-1231","John said \"hello\""
"Jane","Doe","123-555-9876","Jane said \"hello\""
```

若要在 Athena 中對從具有引號值的 CSV 檔案建立的資料表執行查詢，您必須在 中修改資料表屬性 AWS Glue ，才能使用 OpenCSVSerDe。如需 OpenCSV SerDe 的詳細資訊，請參閱[用於處理 CSV 的 Open CSV SerDe](csv-serde.md)。

**在 AWS Glue 主控台中編輯資料表屬性**

1. 在 AWS Glue 主控台導覽窗格中，選擇**資料表**。

1. 選擇您想要編輯的資料表連結，然後選擇 **Action** (動作)、**Edit table** (編輯資料表)。

1. 在 **Edit table** (編輯資料表) 頁面上，進行下列變更：
   + 對於 **Serialization lib** (序列化程式庫)，請輸入 `org.apache.hadoop.hive.serde2.OpenCSVSerde`。
   + 對於 **Serde parameters** (SerDe 參數)，請輸入金鑰 `escapeChar`、`quoteChar` 以及 `separatorChar` 的值：
     + 對於 `escapeChar`，請輸入反斜線 (**\$1**)。
     + 對於 `quoteChar`，請輸入雙引號 (**"**)。
     + 對於 `separatorChar`，請輸入逗號 (**,**)。

1. 選擇**儲存**。

如需詳細資訊，請參閱《AWS Glue 開發人員指南》中的**[檢視與編輯資料表詳細資訊](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html#console-tables-details)。

您也可以以程式設計方式更新 AWS Glue 資料表屬性。使用 AWS Glue [UpdateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateTable.html) API 操作或 [update-table](https://docs.aws.amazon.com/cli/latest/reference/glue/update-table.html) AWS CLI 命令來修改資料表定義中的`SerDeInfo`區塊，如下列 JSON 範例所示。

```
"SerDeInfo": {
   "name": "",
   "serializationLib": "org.apache.hadoop.hive.serde2.OpenCSVSerde",
   "parameters": {
      "separatorChar": ","
      "quoteChar": "\""
      "escapeChar": "\\"
      }
},
```

## 處理具有標頭的 CSV 檔案
<a name="schema-csv-headers"></a>

當您在 Athena 中以 `CREATE TABLE` 陳述式定義資料表時，您可以使用 `skip.header.line.count` 資料表屬性忽略 CSV 資料中的標頭，如下列範例所示。

```
...
STORED AS TEXTFILE
LOCATION 's3://amzn-s3-demo-bucket/csvdata_folder/';
TBLPROPERTIES ("skip.header.line.count"="1")
```

或者，您也可以事先移除 CSV 標頭，使標頭資訊不包含在 Athena 查詢結果中。可達成此目的的其中一種方法是使用 AWS Glue 任務，它會執行擷取、轉換和載入 (ETL) 工作。您可以使用 PySpark Python 方言延伸 AWS Glue 的語言，在 中撰寫指令碼。如需詳細資訊，請參閱[《 開發人員指南》中的在 AWS Glue 中編寫任務](https://docs.aws.amazon.com/glue/latest/dg/author-job-glue.html)。 *AWS Glue *

下列範例顯示 AWS Glue 指令碼中的函數，該函數使用 來寫入動態影格`from_options`，並將`writeHeader`格式選項設定為 false，這會移除標頭資訊：

```
glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://amzn-s3-demo-bucket/MYTABLEDATA/"}, format = "csv", format_options = {"writeHeader": False}, transformation_ctx = "datasink2")
```

# 在 中使用地理空間資料 AWS Glue
<a name="schema-geospatial"></a>

AWS Glue 原生不支援已知文字 (WKT)、已知二進位 (WKB) 或其他 PostGIS 資料類型。 AWS Glue 分類器會剖析地理空間資料，並使用格式支援的資料類型進行分類，例如 `varchar` CSV。如同其他 AWS Glue 資料表，您可能需要更新從地理空間資料建立之資料表的屬性，以允許 Athena 依原狀剖析這些資料類型。如需詳細資訊，請參閱[使用編目程式新增資料表](schema-crawlers.md)及[在 中使用 CSV 資料 AWS Glue](schema-csv.md)。Athena 可能無法依原狀剖析 AWS Glue 資料表中的某些地理空間資料類型。如需在 Athena 中使用地理空間資料的詳細資訊，請參閱[查詢地理空間資料](querying-geospatial-data.md)。

# 使用 Amazon Athena 聯合查詢
<a name="federated-queries"></a>

如果您有資料位於 Simple Storage Service (Amazon S3) 以外的來源中，您可以使用 Athena 聯合查詢就地查詢資料，或建置管道以從多個資料來源擷取資料並將它們存放在 Simple Storage Service (Amazon S3) 中。Athena 聯合查詢可讓您針對存放在關聯式、非關聯式、物件和自訂資料來源中的資料執行 SQL 查詢。

Athena 使用在 上執行的*資料來源連接器* AWS Lambda 來執行聯合查詢。資料來源連接器是可在目標資料來源和 Athena 之間進行轉譯的一段程式碼。您可以將連接器視為 Athena 查詢引擎的延伸。預先建置的 Athena 資料來源連接器適用於諸多資料來源，諸如 Amazon CloudWatch Logs、Amazon DynamoDB、Amazon DocumentDB、Amazon RDS 和符合 JDBC 規範的關聯式資料來源 (例如 MySQL 和 Apache 2.0 授權下的 PostgreSQL)。您也可以使用 Athena Query Federation 軟體開發套件來撰寫自訂連接器。若要選擇、設定並將資料來源連接器部署到您的帳戶，您可以使用 Athena 和 Lambda 主控台或 AWS Serverless Application Repository。部署資料來源連接器之後，連接器會與一個目錄產生關聯，而您可以在 SQL 查詢中指定此目錄。您可以結合來自多個目錄的 SQL 陳述式，並在單一查詢中跨越多個資料來源。

對資料來源提交查詢時，Athena 會叫用對應的連接器，以識別需要讀取的資料表部分，並會管理平行處理和下推篩選條件述詞。根據提交查詢的使用者，連接器可能允許或禁止存取特定的資料元素。連接器使用 Apache Arrow 作為格式，以傳回查詢中要求的資料，因此能夠以 C、C \$1\$1、Java、Python 和 Rust 等語言實作連接器。連接器是在 Lambda 中進行處理，因此可以從雲端或內部部署中可供 Lambda 存取的任何資料來源存取資料。

若要撰寫您的資料來源連接器，您可以使用 Athena Query Federation 軟體開發套件，自訂 Amazon Athena 提供和維護的其中一個預先建置的連接器。您可以從 [GitHub 儲存庫](https://github.com/awslabs/aws-athena-query-federation/wiki/Available-Connectors)修改原始碼的副本，然後使用 [Connector 發佈工具](https://github.com/awslabs/aws-athena-query-federation/wiki/Connector_Publish_Tool)建立您自己的 AWS Serverless Application Repository 套件。

**注意**  
第三方開發人員可能已經使用 Athena Query Federation 軟體開發套件來撰寫資料來源連接器。如對這些資料來源連接器的支援或授權有疑問，請洽詢您的連接器供應商。這些連接器未經測試或支援 AWS。

如需 Athena 撰寫和測試的資料來源連接器之清單，請參閱[可用資料來源連接器](connectors-available.md)。

如需自行撰寫資料來源連接器的相關資訊，請參閱 GitHub 上的[範例 Athena 連接器](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-example)。

## 考量和限制
<a name="connect-to-a-data-source-considerations"></a>
+ **引擎版本** – 只有 Athena 引擎版本 2 及更新版本才能支援 Athena 聯合查詢。如需有關 Athena 引擎版本的資訊，請參閱[Athena 引擎版本控制](engine-versions.md)。
+ **檢視** – 您可以在聯合資料來源上建立和查詢檢視。聯合檢視存放在 中 AWS Glue，而不是基礎資料來源。如需詳細資訊，請參閱[查詢聯合檢視](running-federated-queries.md#running-federated-queries-federated-views)。
+ **分隔的識別碼** – 分隔的識別碼 (也稱為引號識別碼) 是以雙引號 (") 開頭和結尾。目前，Athena 中的聯合查詢不支援分隔的識別碼。
+ **寫入操作** – 不支援[INSERT INTO](insert-into.md)等寫入操作。嘗試執行這項操作可能會產生錯誤訊息：外部目錄目前不支援此操作。
+  **定價** – 如需定價資訊，請參閱 [Amazon Athena 定價](https://aws.amazon.com/athena/pricing/)。
+ **JDBC 驅動程式** – 若要將 JDBC 驅動程式與聯合查詢或[外部 Hive 中繼存放區](connect-to-data-source-hive.md)搭配使用，請在您的 JDBC 連線字串中包含 `MetadataRetrievalMethod=ProxyAPI`。如需有關 JDBC 驅動程式的資訊，請參閱[使用 JDBC 連接到 Amazon Athena](connect-with-jdbc.md)。
+ **Secrets Manager** – 若要搭配 AWS Secrets Manager使用 Athena 聯合查詢功能，您必須為 Secrets Manager 設定 Amazon VPC 私有端點。如需詳細資訊，請參閱《AWS Secrets Manager 使用者指南》**中的[建立 Secrets Manager VPC 私有端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html#vpc-endpoint-create)。

## 必要許可
<a name="connect-to-a-data-source-permissions"></a>

資料來源連接器可能需要存取下列資源，才能正常運作。如果您使用預先建置的連接器，請檢查連接器的資訊，以確保您已正確設定 VPC。此外，請確定執行查詢和建立連接器的 IAM 委託人具有必要動作的權限。如需詳細資訊，請參閱[允許存取 Athena 聯合查詢：範例政策](federated-query-iam-access.md)。
+ **Simple Storage Service (Amazon S3)** – 除了將查詢結果寫入 Simple Storage Service (Amazon S3) 中的 Athena 查詢結果位置外，資料連接器也會寫入 Simple Storage Service (Amazon S3) 中的溢出儲存貯體。對此 Simple Storage Service (Amazon S3) 位置，需有連線能力和許可。建議對每個連接器和 [S3 生命週期組態](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)使用溢出到磁碟加密，讓不再需要的溢出資料過期。
+ **Athena** – 資料來源需要連線到 Athena (反之亦然)，以檢查查詢狀態和防止溢出掃描。
+ **AWS Glue Data Catalog** – 如果您的連接器將資料目錄用於補充或主要中繼資料，則需要連線和許可。
+ **Amazon ECR** – 資料來源連接器 Lambda 函式使用來自 Amazon ECR 儲存庫的 Amazon ECR 映像。部署連接器的使用者必須具有 `ecr:BatchGetImage` 和 `ecr:GetDownloadUrlForLayer` 許可。如需詳細資訊，請參閱《AWS Lambda 開發人員指南**》中的 [Amazon ECR 許可](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#gettingstarted-images-permissions)。

## 影片
<a name="connect-to-a-data-source-videos"></a>

請觀看下列影片，進一步了解如何使用 Athena 聯合查詢。

**影片：在 Amazon Athena 中快速分析聯合查詢的結果**  
下列影片示範如何在 Quick 中分析 Athena 聯合查詢的結果。

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


**影片：遊戲分析管道**  
下列影片說明如何使用 Amazon Athena 聯合查詢來部署可擴展的無伺服器資料管道，以擷取、存放並分析遊戲和服務中的遙測資料。

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


# 可用資料來源連接器
<a name="connectors-available"></a>

本節列出預先建置的 Athena 資料來源連接器，供您用來查詢 Simple Storage Service (Amazon S3) 外部的各種資料來源。若要在 Athena 查詢中使用連接器，請設定連接器並將其部署到您的帳戶。

## 考量和限制
<a name="connectors-available-considerations"></a>
+ 某些預先建置的連接器要求您先建立 VPC 和安全群組，然後才能使用連接器。如需建立 VPC 的相關資訊，請參閱 [為資料來源連接器或 AWS Glue 連線建立 VPC](athena-connectors-vpc-creation.md)。
+ 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，您必須為 Secrets Manager 設定 Amazon VPC 私有端點。如需詳細資訊，請參閱《AWS Secrets Manager 使用者指南》**中的[建立 Secrets Manager VPC 私有端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html#vpc-endpoint-create)。
+ 對於不支援述詞下推的連接器，包含述詞的查詢需要較長時間才能執行。對於小型資料集，只會掃描極少的資料，而查詢平均需要大約 2 分鐘。但是，對於大型資料集，許多查詢可能會逾時。
+ 有些聯合資料來源使用術語來描述與 Athena 不同的資料物件。如需詳細資訊，請參閱[了解聯合資料表名稱限定詞](tables-qualifiers.md)。
+ 我們會根據資料庫或資料來源提供者的升級情況，定期更新連接器。我們不支援已終止支援的資料來源。
+ 針對列出資料表時不支援分頁的連接器，如果您的資料庫有許多資料表和中繼資料，Web 服務可能會逾時。下列連接器提供所列資料表的分頁支援：
  + DocumentDB
  + DynamoDB
  + MySQL
  + OpenSearch
  + Oracle
  + PostgreSQL
  + Redshift
  + SQL Server

## Federation SDK 中的案例解析程式模式
<a name="case-resolver-modes"></a>

Federation SDK 支援下列適用於結構描述和資料表名稱的標準化案例解析程式模式：
+ `NONE` – 請勿變更指定的結構描述和資料表名稱的大小寫。
+ `LOWER` – 將所有指定的結構描述和資料表名稱轉換為小寫。
+ `UPPER` – 將所有指定的結構描述和資料表名稱轉換為大寫。
+ `ANNOTATION` – 此模式僅為回溯相容性而保留，且僅由現有的 Snowflake 和 SAP HANA 連接器支援。
+ `CASE_INSENSITIVE_SEARCH` – 針對結構描述和資料表名稱執行不區分大小寫搜尋。

## 連接器支援案例解析程式模式
<a name="connector-support-matrix"></a>

### 基本模式支援
<a name="basic-mode-support"></a>

所有 JDBC 連接器都支援下列基本模式：
+ `NONE`
+ `LOWER`
+ `UPPER`

### 註釋模式支援
<a name="annotation-mode-support"></a>

只有下列連接器支援 `ANNOTATION` 模式：
+ Snowflake
+ SAP HANA

**注意**  
建議使用 CASE\$1INSENSITIVE\$1SEARCH 而不是 ANNOTATION。

### 不區分大小寫搜尋支援
<a name="case-insensitive-search-support"></a>

下列連接器支援 `CASE_INSENSITIVE_SEARCH`：
+ DataLake Gen2
+ Snowflake
+ Oracle
+ Synapse
+ MySQL
+ PostgreSQL
+ Redshift
+ ClickHouse
+ SQL Server
+ DB2

## 案例解析程式限制
<a name="case-resolver-limitations"></a>

使用案例解析程式模式時，請注意下列限制：
+ 使用 `LOWER` 模式時，您的結構描述名稱和結構描述中的所有資料表必須是小寫。
+ 使用 `UPPER` 模式時，您的結構描述名稱和結構描述中的所有資料表必須是大寫。
+ 使用 `CASE_INSENSITIVE_SEARCH` 時：
  + 結構描述名稱必須是唯一的
  + 結構描述中的資料表名稱必須是唯一的 (例如，"Apple" 和 "APPLE" 不能同時存在)
+ Glue 整合限制：
  + Glue 僅支援小寫名稱
  + 使用 GlueDataCatalog/LakeFormation 註冊 Lambda 函式時，只有 `NONE` 或 `LOWER` 模式才會運作

## 其他資訊
<a name="connectors-available-additional-resources"></a>
+ 如需有關部署 Athena 資料來源連接器的資訊，請參閱[使用 Amazon Athena 聯合查詢](federated-queries.md)。
+ 如需有關使用 Athena 資料來源連接器查詢的資訊，請參閱 [執行聯合查詢](running-federated-queries.md)。

**Topics**
+ [考量和限制](#connectors-available-considerations)
+ [Federation SDK 中的案例解析程式模式](#case-resolver-modes)
+ [連接器支援案例解析程式模式](#connector-support-matrix)
+ [案例解析程式限制](#case-resolver-limitations)
+ [其他資訊](#connectors-available-additional-resources)
+ [Azure Data Lake Storage](connectors-adls-gen2.md)
+ [Azure Synapse](connectors-azure-synapse.md)
+ [Cloudera Hive](connectors-cloudera-hive.md)
+ [Cloudera Impala](connectors-cloudera-impala.md)
+ [CloudWatch](connectors-cloudwatch.md)
+ [CloudWatch 指標](connectors-cwmetrics.md)
+ [CMDB](connectors-cmdb.md)
+ [Db2](connectors-ibm-db2.md)
+ [Db2 iSeries](connectors-ibm-db2-as400.md)
+ [DocumentDB](connectors-docdb.md)
+ [DynamoDB](connectors-dynamodb.md)
+ [Google BigQuery](connectors-bigquery.md)
+ [Google Cloud Storage](connectors-gcs.md)
+ [HBase](connectors-hbase.md)
+ [Hortonworks](connectors-hortonworks.md)
+ [Kafka](connectors-kafka.md)
+ [MSK](connectors-msk.md)
+ [MySQL](connectors-mysql.md)
+ [Neptune](connectors-neptune.md)
+ [OpenSearch](connectors-opensearch.md)
+ [Oracle](connectors-oracle.md)
+ [PostgreSQL](connectors-postgresql.md)
+ [Redis OSS](connectors-redis.md)
+ [Redshift](connectors-redshift.md)
+ [SAP HANA](connectors-sap-hana.md)
+ [Snowflake](connectors-snowflake.md)
+ [SQL Server](connectors-microsoft-sql-server.md)
+ [Teradata](connectors-teradata.md)
+ [Timestream](connectors-timestream.md)
+ [TPC-DS](connectors-tpcds.md)
+ [Vertica](connectors-vertica.md)

**注意**  
[AthenaJdbcConnector](https://serverlessrepo.aws.amazon.com/applications/us-east-1/292517598671/AthenaJdbcConnector) (最新版本 2022.4.1) 已棄用。相反地，請使用資料庫特定連接器，例如適用於 [MySQL](connectors-mysql.md)、[Redshift](connectors-redshift.md) 或 [PostgreSQL](connectors-postgresql.md) 的連接器。

# Amazon Athena Azure Data Lake Storage (ADLS) Gen2 連接器
<a name="connectors-adls-gen2"></a>

適用於 [Azure Data Lake Storage (ADLS) Gen2](https://docs.microsoft.com/en-us/azure/databricks/data/data-sources/azure/adls-gen2/) 的 Amazon Athena 連接器可讓 Amazon Athena 能夠對存放在 ADLS 上的資料執行 SQL 查詢。Athena 無法直接存取資料湖中儲存的檔案。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。
+ **工作流程** – 連接器實作 JDBC 介面，該介面使用 `com.microsoft.sqlserver.jdbc.SQLServerDriver` 驅動程式。連接器會將查詢傳遞至 Azure Synapse 引擎，然後其會存取資料湖。
+ **資料處理和 S3** – 一般而言，Lambda 連接器會直接查詢資料，而無需傳輸至 Amazon S3。但是，當 Lambda 函數傳回的資料超過 Lambda 限制時，資料會寫入您指定的 Amazon S3 溢出儲存貯體，以便 Athena 可以讀取多餘的資料。
+ **AAD 身分驗證** – AAD 可用作 Azure Synapse 連接器的身分驗證方法。若要使用 AAD，連接器使用的 JDBC 連線字串必須包含 URL 參數 `authentication=ActiveDirectoryServicePrincipal`、`AADSecurePrincipalId` 和 `AADSecurePrincipalSecret`。這些參數可以直接傳遞，也可以由 Secrets Manager 傳遞。

## 先決條件
<a name="connectors-datalakegentwo-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-adls-gen2-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 篩選條件中的日期和時間戳記資料類型必須轉換為適當的資料類型。

## 條款
<a name="connectors-adls-gen2-terms"></a>

下列術語與 Azure Data Lake Storage Gen2 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-adls-gen2-parameters"></a>

使用本節中的參數來設定 Azure Data Lake Storage Gen2 連接器。

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。  
下方列出的參數名稱和定義適用於 2024 年 12 月 3 日之前建立的 Athena 資料來源連接器。這些可能與其對應的 [AWS Glue 連線屬性](https://docs.aws.amazon.com/glue/latest/dg/connection-properties.html)不同。從 2024 年 12 月 3 日開始，只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器時，才會使用下列參數。

### Glue 連線 (建議)
<a name="adls-gen2-gc"></a>

我們建議您使用 Glue 連線物件來設定 Azure Data Lake Storage Gen2 連接器。為此，請將 Azure Data Lake Storage Gen2 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type DATALAKEGEN2
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **none** – 請勿變更指定的結構描述和資料表名稱的大小寫。這是具有關聯 Glue 連線的連接器的預設值。
  + **upper** – 將所有指定的結構描述和資料表名稱轉換為大寫。
  + **lower** – 將所有指定的結構描述和資料表名稱轉換為小寫。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 Azure Data Lake Storage Gen2 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Azure Data Lake Storage Gen2 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="adls-gen2-legacy"></a>

#### 連接字串
<a name="connectors-adls-gen2-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
datalakegentwo://${jdbc_connection_string}
```

#### 使用多工處理常式
<a name="connectors-adls-gen2-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | DataLakeGen2MuxCompositeHandler | 
| 中繼資料處理常式 | DataLakeGen2MuxMetadataHandler | 
| 記錄處理常式 | DataLakeGen2MuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-adls-gen2-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 mydatalakegentwocatalog，則環境變數名稱為 mydatalakegentwocatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 DataLakeGen2 MUX Lambda 函數：`datalakegentwo1` (預設) 和 `datalakegentwo2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | datalakegentwo://jdbc:sqlserver://adlsgentwo1.hostname:port;databaseName=database\$1name;\$1\$1secret1\$1name\$1 | 
| datalakegentwo\$1catalog1\$1connection\$1string | datalakegentwo://jdbc:sqlserver://adlsgentwo1.hostname:port;databaseName=database\$1name;\$1\$1secret1\$1name\$1 | 
| datalakegentwo\$1catalog2\$1connection\$1string | datalakegentwo://jdbc:sqlserver://adlsgentwo2.hostname:port;databaseName=database\$1name;\$1\$1secret2\$1name\$1 | 

##### 提供憑證
<a name="connectors-adls-gen2-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${secret1_name}`。

```
datalakegentwo://jdbc:sqlserver://hostname:port;databaseName=database_name;${secret1_name}
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
datalakegentwo://jdbc:sqlserver://hostname:port;databaseName=database_name;user=user_name;password=password
```

#### 使用單一連接處理常式
<a name="connectors-adls-gen2-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 Azure Data Lake Storage Gen2 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | DataLakeGen2CompositeHandler | 
| 中繼資料處理常式 | DataLakeGen2MetadataHandler | 
| 記錄處理常式 | DataLakeGen2RecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-adls-gen2-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函數所支援的單一 Azure Data Lake Storage Gen2 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | datalakegentwo://jdbc:sqlserver://hostname:port;databaseName=;\$1\$1secret\$1name\$1 | 

#### 溢出參數
<a name="connectors-adls-gen2-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-adls-gen2-data-type-support"></a>

下表顯示 ADLS Gen2 和 Arrow 的相應資料類型。


****  

| ADLS Gen2 | Arrow | 
| --- | --- | 
| bit | TINYINT | 
| tinyint | SMALLINT | 
| smallint | SMALLINT | 
| int | INT | 
| bigint | BIGINT | 
| decimal | DECIMAL | 
| numeric | FLOAT8 | 
| smallmoney | FLOAT8 | 
| money | DECIMAL | 
| float[24] | FLOAT4 | 
| float[53] | FLOAT8 | 
| real | FLOAT4 | 
| datetime | Date(MILLISECOND) | 
| datetime2 | Date(MILLISECOND) | 
| smalldatetime | Date(MILLISECOND) | 
| date | Date(DAY) | 
| time | VARCHAR | 
| datetimeoffset | Date(MILLISECOND) | 
| char[n] | VARCHAR | 
| varchar[n/max] | VARCHAR | 

## 分割區和分隔
<a name="connectors-adls-gen2-partitions-and-splits"></a>

Azure Data Lake Storage Gen2 使用與 Hadoop 相容的 Gen2 Blob 儲存體來儲存資料檔案。從 Azure Synapse 引擎中查詢這些檔案的資料。Azure Synapse 引擎會將儲存在檔案系統中的 Gen2 資料視為外部資料表。根據資料類型實作分割區。如果已在 Gen 2 儲存系統中分割和分配資料，則連接器會以單一分割方式擷取資料。

## 效能
<a name="connectors-adls-gen2-performance"></a>

當一次執行多個查詢時，Azure Data Lake Storage Gen2 連接器會顯示較慢的查詢效能，且會受到限流的影響。

Athena Azure Data Lake Storage Gen2 連接器會執行述詞下推，以減少查詢掃描的資料。簡單述詞和複雜表達式會下推至連接器，以減少掃描的資料量並減少查詢執行時間。

### 述詞
<a name="connectors-datalakegentwo-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena Azure Data Lake Storage Gen2 連接器可以合併這些表達式，並將其直接推送至 Azure Data Lake Storage Gen2，以增強功能並減少掃描的資料量。

下列 Athena Azure Data Lake Storage Gen2 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、NULL\$1IF、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-datalakegentwo-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d)) 
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%');
```

## 傳遞查詢
<a name="connectors-datalakegentwo-passthrough-queries"></a>

Azure Data Lake Storage Gen2 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Azure Data Lake Storage Gen2 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Azure Data Lake Storage Gen2 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-datalakegentwo-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-datalakegen2/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-datalakegen2/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-datalakegentwo-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 Azure Data Lake Storage Gen2 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-datalakegen2/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-datalakegen2)。

# Amazon Athena Azure Synapse 連接器
<a name="connectors-azure-synapse"></a>

適用於 [Azure Synapse 分析](https://docs.microsoft.com/en-us/azure/synapse-analytics/overview-what-is)的 Amazon Athena 連接器可讓 Amazon Athena 使用 JDBC 對 Azure Synapse 資料庫執行 SQL 查詢。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-synapse-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-azure-synapse-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 在篩選條件中，您必須將 `Date` 和 `Timestamp` 資料類型轉換為適當的資料類型。
+ 若要搜尋類型 `Real` 和 `Float` 的負值，請使用 `<=` 或者 `>=` 運算子。
+ 不支援 `binary`、`varbinary`、`image`、和 `rowversion` 資料類型。

## 條款
<a name="connectors-azure-synapse-terms"></a>

下列術語與 Synapse 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-azure-synapse-parameters"></a>

使用本節中的參數來設定 Synapse 連接器。

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。  
下方列出的參數名稱和定義適用於 2024 年 12 月 3 日之前建立的 Athena 資料來源連接器。這些可能與其對應的 [AWS Glue 連線屬性](https://docs.aws.amazon.com/glue/latest/dg/connection-properties.html)不同。從 2024 年 12 月 3 日開始，只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器時，才會使用下列參數。

### Glue 連線 (建議)
<a name="connectors-azure-synapse-gc"></a>

我們建議您使用 Glue 連線物件來設定 Synapse 連接器。為此，請將 Synapse 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type SYNAPSE
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **none** – 請勿變更指定的結構描述和資料表名稱的大小寫。這是具有關聯 Glue 連線的連接器的預設值。
  + **upper** – 將所有指定的結構描述和資料表名稱轉換為大寫。
  + **lower** – 將所有指定的結構描述和資料表名稱轉換為小寫。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 Synapse 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Synapse 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線 (建議)
<a name="connectors-azure-synapse-legacy"></a>

#### 連接字串
<a name="connectors-azure-synapse-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
synapse://${jdbc_connection_string}
```

#### 使用多工處理常式
<a name="connectors-azure-synapse-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | SynapseMuxCompositeHandler | 
| 中繼資料處理常式 | SynapseMuxMetadataHandler | 
| 記錄處理常式 | SynapseMuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-azure-synapse-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 mysynapsecatalog，則環境變數名稱為 mysynapsecatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 Synapse MUX Lambda 函數：`synapse1` (預設) 和 `synapse2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | synapse://jdbc:synapse://synapse1.hostname:port;databaseName=<database\$1name>;\$1\$1secret1\$1name\$1 | 
| synapse\$1catalog1\$1connection\$1string | synapse://jdbc:synapse://synapse1.hostname:port;databaseName=<database\$1name>;\$1\$1secret1\$1name\$1 | 
| synapse\$1catalog2\$1connection\$1string | synapse://jdbc:synapse://synapse2.hostname:port;databaseName=<database\$1name>;\$1\$1secret2\$1name\$1 | 

##### 提供憑證
<a name="connectors-azure-synapse-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 \$1\$1secret\$1name\$1。

```
synapse://jdbc:synapse://hostname:port;databaseName=<database_name>;${secret_name}
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
synapse://jdbc:synapse://hostname:port;databaseName=<database_name>;user=<user>;password=<password>
```

#### 使用單一連接處理常式
<a name="connectors-azure-synapse-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 Synapse 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | SynapseCompositeHandler | 
| 中繼資料處理常式 | SynapseMetadataHandler | 
| 記錄處理常式 | SynapseRecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-azure-synapse-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函數所支援的單一 Synapse 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | synapse://jdbc:sqlserver://hostname:port;databaseName=<database\$1name>;\$1\$1secret\$1name\$1 | 

#### 設定 Active Directory 身分驗證
<a name="connectors-azure-synapse-configuring-active-directory-authentication"></a>

Amazon Athena Azure Synapse 連接器支援 Microsoft Active Directory 身分驗證。開始之前，您必須在 Microsoft Azure 入口網站中設定管理使用者，然後使用 AWS Secrets Manager 建立秘密。

**若要設定 Active Directory 管理使用者**

1. 使用具有管理權限的帳戶，登入 Microsoft Azure 入口網站 [https://portal.azure.com/](https://portal.azure.com/)。

1. 在搜尋方塊中，輸入 **Azure Synapse Analytics**，然後選擇 **Azure Synapse Analytics**。  
![\[選擇 Azure Synapse Analytics。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-azure-synapse-1.png)

1. 開啟左側的選單。  
![\[選擇 Azure 入口網站選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-azure-synapse-2.png)

1. 在導覽窗格中，依序選擇 **Azure Active Directory**。

1. 在**設定管理員**索引標籤上，將 **Active Directory 管理員**設定為新的或現有的使用者。  
![\[使用設定管理員索引標籤\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-azure-synapse-3.png)

1. 在 中 AWS Secrets Manager，存放管理員使用者名稱和密碼登入資料。如需有關在 Secrets Manager 中建立祕密的詳細資訊，請參閱[建立 AWS Secrets Manager 祕密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)。

**若要檢視 Secrets Manager 中的祕密**

1. 前往以下位置開啟機密管理員控制台：[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 在導覽窗格中，選擇 **Secrets** (祕密)。

1. 在 **Secrets** (祕密) 頁面中，選擇祕密的連結。

1. 在祕密的詳細資訊頁面上，選擇 **Retrieve secret value** (擷取祕密值)。  
![\[在 中檢視秘密 AWS Secrets Manager。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-azure-synapse-4.png)

##### 修改連線字串
<a name="connectors-azure-synapse-modifying-the-connection-string"></a>

若要啟用連接器的 Active Directory 身分驗證，請使用下列語法修改連線字串：

```
synapse://jdbc:synapse://hostname:port;databaseName=database_name;authentication=ActiveDirectoryPassword;{secret_name}
```

##### 使用 ActiveDirectoryServicePrincipal
<a name="connectors-azure-synapse-using-activedirectoryserviceprincipal"></a>

Amazon Athena Azure Synapse 連接器也支援 `ActiveDirectoryServicePrincipal`。若要啟用此功能，請依照下列方式修改連線字串。

```
synapse://jdbc:synapse://hostname:port;databaseName=database_name;authentication=ActiveDirectoryServicePrincipal;{secret_name}
```

對於 `secret_name`，指定應用程式或用戶端 ID 做為密碼中服務主體識別的使用者名稱和秘密。

#### 溢出參數
<a name="connectors-azure-synapse-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-azure-synapse-data-type-support"></a>

下表顯示 Synapse 和 Apache Arrow 的相應資料類型。


****  

| Synapse | Arrow | 
| --- | --- | 
| bit | TINYINT | 
| tinyint | SMALLINT | 
| smallint | SMALLINT | 
| int | INT | 
| bigint | BIGINT | 
| decimal | DECIMAL | 
| numeric | FLOAT8 | 
| smallmoney | FLOAT8 | 
| money | DECIMAL | 
| float[24] | FLOAT4 | 
| float[53] | FLOAT8 | 
| real | FLOAT4 | 
| datetime | Date(MILLISECOND) | 
| datetime2 | Date(MILLISECOND) | 
| smalldatetime | Date(MILLISECOND) | 
| date | Date(DAY) | 
| time | VARCHAR | 
| datetimeoffset | Date(MILLISECOND) | 
| char[n] | VARCHAR | 
| varchar[n/max] | VARCHAR | 
| nchar[n] | VARCHAR | 
| nvarchar[n/max] | VARCHAR | 

## 分割區和分隔
<a name="connectors-azure-synapse-partitions-and-splits"></a>

分割區由 `varchar` 類型的單一分割區資料欄表示。Synapse 支援範圍分割，因此透過從 Synapse 中繼資料表中擷取分割區資料欄和分割區範圍來執行分割。這些範圍值用於建立分割。

## 效能
<a name="connectors-azure-synapse-performance"></a>

選取資料欄子集會大幅拖慢查詢執行時間。連接器會顯示因為並行而導致的嚴重限流。

Athena Synapse 連接器執行述詞下推，以減少查詢掃描的資料。簡單述詞和複雜表達式會下推至連接器，以減少掃描的資料量並減少查詢執行時間。

### 述詞
<a name="connectors-synapse-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena Synapse 連接器可以合併這些表達式，並將其直接推送至 Synapse，以增強功能並減少掃描的資料量。

下列 Athena Synapse 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、NULL\$1IF、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-synapse-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d)) 
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%');
```

## 傳遞查詢
<a name="connectors-synapse-passthrough-queries"></a>

Synapse 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Synapse 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Synapse 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-synapse-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-synapse/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-synapse/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-synapse-additional-resources"></a>
+ 如需說明如何使用 Quick 和 Amazon Athena 聯合查詢在存放在 Microsoft Azure Synapse 資料庫的資料上建置儀表板和視覺化效果的文章，請參閱 *AWS 大數據部落格*中的[使用 Quick、Amazon Athena 聯合查詢和 Microsoft Azure Synapse 執行多雲端分析](https://aws.amazon.com/blogs/business-intelligence/perform-multi-cloud-analytics-using-amazon-quicksight-amazon-athena-federated-query-and-microsoft-azure-synapse/)。
+ 如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 Synapse 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-synapse/pom.xml) 檔案。
+ 如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-synapse)。

# Amazon Athena Cloudera Hive 連接器
<a name="connectors-cloudera-hive"></a>

適用於 Cloudera Hive 的 Amazon Athena 連接器可讓 Athena 能夠對 [Cloudera Hive](https://www.cloudera.com/products/open-source/apache-hadoop/apache-hive.html) Hadoop 分發執行 SQL 查詢。連接器可將您的 Athena SQL 查詢轉換為其同等的 HiveQL 語法。

此連接器不會使用 Glue 連線來集中 Glue 中的組態屬性。連線組態是透過 Lambda 完成的。

## 先決條件
<a name="connectors-hive-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。
+ 您必須先設定 VPC 和安全群組，才能使用此連接器。如需詳細資訊，請參閱[為資料來源連接器或 AWS Glue 連線建立 VPC](athena-connectors-vpc-creation.md)。

## 限制
<a name="connectors-cloudera-hive-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。

## 條款
<a name="connectors-cloudera-hive-terms"></a>

下列術語與 Cloudera Hive 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-cloudera-hive-parameters"></a>

使用本節中的參數來設定 Cloudera Hive 連接器。

### Glue 連線 (建議)
<a name="connectors-cloudera-hive-gc"></a>

我們建議您使用 Glue 連線物件來設定 Cloudera Hive 連接器。為此，請將 Cloudera Hive 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type CLOUDERAHIVE
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **none** – 請勿變更指定的結構描述和資料表名稱的大小寫。這是具有關聯 Glue 連線的連接器的預設值。
  + **upper** – 將所有指定的結構描述和資料表名稱轉換為大寫。
  + **lower** – 將所有指定的結構描述和資料表名稱轉換為小寫。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 Cloudera Hive 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Cloudera Hive 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-cloudera-hive-legacy"></a>

#### 連接字串
<a name="connectors-cloudera-hive-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
hive://${jdbc_connection_string}
```

#### 使用多工處理常式
<a name="connectors-cloudera-hive-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | HiveMuxCompositeHandler | 
| 中繼資料處理常式 | HiveMuxMetadataHandler | 
| 記錄處理常式 | HiveMuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-cloudera-hive-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 myhivecatalog，則環境變數名稱為 myhivecatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 Hive MUX Lambda 函數：`hive1` (預設) 和 `hive2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | hive://jdbc:hive2://hive1:10000/default;\$1\$1Test/RDS/hive1\$1 | 
| hive2\$1catalog1\$1connection\$1string | hive://jdbc:hive2://hive1:10000/default;\$1\$1Test/RDS/hive1\$1 | 
| hive2\$1catalog2\$1connection\$1string | hive://jdbc:hive2://hive2:10000/default;UID=sample&PWD=sample | 

##### 提供憑證
<a name="connectors-cloudera-hive-credentials"></a>

若要在 JDBC 連線字串中提供資料庫的使用者名稱和密碼，Cloudera Hive 連接器需要來自 的秘密 AWS Secrets Manager。若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

在 JDBC 連線字串 AWS Secrets Manager 中放入秘密的名稱。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${Test/RDS/hive1}`。

```
hive://jdbc:hive2://hive1:10000/default;...&${Test/RDS/hive1}&...
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
hive://jdbc:hive2://hive1:10000/default;...&UID=sample2&PWD=sample2&...
```

目前，Cloudera Hive 連接器可辨識 `UID` 和 `PWD` JDBC 屬性。

#### 使用單一連接處理常式
<a name="connectors-cloudera-hive-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 Cloudera Hive 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | HiveCompositeHandler | 
| 中繼資料處理常式 | HiveMetadataHandler | 
| 記錄處理常式 | HiveRecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-cloudera-hive-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函數所支援的單一 Cloudera Hive 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| 預設 | hive://jdbc:hive2://hive1:10000/default;secret=\$1\$1Test/RDS/hive1\$1 | 

#### 溢出參數
<a name="connectors-cloudera-hive-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-cloudera-hive-data-type-support"></a>

下表顯示 JDBC、Cloudera Hive 和 Arrow 的相應資料類型。


****  

| JDBC | Cloudera Hive | Arrow | 
| --- | --- | --- | 
| Boolean | Boolean | 位元 | 
| Integer | TINYINT | Tiny | 
| Short | SMALLINT | Smallint | 
| Integer | INT | Int | 
| Long | BIGINT | Bigint | 
| float | float4 | Float4 | 
| Double | float8 | Float8 | 
| Date | date | DateDay | 
| 時間戳記 | timestamp | DateMilli | 
| String | VARCHAR | Varchar | 
| 位元組 | 位元組 | Varbinary | 
| BigDecimal | Decimal (小數) | Decimal (小數) | 
| ARRAY | N/A (請參閱備註) | 清單 | 

**注意**  
目前，Cloudera Hive 不支援彙總類型 `ARRAY`、`MAP`、`STRUCT` 或 `UNIONTYPE`。彙總類型的資料欄在 SQL 中被視為 `VARCHAR` 資料欄。

## 分割區和分隔
<a name="connectors-cloudera-hive-partitions-and-splits"></a>

分割區用於決定如何產生連接器的分割。Athena 建構了類型 `varchar` 的合成資料欄，表示資料表的分割結構，以幫助連接器產生分割。連接器不會修改實際的資料表定義。

## 效能
<a name="connectors-cloudera-hive-performance"></a>

Cloudera Hive 支援靜態分割區。Athena Cloudera Hive 連接器可以平行地從這些分割區中擷取資料。如果您想要查詢具有統一分割區分佈的非常大型的資料集，強烈建議使用靜態分割。Cloudera Hive 連接器對由於並行而導致的限流保有彈性。

Athena Cloudera Hive 連接器執行述詞下推，以減少查詢掃描的資料。`LIMIT` 子句、簡單述詞和複雜的表達式會下推至連接器，以減少掃描的資料量並縮短查詢執行時間。

### LIMIT 子句
<a name="connectors-hive-performance-limit-clauses"></a>

`LIMIT N` 陳述句可減少查詢掃描的資料。透過 `LIMIT N` 下推，連接器只會向 Athena 傳回 `N` 個資料列。

### 述詞
<a name="connectors-hive-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena Cloudera Hive 連接器可以結合這些表達式，並將它們直接推送到 Cloudera Hive，以增強功能並減少掃描的資料量。

下列 Athena Cloudera Hive 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-hive-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d))
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%') 
LIMIT 10;
```

## 傳遞查詢
<a name="connectors-hive-passthrough-queries"></a>

Cloudera Hive 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Cloudera Hive 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Cloudera Hive 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-hive-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-cloudera-hive/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-cloudera-hive/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-hive-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 Cloudera Hive 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-cloudera-hive/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-cloudera-hive)。

# Amazon Athena Cloudera Impala 連接器
<a name="connectors-cloudera-impala"></a>

Amazon Athena Cloudera Impala 連接器可讓 Athena 能夠對 [Cloudera Impala](https://docs.cloudera.com/cdw-runtime/cloud/impala-overview/topics/impala-overview.html) 分佈執行 SQL 查詢。連接器可將您的 Athena SQL 查詢轉換為同等的 Impala 語法。

此連接器不會使用 Glue 連線來集中 Glue 中的組態屬性。連線組態是透過 Lambda 完成的。

## 先決條件
<a name="connectors-impala-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。
+ 您必須先設定 VPC 和安全群組，才能使用此連接器。如需詳細資訊，請參閱[為資料來源連接器或 AWS Glue 連線建立 VPC](athena-connectors-vpc-creation.md)。

## 限制
<a name="connectors-cloudera-impala-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。

## 條款
<a name="connectors-cloudera-impala-terms"></a>

下列術語與 Cloudera Impala 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-cloudera-impala-parameters"></a>

使用本節中的參數來設定 Cloudera Impala 連接器。

### Glue 連線 (建議)
<a name="connectors-cloudera-impala-gc"></a>

我們建議您使用 Glue 連線物件來設定 Cloudera Impala 連接器。為此，請將 Cloudera Impala 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type CLOUDERAIMPALA
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **none** – 請勿變更指定的結構描述和資料表名稱的大小寫。這是具有關聯 Glue 連線的連接器的預設值。
  + **upper** – 將所有指定的結構描述和資料表名稱轉換為大寫。
  + **lower** – 將所有指定的結構描述和資料表名稱轉換為小寫。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 Cloudera Impala 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Cloudera Impala 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-cloudera-impala-legacy"></a>

#### 連接字串
<a name="connectors-cloudera-impala-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接 Impala 叢集。

```
impala://${jdbc_connection_string}
```

#### 使用多工處理常式
<a name="connectors-cloudera-impala-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | ImpalaMuxCompositeHandler | 
| 中繼資料處理常式 | ImpalaMuxMetadataHandler | 
| 記錄處理常式 | ImpalaMuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-cloudera-impala-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. Athena 目錄的 Impala 叢集連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 myimpalacatalog，則環境變數名稱為 myimpalacatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 Impala MUX Lambda 函數：`impala1` (預設) 和 `impala2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | impala://jdbc:impala://some.impala.host.name:21050/?\$1\$1Test/impala1\$1 | 
| impala\$1catalog1\$1connection\$1string | impala://jdbc:impala://someother.impala.host.name:21050/?\$1\$1Test/impala1\$1 | 
| impala\$1catalog2\$1connection\$1string | impala://jdbc:impala://another.impala.host.name:21050/?UID=sample&PWD=sample | 

##### 提供憑證
<a name="connectors-cloudera-impala-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${Test/impala1host}`。

```
impala://jdbc:impala://Impala1host:21050/?...&${Test/impala1host}&...
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
impala://jdbc:impala://Impala1host:21050/?...&UID=sample2&PWD=sample2&...
```

目前，Cloudera Impala 可辨識 `UID` 和 `PWD` JDBC 屬性。

#### 使用單一連接處理常式
<a name="connectors-cloudera-impala-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 Cloudera Impala 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | ImpalaCompositeHandler | 
| 中繼資料處理常式 | ImpalaMetadataHandler | 
| 記錄處理常式 | ImpalaRecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-cloudera-impala-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函數所支援的單一 Cloudera Impala 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | impala://jdbc:impala://Impala1host:21050/?secret=\$1\$1Test/impala1host\$1 | 

#### 溢出參數
<a name="connectors-cloudera-impala-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-cloudera-impala-data-type-support"></a>

下表顯示 JDBC、Cloudera Impala 和 Arrow 的相應資料類型。


****  

| JDBC | Cloudera Impala | Arrow | 
| --- | --- | --- | 
| Boolean | Boolean | 位元 | 
| Integer | TINYINT | Tiny | 
| Short | SMALLINT | Smallint | 
| Integer | INT | Int | 
| Long | BIGINT | Bigint | 
| float | float4 | Float4 | 
| Double | float8 | Float8 | 
| Date | date | DateDay | 
| 時間戳記 | timestamp | DateMilli | 
| String | VARCHAR | Varchar | 
| 位元組 | 位元組 | Varbinary | 
| BigDecimal | Decimal (小數) | Decimal (小數) | 
| ARRAY | N/A (請參閱備註) | 清單 | 

**注意**  
目前，Cloudera Impala 不支援彙總類型 `ARRAY`、`MAP`、`STRUCT` 或 `UNIONTYPE`。彙總類型的資料欄在 SQL 中被視為 `VARCHAR` 資料欄。

## 分割區和分隔
<a name="connectors-cloudera-impala-partitions-and-splits"></a>

分割區用於決定如何產生連接器的分割。Athena 建構了類型 `varchar` 的合成資料欄，表示資料表的分割結構，以幫助連接器產生分割。連接器不會修改實際的資料表定義。

## 效能
<a name="connectors-cloudera-impala-performance"></a>

Cloudera Impala 支援靜態分割區。Athena Cloudera Impala 連接器可以平行地從這些分割區中擷取資料。如果您想要查詢具有統一分割區分佈的非常大型的資料集，強烈建議使用靜態分割。Cloudera Impala 連接器由於並行而對限流保有彈性。

Athena Cloudera Impala 連接器執行述詞下推，以減少查詢掃描的資料。`LIMIT` 子句、簡單述詞和複雜的表達式會下推至連接器，以減少掃描的資料量並縮短查詢執行時間。

### LIMIT 子句
<a name="connectors-impala-performance-limit-clauses"></a>

`LIMIT N` 陳述句可減少查詢掃描的資料。透過 `LIMIT N` 下推，連接器只會向 Athena 傳回 `N` 個資料列。

### 述詞
<a name="connectors-impala-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena Cloudera Impala 連接器可以結合這些表達式，並將它們直接推送到 Cloudera Impala，以增強功能並減少掃描的資料量。

下列 Athena Cloudera Impala 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1DISTINCT\$1FROM、NULL\$1IF、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-impala-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d))
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%') 
LIMIT 10;
```

## 傳遞查詢
<a name="connectors-impala-passthrough-queries"></a>

Cloudera Impala 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Cloudera Impala 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Cloudera Impala 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-impala-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-cloudera-impala/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-cloudera-impala/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-impala-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 Cloudera Impala 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-cloudera-impala/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-cloudera-impala)。

# Amazon Athena CloudWatch 連接器
<a name="connectors-cloudwatch"></a>

Amazon Athena CloudWatch 連接器讓 Amazon Athena 能夠與 CloudWatch 通訊，以便使用 SQL 來查詢您的日誌資料。

此連接器不會使用 Glue 連線來集中 Glue 中的組態屬性。連線組態是透過 Lambda 完成的。

此連接器將 LogGroups 映射為結構描述，將每個 LogStream 映射為資料表。此連接器也映射特殊的 `all_log_streams` 檢視，其中包含 LogGroup 中的所有 LogStream。此檢視可讓您一次查詢 LogGroup 中的所有日誌，而不是個別搜尋每個 LogStream。

## 先決條件
<a name="connectors-cloudwatch-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## Parameters
<a name="connectors-cloudwatch-parameters"></a>

使用本節中的參數來設定 CloudWatch 連接器。

### Glue 連線 (建議)
<a name="connectors-cloudwatch-gc"></a>

我們建議您使用 Glue 連線物件來設定 CloudWatch 連接器。為此，請將 CloudWatch 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type CLOUDWATCH
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 CloudWatch 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 CloudWatch 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-cloudwatch-legacy"></a>
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。

連接器也支援 [AIMD 擁塞控制](https://en.wikipedia.org/wiki/Additive_increase/multiplicative_decrease)，以透過 [Amazon Athena Query Federation 軟體開發套件](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-federation-sdk) `ThrottlingInvoker` 構造來處理來自 CloudWatch 的限流事件。您可以透過設定下列任何選用的環境變數來調整預設限流行為：
+ **throttle\$1initial\$1delay\$1ms** - 在第一個擁塞事件之後套用的初始呼叫延遲。預設值為 10 毫秒。
+ **throttle\$1max\$1delay\$1ms** - 呼叫之間的最大延遲。您可以透過將其分成 1000 毫秒來衍生 TPS。預設值為 1000 毫秒。
+ **throttle\$1decrease\$1factor** - Athena 降低呼叫速率的係數。預設值為 0.5
+ **throttle\$1increase\$1ms**— Athena 降低呼叫延遲的速率。預設值為 10 毫秒。

## 資料庫和資料表
<a name="connectors-cloudwatch-databases-and-tables"></a>

Athena CloudWatch 連接器將 LogGroups 映射為結構描述 (即資料庫)，將每個 LogStream 映射為資料表。此連接器也映射特殊的 `all_log_streams` 檢視，其中包含 LogGroup 中的所有 LogStream。此檢視可讓您一次查詢 LogGroup 中的所有日誌，而不是個別搜尋每個 LogStream。

Athena CloudWatch 連接器映射的每個資料表都具有下列結構描述。此結構描述符合 CloudWatch Logs 提供的欄位。
+ **log\$1stream** - 一個 `VARCHAR`，它包含資料列所在之 LogStream 的名稱。
+ **time** - 一個 `INT64`，它包含產生日誌行時的 epoch 時間。
+ **message** - 包含日誌消息的 `VARCHAR`。

**範例**  
下列範例會示範如何對指定的 LogStream 執行 `SELECT` 查詢。

```
SELECT * 
FROM "lambda:cloudwatch_connector_lambda_name"."log_group_path"."log_stream_name" 
LIMIT 100
```

下列範例會示範如何使用 `all_log_streams` 檢視，在指定的 LogGroup 中對所有 LogStream 執行查詢。

```
SELECT * 
FROM "lambda:cloudwatch_connector_lambda_name"."log_group_path"."all_log_streams" 
LIMIT 100
```

## 所需的許可
<a name="connectors-cloudwatch-required-permissions"></a>

如需詳細了解此連接器所需的 IAM 政策，請檢閱 [athena-cloudwatch.yaml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-cloudwatch/athena-cloudwatch.yaml) 檔案的 `Policies` 部分。以下清單摘要說明所需的許可。
+ **Amazon S3 寫入存取** - 連接器需要 Amazon S3 中某個位置的寫入存取權，以便從大型查詢中溢寫結果。
+ **Athena GetQueryExecution** - 當上游 Athena 查詢終止時，連接器會使用此權限快速失敗。
+ **CloudWatch Logs Read/Write** - 連接器會使用此權限來讀取日誌資料並寫入其診斷日誌。

## 效能
<a name="connectors-cloudwatch-performance"></a>

Athena CloudWatch 連接器透過並行掃描査詢所需的日誌串流，嘗試依據 CloudWatch 來最佳化查詢。對於特定時段篩選條件，會在 Lambda 函數和 CloudWatch Logs 中執行述詞下推。

為了獲得最佳效能，請僅使用小寫作為日誌群組名稱和日誌串流名稱。使用混合大小寫會導致連接器執行運算密集程度較高的不區分大小寫搜尋。

**注意**  
 CloudWatch 連接器不支援大寫資料庫名稱。

## 傳遞查詢
<a name="connectors-cloudwatch-passthrough-queries"></a>

CloudWatch 連接器支援使用 [CloudWatch Logs Insights 查詢語法](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html)的[傳遞查詢](federated-query-passthrough.md)。如需有關 CloudWatch Logs Insights 的詳細資訊，請參閱《Amazon CloudWatch Logs 使用者指南**》中的[使用 CloudWatch Logs Insights 分析日誌資料](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html)。

若要透過 CloudWatch 建立傳遞查詢，請使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            STARTTIME => 'start_time',
            ENDTIME => 'end_time',
            QUERYSTRING => 'query_string',
            LOGGROUPNAMES => 'log_group-names',
            LIMIT => 'max_number_of_results'
        ))
```

下列範例 CloudWatch 傳遞查詢會在 `duration` 欄位不等於 1000 時進行篩選。

```
SELECT * FROM TABLE(
        system.query(
            STARTTIME => '1710918615308',
            ENDTIME => '1710918615972',
            QUERYSTRING => 'fields @duration | filter @duration != 1000',
            LOGGROUPNAMES => '/aws/lambda/cloudwatch-test-1',
            LIMIT => '2'
            ))
```

## 授權資訊
<a name="connectors-cloudwatch-license-information"></a>

Amazon Athena CloudWatch 連接器專案是依據 [Apache-2.0 License](https://www.apache.org/licenses/LICENSE-2.0.html) 來授權的。

## 其他資源
<a name="connectors-cloudwatch-additional-resources"></a>

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-cloudwatch)。

# Amazon Athena CloudWatch Metrics 連接器
<a name="connectors-cwmetrics"></a>

Amazon Athena CloudWatch Metrics 連接器讓 Amazon Athena 能夠使用 SQL 來查詢 CloudWatch Metrics 資料。

此連接器不會使用 Glue 連線來集中 Glue 中的組態屬性。連線組態是透過 Lambda 完成的。

如需將查詢指標從 Athena 本身發佈至 CloudWatch 的相關資訊，請參閱 [使用 CloudWatch 和 EventBridge 來監控查詢和控制成本](workgroups-control-limits.md)。

## 先決條件
<a name="connectors-cwmetrics-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## Parameters
<a name="connectors-cwmetrics-parameters"></a>

使用本節中的參數來設定 CloudWatch Metrics 連接器。

### Glue 連線 (建議)
<a name="connectors-cwmetrics-gc"></a>

我們建議您使用 Glue 連線物件來設定 CloudWatch Metrics 連接器。為此，請將 CloudWatch Metrics 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type CLOUDWATCHMETRICS
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 CloudWatch Metrics 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 CloudWatch Metrics 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-cwmetrics-legacy"></a>
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。

連接器也支援 [AIMD 擁塞控制](https://en.wikipedia.org/wiki/Additive_increase/multiplicative_decrease)，以透過 [Amazon Athena Query Federation 軟體開發套件](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-federation-sdk) `ThrottlingInvoker` 構造來處理來自 CloudWatch 的限流事件。您可以透過設定下列任何選用的環境變數來調整預設限流行為：
+ **throttle\$1initial\$1delay\$1ms** - 在第一個擁塞事件之後套用的初始呼叫延遲。預設值為 10 毫秒。
+ **throttle\$1max\$1delay\$1ms** - 呼叫之間的最大延遲。您可以透過將其分成 1000 毫秒來衍生 TPS。預設值為 1000 毫秒。
+ **throttle\$1decrease\$1factor** - Athena 降低呼叫速率的係數。預設值為 0.5
+ **throttle\$1increase\$1ms**— Athena 降低呼叫延遲的速率。預設值為 10 毫秒。

## 資料庫和資料表
<a name="connectors-cwmetrics-databases-and-tables"></a>

Athena CloudWatch Metrics 連接器會將您的命名空間、維度、指標和指標值映射到名為 `default` 的單一結構描述中的兩個資料表。

### 指標資料表
<a name="connectors-cwmetrics-the-metrics-table"></a>

`metrics` 資料表包含由命名空間、集合和名稱組合唯一定義的可用指標。`metrics` 資料表包含以下資料欄。
+ **namespace** - 包含命名空間的 `VARCHAR`。
+ **metric\$1name** - 包含指標名稱的 `VARCHAR`。
+ **dimensions** - `STRUCT` 物件的 `LIST`，由 `dim_name (VARCHAR)` 和 `dim_value (VARCHAR)` 組成。
+ **statistic** - `VARCH` 統計資料的 `LIST` (例如，`p90`、`AVERAGE` ...)，可供指標使用。

### metric\$1samples 資料表
<a name="connectors-cwmetrics-the-metric_samples-table"></a>

`metric_samples` 資料表包含 `metrics` 資料表中每個指標的可用指標範例。`metric_samples` 資料表包含以下資料欄。
+ **namespace** - 包含命名空間的 `VARCHAR`。
+ **metric\$1name** - 包含指標名稱的 `VARCHAR`。
+ **dimensions** - `STRUCT` 物件的 `LIST`，由 `dim_name (VARCHAR)` 和 `dim_value (VARCHAR)` 組成。
+ **dim\$1name**— 一個 `VARCHAR` 方便欄位，可用於輕鬆篩選單個維度名稱。
+ **dim\$1value**— 一個 `VARCHAR` 方便欄位，可用於輕鬆篩選單個維度值。
+ **period** - 一個表示指標「時段」的 `INT` 欄位 (以秒為單位) (例如，60 秒指標)。
+ **timestamp** - 表示指標範例所用 epoch 時間的 `BIGINT` 欄位 (以秒為單位)。
+ **value** - 包含範例值的 `FLOAT8` 欄位。
+ **statistic** - 包含範例統計類型的 `VARCHAR` (例如，`AVERAGE` 或者 `p90`)。

## 所需的許可
<a name="connectors-cwmetrics-required-permissions"></a>

如需詳細了解此連接器所需的 IAM 政策，請檢閱 [athena-cloudwatch-metrics.yaml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-cloudwatch-metrics/athena-cloudwatch-metrics.yaml) 檔案的 `Policies` 部分。以下清單摘要說明所需的許可。
+ **Amazon S3 寫入存取** - 連接器需要 Amazon S3 中某個位置的寫入存取權，以便從大型查詢中溢寫結果。
+ **Athena GetQueryExecution** - 當上游 Athena 查詢終止時，連接器會使用此許可快速失敗。
+ **CloudWatch Metrics ReadOnly** - 連接器會使用此權限來查詢您的指標資料。
+ **CloudWatch Logs Write** - 連接器使用此存取權來寫入其診斷日誌。

## 效能
<a name="connectors-cwmetrics-performance"></a>

Athena CloudWatch Metrics 連接器透過並行掃描査詢所需的日誌串流，嘗試依據 CloudWatch Metrics 來最佳化查詢。對於特定時段、指標、命名空間和維度篩選條件，會在 Lambda 函數和 CloudWatch Logs 中執行述詞下推。

## 授權資訊
<a name="connectors-cwmetrics-license-information"></a>

Amazon Athena CloudWatch Metrics 連接器專案是依據 [Apache-2.0 License](https://www.apache.org/licenses/LICENSE-2.0.html) 來授權的。

## 其他資源
<a name="connectors-cwmetrics-additional-resources"></a>

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-cloudwatch-metrics)。

# Amazon Athena AWS CMDB 連接器
<a name="connectors-cmdb"></a>

Amazon Athena AWS CMDB 連接器可讓 Athena 與各種 AWS 服務進行通訊，讓您可以使用 SQL 進行查詢。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-cmdb-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## Parameters
<a name="connectors-cmdb-parameters"></a>

使用本節中的參數來設定 AWS CMDB 連接器。

### Glue 連線 (建議)
<a name="connectors-cmdb-gc"></a>

建議您使用 AWS Glue 連線物件來設定 CMDB 連接器。若要這樣做，請將 AWS CMDB 連接器 Lambda `glue_connection`的環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type CMDB
```

**Lambda 環境屬性**

**glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 AWS Glue 連線建立的 CMDB 連接器不支援使用多工處理常式。
使用 AWS Glue 連線建立的 CMDB 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-cmdb-legacy"></a>

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。

下方列出的參數名稱和定義適用於未使用關聯 Glue 連線建立的 Athena 資料來源連接器。只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器或未指定 `glue_connection` 環境屬性時，才會使用下列參數。

**Lambda 環境屬性**
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。
+ **default\$1ec2\$1image\$1owner** - (選用) 設定後，控制篩選 [Amazon Machine Image (AMI)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html) 的預設 Amazon EC2 映像擁有者。如果您未設定此值，且您針對 EC2 映像資料表的查詢不包含擁有者的篩選條件，則您的結果將包含所有公有映像。

## 資料庫和資料表
<a name="connectors-cmdb-databases-and-tables"></a>

Athena AWS CMDB 連接器可讓下列資料庫和資料表可用於查詢您的 AWS 資源庫存。如需有關每個資料表中可用資料欄的詳細資訊，請使用 Athena 主控台或 API 執行 `DESCRIBE database.table` 陳述式。
+ **ec2** - 此資料庫包含與 Amazon EC2 相關的資源，包括下列資源。
+ **ebs\$1volumes** - 包含您的 Amazon EBS 磁碟區的詳細資訊。
+ **ec2\$1instances** - 包含您的 EC2 執行個體的詳細資訊。
+ **ec2\$1images** - 包含您的 EC2 執行個體映像的詳細資訊。
+ **routing\$1tables** - 包含您的 VPC 路由表的詳細資訊。
+ **security\$1groups** - 包含安全性群組的詳細資訊。
+ **subnets** - 包含 VPC 子網的詳細資訊。
+ **vpcs** - 包含 VPC 的詳細資訊。
+ **emr** - 此資料庫包含與 Amazon EMR 相關的資源，包括下列資源。
+ **emr\$1clusters** - 包含 EMR 叢集的詳細資訊。
+ **rds** - 此資料庫包含與 Amazon RDS 相關的資源，包括下列資源。
+ **rds\$1instances** - 包含您的 RDS 執行個體的詳細資訊。
+ **s3** - 此資料庫包含與 RDS 相關的資源，包括下列資源。
+ **buckets** - 包含您的 Amazon S3 儲存貯體的詳細資訊。
+ **objects** - 包含 Amazon S3 物件的詳細資訊，但不包含其內容。

## 所需的許可
<a name="connectors-cmdb-required-permissions"></a>

如需詳細了解此連接器所需的 IAM 政策，請檢閱 [athena-aws-cmdb.yaml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-aws-cmdb/athena-aws-cmdb.yaml) 檔案的 `Policies` 部分。以下清單摘要說明所需的許可。
+ **Amazon S3 寫入存取** - 連接器需要 Amazon S3 中某個位置的寫入存取權，以便從大型查詢中溢寫結果。
+ **Athena GetQueryExecution** - 當上游 Athena 查詢終止時，連接器會使用此許可快速失敗。
+ **S3 List** - 連接器使用此許可列出您的 Amazon S3 儲存貯體和物件。
+ **EC2 Describe** - 連接器使用此權限來描述資源，例如您的 Amazon EC2 執行個體、安全群組、VPC 和 Amazon EBS 磁碟區。
+ **EMR Describe / List** - 連接器使用此權限來描述您的 EMR 叢集。
+ **RDS Describe** - 連接器使用此許可來描述您的 RDS 執行個體。

## 效能
<a name="connectors-cmdb-performance"></a>

目前，Athena AWS CMDB 連接器不支援平行掃描。在 Lambda 函數內執行述詞下推。如果可能，部分述詞會被推送到正在查詢的服務。例如，查詢特定 Amazon EC2 執行個體的詳細資訊會使用特定執行個體 ID 呼叫 EC2 API，以執行目標描述操作。

## 授權資訊
<a name="connectors-cmdb-license-information"></a>

Amazon Athena AWS CMDB 連接器專案是根據 [Apache-2.0 授權進行授權。](https://www.apache.org/licenses/LICENSE-2.0.html)

## 其他資源
<a name="connectors-cmdb-additional-resources"></a>

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-aws-cmdb)。

# Amazon Athena IBM Db2 連接器
<a name="connectors-ibm-db2"></a>

適用於 Db2 的 Amazon Athena 連接器可讓 Amazon Athena 使用 JDBC 對 IBM Db2 資料庫執行 SQL 查詢。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-dbtwo-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。
+ 您必須先設定 VPC 和安全群組，才能使用此連接器。如需詳細資訊，請參閱[為資料來源連接器或 AWS Glue 連線建立 VPC](athena-connectors-vpc-creation.md)。

## 限制
<a name="connectors-ibm-db2-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 篩選條件中的日期和時間戳記資料類型必須轉換為適當的資料類型。

## 條款
<a name="connectors-ibm-db2-terms"></a>

下列術語與 Db2 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-ibm-db2-parameters"></a>

使用本節中的參數來設定 Db2 連接器。

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。  
下方列出的參數名稱和定義適用於 2024 年 12 月 3 日之前建立的 Athena 資料來源連接器。這些可能與其對應的 [AWS Glue 連線屬性](https://docs.aws.amazon.com/glue/latest/dg/connection-properties.html)不同。從 2024 年 12 月 3 日開始，只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器時，才會使用下列參數。

### Glue 連線 (建議)
<a name="connectors-ibm-db2-gc"></a>

我們建議您使用 Glue 連線物件來設定 Db2 連接器。為此，請將 Db2 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type DB2
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **none** – 請勿變更指定的結構描述和資料表名稱的大小寫。這是具有關聯 Glue 連線的連接器的預設值。
  + **upper** – 將所有指定的結構描述和資料表名稱轉換為大寫。
  + **lower** – 將所有指定的結構描述和資料表名稱轉換為小寫。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 Db2 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Db2 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-ibm-db2-legacy"></a>

#### 連接字串
<a name="connectors-ibm-db2-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
dbtwo://${jdbc_connection_string}
```

#### 使用多工處理常式
<a name="connectors-ibm-db2-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | Db2MuxCompositeHandler | 
| 中繼資料處理常式 | Db2MuxMetadataHandler | 
| 記錄處理常式 | Db2MuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-ibm-db2-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 mydbtwocatalog，則環境變數名稱為 mydbtwocatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 Db2 MUX Lambda 函數：`dbtwo1` (預設) 和 `dbtwo2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | dbtwo://jdbc:db2://dbtwo1.hostname:port/database\$1name:\$1\$1secret1\$1name\$1 | 
| dbtwo\$1catalog1\$1connection\$1string | dbtwo://jdbc:db2://dbtwo1.hostname:port/database\$1name:\$1\$1secret1\$1name\$1 | 
| dbtwo\$1catalog2\$1connection\$1string | dbtwo://jdbc:db2://dbtwo2.hostname:port/database\$1name:\$1\$1secret2\$1name\$1 | 

##### 提供憑證
<a name="connectors-ibm-db2-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${secret_name}`。

```
dbtwo://jdbc:db2://hostname:port/database_name:${secret_name}
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
dbtwo://jdbc:db2://hostname:port/database_name:user=user_name;password=password;
```

#### 使用單一連接處理常式
<a name="connectors-ibm-db2-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 Db2 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | Db2CompositeHandler | 
| 中繼資料處理常式 | Db2MetadataHandler | 
| 記錄處理常式 | Db2RecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-ibm-db2-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函數所支援的單一 Db2 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | dbtwo://jdbc:db2://hostname:port/database\$1name:\$1\$1secret\$1name\$1  | 

#### 溢出參數
<a name="connectors-ibm-db2-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-ibm-db2-data-type-support"></a>

下表顯示 JDBC 和 Arrow 的相應資料類型。


****  

| Db2 | Arrow | 
| --- | --- | 
| CHAR | VARCHAR | 
| VARCHAR | VARCHAR | 
| DATE | DATEDAY | 
| TIME | VARCHAR | 
| TIMESTAMP | DATEMILLI | 
| DATETIME | DATEMILLI | 
| BOOLEAN | BOOL | 
| SMALLINT | SMALLINT | 
| INTEGER | INT | 
| BIGINT | BIGINT | 
| DECIMAL | DECIMAL | 
| REAL | FLOAT8 | 
| DOUBLE | FLOAT8 | 
| DECFLOAT | FLOAT8 | 

## 分割區和分隔
<a name="connectors-ibm-db2-partitions-and-splits"></a>

分割區由 `varchar` 類型的一或多個分割區資料欄表示。Db2 連接器使用下列組織結構描述建立分割區。
+ 依雜湊分配
+ 依範圍分割
+ 依維度組織

連接器會從一或多個 Db2 中繼資料資料表擷取分割區詳細資訊，例如分割區數目和資料欄名稱。根據識別的分割區數目建立分割。

## 效能
<a name="connectors-ibm-db2-performance"></a>

Athena Db2 連接器執行述詞下推，以減少查詢掃描的資料。`LIMIT` 子句、簡單述詞和複雜的表達式會下推至連接器，以減少掃描的資料量並縮短查詢執行時間。

### LIMIT 子句
<a name="connectors-dbtwo-performance-limit-clauses"></a>

`LIMIT N` 陳述句可減少查詢掃描的資料。透過 `LIMIT N` 下推，連接器只會向 Athena 傳回 `N` 個資料列。

### 述詞
<a name="connectors-dbtwo-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena Db2 連接器可以合併這些表達式，並將其直接推送至 Db2，以增強功能並減少掃描的資料量。

下列 Athena Db2 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1DISTINCT\$1FROM、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-dbtwo-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d))
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%') 
LIMIT 10;
```

## 傳遞查詢
<a name="connectors-dbtwo-passthrough-queries"></a>

Db2 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Db2 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Db2 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-dbtwo-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-db2/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-db2/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-dbtwo-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 Db2 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-db2/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-db2)。

# Amazon Athena IBM Db2 AS/400 (Db2 iSeries) 連接器
<a name="connectors-ibm-db2-as400"></a>

適用於 Db2 AS/400 的 Amazon Athena 連接器可讓 Amazon Athena 使用 JDBC 對 IBM Db2 AS/400 (Db2 iSeries) 資料庫執行 SQL 查詢。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-db2as400-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。
+ 您必須先設定 VPC 和安全群組，才能使用此連接器。如需詳細資訊，請參閱[為資料來源連接器或 AWS Glue 連線建立 VPC](athena-connectors-vpc-creation.md)。

## 限制
<a name="connectors-ibm-db2-as400-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 篩選條件中的日期和時間戳記資料類型必須轉換為適當的資料類型。

## 條款
<a name="connectors-ibm-db2-as400-terms"></a>

下列術語與 Db2 AS/400 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-ibm-db2-as400-parameters"></a>

使用本節中的參數來設定 Db2 AS/400 連接器。

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。  
下方列出的參數名稱和定義適用於 2024 年 12 月 3 日之前建立的 Athena 資料來源連接器。這些可能與其對應的 [AWS Glue 連線屬性](https://docs.aws.amazon.com/glue/latest/dg/connection-properties.html)不同。從 2024 年 12 月 3 日開始，只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器時，才會使用下列參數。

### Glue 連線 (建議)
<a name="connectors-ibm-db2-as400-gc"></a>

我們建議您使用 Glue 連線物件來設定 Db2 AS/400 連接器。為此，請將 Db2 AS/400 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type DB2AS400
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **none** – 請勿變更指定的結構描述和資料表名稱的大小寫。這是具有關聯 Glue 連線的連接器的預設值。
  + **upper** – 將所有指定的結構描述和資料表名稱轉換為大寫。
  + **lower** – 將所有指定的結構描述和資料表名稱轉換為小寫。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 Db2 AS/400 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Db2 AS/400 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-ibm-db2-as400-legacy"></a>

#### 連接字串
<a name="connectors-ibm-db2-as400-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
db2as400://${jdbc_connection_string}
```

#### 使用多工處理常式
<a name="connectors-ibm-db2-as400-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | Db2MuxCompositeHandler | 
| 中繼資料處理常式 | Db2MuxMetadataHandler | 
| 記錄處理常式 | Db2MuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-ibm-db2-as400-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 mydb2as400catalog，則環境變數名稱為 mydb2as400catalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 Db2 MUX Lambda 函數：`db2as4001` (預設) 和 `db2as4002`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | db2as400://jdbc:as400://<ip\$1address>;<properties>;:\$1\$1<secret name>\$1; | 
| db2as400\$1catalog1\$1connection\$1string | db2as400://jdbc:as400://db2as4001.hostname/:\$1\$1secret1\$1name\$1 | 
| db2as400\$1catalog2\$1connection\$1string | db2as400://jdbc:as400://db2as4002.hostname/:\$1\$1secret2\$1name\$1 | 
| db2as400\$1catalog3\$1connection\$1string | db2as400://jdbc:as400://<ip\$1address>;user=<username>;password=<password>;<properties>; | 

##### 提供憑證
<a name="connectors-ibm-db2-as400-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${secret_name}`。

```
db2as400://jdbc:as400://<ip_address>;<properties>;:${<secret_name>};
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
db2as400://jdbc:as400://<ip_address>;user=<username>;password=<password>;<properties>;
```

#### 使用單一連接處理常式
<a name="connectors-ibm-db2-as400-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 Db2 AS/400 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | Db2CompositeHandler | 
| 中繼資料處理常式 | Db2MetadataHandler | 
| 記錄處理常式 | Db2RecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-ibm-db2-as400-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函式所支援的單一 Db2 AS/400 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | db2as400://jdbc:as400://<ip\$1address>;<properties>;:\$1\$1<secret\$1name>\$1; | 

#### 溢出參數
<a name="connectors-ibm-db2-as400-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-ibm-db2-as400-data-type-support"></a>

下表顯示 JDBC 和 Apache Arrow 的相應資料類型。


****  

| Db2 AS/400 | Arrow | 
| --- | --- | 
| CHAR | VARCHAR | 
| VARCHAR | VARCHAR | 
| DATE | DATEDAY | 
| TIME | VARCHAR | 
| TIMESTAMP | DATEMILLI | 
| DATETIME | DATEMILLI | 
| BOOLEAN | BOOL | 
| SMALLINT | SMALLINT | 
| INTEGER | INT | 
| BIGINT | BIGINT | 
| DECIMAL | DECIMAL | 
| REAL | FLOAT8 | 
| DOUBLE | FLOAT8 | 
| DECFLOAT | FLOAT8 | 

## 分割區和分隔
<a name="connectors-ibm-db2-as400-partitions-and-splits"></a>

分割區由 `varchar` 類型的一或多個分割區資料欄表示。Db2 AS/400 連接器使用下列組織結構描述建立分割區。
+ 依雜湊分配
+ 依範圍分割
+ 依維度組織

連接器會從一或多個 Db2 AS/400 中繼資料資料表擷取分割區詳細資訊，例如分割區數目和資料欄名稱。根據識別的分割區數目建立分割。

## 效能
<a name="connectors-db2-as400-performance"></a>

為了提升效能，請使用述詞下推從 Athena 查詢，如下列範例所示。

```
SELECT * FROM "lambda:<LAMBDA_NAME>"."<SCHEMA_NAME>"."<TABLE_NAME>" 
 WHERE integercol = 2147483647
```

```
SELECT * FROM "lambda: <LAMBDA_NAME>"."<SCHEMA_NAME>"."<TABLE_NAME>" 
 WHERE timestampcol >= TIMESTAMP '2018-03-25 07:30:58.878'
```

## 傳遞查詢
<a name="connectors-db2as400-passthrough-queries"></a>

Db2 AS/400 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Db2 AS/400 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Db2 AS/400 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-db2as400-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-db2-as400/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-db2-as400/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-db2as400-additional-resources"></a>

如需最新的 JDBC 驅動器版本資訊，請參閱 GitHub.com 上 Db2 AS/400 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-db2-as400/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-db2-as400)。

# Amazon Athena DocumentDB 連接器
<a name="connectors-docdb"></a>

Amazon Athena DocumentDB 連接器讓 Athena 能夠與您的 DocumentDB 執行個體通訊，以便使用 SQL 來查詢您的 DocumentDB 資料。此連接器也適用於 MongoDB 相容的任何端點。

與傳統的關聯式資料存放區不同，Amazon DocumentDB 集合沒有集結構描述。DocumentDB 沒有中繼資料存放區。DocumentDB 集合中的每個項目可以有不同的欄位和資料類型。

DocumentDB 連接器支援兩種產生資料表結構描述資訊的機制：基本結構描述推論和 AWS Glue Data Catalog 中繼資料。

結構描述推斷是預設值。此選項會掃描集合中的少量文件，形成所有欄位的聯集，並指定具有非重疊資料類型的欄位。此選項適用於大多數具有統一條目的集合。

對於具有更多資料類型的集合，連接器支援從 AWS Glue Data Catalog中擷取中繼資料。如果連接器看到符合您 DocumentDB AWS Glue 資料庫和集合名稱的資料庫和資料表，則會從對應的 AWS Glue 資料表取得其結構描述資訊。當您建立 AWS Glue 資料表時，建議您將其設定為您可能想要從 DocumentDB 集合存取的所有欄位的超級集合。

如果您的 帳戶中已啟用 Lake Formation，則您在 中部署的 Athena 聯合 Lambda 連接器的 IAM 角色 AWS Serverless Application Repository 必須在 Lake Formation 中具有對 的讀取存取權 AWS Glue Data Catalog。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-docdb-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## Parameters
<a name="connectors-docdb-parameters"></a>

使用本節中的參數來設定 DocumentDB 連接器。

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。  
下方列出的參數名稱和定義適用於 2024 年 12 月 3 日之前建立的 Athena 資料來源連接器。這些可能與其對應的 [AWS Glue 連線屬性](https://docs.aws.amazon.com/glue/latest/dg/connection-properties.html)不同。從 2024 年 12 月 3 日開始，只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器時，才會使用下列參數。

### Glue 連線 (建議)
<a name="connectors-docdb-gc"></a>

我們建議您使用 Glue 連線物件來設定 DocumentDB 連接器。為此，請將 DocumentDB 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type DOCUMENTDB
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 DocumentDB 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 DocumentDB 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-docdb-legacy"></a>
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。
+ **disable\$1glue** – （選用） 如果存在並設為 true，連接器不會嘗試從中擷取補充中繼資料 AWS Glue。
+ **glue\$1catalog** - (選用) 使用此選項可指定[跨帳戶 AWS Glue 目錄](data-sources-glue-cross-account.md)。根據預設，連接器會嘗試從自己的 AWS Glue 帳戶取得中繼資料。
+ **default\$1docdb** - 如果存在，請指定當不存在目錄特定環境變數時要使用的 DocumentDB 連接字串。
+ **disable\$1projection\$1and\$1casing** - (選用) 停用投影和大小寫。如果想要查詢使用區分大小寫資料欄名稱的 Amazon DocumentDB 資料表，請使用此選項。`disable_projection_and_casing` 參數使用下列值來指定大小寫和資料欄映射的行為：
  + **false** – 這是預設設定。投影已啟用，連接器預期所有資料欄名稱都為小寫字母。
  + **true** – 停用投影和大小寫。使用 `disable_projection_and_casing` 參數時，請謹記以下幾點：
    + 使用該參數可能會導致更高的頻寬用量。此外，如果您的 Lambda 函數與資料來源位於不同的 AWS 區域 ，則將因為頻寬用量增加而產生較高的標準 AWS 跨區域傳輸成本。如需跨區域傳輸成本的詳細資訊，請參閱 AWS 合作夥伴網路部落格中的[AWS 伺服器和無伺服器架構的資料傳輸費用](https://aws.amazon.com/blogs/apn/aws-data-transfer-charges-for-server-and-serverless-architectures/)。
    + 由於傳輸的位元組數目較多，而且位元組數目越多，需要越長的還原序列化時間，因此整體延遲可能會增加。
+ **enable\$1case\$1insensitive\$1match** – (選用) 當 `true` 時，針對 Amazon DocumentDB 中的結構描述和資料表名稱執行不區分大小寫搜尋。預設值為 `false`。查詢包含大寫的結構描述或資料表名稱時使用。

#### 指定連接字串
<a name="connectors-docdb-specifying-connection-strings"></a>

您可以提供一個或多個屬性，以定義與連接器搭配使用的 DocumentDB 執行個體的 DocumentDB 連接詳細資訊。因此，請設定您要在 Athena 使用的目錄名稱所對應的 Lambda 環境變數。例如，假設您想要使用下列查詢來查詢來自 Athena 的兩個不同 DocumentDB 執行個體：

```
SELECT * FROM "docdb_instance_1".database.table
```

```
SELECT * FROM "docdb_instance_2".database.table
```

您必須先將兩個環境變數 `docdb_instance_1` 和 `docdb_instance_2` 新增至 Lambda 函數，才能使用這兩個 SQL 陳述式。每個陳述式的值應該為以下格式的 DocumentDB 連接字串：

```
mongodb://:@:/?ssl=true&ssl_ca_certs=rds-combined-ca-bundle.pem&replicaSet=rs0      
```

##### 使用秘密
<a name="connectors-docdb-using-secrets"></a>

您可以選擇性地將 AWS Secrets Manager 用於連線字串詳細資訊的部分或全部值。若要搭配使用 Athena 聯合查詢功能和 Secrets Manager，連接到您的 Lambda 函數的 VPC 應該具有[網際網路存取權](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接到 Secrets Manager。

如果您使用語法 `${my_secret}` 將 Secrets Manager 秘密的名稱放入連接字串中，連接器會以 Secret Manager 中的相應純文字值來取代 `${my_secret}`。秘密應儲存為具有值 `<username>:<password>` 的純文字秘密。儲存為 `{username:<username>,password:<password>}` 的秘密將不會正確地傳遞給連接字串。

秘密也可以完整地用於整個連接字串，並且可以在秘密中定義使用者名稱和密碼。

例如，假設您將 `docdb_instance_1` 的 Lambda 環境變數設定為以下值：

```
mongodb://${docdb_instance_1_creds}@myhostname.com:123/?ssl=true&ssl_ca_certs=rds-combined-ca-bundle.pem&replicaSet=rs0         
```

Athena Query Federation 軟體開發套件會自動嘗試從 Secrets Manager 中擷取名為 `docdb_instance_1_creds` 的秘密，並將該值放入 `${docdb_instance_1_creds}` 位置。由 `${ }` 字元組合括住的連接字串的任何部分會被解譯為 Secrets Manager 的秘密。如果您指定連接器在 Secrets Manager 中找不到的秘密名稱，則連接器不會取代該文字。

## 擷取補充中繼資料
<a name="supplemental-metadata"></a>

若要擷取補充中繼資料，請依照以下步驟，設定 Glue 資料庫和資料表。

### 設定 Glue 資料庫
<a name="setup-glue-database"></a>

1. 建立與 DocumentDB 集合同名的 Glue 資料庫。

1. 在位置 URI 欄位中，輸入 `docdb-metadata-flag`。

### 設定 Glue 資料表
<a name="setup-glue-table"></a>

將下列參數新增至您的 Glue 資料表：
+ `docdb-metadata-flag = true`
+ `columnMapping = apple=APPLE`

  在此範例中，`apple` 表示 Glue 中的小寫資料欄名稱，而 `APPLE` 表示 DocumentDB 集合中實際的區分大小寫的資料欄名稱。

### 驗證中繼資料擷取
<a name="verify-metadata-retrieval"></a>

1. 執行查詢。

1. 檢查 Lambda 函式的 CloudWatch 日誌，以確認中繼資料擷取是否成功。成功擷取將顯示下列日誌項目：

   ```
   doGetTable: Retrieved schema for table[TableName{schemaName=test, tableName=profiles}] from AWS Glue.
   ```

**注意**  
如果您的資料表已設定 `columnMapping` 欄位，則您只需要將 `docdb-metadata-flag = true` 參數新增至資料表屬性。

## 在 中設定資料庫和資料表 AWS Glue
<a name="connectors-docdb-setting-up-databases-and-tables-in-aws-glue"></a>

由於連接器的內建結構描述推論功能會掃描有限數量的文件，並僅支援一部分資料類型，因此您可能想要將 AWS Glue 用於中繼資料。

若要啟用 AWS Glue 資料表以搭配 Amazon DocumentDB 使用，您必須擁有要為其提供補充中繼資料的 DocumentDB 資料庫和集合的資料庫和 AWS Glue 資料表。

**使用 AWS Glue 資料表補充中繼資料**

1. 使用 AWS Glue 主控台建立與 Amazon DocumentDB AWS Glue 資料庫名稱同名的資料庫。

1. 將資料庫的 URI 屬性設定為包含 **docdb-metadata-flag**。

1. (選用) 新增 **sourceTable** 資料表屬性。此屬性定義 Amazon DocumentDB 中的來源資料表名稱。如果您的 AWS Glue 資料表名稱與 Amazon DocumentDB 中的資料表名稱不同，請使用此屬性。 AWS Glue 與 Amazon DocumentDB 之間命名規則的差異可能會使此成為必要。例如， AWS Glue 資料表名稱中不允許大寫字母，但 Amazon DocumentDB 資料表名稱中允許大寫字母。

1. (選用) 新增 **columnMapping** 資料表屬性。此屬性可定義資料欄名稱映射。如果 AWS Glue 資料欄命名規則阻止您建立的資料欄名稱與 Amazon DocumentDB AWS Glue 資料表中的資料欄名稱相同，請使用此屬性。這非常有用，因為 Amazon DocumentDB 資料欄名稱中允許大寫字母，但 AWS Glue 資料欄名稱中不允許。

   `columnMapping` 屬性值應該是格式 `col1=Col1,col2=Col2` 中的一組映射。
**注意**  
 資料欄映射僅適用於頂層資料欄名稱，而不適用於巢狀欄位。

   新增 AWS Glue `columnMapping`資料表屬性後，您可以移除 `disable_projection_and_casing` Lambda 環境變數。

1. 請確定您使用適用於本文件 AWS Glue 所列 的資料類型。

## 支援的資料類型
<a name="connectors-docdb-data-type-support"></a>

本節列出 DocumentDB 連接器用於結構描述推論的資料類型，以及使用 AWS Glue 中繼資料時的資料類型。

### 結構描述推斷資料類型
<a name="connectors-docdb-schema-inference-data-types"></a>

DocumentDB 連接器的結構描述推斷功能會嘗試將值推斷為以下資料類型之一。該資料表顯示 Amazon DocumentDB、Java 和 Apache Arrow 的相應資料類型。


****  

| Apache Arrow | Java 或 DocDB | 
| --- | --- | 
| VARCHAR | String | 
| INT | Integer | 
| BIGINT | Long | 
| BIT | Boolean | 
| FLOAT4 | Float | 
| FLOAT8 | Double | 
| TIMESTAMPSEC | Date | 
| VARCHAR | ObjectId | 
| LIST | 清單 | 
| STRUCT | 文件 | 

### AWS Glue 資料類型
<a name="connectors-docdb-glue-data-types"></a>

如果您使用 AWS Glue 補充中繼資料，則可以設定下列資料類型。資料表顯示 AWS Glue 和 Apache Arrow 的對應資料類型。


****  

| AWS Glue | Apache Arrow | 
| --- | --- | 
| int | INT | 
| bigint | BIGINT | 
| double | FLOAT8 | 
| float | FLOAT4 | 
| boolean | BIT | 
| binary | VARBINARY | 
| string | VARCHAR | 
| 清單 | LIST | 
| Struct | STRUCT | 

## 所需的許可
<a name="connectors-docdb-required-permissions"></a>

如需詳細了解此連接器所需的 IAM 政策，請檢閱 [athena-docdb.yaml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-docdb/athena-docdb.yaml) 檔案的 `Policies` 部分。以下清單摘要說明所需的許可。
+ **Amazon S3 寫入存取** - 連接器需要 Amazon S3 中某個位置的寫入存取權，以便從大型查詢中溢寫結果。
+ **Athena GetQueryExecution** - 當上游 Athena 查詢終止時，連接器會使用此許可快速失敗。
+ **AWS Glue Data Catalog** – DocumentDB 連接器需要對 的唯讀存取權 AWS Glue Data Catalog ，才能取得結構描述資訊。
+ **CloudWatch Logs** - 連接器需要存取 CloudWatch Logs 以儲存日誌。
+ **AWS Secrets Manager 讀取存取** – 如果您選擇將 DocumentDB 端點詳細資訊儲存在 Secrets Manager 中，則必須授予連接器存取這些秘密的權限。
+ **VPC 存取** - 連接器需要能夠將介面連接到 VPC 並能進行分離，以便可進行連接並與 DocumentDB 執行個體通訊。

## 效能
<a name="connectors-docdb-performance"></a>

Athena Amazon DocumentDB 連接器目前不支援平行掃描，但會嘗試下推述詞作為其 DocumentDB 查詢的一部分，而針對 DocumentDB 集合上之索引的述詞會導致掃描的資料大幅減少。

Lambda 函數執行投影下推，以減少查詢掃描的資料。不過，選取資料欄子集有時會導致較長的查詢執行時期。`LIMIT` 子句可減少掃描的資料量，但是如果您未提供述詞，則應期望具有 `LIMIT` 子句的 `SELECT` 查詢掃描至少 16 MB 的資料。

## 傳遞查詢
<a name="connectors-docdb-passthrough-queries"></a>

Athena Amazon DocumentDB 連接器支援[傳遞查詢](federated-query-passthrough.md)，並且以 NoSQL 為基礎。如需有關查詢 Amazon DocumentDB 的資訊，請參閱《Amazon DocumentDB 開發人員指南**》中的[查詢](https://docs.aws.amazon.com/documentdb/latest/developerguide/querying.html)。

若要透過 Amazon DocumentDB 使用傳遞查詢，請使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            database => 'database_name',
            collection => 'collection_name',
            filter => '{query_syntax}'
        ))
```

下列範例會查詢 `TPCDS` 集合內的 `example` 資料庫，進而篩選出所有標題為*權利法案*的書籍。

```
SELECT * FROM TABLE(
        system.query(
            database => 'example',
            collection => 'tpcds',
            filter => '{title: "Bill of Rights"}'
        ))
```

## 其他資源
<a name="connectors-docdb-additional-resources"></a>
+ 如需使用 [Amazon Athena 聯合查詢](federated-queries.md)將 MongoDB 資料庫連線至 [Quick](https://aws.amazon.com/quicksight/) 以建置儀表板和視覺化效果的文章，請參閱 大數據部落格中的[使用 Amazon Athena 聯合查詢視覺化來自 Quick 的 MongoDB ](https://aws.amazon.com/blogs/big-data/visualize-mongodb-data-from-amazon-quicksight-using-amazon-athena-federated-query/) 資料。 *AWS *
+ 如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-docdb)。

# Amazon Athena DynamoDB 連接器
<a name="connectors-dynamodb"></a>

Amazon Athena DynamoDB 連接器讓 Amazon Athena 能夠與 DynamoDB 通訊，以便使用 SQL 來查詢您的資料表。不支援 [INSERT INTO](insert-into.md) 等寫入操作。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

如果您的 帳戶中已啟用 Lake Formation，則您在 中部署的 Athena 聯合 Lambda 連接器的 IAM 角色 AWS Serverless Application Repository 必須在 Lake Formation 中具有對 的讀取存取權 AWS Glue Data Catalog。

## 先決條件
<a name="connectors-dynamodb-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-dynamodb-limitations"></a>

如果將 DynamoDB 連線移轉至 Glue Catalog 和 Lake Formation，則僅會辨識小寫的資料表和資料欄名稱。

## Parameters
<a name="connectors-dynamodb-parameters"></a>

使用本節中的參數來設定 DynamoDB 連接器。

### Glue 連線 (建議)
<a name="ddb-gc"></a>

我們建議您使用 Glue 連線物件來設定 DynamoDB 連接器。為此，請將 DynamoDB 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type DYNAMODB
```

**Lambda 環境屬性**

**glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 DynamoDB 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 DynamoDB 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="ddb-legacy"></a>

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。

下方列出的參數名稱和定義適用於未使用關聯 Glue 連線建立的 Athena 資料來源連接器。只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器或未指定 `glue_connection` 環境屬性時，才會使用下列參數。

**Lambda 環境屬性**
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。
+ **disable\$1glue** – （選用） 如果存在並設為 true，連接器不會嘗試從中擷取補充中繼資料 AWS Glue。
+ **glue\$1catalog** - (選用) 使用此選項可指定[跨帳戶 AWS Glue 目錄](data-sources-glue-cross-account.md)。根據預設，連接器會嘗試從自己的 AWS Glue 帳戶取得中繼資料。
+ **disable\$1projection\$1and\$1casing** - (選用) 停用投影和大小寫。如果您想要查詢其資料欄名稱中有大小寫的 DynamoDB 資料表並且不想在 AWS Glue 中指定 `columnMapping` 屬性，請使用它。

  `disable_projection_and_casing` 參數使用下列值來指定大小寫和資料欄映射的行為：
  + **auto** (自動) - 當偵測到先前不支援的類型且未在資料表中設定資料欄名稱映射時，停用投影和大小寫。這是預設設定。
  + **always** (永遠) - 無條件停用投影和大小寫。當 DynamoDB 資料欄名稱中有大小寫，但您不想指定任何資料欄名稱映射時，此功能非常有用。

  使用 `disable_projection_and_casing` 參數時，請謹記以下幾點：
  + 使用該參數可能會導致更高的頻寬用量。此外，如果您的 Lambda 函數與資料來源位於不同的 AWS 區域 ，則將因為頻寬用量增加而產生較高的標準 AWS 跨區域傳輸成本。如需跨區域傳輸成本的詳細資訊，請參閱 AWS 合作夥伴網路部落格中的[AWS 伺服器和無伺服器架構的資料傳輸費用](https://aws.amazon.com/blogs/apn/aws-data-transfer-charges-for-server-and-serverless-architectures/)。
  + 由於傳輸的位元組數目較多，而且位元組數目越多，需要越長的還原序列化時間，因此整體延遲可能會增加。

## 在 中設定資料庫和資料表 AWS Glue
<a name="connectors-dynamodb-setting-up-databases-and-tables-in-aws-glue"></a>

由於連接器的內建結構描述推論功能有限，您可能想要將 AWS Glue 用於中繼資料。若要這樣做，您必須在其中擁有資料庫和資料表 AWS Glue。若要啟用資料庫和資料表以與 DynamoDB 搭配使用，您必須編輯其屬性。

**在 AWS Glue 主控台中編輯資料庫屬性**

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

1. 在導覽窗格中，展開**資料目錄**，然後選擇**資料庫**。

   在 **Databases** (資料庫) 頁面中，您可以編輯現有的資料庫，或選擇 **Add database** (新增資料庫) 來建立資料庫。

1. 在資料庫清單中，選擇您要編輯的資料庫連結。

1. 選擇**編輯**。

1. 在**更新資料庫**頁面的**資料庫設定**下，針對**位置**，新增字串 **dynamo-db-flag**。此關鍵字表示資料庫包含 Athena DynamoDB 連接器用於補充中繼資料的資料表，而 以外的 AWS Glue 資料庫則需要此資料表`default`。`dynamo-db-flag` 屬性有助於在具有許多資料庫的帳戶中篩選資料庫。

1. 選擇 **Update Database** (更新資料庫)。

**在 AWS Glue 主控台中編輯資料表屬性**

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

1. 在導覽窗格中，展開**資料目錄**，然後選擇**資料表**。

1. 在**資料表**頁面的資料表清單中，選擇您要編輯的資料表的連結名稱。

1. 選擇 **Actions** (動作)、**Edit table** (編輯資料表)。

1. 在 **Edit table** (編輯資料表) 頁面的 **Table properties** (資料表屬性) 部分中，根據需要新增以下資料表屬性。如果您使用 AWS Glue DynamoDB 爬蟲程式，系統會自動設定這些屬性。
   + **dynamodb** - 向 Athena DynamoDB 連接器發出指示的字串，指示資料表可用於補充中繼資料。在名為 **classification** (分類) 的欄位下的資料表屬性中輸入 `dynamodb` (完全匹配)。
**注意**  
 AWS Glue 主控台中屬於資料表建立程序一部分的設定資料表**屬性**頁面具有具有**分類**欄位**的資料格式**區段。在這裡您無法進入或選擇 `dynamodb`。相反，在建立資料表後，請依照下列步驟來編輯資料表，並在**資料表屬性**區段中輸入 `classification` 和 `dynamodb` 做為索引鍵值配對。
   + **sourceTable** - 在 DynamoDB 中定義來源資料表名稱的選用資料表屬性。如果 AWS Glue 資料表命名規則阻止您建立與 DynamoDB AWS Glue 資料表同名的資料表，請使用此選項。例如， AWS Glue 資料表名稱中不允許大寫字母，但 DynamoDB 資料表名稱中允許大寫字母。
   + **columnMapping** - 定義資料欄名稱映射的選用資料表屬性。如果 AWS Glue 資料欄命名規則阻止您建立與 DynamoDB AWS Glue 資料表具有相同資料欄名稱的資料表，請使用此選項。例如，資料 AWS Glue 欄名稱中不允許大寫字母，但 DynamoDB 資料欄名稱中不允許大寫字母。屬性值的格式應為：col1=Col1，col2=Col2。請注意，資料欄映射僅適用於頂層資料欄名稱，而不適用於巢狀欄位。
   + **defaultTimeZone** - 一個選用資料表屬性，套用至沒有明確時區的 `date` 或 `datetime` 值。若要避免資料來源預設時區與 Athena 工作階段時區之間的差異，設定此值是一個很好的方法。
   + **datetimeFormatMapping** – 選用資料表屬性，指定從 `date`或 `timestamp`資料類型的資料欄剖析資料時要使用的 AWS Glue `date`或 `datetime` 格式。如果未指定此屬性，連接器會嘗試[推斷](https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DateFormatUtils.html) ISO-8601 格式。如果連接器無法推斷 `date` 或者 `datetime` 的格式，或無法剖析原始字串，則會從結果中省略該值。

     `datetimeFormatMapping` 值的格式應為 `col1=someformat1,col2=someformat2`。以下是一些範例格式：

     ```
     yyyyMMdd'T'HHmmss 
     ddMMyyyy'T'HH:mm:ss
     ```

     如果您的資料欄具有沒有時區的 `date` 或 `datetime` 值，並且您想要在 `WHERE` 子句中使用該資料欄，請設定該資料欄的 `datetimeFormatMapping` 屬性。

1. 如果您手動定義資料欄，請務必使用適當的資料類型。如果您使用爬蟲程式，請驗證爬蟲程式發現的資料欄和類型。

1. 選擇**儲存**。

## 所需的許可
<a name="connectors-dynamodb-required-permissions"></a>

如需詳細了解此連接器所需的 IAM 政策，請檢閱 [athena-dynamodb.yaml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-dynamodb/athena-dynamodb.yaml) 檔案的 `Policies` 部分。以下清單摘要說明所需的許可。
+ **Amazon S3 寫入存取** - 連接器需要 Amazon S3 中某個位置的寫入存取權，以便從大型查詢中溢寫結果。
+ **Athena GetQueryExecution** - 當上游 Athena 查詢終止時，連接器會使用此許可快速失敗。
+ **AWS Glue Data Catalog** – DynamoDB 連接器需要對 的唯讀存取權 AWS Glue Data Catalog ，才能取得結構描述資訊。
+ **CloudWatch Logs** - 連接器需要存取 CloudWatch Logs 以儲存日誌。
+ **DynamoDB 讀取權限** - 連接器使用 `DescribeTable`、`ListSchemas`、`ListTables`、`Query` 以及 `Scan` API 操作。

## 效能
<a name="connectors-dynamodb-performance"></a>

Athena DynamoDB 連接器支援平行掃描，並嘗試下推述詞作為 DynamoDB 查詢的一部分。具有 `X` 個不同值的雜湊索引鍵述詞會導致對 DynamoDB 發出 `X` 個查詢呼叫。所有其他述詞案例都會導致 `Y` 個掃描呼叫，其中 `Y` 是根據資料表大小及其佈建的輸送量啟發式決定的。不過，選取資料欄子集有時會導致查詢執行期更長。

`LIMIT` 子句和簡單述詞會下推，可以減少掃描的資料量，並會導致查詢執行時間縮短。

### LIMIT 子句
<a name="connectors-dynamodb-performance-limit-clauses"></a>

`LIMIT N` 陳述句可減少查詢掃描的資料。透過 `LIMIT N` 下推，連接器只會向 Athena 傳回 `N` 個資料列。

### 述詞
<a name="connectors-dynamodb-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。為了增強功能及減少掃描的資料量，Athena DynamoDB 連接器可以合併這些表達式並將其直接推送至 DynamoDB。

下列 Athena DynamoDB 連接器運算子支援述詞下推：
+ **布林值：**AND
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1NULL

### 合併下推範例
<a name="connectors-dynamodb-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT *
FROM my_table
WHERE col_a > 10 and col_b < 10
LIMIT 10
```

如需有關使用述詞下推以改善聯合查詢中的效能 (包括 DynamoDB) 的文章，請參閱 *AWS 大數據部落格*中的[使用 Amazon Athena 中的述詞下推改善聯合查詢](https://aws.amazon.com/blogs/big-data/improve-federated-queries-with-predicate-pushdown-in-amazon-athena/)。

## 傳遞查詢
<a name="connectors-dynamodb-passthrough-queries"></a>

DynamoDB 連接器支援[傳遞查詢](federated-query-passthrough.md)，並且使用 PartiQL 語法。不支援 DynamoDB [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) API 操作。如需有關使用 PartiQL 查詢 DynamoDB 的資訊，請參閱《Amazon DynamoDB 開發人員指南**》中的[適用於 DynamoDB 的 PartiQL Select 陳述式](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.select.html)。

若要透過 DynamoDB 使用傳遞查詢，請使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query_string'
        ))
```

下列 DynamoDB 傳遞查詢範例使用 PartiQL 傳回 `DateWatched` 屬性晚於 12/24/22 的 Fire TV Stick 裝置清單。

```
SELECT * FROM TABLE(
        system.query(
           query => 'SELECT Devices 
                       FROM WatchList 
                       WHERE Devices.FireStick.DateWatched[0] > '12/24/22''
        ))
```

## 疑難排解
<a name="connectors-dynamodb-troubleshooting"></a>

### 排序索引鍵資料欄上的多個篩選條件
<a name="connectors-dynamodb-troubleshooting-sort-key-filters"></a>

**錯誤訊息**：KeyConditionExpressions 每個索引鍵只能包含一個條件

**原因**：在 DynamoDB 排序索引鍵資料欄上同時具有下限篩選條件和上限篩選條件的查詢中，Athena 引擎第 3 版可能會發生此問題。由於 DynamoDB 不支援排序索引鍵上的多個篩選條件，因此當連接器嘗試下推套用這兩個條件的查詢時，即會擲回錯誤。

**解決方案**：將連接器更新到 2023.11.1 版本或更新版本。如需有關更新連接器的說明，請參閱 [更新資料來源連接器](connectors-updating.md)。

## 成本
<a name="connectors-dynamodb-costs"></a>

連接器的使用成本取決於所使用的基礎 AWS 資源。因為使用掃描的查詢可能會消耗大量的[讀取容量單位 (RCU)](https://aws.amazon.com/dynamodb/pricing/provisioned/)，所以請仔細考慮 [Amazon DynamoDB 定價](https://aws.amazon.com/dynamodb/pricing/)資訊。

## 其他資源
<a name="connectors-dynamodb-additional-resources"></a>
+ 如需有關使用 Amazon Athena DynamoDB 連接器的說明，請參閱《*AWS 規範性指引模式*》指南中的[使用 Athena 存取、查詢和聯結 Amazon DynamoDB 資料表](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html)。
+ 如需如何使用 Athena DynamoDB 連接器透過 SQL 查詢 DynamoDB 中的資料並在 Quick 中視覺化洞見的文章，請參閱*AWS 大數據部落格*文章[使用 Amazon Athena DynamoDB 連接器在 Quick 中視覺化 Amazon DynamoDB 洞見和 Amazon Athena AWS Glue](https://aws.amazon.com/blogs/big-data/visualize-amazon-dynamodb-insights-in-amazon-quicksight-using-the-amazon-athena-dynamodb-connector-and-aws-glue/)。
+ 如需搭配 Amazon DynamoDB、Athena 和 Quick 使用 Amazon Athena DynamoDB 連接器來建立簡單控管儀表板的文章，請參閱[使用 Amazon Athena 聯合查詢查詢查詢跨帳戶 Amazon DynamoDB 資料表](https://aws.amazon.com/blogs/big-data/query-cross-account-amazon-dynamodb-tables-using-amazon-athena-federated-query/)之後*AWS 的大數據部落格*。 DynamoDB 
+ 如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb)。

# Amazon Athena Google BigQuery 連接器
<a name="connectors-bigquery"></a>

適用於 Google [BigQuery](https://cloud.google.com/bigquery/) 的 Amazon Athena 連接器可讓 Amazon Athena 能夠對 Google BigQuery 資料執行 SQL 查詢。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-bigquery-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-bigquery-limitations"></a>
+ Lambda 函數的逾時值上限為 15 分鐘。每次分割都會對 BigQuery 執行查詢，並且必須有足夠的時間來儲存結果，以便 Athena 讀取。如果 Lambda 函數逾時，查詢就會失敗。
+ Google BigQuery 區分大小寫。連接器會嘗試更正資料集名稱、資料表名稱和專案 ID 的大小寫。這是必要的，因為 Athena 會使所有中繼資料變為小寫。這些更正會對 Google BigQuery 產生許多額外呼叫。
+ 不支援二進位資料類型。
+ 由於 Google BigQuery 的並行處理和配額限制，連接器可能會遇到 Google 配額限制問題。為了避免這些問題，請盡可能多地向 Google BigQuery 推送限制條件。如需有關 BigQuery 配額的資訊，請參閱 Google BigQuery 文件中的[配額和限制](https://cloud.google.com/bigquery/quotas)。

## Parameters
<a name="connectors-bigquery-parameters"></a>

使用本節中的參數來設定 Google BigQuery 連接器。

### Glue 連線 (建議)
<a name="bigquery-gc"></a>

我們建議您使用 Glue 連線物件來設定 Google BigQuery 連接器。為此，請將 Google BigQuery 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type BIGQUERY
```

**Lambda 環境屬性**

**glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 Google BigQuery 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Google BigQuery 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="bigquery-legacy"></a>

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。

下方列出的參數名稱和定義適用於未使用關聯 Glue 連線建立的 Athena 資料來源連接器。只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器或未指定 `glue_connection` 環境屬性時，才會使用下列參數。

**Lambda 環境屬性**
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。
+ **gcp\$1project\$1id** - 專案 ID (非專案名稱)，它包含連接器應讀取的資料集 (例如，`semiotic-primer-1234567`)。
+ **secret\$1manager\$1gcp\$1creds\$1name** – 內秘密的名稱 AWS Secrets Manager ，其中包含 JSON 格式的 BigQuery 登入資料 （例如 `GoogleCloudPlatformCredentials`)。
+ **big\$1query\$1endpoint** – (選用) BigQuery 私有端點的 URL。如果想要透過私有端點存取 BigQuery，請使用此參數。

## 分割與檢視
<a name="connectors-bigquery-splits-and-views"></a>

由於 BigQuery 連接器使用 BigQuery Storage Read API 查詢資料表，並且 BigQuery Storage API 不支援檢視，因此連接器會使用具有單一分割的 BigQuery 用戶端以進行檢視。

## 效能
<a name="connectors-bigquery-performance"></a>

若要查詢資料表，BigQuery 連接器會使用 BigQuery Storage Read API，而該 API 使用了 RPC 型通訊協定，可快速存取 BigQuery 受管儲存。如需有關 BigQuery Storage Read API 的詳細資訊，請參閱 Google Cloud 文件中的[使用 BigQuery Storage Read API 讀取資料表資料](https://cloud.google.com/bigquery/docs/reference/storage)。

選取資料欄子集可大幅加速查詢執行期，並減少掃描的資料。隨著並行數目增加，連接器容易出現查詢失敗，且連接器速度通常較慢。

Athena Google BigQuery 連接器執行述詞下推，以減少查詢掃描的資料。`LIMIT` 子句、`ORDER BY` 子句、簡單述詞和複雜的表達式會下推至連接器，以減少掃描的資料量並縮短查詢執行時間。

### LIMIT 子句
<a name="connectors-bigquery-performance-limit-clauses"></a>

`LIMIT N` 陳述句可減少查詢掃描的資料。透過 `LIMIT N` 下推，連接器只會向 Athena 傳回 `N` 個資料列。

### 前 N 個查詢
<a name="connectors-bigquery-performance-top-n-queries"></a>

前 `N` 個查詢會指定結果集的順序，以及傳回的資料列數目的限制。您可以使用這種查詢類型，判斷資料集的前 `N` 個最大值或前 `N` 個最小值。透過前 `N` 個下推，連接器只會向 Athena 傳回 `N` 個排序的資料列。

### 述詞
<a name="connectors-bigquery-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena Google BigQuery 連接器可以結合這些表達式，並將它們直接推送到 Google BigQuery，以增強功能並減少掃描的資料量。

下列 Athena Google BigQuery 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1DISTINCT\$1FROM、NULL\$1IF、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-bigquery-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d)) 
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%') 
ORDER BY col_a DESC 
LIMIT 10;
```

## 傳遞查詢
<a name="connectors-bigquery-passthrough-queries"></a>

Google BigQuery 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Google BigQuery 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Google BigQuery 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-bigquery-license-information"></a>

Amazon Athena Google BigQuery 連接器專案是依據 [Apache-2.0 License](https://www.apache.org/licenses/LICENSE-2.0.html) 來授權的。

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-google-bigquery/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-google-bigquery/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-bigquery-additional-resources"></a>

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-google-bigquery)。

# Amazon Athena Google Cloud Storage 連接器
<a name="connectors-gcs"></a>

Amazon Athena Google Cloud Storage 連接器讓 Amazon Athena 能夠對存放在 Google Cloud Storage (GCS) 儲存貯體中的 Parquet 檔案和 CSV 檔案執行查詢。將一個或多個 Parquet 或 CSV 檔案分組到 GCS 儲存貯體中的未分割或分割資料夾之後，您可以在 [AWS Glue](https://aws.amazon.com/glue/) 資料庫資料表中對其進行整理。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

如果您的 帳戶中已啟用 Lake Formation，則您在 中部署的 Athena 聯合 Lambda 連接器的 IAM 角色 AWS Serverless Application Repository 必須在 Lake Formation 中具有對 的讀取存取權 AWS Glue Data Catalog。

如需示範如何使用 Athena 對 GCS 儲存貯體中的 Parquet 或 CSV 檔案執行查詢的文章，請參閱 AWS 大數據部落格文章[使用 Amazon Athena 查詢存放在 Google Cloud Platform 中的資料](https://aws.amazon.com/blogs/big-data/use-amazon-athena-to-query-data-stored-in-google-cloud-platform/)。

## 先決條件
<a name="connectors-gcs-prerequisites"></a>
+ 設定與 Google Cloud Storage 中的儲存貯體和資料夾對應的 AWS Glue 資料庫和資料表。如需這些步驟，請參閱本文件後面的 [在 中設定資料庫和資料表 AWS Glue](#connectors-gcs-setting-up-databases-and-tables-in-glue)。
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-gcs-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 目前，連接器僅支援分割區資料欄的`VARCHAR`類型 (`string` 或 AWS Glue 資料表結構描述`varchar`中的 )。當您在 Athena 中查詢其他分割區欄位類型時，會引發錯誤。

## 條款
<a name="connectors-gcs-terms"></a>

下列術語與 GCS 連接器相關。
+ **處理常式** - 存取 GCS 儲存貯體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從 GCS 儲存貯體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從 GCS 儲存貯體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從 GCS 儲存貯體中擷取中繼資料和資料記錄的 Lambda 處理常式。

## 支援的檔案類型
<a name="connectors-gcs-supported-file-types"></a>

GCS 連接器支援 Parquet 和 CSV 檔案類型。

**注意**  
請確定不要將 CSV 和 Parquet 檔案同時放在相同的 GCS 儲存貯體或路徑中。如果嘗試將 Parquet 檔案讀取為 CSV，可能會導致執行階段錯誤，反之亦然。

## Parameters
<a name="connectors-gcs-parameters"></a>

使用本節中的參數來設定 GCS 連接器。

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。  
下方列出的參數名稱和定義適用於 2024 年 12 月 3 日之前建立的 Athena 資料來源連接器。這些可能與其對應的 [AWS Glue 連線屬性](https://docs.aws.amazon.com/glue/latest/dg/connection-properties.html)不同。從 2024 年 12 月 3 日開始，只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器時，才會使用下列參數。

### Glue 連線 (建議)
<a name="connectors-gcs-gc"></a>

我們建議您使用 Glue 連線物件來設定 GCS 連接器。為此，請將 GCS 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type GOOGLECLOUDSTORAGE
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 GCS 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 GCS 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-gcs-legacy"></a>
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。
+ **secret\$1manager\$1gcp\$1creds\$1name** – 中的秘密名稱 AWS Secrets Manager ，其中包含 JSON 格式的 GCS 登入資料 （例如 `GoogleCloudPlatformCredentials`)。

## 在 中設定資料庫和資料表 AWS Glue
<a name="connectors-gcs-setting-up-databases-and-tables-in-glue"></a>

由於 GCS 連接器的內建結構描述推論功能有限，我們建議您將 AWS Glue 用於中繼資料。下列程序說明如何在 中建立資料庫和資料表 AWS Glue ，以便從 Athena 存取。

### 在 中建立資料庫 AWS Glue
<a name="connectors-gcs-creating-a-database-in-glue"></a>

您可以使用 AWS Glue 主控台來建立資料庫，以搭配 GCS 連接器使用。

**在 中建立資料庫 AWS Glue**

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

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

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

1. 對於 **Name** (名稱)，輸入您要搭配 GCS 連接器使用的資料庫名稱。

1. 對於**位置**，請指定 `google-cloud-storage-flag`。此位置會告知 GCS 連接器， AWS Glue 資料庫包含要在 Athena 中查詢 GCS 資料的資料表。連接器可辨識 Athena 中具有此標記的資料庫，並忽略沒有此標記的資料庫。

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

### 在 中建立資料表 AWS Glue
<a name="connectors-gcs-creating-a-table-in-glue"></a>

現在，您可以為資料庫建立資料表。當您建立要與 GCS 連接器搭配使用的 AWS Glue 資料表時，您必須指定其他中繼資料。

**在 AWS Glue 主控台中建立資料表**

1. 在 AWS Glue 主控台的導覽窗格中，選擇**資料表**。

1. 在 **Tables** (資料表) 頁面中，選擇 **Add table** (新增資料表)。

1. 在 **Set table properties** (設定資料表屬性) 頁面中，輸入以下資訊。
   + **名稱** – 資料表的唯一名稱。
   + **資料庫** - 選擇您為 GCS 連接器建立的 AWS Glue 資料庫。
   + **包含路徑** – 在 **Data store** (資料存放區) 區段中，對於 **Include path** (包含路徑)，輸入字首為 `gs://` 的 GCS URI 位置 (例如，`gs://gcs_table/data/`)。如果您有一個或多個分割區資料夾，則請不要將其包含在路徑中。
**注意**  
當您輸入非 `s3://` 資料表路徑時， AWS Glue 主控台會顯示錯誤。您可以忽略此錯誤。將成功建立資料表。
   + **資料格式** - 對於 **Classification** (分類)，請選取 **CSV** 或 **Parquet**。

1. 選擇**下一步**。

1. 強烈建議您在 **Choose or define schema** (選擇或定義結構描述) 頁面中定義資料表結構描述，但不是必要的。如果您未定義結構描述，則 GCS 連接器會嘗試為您推斷結構描述。

   執行以下任意一項：
   + 如果要讓 GCS 連接器嘗試為您推斷結構描述，則請選擇 **Next** (下一步)，然後選擇 **Create** (建立)。
   + 若要自行定義結構描述，請遵循下一節中的步驟。

### 在 中定義資料表結構描述 AWS Glue
<a name="connectors-gcs-defining-a-table-schema-in-glue"></a>

在 中定義資料表結構描述 AWS Glue 需要更多步驟，但可讓您更好地控制資料表建立程序。

**在 中定義資料表的結構描述 AWS Glue**

1. 在 **Choose or define schema** (選擇或定義結構描述) 頁面中，選擇 **Add** (新增)。

1. 使用 **Add schema entry** (新增結構描述項目) 對話方塊提供資料欄名稱和資料類型。

1. 若要將資料欄指定為分割區資料欄，請選取 **Set as partition key** (設定為分割區索引鍵) 選項。

1. 選擇 **Save** (儲存) 可儲存資料欄。

1. 選擇 **Add** (新增) 可新增另一個資料欄。

1. 當您完成新增資料欄時，選擇 **Next** (下一步)。

1. 在 **Review and create** (檢閱和建立) 頁面中，檢閱資料表，然後選擇 **Create** (建立)。

1. 如果您的結構描述包含分割區資訊，則請遵循下一節中的步驟，將分割區模式新增至 AWS Glue中的資料表屬性。

### 將分割區模式新增至 中的資料表屬性 AWS Glue
<a name="connectors-gcs-adding-a-partition-pattern-to-table-properties-in-glue"></a>

如果您的 GCS 儲存貯體具有分割區，則必須將分割區模式新增至 AWS Glue中的資料表屬性。

**將分割區資訊新增至資料表屬性 AWS Glue**

1. 在您建立之資料表的詳細資訊頁面上 AWS Glue，選擇**動作**、**編輯資料表**。

1. 在 **Edit table** (編輯資料表) 頁面中，向下捲動至 **Table properties** (資料表屬性) 區段。

1. 選擇 **Add** (新增) 以新增分割區索引鍵。

1. 在 **Key** (索引鍵) 欄位，輸入 **partition.pattern**。此索引鍵定義資料夾路徑模式。

1. 在 **Value** (值) 中，輸入資料夾路徑樣式，例如 **StateName=\$1\$1statename\$1/ZipCode=\$1\$1zipcode\$1/**，其中由 **\$1\$1\$1** 括起來的 **statename** 和 **zipcode** 是分割區資料欄名稱。GCS 連接器支援 Hive 和非 Hive 分割區結構描述。

1. 完成時，請選擇 **Save (儲存)**。

1. 若要檢視您剛剛建立的資料表屬性，請選擇 **Advanced properties** (進階屬性) 索引標籤。

此時，您可以導覽至 Athena 主控台。您在 中建立的資料庫和資料表 AWS Glue 可在 Athena 中查詢。

## 支援的資料類型
<a name="connectors-gcs-data-type-support"></a>

下表顯示 CSV 和 Parquet 支援的資料類型。

### CSV
<a name="connectors-gcs-csv"></a>


****  

| **Nature of data** (資料性質) | **Inferred Data Type** (推斷的資料類型) | 
| --- | --- | 
| 資料看起來像數字 | BIGINT | 
| 資料看起來像字串 | VARCHAR | 
| 資料看起來像浮點值 (浮點數、雙精度或十進制) | DOUBLE | 
| 資料看起來像日期 | 時間戳記 | 
| 包含真/假值的資料 | BOOL | 

### Parquet
<a name="connectors-gcs-parquet"></a>


****  

| **PARQUET** | **Athena (Arrow)** (Athena (箭頭)) | 
| --- | --- | 
| BINARY | VARCHAR | 
| BOOLEAN | BOOL | 
| DOUBLE | DOUBLE | 
| ENUM | VARCHAR | 
| FIXED\$1LEN\$1BYTE\$1ARRAY | DECIMAL | 
| FLOAT | FLOAT (32 位元) | 
| INT32 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/connectors-gcs.html)  | 
| INT64 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/connectors-gcs.html)  | 
| INT96 | 時間戳記 | 
| MAP | MAP | 
| STRUCT | STRUCT | 
| LIST | LIST | 

## 所需的許可
<a name="connectors-gcs-required-permissions"></a>

如需詳細了解此連接器所需的 IAM 政策，請檢閱 [athena-gcs.yaml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-gcs/athena-gcs.yaml) 檔案的 `Policies` 部分。以下清單摘要說明所需的許可。
+ **Amazon S3 寫入存取** - 連接器需要 Amazon S3 中某個位置的寫入存取權，以便從大型查詢中溢寫結果。
+ **Athena GetQueryExecution** - 當上游 Athena 查詢終止時，連接器會使用此許可快速失敗。
+ **AWS Glue Data Catalog** – GCS 連接器需要對 的唯讀存取權 AWS Glue Data Catalog ，才能取得結構描述資訊。
+ **CloudWatch Logs** - 連接器需要存取 CloudWatch Logs 以儲存日誌。

## 效能
<a name="connectors-gcs-performance"></a>

當資料表結構描述包含分割區欄位且 `partition.pattern` 資料表屬性設定正確時，您可以在查詢的 `WHERE` 子句中包含分割區欄位。對於此類查詢，GCS 連接器會使用分割區資料欄來精簡 GCS 資料夾路徑，並避免掃描 GCS 資料夾中不需要的檔案。

對於 Parquet 資料集，選取資料欄子集會導致掃描的資料較少。當套用資料欄投影時，這通常會導致較短的查詢執行階段。

對於 CSV 資料集，不支援資料欄投影，並且不會減少掃描的資料量。

`LIMIT` 子句可減少掃描的資料量，但是如果您未提供述詞，則應期望具有 `LIMIT` 子句的 `SELECT` 查詢掃描至少 16 MB 的資料。與較小資料集相比，GCS 連接器可為較大資料集掃描更多資料，無論是否套用 `LIMIT` 子句。例如，與較小的基礎資料集相比，`SELECT * LIMIT 10000` 查詢可為較大的基礎資料集掃描更多資料。

### 授權資訊
<a name="connectors-gcs-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-gcs/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-gcs/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

### 其他資源
<a name="connectors-gcs-additional-resources"></a>

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-gcs)。

# Amazon Athena HBase 連接器
<a name="connectors-hbase"></a>

Amazon Athena HBase 連接器讓 Amazon Athena 能夠與您的 Apache HBase 執行個體通訊，以便使用 SQL 來查詢您的 HBase 資料。

與傳統的關聯式資料存放區不同，HBase 集合沒有集結構描述。HBase 沒有中繼資料存放區。HBase 集合中的每個條目可以有不同的欄位和資料類型。

HBase 連接器支援兩種產生資料表結構描述資訊的機制：基本結構描述推論和 AWS Glue Data Catalog 中繼資料。

結構描述推斷是預設值。此選項會掃描集合中的少量文件，形成所有欄位的聯集，以及強制具有非重疊資料類型的欄位。此選項適用於大多數具有統一條目的集合。

對於具有更多資料類型的集合，連接器支援從 AWS Glue Data Catalog中擷取中繼資料。如果連接器看到符合您 HBase 命名空間和集合名稱的 AWS Glue 資料庫和資料表，則會從對應的 AWS Glue 資料表取得其結構描述資訊。當您建立 AWS Glue 資料表時，建議您將其設定為您可能想要從 HBase 集合存取的所有欄位的超級集合。

如果您的 帳戶中已啟用 Lake Formation，則您在 中部署的 Athena 聯合 Lambda 連接器的 IAM 角色 AWS Serverless Application Repository 必須在 Lake Formation 中具有對 的讀取存取權 AWS Glue Data Catalog。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-hbase-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## Parameters
<a name="connectors-hbase-parameters"></a>

使用本節中的參數來設定 HBase 連接器。

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。  
下方列出的參數名稱和定義適用於 2024 年 12 月 3 日之前建立的 Athena 資料來源連接器。這些可能與其對應的 [AWS Glue 連線屬性](https://docs.aws.amazon.com/glue/latest/dg/connection-properties.html)不同。從 2024 年 12 月 3 日開始，只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器時，才會使用下列參數。

### Glue 連線 (建議)
<a name="connectors-hbase-gc"></a>

我們建議您使用 Glue 連線物件來設定 HBase 連接器。為此，請將 HBase 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type HBASE
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 HBase 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 HBase 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-hbase-legacy"></a>
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。
+ **disable\$1glue** – （選用） 如果存在並設為 true，連接器不會嘗試從中擷取補充中繼資料 AWS Glue。
+ **glue\$1catalog** - (選用) 使用此選項可指定[跨帳戶 AWS Glue 目錄](data-sources-glue-cross-account.md)。根據預設，連接器會嘗試從自己的 AWS Glue 帳戶取得中繼資料。
+ **default\$1hbase** - 如果存在，則指定當不存在目錄特定環境變數時要使用的 HBase 連接字串。
+ **enable\$1case\$1insensitive\$1match** – (選用) 當 `true` 時，針對 HBase 中的資料表名稱執行不區分大小寫搜尋。預設值為 `false`。查詢包含大寫的資料表名稱時使用。

#### 指定連接字串
<a name="connectors-hbase-specifying-connection-strings"></a>

您可以提供一個或多個屬性，以定義與連接器搭配使用的 HBase 執行個體的 HBase 連接詳細資訊。因此，請設定您要在 Athena 使用的目錄名稱所對應的 Lambda 環境變數。例如，假設您想要使用下列查詢來查詢來自 Athena 的兩個不同 HBase 執行個體：

```
SELECT * FROM "hbase_instance_1".database.table
```

```
SELECT * FROM "hbase_instance_2".database.table
```

您必須先將兩個環境變數 `hbase_instance_1` 和 `hbase_instance_2` 新增至 Lambda 函數，才能使用這兩個 SQL 陳述式。每個的值應該為以下格式的 HBase 連接字串：

```
master_hostname:hbase_port:zookeeper_port
```

##### 使用秘密
<a name="connectors-hbase-using-secrets"></a>

您可以選擇性地將 AWS Secrets Manager 用於連線字串詳細資訊的部分或全部值。若要搭配使用 Athena 聯合查詢功能和 Secrets Manager，連接到您的 Lambda 函數的 VPC 應該具有[網際網路存取權](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接到 Secrets Manager。

如果您使用語法 `${my_secret}` 將 Secret Manager 秘密的名稱放入連接字串中，連接器會使用您在 Secret Manager 中的使用者名稱和密碼值來取代秘密名稱。

例如，假設您將 `hbase_instance_1` 的 Lambda 環境變數設定為以下值：

```
${hbase_host_1}:${hbase_master_port_1}:${hbase_zookeeper_port_1}
```

Athena Query Federation 軟體開發套件會自動嘗試從 Secrets Manager 中擷取名為 `hbase_instance_1_creds` 的秘密，並將該值放入 `${hbase_instance_1_creds}` 位置。由 `${ }` 字元組合括住的連接字串的任何部分會被解譯為 Secrets Manager 的秘密。如果您指定連接器在 Secrets Manager 中找不到的秘密名稱，則連接器不會取代該文字。

## 在 中設定資料庫和資料表 AWS Glue
<a name="connectors-hbase-setting-up-databases-and-tables-in-aws-glue"></a>

連接器的內建結構描述推斷僅支援在 HBase 中序列化為字串的值 (例如，`String.valueOf(int)`)。由於連接器的內建結構描述推斷功能受到限制，因此您可能需要對中繼資料使用 AWS Glue 。若要啟用 AWS Glue 資料表以搭配 HBase 使用，您必須擁有 AWS Glue 資料庫和資料表，其名稱符合您要為其提供補充中繼資料的 HBase 命名空間和資料表。使用 HBase 資料欄系列命名慣例是可選的，但不是必需的。

**使用 AWS Glue 資料表補充中繼資料**

1. 在 AWS Glue 主控台中編輯資料表和資料庫時，請新增下列資料表屬性：
   + **hbase-metadata-flag** - 此屬性向 HBase 連接器發出指示，連接器可使用資料表作為補充中繼資料。您可以為 `hbase-metadata-flag` 提供任何值，只要 `hbase-metadata-flag` 屬性存在於資料表屬性清單中。
   + **hbase-native-storage-flag** - 使用此標記可切換連接器支援的兩個值序列化模式。根據預設，當此欄位不存在時，連接器假定所有值都作為字串儲存在 HBase 中。因此，它會嘗試將 HBase 中的 `INT`、`BIGINT` 和 `DOUBLE` 等資料類型作為字串進行剖析。如果此欄位在 中的資料表上以任何值設定 AWS Glue，連接器會切換到「原生」儲存模式，並使用下列函數嘗試將 `INT`、`BIT`、 `BIGINT`和 讀取`DOUBLE`為位元組：

     ```
     ByteBuffer.wrap(value).getInt() 
     ByteBuffer.wrap(value).getLong() 
     ByteBuffer.wrap(value).get() 
     ByteBuffer.wrap(value).getDouble()
     ```

1. 請確定您使用適用於本文件 AWS Glue 所列 的資料類型。

### 建立資料欄系列模型
<a name="connectors-hbase-modeling-column-families"></a>

Athena HBase 連接器支援兩種方式來建立 HBase 資料欄系列模型：完全限定 (扁平化) 命名 (例如 `family:column`)，或使用 `STRUCT` 物件。

在 `STRUCT` 模型中，`STRUCT` 欄位的名稱應與資料欄系列相符，而 `STRUCT` 的子項應該與該系列的資料欄名稱相符。但是，由於諸如 `STRUCT` 等複雜類型尚不完全支援述詞下推和資料欄讀取，因此目前不建議使用 `STRUCT`。

下圖顯示在 中設定的資料表 AWS Glue ，該資料表使用兩種方法的組合。

![\[在 AWS Glue for Apache Hbase 中建立資料欄系列的模型。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-hbase-1.png)


## 支援的資料類型
<a name="connectors-hbase-data-type-support"></a>

連接器會擷取所有 HBase 值作為基本位元組類型。然後，根據您在 AWS Glue Data Catalog 中定義資料表的方式，它會將值映射至下表中的其中一個 Apache Arrow 資料類型。


****  

| AWS Glue 資料類型 | Apache Arrow 資料類型 | 
| --- | --- | 
| int | INT | 
| bigint | BIGINT | 
| double | FLOAT8 | 
| float | FLOAT4 | 
| boolean | BIT | 
| binary | VARBINARY | 
| string | VARCHAR | 

**注意**  
如果您不使用 AWS Glue 補充中繼資料，連接器的結構描述推論只會使用資料類型 `BIGINT`、 `FLOAT8`和 `VARCHAR`。

## 所需的許可
<a name="connectors-hbase-required-permissions"></a>

如需詳細了解此連接器所需的 IAM 政策，請檢閱 [athena-hbase.yaml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-hbase/athena-hbase.yaml) 檔案的 `Policies` 部分。以下清單摘要說明所需的許可。
+ **Amazon S3 寫入存取** - 連接器需要 Amazon S3 中某個位置的寫入存取權，以便從大型查詢中溢寫結果。
+ **Athena GetQueryExecution** - 當上游 Athena 查詢終止時，連接器會使用此許可快速失敗。
+ **AWS Glue Data Catalog** – HBase 連接器需要對 的唯讀存取權 AWS Glue Data Catalog ，才能取得結構描述資訊。
+ **CloudWatch Logs** - 連接器需要存取 CloudWatch Logs 以儲存日誌。
+ **AWS Secrets Manager 讀取存取** – 如果您選擇將 HBase 端點詳細資訊存放在 Secrets Manager 中，則必須授予連接器存取這些秘密的權限。
+ **VPC 存取** - 連接器需要能夠將介面連接到 VPC 並能進行分離，以便可進行連接並與 HBase 執行個體通訊。

## 效能
<a name="connectors-hbase-performance"></a>

Athena HBase 連接器透過平行讀取每個區域伺服器，嘗試對 HBase 執行個體平行處理查詢。Athena HBase 連接器執行述詞下推，以減少查詢掃描的資料。

Lambda 函數還執行*投影*下推，以減少查詢掃描的資料。不過，選取資料欄子集有時會導致較長的查詢執行時期。`LIMIT` 子句可減少掃描的資料量，但是如果您未提供述詞，則應期望具有 `LIMIT` 子句的 `SELECT` 查詢掃描至少 16 MB 的資料。

HBase 容易導致查詢失敗和可變的查詢執行時間。您可能必須重試查詢多次才能成功。HBase 連接器由於並行而對限流保有彈性。

## 傳遞查詢
<a name="connectors-hbase-passthrough-queries"></a>

HBase 連接器支援[傳遞查詢](federated-query-passthrough.md)，並且以 NoSQL 為基礎。如需有關使用篩選查詢 Apache HBase 的資訊，請參閱 Apache 文件中的[篩選語言](https://hbase.apache.org/book.html#thrift.filter_language)。

若要透過 HBase 使用傳遞查詢，請使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            database => 'database_name',
            collection => 'collection_name',
            filter => '{query_syntax}'
        ))
```

下列範例 HBase 傳遞查詢會篩選 `default` 資料庫的 `employee` 集合內年齡為 24 或 30 歲的員工。

```
SELECT * FROM TABLE(
        system.query(
            DATABASE => 'default',
            COLLECTION => 'employee',
            FILTER => 'SingleColumnValueFilter(''personaldata'', ''age'', =, ''binary:30'')' ||
                       ' OR SingleColumnValueFilter(''personaldata'', ''age'', =, ''binary:24'')'
        ))
```

## 授權資訊
<a name="connectors-hbase-license-information"></a>

Amazon Athena HBase 連接器專案是依據 [Apache-2.0 License](https://www.apache.org/licenses/LICENSE-2.0.html) 來授權的。

## 其他資源
<a name="connectors-hbase-additional-resources"></a>

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-hbase)。

# Amazon Athena Hortonworks 連接器
<a name="connectors-hortonworks"></a>

適用於 Hortonworks 的 Amazon Athena 連接器可讓 Amazon Athena 能夠在 Cloudera [Hortonworks](https://www.cloudera.com/products/hdp.html) 資料平台上執行 SQL 查詢。連接器可將您的 Athena SQL 查詢轉換為其同等的 HiveQL 語法。

此連接器不會使用 Glue 連線來集中 Glue 中的組態屬性。連線組態是透過 Lambda 完成的。

## 先決條件
<a name="connectors-hive-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-hortonworks-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。

## 條款
<a name="connectors-hortonworks-terms"></a>

下列術語與 Hortonworks Hive 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-hortonworks-parameters"></a>

使用本節中的參數來設定 Hortonworks Hive 連接器。

### 連接字串
<a name="connectors-hortonworks-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
hive://${jdbc_connection_string}
```

### 使用多工處理常式
<a name="connectors-hortonworks-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | HiveMuxCompositeHandler | 
| 中繼資料處理常式 | HiveMuxMetadataHandler | 
| 記錄處理常式 | HiveMuxRecordHandler | 

#### 多工處理常式參數
<a name="connectors-hortonworks-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 myhivecatalog，則環境變數名稱為 myhivecatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 Hive MUX Lambda 函數：`hive1` (預設) 和 `hive2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | hive://jdbc:hive2://hive1:10000/default?\$1\$1Test/RDS/hive1\$1 | 
| hive\$1catalog1\$1connection\$1string | hive://jdbc:hive2://hive1:10000/default?\$1\$1Test/RDS/hive1\$1 | 
| hive\$1catalog2\$1connection\$1string | hive://jdbc:hive2://hive2:10000/default?UID=sample&PWD=sample | 

#### 提供憑證
<a name="connectors-hortonworks-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${Test/RDS/hive1host}`。

```
hive://jdbc:hive2://hive1host:10000/default?...&${Test/RDS/hive1host}&...
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
hive://jdbc:hive2://hive1host:10000/default?...&UID=sample2&PWD=sample2&...
```

目前，Hortonworks Hive 連接器可辨識 `UID` 和 `PWD` JDBC 屬性。

### 使用單一連接處理常式
<a name="connectors-hortonworks-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 Hortonworks Hive 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | HiveCompositeHandler | 
| 中繼資料處理常式 | HiveMetadataHandler | 
| 記錄處理常式 | HiveRecordHandler | 

#### 單一連接處理常式參數
<a name="connectors-hortonworks-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函數所支援的單一 Hortonworks Hive 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | hive://jdbc:hive2://hive1host:10000/default?secret=\$1\$1Test/RDS/hive1host\$1 | 

### 溢出參數
<a name="connectors-hortonworks-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-hortonworks-data-type-support"></a>

下表顯示 JDBC、Hortonworks Hive 和 Arrow 的相應資料類型。


****  

| JDBC | Hortonworks Hive | Arrow | 
| --- | --- | --- | 
| Boolean | Boolean | 位元 | 
| Integer | TINYINT | Tiny | 
| Short | SMALLINT | Smallint | 
| Integer | INT | Int | 
| Long | BIGINT | Bigint | 
| float | float4 | Float4 | 
| Double | float8 | Float8 | 
| Date | date | DateDay | 
| 時間戳記 | timestamp | DateMilli | 
| String | VARCHAR | Varchar | 
| 位元組 | 位元組 | Varbinary | 
| BigDecimal | Decimal (小數) | Decimal (小數) | 
| ARRAY | N/A (請參閱備註) | 清單 | 

**注意**  
目前，Hortonworks Hive 不支援彙總類型 `ARRAY`、`MAP`、`STRUCT` 或 `UNIONTYPE`。彙總類型的資料欄在 SQL 中被視為 `VARCHAR` 資料欄。

## 分割區和分隔
<a name="connectors-hortonworks-partitions-and-splits"></a>

分割區用於決定如何產生連接器的分割。Athena 建構了類型 `varchar` 的合成資料欄，表示資料表的分割結構，以幫助連接器產生分割。連接器不會修改實際的資料表定義。

## 效能
<a name="connectors-hortonworks-performance"></a>

Hortonworks Hive 支援靜態分割區。Athena Hortonworks Hive 連接器可以平行地從這些分割區中擷取資料。如果您想要查詢具有統一分割區分佈的非常大型的資料集，強烈建議使用靜態分割。選取資料欄子集可大幅加速查詢執行期，並減少掃描的資料。Hortonworks Hive 連接器由於並行而對限流保有彈性。

Athena Hortonworks Hive 連接器執行述詞下推，以減少查詢掃描的資料。`LIMIT` 子句、簡單述詞和複雜的表達式會下推至連接器，以減少掃描的資料量並縮短查詢執行時間。

### LIMIT 子句
<a name="connectors-hive-performance-limit-clauses"></a>

`LIMIT N` 陳述句可減少查詢掃描的資料。透過 `LIMIT N` 下推，連接器只會向 Athena 傳回 `N` 個資料列。

### 述詞
<a name="connectors-hive-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena Hortonworks Hive 連接器可以結合這些表達式，並將它們直接推送到 Hortonworks Hive，以增強功能並減少掃描的資料量。

下列 Athena Hortonworks Hive 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-hive-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d))
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%') 
LIMIT 10;
```

## 傳遞查詢
<a name="connectors-hive-passthrough-queries"></a>

Hortonworks Hive 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Hortonworks Hive 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Hortonworks Hive 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-hive-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-hortonworks-hive/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-hortonworks-hive/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-hive-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 Hortonworks Hive 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-hortonworks-hive/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-hortonworks-hive)。

# Amazon Athena Apache Kafka 連接器
<a name="connectors-kafka"></a>

適用於 Apache Kafka 的 Amazon Athena 連接器可讓 Amazon Athena 能夠對 Apache Kafka 主題執行 SQL 查詢。使用此連接器可以在 Athena 中以資料表的形式檢視 [Apache Kafka](https://kafka.apache.org/) 主題，並以資料列的形式檢視訊息。

此連接器不會使用 Glue 連線來集中 Glue 中的組態屬性。連線組態是透過 Lambda 完成的。

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

使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-kafka-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 篩選條件中的日期和時間戳記資料類型必須轉換為適當的資料類型。
+ 日期和時間戳記資料類型不受 CSV 檔案類型支援，且會被視為 varchar 值。
+ 不支援映射至巢狀 JSON 欄位。連接器僅映射最上層欄位。
+ 連接器不支援複雜類型。複雜類型會轉譯為字串。
+ 若要擷取或使用複雜的 JSON 值，請使用 Athena 中提供的 JSON 相關函數。如需詳細資訊，請參閱[從字串擷取 JSON 資料](extracting-data-from-JSON.md)。
+ 連接器不支援存取 Kafka 訊息中繼資料。

## 條款
<a name="connectors-kafka-terms"></a>
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **Kafka 端點** – 與 Kafka 執行個體建立連線的文字字串。

## 叢集相容性
<a name="connectors-kafka-cluster-compatibility"></a>

Kafka 連接器可搭配下列叢集類型使用。
+ **獨立 Kafka** – 直接連接至 Kafka (已進行身分驗證或未進行身分驗證)。
+ **Confluent** – 直接連線至 Confluent Kafka。如需有關搭配 Confluent Kafka 資料使用 Athena 的資訊，請參閱*AWS 商業智慧部落格*[中的使用 Amazon Athena 在 Quick 中視覺化 Confluent 資料](https://aws.amazon.com/blogs/business-intelligence/visualize-confluent-data-in-amazon-quicksight-using-amazon-athena/)。

### 連線至 Confluent
<a name="connectors-kafka-connecting-to-confluent"></a>

連線到 Confluent 需要以下步驟：

1. 從 Confluent 產生一個 API 金鑰。

1. 將 Confluent API 金鑰的使用者名稱和密碼儲存到 AWS Secrets Manager。

1. 提供 Kafka 連接器中 `secrets_manager_secret` 環境變數的密碼名稱。

1. 請遵循本文件 [設定 Kafka 連接器](#connectors-kafka-setup) 一節中的步驟。

## 支援的身分驗證方法
<a name="connectors-kafka-supported-authentication-methods"></a>

連接器支援下列身分驗證方法。
+ [SSL](https://kafka.apache.org/documentation/#security_ssl)
+ [SASL/SCRAM](https://kafka.apache.org/documentation/#security_sasl_scram)
+ SASL/PLAIN
+ SASL/PLAINTEXT
+ NO\$1AUTH
+ **自我管理的 Kafka 和 Confluent 平台** – SSL、SASL/SCRAM、SASL/PLAINTEXT、NO\$1AUTH
+ **自我管理的 Kafka 和 Confluent 雲端** – SASL/PLAIN

如需詳細資訊，請參閱[設定 Athena Kafka 連接器的身分驗證](#connectors-kafka-setup-configuring-authentication)。

## 支援的輸入資料格式
<a name="connectors-kafka-supported-input-data-formats"></a>

連接器支援以下輸入資料格式。
+ JSON
+ CSV
+ AVRO
+ PROTOBUF (PROTOCOL BUFFERS)

## Parameters
<a name="connectors-kafka-parameters"></a>

使用本節中的參數來設定 Athena Kafka 連接器。
+ **auth\$1type** – 指定叢集的身分驗證類型。連接器支援下列身分驗證類型：
  + **NO\$1AUTH** – 直接連接至 Kafka (例如，連接至透過無需使用身分驗證之 EC2 執行個體部署的 Kafka 叢集)。
  + **SASL\$1SSL\$1PLAIN** – 此方法使用 `SASL_SSL` 安全通訊協定和 `PLAIN` SASL 機制。如需詳細資訊，請參閱 Apache Kafka 文件中的 [SASL 組態](https://kafka.apache.org/documentation/#security_sasl_config)。
  + **SASL\$1PLAINTEXT\$1PLAIN** – 此方法使用 `SASL_PLAINTEXT` 安全通訊協定和 `PLAIN` SASL 機制。如需詳細資訊，請參閱 Apache Kafka 文件中的 [SASL 組態](https://kafka.apache.org/documentation/#security_sasl_config)。
  + **SASL\$1SSL\$1SCRAM\$1SHA512** – 您可以使用此身分驗證類型來控制對 Apache Kafka 叢集的存取。此方法會將使用者名稱和密碼存放在其中 AWS Secrets Manager。秘密必須與 Kafka 叢集相關聯。如需詳細資訊，請參閱 Apache Kafka 文件中的[使用 SASL/SCRAM 進行身分驗證](https://kafka.apache.org/documentation/#security_sasl_scram)。
  + **SASL\$1PLAINTEXT\$1SCRAM\$1SHA512** – 此方法使用 `SASL_PLAINTEXT` 安全通訊協定和 `SCRAM_SHA512 SASL` 機制。此方法使用您的使用者名稱和密碼存放在 中 AWS Secrets Manager。如需詳細資訊，請參閱 Apache Kafka 文件中的 [SASL 組態](https://kafka.apache.org/documentation/#security_sasl_config)一節。
  + **SSL** – SSL 身分驗證使用金鑰存放區和信任存放區檔案來連接 Apache Kafka 叢集。您必須產生信任存放區和金鑰存放區檔案，將其上傳至 Amazon S3 儲存貯體，並在部署連接器時提供 Amazon S3 參考。金鑰存放區、信任存放區和 SSL 金鑰會存放在其中 AWS Secrets Manager。部署連接器時，您的用戶端必須提供 AWS 私密金鑰。如需詳細資訊，請參閱 Apache Kafka 文件中的[使用 SSL 進行加密和身分驗證](https://kafka.apache.org/documentation/#security_ssl)。

    如需詳細資訊，請參閱[設定 Athena Kafka 連接器的身分驗證](#connectors-kafka-setup-configuring-authentication)。
+ **certificates\$1s3\$1reference** – 包含憑證 (金鑰存放區和信任存放區檔案) 的 Amazon S3 位置。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。
+ **kafka\$1endpoint** – 提供給 Kafka 的端點詳細資訊。
+ **schema\$1registry\$1url** – 結構描述登錄檔的 URL 地址 (例如 `http://schema-registry.example.org:8081`)。適用於 `AVRO` 和 `PROTOBUF` 資料格式。Athena 僅支援 Confluent 結構描述登錄檔。
+ **secrets\$1manager\$1secret** – 用來儲存憑證的 AWS 祕密的名稱。
+ **溢出參數** –Lambda 函數會將不適用記憶體的資料暫時存放 (「溢出」) 至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。請使用以下資料表中的參數來指定溢出位置。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/connectors-kafka.html)
+ **Subnet IDs** – 一個或多個子網路 ID，其對應於 Lambda 函數可用來存取資料來源的子網路。
  + **公有 Kafka 叢集或標準 Confluent 雲端叢集** – 將連接器與具有 NAT 閘道的私有子網路建立關聯。
  + **Confluent 雲端叢集與私有連線** – 將連接器與具有對 Confluent 雲端叢集的路由的私有子網路建立關聯。
    + 對於 [AWS Transit Gateway](https://docs.confluent.io/cloud/current/networking/aws-transit-gateway.html)，子網路必須位於連接至 Confluent 雲端使用的同一傳輸閘道的 VPC 中。
    + 對於 [VPC 對等連線](https://docs.confluent.io/cloud/current/networking/peering/aws-peering.html)，子網路必須位於對等連線至 Confluent 雲端 VPC 的 VPC 中。
    + 對於 [AWS PrivateLink](https://docs.confluent.io/cloud/current/networking/private-links/aws-privatelink.html)，子網路必須位於已路由至連線至 Confluent 雲端的 VPC 端點的 VPC 中。

**注意**  
如果您將連接器部署到 VPC 中以存取私有資源，並且還想要連接到可公開存取的服務 (例如 Confluent)，則必須將連接器與具有 NAT 閘道的私有子網路建立關聯。如需詳細資訊，請參閱《Amazon VPC 使用者指南》中的 [NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)。

## 支援的資料類型
<a name="connectors-kafka-data-type-support"></a>

下表顯示 Kafka 和 Apache Arrow 支援的相應資料類型。


****  

| Kafka | Arrow | 
| --- | --- | 
| CHAR | VARCHAR | 
| VARCHAR | VARCHAR | 
| TIMESTAMP | 毫秒 | 
| DATE | DAY | 
| BOOLEAN | BOOL | 
| SMALLINT | SMALLINT | 
| INTEGER | INT | 
| BIGINT | BIGINT | 
| DECIMAL | FLOAT8 | 
| DOUBLE | FLOAT8 | 

## 分割區和分隔
<a name="connectors-kafka-partitions-and-splits"></a>

Kafka 主題會分為多個分割區。每個分割區都已排序。分割區中的每個訊息都有一個稱為*位移*的增量 ID。每個 Kafka 分割區可再細分為多個分隔，用於並行處理。資料在 Kafka 叢集中設定的保留期間內可供使用。

## 最佳實務
<a name="connectors-kafka-best-practices"></a>

最佳實務是在您查詢 Athena 時使用述詞下推，如以下範例所示。

```
SELECT * 
FROM "kafka_catalog_name"."glue_schema_registry_name"."glue_schema_name" 
WHERE integercol = 2147483647
```

```
SELECT * 
FROM "kafka_catalog_name"."glue_schema_registry_name"."glue_schema_name" 
WHERE timestampcol >= TIMESTAMP '2018-03-25 07:30:58.878'
```

## 設定 Kafka 連接器
<a name="connectors-kafka-setup"></a>

您必須先設定 Apache Kafka 叢集、使用 [AWS Glue 結構描述登錄檔](https://docs.aws.amazon.com/glue/latest/dg/schema-registry.html)來定義結構描述，以及為連接器設定身分驗證，才能使用連接器。

使用 AWS Glue 結構描述登錄檔時，請注意下列幾點：
+ 請確定 AWS Glue 結構描述登錄檔的 **Description** (描述) 欄位中的文字包含字串 `{AthenaFederationKafka}`。搭配 Amazon Athena Kafka 連接器使用的 AWS Glue 登錄檔需要此標記字串。
+ 為了獲得最佳效能，請僅使用小寫作為資料庫名稱和資料表名稱。使用混合大小寫會導致連接器執行運算密集程度較高的不區分大小寫搜尋。

**設定您的 Apache Kafka 環境和 AWS Glue 結構描述登錄檔**

1. 設定 Apache Kafka 環境。

1. 將 JSON 格式的 Kafka 主題描述檔案 （即其結構描述） 上傳至 AWS Glue 結構描述登錄檔。如需詳細資訊，請參閱《 AWS Glue 開發人員指南》中的[整合 AWS Glue 結構描述登錄](https://docs.aws.amazon.com/glue/latest/dg/schema-registry-integrations.html)檔。

1. 若要在 AWS Glue 結構描述登錄檔中定義結構描述時使用 `AVRO` 或 `PROTOBUF` 資料格式：
   + 對於**結構描述名稱**，請輸入與原名稱大小寫相同的 Kafka 主題名稱。
   + 對於**資料格式**，選擇 **Apache Avro** 或 **Protocol Buffers**。

    如需範例結構描述，請參閱下一節。

### 結構描述登錄檔的 AWS Glue 結構描述範例
<a name="connectors-kafka-setup-schema-examples"></a>

將結構描述上傳至 [AWS Glue 結構描述登錄檔](https://docs.aws.amazon.com/glue/latest/dg/schema-registry.html)時，請使用本節中的範例格式。

#### JSON 類型結構描述範例
<a name="connectors-kafka-setup-schema-examples-json"></a>

在下列範例中，要在結構描述登錄檔中建立的 AWS Glue 結構描述指定 `json`作為 的值`dataFormat`，並`datatypejson`用於 `topicName`。

**注意**  
`topicName` 的值應使用與 Kafka 中的主題名稱相同的大小寫。

```
{
  "topicName": "datatypejson",
  "message": {
    "dataFormat": "json",
    "fields": [
      {
        "name": "intcol",
        "mapping": "intcol",
        "type": "INTEGER"
      },
      {
        "name": "varcharcol",
        "mapping": "varcharcol",
        "type": "VARCHAR"
      },
      {
        "name": "booleancol",
        "mapping": "booleancol",
        "type": "BOOLEAN"
      },
      {
        "name": "bigintcol",
        "mapping": "bigintcol",
        "type": "BIGINT"
      },
      {
        "name": "doublecol",
        "mapping": "doublecol",
        "type": "DOUBLE"
      },
      {
        "name": "smallintcol",
        "mapping": "smallintcol",
        "type": "SMALLINT"
      },
      {
        "name": "tinyintcol",
        "mapping": "tinyintcol",
        "type": "TINYINT"
      },
      {
        "name": "datecol",
        "mapping": "datecol",
        "type": "DATE",
        "formatHint": "yyyy-MM-dd"
      },
      {
        "name": "timestampcol",
        "mapping": "timestampcol",
        "type": "TIMESTAMP",
        "formatHint": "yyyy-MM-dd HH:mm:ss.SSS"
      }
    ]
  }
}
```

#### CSV 類型結構描述範例
<a name="connectors-kafka-setup-schema-examples-csv"></a>

在下列範例中，要在結構描述登錄檔中建立的 AWS Glue 結構描述會指定 `csv`作為 的值`dataFormat`，並`datatypecsvbulk`用於 `topicName`。`topicName` 的值應使用與 Kafka 中的主題名稱相同的大小寫。

```
{
  "topicName": "datatypecsvbulk",
  "message": {
    "dataFormat": "csv",
    "fields": [
      {
        "name": "intcol",
        "type": "INTEGER",
        "mapping": "0"
      },
      {
        "name": "varcharcol",
        "type": "VARCHAR",
        "mapping": "1"
      },
      {
        "name": "booleancol",
        "type": "BOOLEAN",
        "mapping": "2"
      },
      {
        "name": "bigintcol",
        "type": "BIGINT",
        "mapping": "3"
      },
      {
        "name": "doublecol",
        "type": "DOUBLE",
        "mapping": "4"
      },
      {
        "name": "smallintcol",
        "type": "SMALLINT",
        "mapping": "5"
      },
      {
        "name": "tinyintcol",
        "type": "TINYINT",
        "mapping": "6"
      },
      {
        "name": "floatcol",
        "type": "DOUBLE",
        "mapping": "7"
      }
    ]
  }
}
```

#### AVRO 類型結構描述範例
<a name="connectors-kafka-setup-schema-examples-avro"></a>

下列範例用於在 AWS Glue 結構描述登錄檔中建立以 AVRO 為基礎的結構描述。當您在結構描述登錄檔中定義 AWS Glue 結構描述時，對於**結構描述名稱**，您可以在與原始 相同的大小寫中輸入 Kafka 主題名稱，對於**資料格式**，您可以選擇 **Apache Avro**。由於您直接在登錄檔中指定此資訊，因此不需要 `dataformat` 和 `topicName` 欄位。

```
{
    "type": "record",
    "name": "avrotest",
    "namespace": "example.com",
    "fields": [{
            "name": "id",
            "type": "int"
        },
        {
            "name": "name",
            "type": "string"
        }
    ]
}
```

#### PROTOBUF 類型結構描述範例
<a name="connectors-kafka-setup-schema-examples-protobuf"></a>

下列範例用於在 AWS Glue 結構描述登錄檔中建立以 PROTOBUF 為基礎的結構描述。當您在結構描述登錄檔中定義 AWS Glue 結構描述時，對於**結構描述名稱**，您可以在與原始 相同的大小寫中輸入 Kafka 主題名稱，對於**資料格式**，您可以選擇**通訊協定緩衝區**。由於您直接在登錄檔中指定此資訊，因此不需要 `dataformat` 和 `topicName` 欄位。第一行將結構描述定義為 PROTOBUF。

```
syntax = "proto3";
message protobuftest {
string name = 1;
int64 calories = 2;
string colour = 3;
}
```

如需在結構描述登錄檔中 AWS Glue 新增登錄檔和結構描述的詳細資訊，請參閱 AWS Glue 文件中的[結構描述登錄檔入門](https://docs.aws.amazon.com/glue/latest/dg/schema-registry-gs.html)。

### 設定 Athena Kafka 連接器的身分驗證
<a name="connectors-kafka-setup-configuring-authentication"></a>

您可以使用各種方法對 Apache Kafka 叢集進行身分驗證，包括 SSL、SASL/SCRAM、SASL/PLAIN 和 SASL/PLAINTEXT。

下表顯示了連接器的身分驗證類型，以及每種連接器的安全通訊協定和 SASL 機制。如需有關詳細資訊，請參閱 Apache Kafka 文件的[安全性](https://kafka.apache.org/documentation/#security)一節。


****  

| auth\$1type | security.protocol | sasl.mechanism | 叢集類型相容性 | 
| --- | --- | --- | --- | 
| SASL\$1SSL\$1PLAIN | SASL\$1SSL | PLAIN |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/connectors-kafka.html)  | 
| SASL\$1PLAINTEXT\$1PLAIN | SASL\$1PLAINTEXT | PLAIN |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/connectors-kafka.html)  | 
| SASL\$1SSL\$1SCRAM\$1SHA512 | SASL\$1SSL | SCRAM-SHA-512 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/connectors-kafka.html)  | 
| SASL\$1PLAINTEXT\$1SCRAM\$1SHA512 | SASL\$1PLAINTEXT | SCRAM-SHA-512 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/connectors-kafka.html)  | 
| SSL | SSL | N/A |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/connectors-kafka.html)  | 

#### SSL
<a name="connectors-kafka-setup-configuring-authentication-tls"></a>

如果叢集經過 SSL 身分驗證，您必須產生信任存放區和金鑰存放區檔案，並將其上傳到 Amazon S3 儲存貯體。部署連接器時，您必須提供此 Amazon S3 參考。金鑰存放區、信任存放區和 SSL 金鑰會儲存在 AWS Secrets Manager中。您可以在部署連接器時提供 AWS 私密金鑰。

如需有關在 Secrets Manager 中建立祕密的詳細資訊，請參閱[建立 AWS Secrets Manager 祕密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)。

若要使用此身分驗證類型，請設定環境變數，如下表所示。


****  

| 參數 | Value | 
| --- | --- | 
| auth\$1type | SSL | 
| certificates\$1s3\$1reference | 包含憑證的 Amazon S3 位置。 | 
| secrets\$1manager\$1secret |  AWS 私密金鑰的名稱。 | 

在 Secrets Manager 中建立祕密之後，您可以在 Secrets Manager 主控台中進行檢視。

**若要檢視 Secrets Manager 中的祕密**

1. 前往以下位置開啟機密管理員控制台：[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 在導覽窗格中，選擇 **Secrets** (祕密)。

1. 在 **Secrets** (祕密) 頁面中，選擇祕密的連結。

1. 在祕密的詳細資訊頁面上，選擇 **Retrieve secret value** (擷取祕密值)。

   下圖顯示了具有三個金鑰/值對的祕密範例：`keystore_password`、`truststore_password` 和 `ssl_key_password`。  
![\[在 Secrets Manager 中擷取 SSL 祕密。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-kafka-setup-1.png)

如需有關使用 SSL with Kafka 的詳細資訊，請參閱 Apache Kafka 文件中的[使用 SSL 進行加密和身分驗證](https://kafka.apache.org/documentation/#security_ssl)。

#### SASL/SCRAM
<a name="connectors-kafka-setup-configuring-authentication-sasl-scram"></a>

如果您的叢集使用 SCRAM 身分驗證，則請在部署連接器時提供與叢集相關聯的 Secrets Manager 金鑰。使用者的 AWS 憑證 (祕密金鑰和存取金鑰) 可用於向叢集進行身分驗證。

設定環境變數，如下表所示。


****  

| 參數 | Value | 
| --- | --- | 
| auth\$1type | SASL\$1SSL\$1SCRAM\$1SHA512 | 
| secrets\$1manager\$1secret |  AWS 私密金鑰的名稱。 | 

下圖顯示了 Secrets Manager 主控台中含有兩個金鑰/值對的祕密範例：一個用於 `username`，另一個用於 `password`。

![\[在 Secrets Manager 中擷取 SCRAM 祕密。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-kafka-setup-2.png)


如需有關使用 SASL/SCRAM with Kafka 的詳細資訊，請參閱 Apache Kafka 文件中的[使用 SASL/SCRAM 進行身分驗證](https://kafka.apache.org/documentation/#security_sasl_scram)。

## 授權資訊
<a name="connectors-kafka-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-kafka/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-kafka/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-kafka-additional-resources"></a>

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-kafka)。

# Amazon Athena MSK 連接器
<a name="connectors-msk"></a>

適用於 [Amazon MSK](https://aws.amazon.com/msk/) 的 Amazon Athena 連接器可讓 Amazon Athena 能夠對 Apache Kafka 主題執行 SQL 查詢。使用此連接器可以在 Athena 中以資料表的形式檢視 [Apache Kafka](https://kafka.apache.org/) 主題，並以資料列的形式檢視訊息。如需詳細資訊，請參閱 AWS 大[數據部落格中的使用 Amazon Athena 分析 Amazon MSK 中的即時串流](https://aws.amazon.com/blogs/big-data/analyze-real-time-streaming-data-in-amazon-msk-with-amazon-athena/)資料。

此連接器不會使用 Glue 連線來集中 Glue 中的組態屬性。連線組態是透過 Lambda 完成的。

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

使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-msk-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 篩選條件中的日期和時間戳記資料類型必須轉換為適當的資料類型。
+ 日期和時間戳記資料類型不受 CSV 檔案類型支援，且會被視為 varchar 值。
+ 不支援映射至巢狀 JSON 欄位。連接器僅映射最上層欄位。
+ 連接器不支援複雜類型。複雜類型會轉譯為字串。
+ 若要擷取或使用複雜的 JSON 值，請使用 Athena 中提供的 JSON 相關函數。如需詳細資訊，請參閱[從字串擷取 JSON 資料](extracting-data-from-JSON.md)。
+ 連接器不支援存取 Kafka 訊息中繼資料。

## 條款
<a name="connectors-msk-terms"></a>
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **Kafka 端點** – 與 Kafka 執行個體建立連線的文字字串。

## 叢集相容性
<a name="connectors-msk-cluster-compatibility"></a>

MSK 連接器可搭配下列叢集類型使用。
+ **MSK 佈建的叢集** – 您可以手動指定、監控和調整叢集容量。
+ **MSK 無伺服器叢集** – 提供隨需容量，可隨應用程式 I/O 擴展而自動擴展。
+ **獨立 Kafka** – 直接連接至 Kafka (已進行身分驗證或未進行身分驗證)。

## 支援的身分驗證方法
<a name="connectors-msk-supported-authentication-methods"></a>

連接器支援下列身分驗證方法。
+ [SASL/IAM](https://docs.aws.amazon.com/msk/latest/developerguide/iam-access-control.html) 
+ [SSL](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html)
+ [SASL/SCRAM](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password.html)
+ SASL/PLAIN
+ SASL/PLAINTEXT
+ NO\$1AUTH

  如需詳細資訊，請參閱[設定 Athena MSK 連接器的身分驗證](#connectors-msk-setup-configuring-authentication)。

## 支援的輸入資料格式
<a name="connectors-msk-supported-input-data-formats"></a>

連接器支援以下輸入資料格式。
+ JSON
+ CSV

## Parameters
<a name="connectors-msk-parameters"></a>

使用本節中的參數來設定 Athena MSK 連接器。
+ **auth\$1type** – 指定叢集的身分驗證類型。連接器支援下列身分驗證類型：
  + **NO\$1AUTH** – 直接連接至 Kafka，而不需要身分驗證 (例如，連接至透過無需使用身分驗證之 EC2 執行個體部署的 Kafka 叢集)。
  + **SASL\$1SSL\$1PLAIN** – 此方法使用 `SASL_SSL` 安全通訊協定和 `PLAIN` SASL 機制。
  + **SASL\$1PLAINTEXT\$1PLAIN** – 此方法使用 `SASL_PLAINTEXT` 安全通訊協定和 `PLAIN` SASL 機制。
**注意**  
Apache Kafka 支援 `SASL_SSL_PLAIN` 和 `SASL_PLAINTEXT_PLAIN` 身分驗證類型，但 Amazon MSK 不支援。
  + **SASL\$1SSL\$1AWS\$1MSK\$1IAM** – 適用於 Amazon MSK 的 IAM 存取控制可讓您能夠處理 MSK 叢集的身分驗證和授權。您使用者的 AWS 登入資料 （私密金鑰和存取金鑰） 用於與叢集連線。如需詳細資訊，請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》中的 [IAM 存取控制](https://docs.aws.amazon.com/msk/latest/developerguide/iam-access-control.html)。
  + **SASL\$1SSL\$1SCRAM\$1SHA512** – 您可以使用此身分驗證類型來控制對 Amazon MSK 叢集的存取。此方法存放使用者名稱和密碼 AWS Secrets Manager。祕密必須與 Amazon MSK 叢集相關聯。如需詳細資訊，請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》中的[設定 Amazon MSK 叢集的 SASL/SCRAM 身分驗證](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password.html#msk-password-tutorial)。
  + **SSL** – SSL 身分驗證使用金鑰存放區和信任存放區檔案來連接 Amazon MSK 叢集。您必須產生信任存放區和金鑰存放區檔案，將其上傳至 Amazon S3 儲存貯體，並在部署連接器時提供 Amazon S3 參考。金鑰存放區、信任存放區和 SSL 金鑰會儲存在 AWS Secrets Manager中。部署連接器時，您的用戶端必須提供 AWS 私密金鑰。如需詳細資訊，請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》中的[相互 TLS 身分驗證](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html)。

    如需詳細資訊，請參閱[設定 Athena MSK 連接器的身分驗證](#connectors-msk-setup-configuring-authentication)。
+ **certificates\$1s3\$1reference** – 包含憑證 (金鑰存放區和信任存放區檔案) 的 Amazon S3 位置。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。
+ **kafka\$1endpoint** – 提供給 Kafka 的端點詳細資訊。例如，對於 Amazon MSK 叢集，您可以為叢集提供[引導 URL](https://docs.aws.amazon.com/msk/latest/developerguide/msk-get-bootstrap-brokers.html)。
+ **secrets\$1manager\$1secret** – 用來儲存憑證的 AWS 祕密的名稱。IAM 身分驗證不需要此參數。
+ **溢出參數** –Lambda 函數會將不適用記憶體的資料暫時存放 (「溢出」) 至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。請使用以下資料表中的參數來指定溢出位置。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/connectors-msk.html)

## 支援的資料類型
<a name="connectors-msk-data-type-support"></a>

下表顯示 Kafka 和 Apache Arrow 支援的相應資料類型。


****  

| Kafka | Arrow | 
| --- | --- | 
| CHAR | VARCHAR | 
| VARCHAR | VARCHAR | 
| TIMESTAMP | 毫秒 | 
| DATE | DAY | 
| BOOLEAN | BOOL | 
| SMALLINT | SMALLINT | 
| INTEGER | INT | 
| BIGINT | BIGINT | 
| DECIMAL | FLOAT8 | 
| DOUBLE | FLOAT8 | 

## 分割區和分隔
<a name="connectors-msk-partitions-and-splits"></a>

Kafka 主題會分為多個分割區。每個分割區都已排序。分割區中的每個訊息都有一個稱為*位移*的增量 ID。每個 Kafka 分割區可再細分為多個分隔，用於並行處理。資料在 Kafka 叢集中設定的保留期間內可供使用。

## 最佳實務
<a name="connectors-msk-best-practices"></a>

最佳實務是在您查詢 Athena 時使用述詞下推，如以下範例所示。

```
SELECT * 
FROM "msk_catalog_name"."glue_schema_registry_name"."glue_schema_name" 
WHERE integercol = 2147483647
```

```
SELECT * 
FROM "msk_catalog_name"."glue_schema_registry_name"."glue_schema_name" 
WHERE timestampcol >= TIMESTAMP '2018-03-25 07:30:58.878'
```

## 設定 MSK 連接器
<a name="connectors-msk-setup"></a>

您必須先設定 Amazon MSK 叢集、使用 [AWS Glue 結構描述登錄檔](https://docs.aws.amazon.com/glue/latest/dg/schema-registry.html)來定義結構描述，以及為連接器設定身分驗證，才能使用連接器。

**注意**  
如果您將連接器部署到 VPC 中以存取私有資源，並且還想要連接到可公開存取的服務 (例如 Confluent)，則必須將連接器與具有 NAT 閘道的私有子網路建立關聯。如需詳細資訊，請參閱《Amazon VPC 使用者指南》中的 [NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)。

使用 AWS Glue 結構描述登錄檔時，請注意下列幾點：
+ 請確定 AWS Glue 結構描述登錄檔的 **Description** (描述) 欄位中的文字包含字串 `{AthenaFederationMSK}`。搭配 Amazon Athena MSK 連接器使用的 AWS Glue 註冊機構需要此標記字串。
+ 為了獲得最佳效能，請僅使用小寫作為資料庫名稱和資料表名稱。使用混合大小寫會導致連接器執行運算密集程度較高的不區分大小寫搜尋。

**設定 Amazon MSK 環境和 AWS Glue 結構描述登錄檔**

1. 設定您的 Amazon MSK 環境。如需相關資訊和步驟，請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》中的[設定 Amazon MSK](https://docs.aws.amazon.com/msk/latest/developerguide/before-you-begin.html) 和[開始使用 Amazon MSK](https://docs.aws.amazon.com/msk/latest/developerguide/getting-started.html)。

1. 將 JSON 格式的 Kafka 主題描述檔案 （即其結構描述） 上傳至 AWS Glue 結構描述登錄檔。如需詳細資訊，請參閱《 AWS Glue 開發人員指南》中的[整合 AWS Glue 結構描述登錄](https://docs.aws.amazon.com/glue/latest/dg/schema-registry-integrations.html)檔。如需範例結構描述，請參閱下一節。

### 結構描述登錄檔的 AWS Glue 結構描述範例
<a name="connectors-msk-setup-schema-examples"></a>

將結構描述上傳至 [AWS Glue 結構描述登錄檔](https://docs.aws.amazon.com/glue/latest/dg/schema-registry.html)時，請使用本節中的範例格式。

#### JSON 類型結構描述範例
<a name="connectors-msk-setup-schema-examples-json"></a>

在下列範例中，要在結構描述登錄檔中建立的 AWS Glue 結構描述指定 `json`作為 的值`dataFormat`，並`datatypejson`用於 `topicName`。

**注意**  
`topicName` 的值應使用與 Kafka 中的主題名稱相同的大小寫。

```
{
  "topicName": "datatypejson",
  "message": {
    "dataFormat": "json",
    "fields": [
      {
        "name": "intcol",
        "mapping": "intcol",
        "type": "INTEGER"
      },
      {
        "name": "varcharcol",
        "mapping": "varcharcol",
        "type": "VARCHAR"
      },
      {
        "name": "booleancol",
        "mapping": "booleancol",
        "type": "BOOLEAN"
      },
      {
        "name": "bigintcol",
        "mapping": "bigintcol",
        "type": "BIGINT"
      },
      {
        "name": "doublecol",
        "mapping": "doublecol",
        "type": "DOUBLE"
      },
      {
        "name": "smallintcol",
        "mapping": "smallintcol",
        "type": "SMALLINT"
      },
      {
        "name": "tinyintcol",
        "mapping": "tinyintcol",
        "type": "TINYINT"
      },
      {
        "name": "datecol",
        "mapping": "datecol",
        "type": "DATE",
        "formatHint": "yyyy-MM-dd"
      },
      {
        "name": "timestampcol",
        "mapping": "timestampcol",
        "type": "TIMESTAMP",
        "formatHint": "yyyy-MM-dd HH:mm:ss.SSS"
      }
    ]
  }
}
```

#### CSV 類型結構描述範例
<a name="connectors-msk-setup-schema-examples-csv"></a>

在下列範例中，要在結構描述登錄檔中建立的 AWS Glue 結構描述會指定 `csv`作為 的值`dataFormat`，並`datatypecsvbulk`用於 `topicName`。`topicName` 的值應使用與 Kafka 中的主題名稱相同的大小寫。

```
{
  "topicName": "datatypecsvbulk",
  "message": {
    "dataFormat": "csv",
    "fields": [
      {
        "name": "intcol",
        "type": "INTEGER",
        "mapping": "0"
      },
      {
        "name": "varcharcol",
        "type": "VARCHAR",
        "mapping": "1"
      },
      {
        "name": "booleancol",
        "type": "BOOLEAN",
        "mapping": "2"
      },
      {
        "name": "bigintcol",
        "type": "BIGINT",
        "mapping": "3"
      },
      {
        "name": "doublecol",
        "type": "DOUBLE",
        "mapping": "4"
      },
      {
        "name": "smallintcol",
        "type": "SMALLINT",
        "mapping": "5"
      },
      {
        "name": "tinyintcol",
        "type": "TINYINT",
        "mapping": "6"
      },
      {
        "name": "floatcol",
        "type": "DOUBLE",
        "mapping": "7"
      }
    ]
  }
}
```

### 設定 Athena MSK 連接器的身分驗證
<a name="connectors-msk-setup-configuring-authentication"></a>

您可以使用各種方法對 Amazon MSK 叢集進行身分驗證，包括 IAM、SSL、SCRAM 和獨立 Kafka。

下表顯示了連接器的身分驗證類型，以及每種連接器的安全通訊協定和 SASL 機制。如需詳細資訊，請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》中的[Apache Kafka API 的身分驗證和授權](https://docs.aws.amazon.com/msk/latest/developerguide/kafka_apis_iam.html)。


****  

| auth\$1type | security.protocol | sasl.mechanism | 
| --- | --- | --- | 
| SASL\$1SSL\$1PLAIN | SASL\$1SSL | PLAIN | 
| SASL\$1PLAINTEXT\$1PLAIN | SASL\$1PLAINTEXT | PLAIN | 
| SASL\$1SSL\$1AWS\$1MSK\$1IAM | SASL\$1SSL | AWS\$1MSK\$1IAM | 
| SASL\$1SSL\$1SCRAM\$1SHA512 | SASL\$1SSL | SCRAM-SHA-512 | 
| SSL | SSL | N/A | 

**注意**  
Apache Kafka 支援 `SASL_SSL_PLAIN` 和 `SASL_PLAINTEXT_PLAIN` 身分驗證類型，但 Amazon MSK 不支援。

#### SASL/IAM
<a name="connectors-msk-setup-configuring-authentication-sasl-iam"></a>

如果叢集使用 IAM 身分驗證，則必須在設定叢集時為使用者設定 IAM 政策。如需詳細資訊，請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》中的 [IAM 存取控制](https://docs.aws.amazon.com/msk/latest/developerguide/IAM-access-control.html)。

若要使用此身分驗證類型，請將連接器的 `auth_type` Lambda 環境變數設定為 `SASL_SSL_AWS_MSK_IAM`。

#### SSL
<a name="connectors-msk-setup-configuring-authentication-tls"></a>

如果叢集經過 SSL 身分驗證，您必須產生信任存放區和金鑰存放區檔案，並將其上傳到 Amazon S3 儲存貯體。部署連接器時，您必須提供此 Amazon S3 參考。金鑰存放區、信任存放區和 SSL 金鑰會儲存在 AWS Secrets Manager中。您可以在部署連接器時提供 AWS 私密金鑰。

如需有關在 Secrets Manager 中建立祕密的詳細資訊，請參閱[建立 AWS Secrets Manager 祕密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)。

若要使用此身分驗證類型，請設定環境變數，如下表所示。


****  

| 參數 | Value | 
| --- | --- | 
| auth\$1type | SSL | 
| certificates\$1s3\$1reference | 包含憑證的 Amazon S3 位置。 | 
| secrets\$1manager\$1secret |  AWS 私密金鑰的名稱。 | 

在 Secrets Manager 中建立祕密之後，您可以在 Secrets Manager 主控台中進行檢視。

**若要檢視 Secrets Manager 中的祕密**

1. 前往以下位置開啟機密管理員控制台：[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 在導覽窗格中，選擇 **Secrets** (祕密)。

1. 在 **Secrets** (祕密) 頁面中，選擇祕密的連結。

1. 在祕密的詳細資訊頁面上，選擇 **Retrieve secret value** (擷取祕密值)。

   下圖顯示了具有三個金鑰/值對的祕密範例：`keystore_password`、`truststore_password` 和 `ssl_key_password`。  
![\[在 Secrets Manager 中擷取 SSL 祕密。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-msk-setup-1.png)

#### SASL/SCRAM
<a name="connectors-msk-setup-configuring-authentication-sasl-scram"></a>

如果您的叢集使用 SCRAM 身分驗證，則請在部署連接器時提供與叢集相關聯的 Secrets Manager 金鑰。使用者的 AWS 憑證 (祕密金鑰和存取金鑰) 可用於向叢集進行身分驗證。

設定環境變數，如下表所示。


****  

| 參數 | Value | 
| --- | --- | 
| auth\$1type | SASL\$1SSL\$1SCRAM\$1SHA512 | 
| secrets\$1manager\$1secret |  AWS 私密金鑰的名稱。 | 

下圖顯示了 Secrets Manager 主控台中含有兩個金鑰/值對的祕密範例：一個用於 `username`，另一個用於 `password`。

![\[在 Secrets Manager 中擷取 SCRAM 祕密。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-msk-setup-2.png)


## 授權資訊
<a name="connectors-msk-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-msk/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-msk/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-msk-additional-resources"></a>

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-msk)。

# Amazon Athena MySQL 連接器
<a name="connectors-mysql"></a>

Amazon Athena Lambda MySQL 連接器讓 Amazon Athena 能夠存取 MySQL 資料庫。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-mysql-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。
+ 您必須先設定 VPC 和安全群組，才能使用此連接器。如需詳細資訊，請參閱[為資料來源連接器或 AWS Glue 連線建立 VPC](athena-connectors-vpc-creation.md)。

## 限制
<a name="connectors-mysql-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 由於 Athena 將查詢轉換為小寫，因此 MySQL 資料表名稱必須為小寫。例如，Athena 針對名為 `myTable` 的資料表進行查詢會失敗。
+ 如果將 MySQL 連線移轉至 Glue Catalog 和 Lake Formation，則僅會辨識小寫的資料表和資料欄名稱。

## 條款
<a name="connectors-mysql-terms"></a>

下列術語與 MySQL 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-mysql-parameters"></a>

使用本節中的參數來設定 MySQL 連接器。

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。

### Glue 連線 (建議)
<a name="connectors-mysql-gc"></a>

我們建議您使用 Glue 連線物件來設定 MySQL 連接器。

為此，請將 MySQL 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type MYSQL
```

**Lambda 環境屬性**

**glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 MySQL 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 MySQL 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-mysql-connection-legacy"></a>

下方列出的參數名稱和定義適用於未使用關聯 Glue 連線建立的 Athena 資料來源連接器。只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器或未指定 `glue_connection` 環境屬性時，才會使用下列參數。

#### 連接字串
<a name="connectors-mysql-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
mysql://${jdbc_connection_string}
```

**注意**  
如果在對 MySQL 資料表進行 `SELECT` 查詢時，收到錯誤 java.sql.SQLException: Zero date value prohibited (java.sql.SQLException：禁止零日期值)，請將以下參數新增到您的連接字串中：  

```
zeroDateTimeBehavior=convertToNull
```
如需詳細資訊，請參閱 GitHub.com 上的 [Error 'Zero date value prohibited' while trying to select from MySQL table](https://github.com/awslabs/aws-athena-query-federation/issues/760) (嘗試從 MySQL 資料表中選擇時出現錯誤「禁止零日期值」)。

#### 使用多工處理常式
<a name="connectors-mysql-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | MySqlMuxCompositeHandler | 
| 中繼資料處理常式 | MySqlMuxMetadataHandler | 
| 記錄處理常式 | MySqlMuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-mysql-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 mymysqlcatalog，則環境變數名稱為 mymysqlcatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 MySql MUX Lambda 函數：`mysql1` (預設) 和 `mysql2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | mysql://jdbc:mysql://mysql2.host:3333/default?user=sample2&password=sample2 | 
| mysql\$1catalog1\$1connection\$1string | mysql://jdbc:mysql://mysql1.host:3306/default?\$1\$1Test/RDS/MySql1\$1 | 
| mysql\$1catalog2\$1connection\$1string | mysql://jdbc:mysql://mysql2.host:3333/default?user=sample2&password=sample2 | 

##### 提供憑證
<a name="connectors-mysql-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${Test/RDS/MySql1}`。

```
mysql://jdbc:mysql://mysql1.host:3306/default?...&${Test/RDS/MySql1}&...
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
mysql://jdbc:mysql://mysql1host:3306/default?...&user=sample2&password=sample2&...
```

目前，MySQL 連接器可辨識 `user` 和 `password` JDBC 屬性。

#### 使用單一連接處理常式
<a name="connectors-mysql-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 MySQL 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | MySqlCompositeHandler | 
| 中繼資料處理常式 | MySqlMetadataHandler | 
| 記錄處理常式 | MySqlRecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-mysql-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函數所支援的單一 MySQL 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | mysql://mysql1.host:3306/default?secret=Test/RDS/MySql1 | 

#### 溢出參數
<a name="connectors-mysql-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-mysql-data-type-support"></a>

下表顯示 JDBC 和 Arrow 的相應資料類型。


****  

| JDBC | Arrow | 
| --- | --- | 
| Boolean | 位元 | 
| Integer | Tiny | 
| Short | Smallint | 
| Integer | Int | 
| Long | Bigint | 
| float | Float4 | 
| Double | Float8 | 
| Date | DateDay | 
| 時間戳記 | DateMilli | 
| String | Varchar | 
| 位元組 | Varbinary | 
| BigDecimal | Decimal (小數) | 
| ARRAY | 清單 | 

## 分割區和分隔
<a name="connectors-mysql-partitions-and-splits"></a>

分割區用於決定如何產生連接器的分割。Athena 建構了類型 `varchar` 的合成資料欄，表示資料表的分割結構，以幫助連接器產生分割。連接器不會修改實際的資料表定義。

## 效能
<a name="connectors-mysql-performance"></a>

MySQL 支援原生分割區。Athena MySQL 連接器可以平行地從這些分割區中擷取資料。如果您想要查詢具有統一分割區分佈的非常大的資料集，強烈建議使用原生分割。

Athena MySQL 連接器執行述詞下推，以減少查詢掃描的資料。`LIMIT` 子句、簡單述詞和複雜的表達式會下推至連接器，以減少掃描的資料量並縮短查詢執行時間。

### LIMIT 子句
<a name="connectors-mysql-performance-limit-clauses"></a>

`LIMIT N` 陳述句可減少查詢掃描的資料。透過 `LIMIT N` 下推，連接器只會向 Athena 傳回 `N` 個資料列。

### 述詞
<a name="connectors-mysql-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena MySQL 連接器可以合併這些表達式，並將其直接推送至 MySQL，以增強功能並減少掃描的資料量。

下列 Athena MySQL 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1DISTINCT\$1FROM、NULL\$1IF、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-mysql-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d))
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%') 
LIMIT 10;
```

如需有關使用述詞下推以改善聯合查詢中的效能 (包括 MySQL) 的文章，請參閱 *AWS 大數據部落格*中的[使用 Amazon Athena 中的述詞下推改善聯合查詢](https://aws.amazon.com/blogs/big-data/improve-federated-queries-with-predicate-pushdown-in-amazon-athena/)。

## 傳遞查詢
<a name="connectors-mysql-passthrough-queries"></a>

MySQL 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 MySQL 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 MySQL 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-mysql-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-mysql/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-mysql/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-mysql-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 MySQL 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-mysql/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-mysql)。

# Amazon Athena Neptune 連接器
<a name="connectors-neptune"></a>

Amazon Neptune 是快速、可靠、全受管的圖形資料庫服務，可讓您輕鬆建置和執行搭配高度連線資料集使用的應用程式。專門打造的 Neptune 高效能圖形資料庫引擎可將數十億筆關係以最佳化方式存放，且查詢圖形時只會產生數毫秒的延遲。如需詳細資訊，請參閱《[Neptune 使用者指南](https://docs.aws.amazon.com/neptune/latest/userguide/intro.html)》。

Amazon Athena Neptune 連接器讓 Athena 能夠與您的 Neptune 圖形資料庫執行個體通訊，以便使用 SQL 查詢來存取您的 Neptune 圖形資料。

此連接器不會使用 Glue 連線來集中 Glue 中的組態屬性。連線組態是透過 Lambda 完成的。

如果您的 帳戶中已啟用 Lake Formation，則您在 中部署的 Athena 聯合 Lambda 連接器的 IAM 角色 AWS Serverless Application Repository 必須在 Lake Formation 中具有對 的讀取存取權 AWS Glue Data Catalog。

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

使用 Neptune 連接器需要以下三個步驟。
+ 設定 Neptune 叢集
+ 設定 AWS Glue Data Catalog
+ 將連接器部署到您的 AWS 帳戶。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。如需特定於部署 Neptune 連接器的其他詳細資訊，請參閱 GitHub.com 上的[部署 Amazon Athena Neptune 連接器](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-neptune/docs/neptune-connector-setup)。

## 限制
<a name="connectors-neptune-limitations"></a>

目前，Neptune 連接器會有下列限制。
+ 不支援投影資料欄，包括主索引鍵 (ID)。

## 設定 Neptune 叢集
<a name="connectors-neptune-setting-up-a-neptune-cluster"></a>

如果您沒有想要使用的現有 Amazon Neptune 叢集和屬性圖資料集，則必須設定一個。

確保在託管 Neptune 叢集的 VPC 中具有網際網路閘道和 NAT 閘道。Neptune 連接器 Lambda 函數使用的私有子網應具有透過此 NAT 閘道連線至網際網路的路由。Neptune 連接器 Lambda 函數使用 NAT Gateway 進行通訊 AWS Glue。

如需有關設定新 Neptune 叢集並使用範例資料集載入它的說明，請參閱 GitHub.com 上的 [Sample Neptune Cluster Setup](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-neptune/docs/neptune-cluster-setup) (Neptune 叢集設定範例)。

## 設定 AWS Glue Data Catalog
<a name="connectors-neptune-setting-up-an-aws-glue-data-catalog"></a>

與傳統的關聯式資料存放區不同，Neptune 圖形資料庫節點和邊緣不使用集結構描述。每個條目可以有不同的欄位和資料類型。不過，由於 Neptune 連接器會從 擷取中繼資料 AWS Glue Data Catalog，因此您必須建立資料庫 AWS Glue ，其中包含具有所需結構描述的資料表。建立 AWS Glue 資料庫和資料表之後，連接器會填充可從 Athena 查詢的資料表清單。

### 啟用不區分大小寫的資料欄比對
<a name="connectors-neptune-glue-case-insensitive-column-matching"></a>

若要使用正確的大小寫解析 Neptune 資料表中的資料欄名稱，即使資料欄名稱都是小寫的 AWS Glue，您可以將 Neptune 連接器設定為不區分大小寫的比對。

若要啟用此功能，請將 Neptune 連接器 Lambda 函數環境變數 `enable_caseinsensitivematch` 設定為 `true`。

### 指定大小寫資料表名稱的 AWS Glue glabel 資料表參數
<a name="connectors-neptune-glue-glabel-parameter-for-table-names"></a>

由於 僅 AWS Glue 支援小寫資料表名稱，因此當您為 Neptune 建立`glabel` AWS Glue 資料表且 Neptune AWS Glue 資料表名稱包含大小寫時，請務必指定資料表參數。

在 AWS Glue 資料表定義中，包含 `glabel` 參數，並使用其原始大小寫將其值設定為資料表名稱。這可確保在 與您的 Neptune 資料表 AWS Glue 互動時保留正確的大小寫。下列範例會將 `glabel` 的值設定為資料表名稱 `Airport`。

```
glabel = Airport
```

![\[設定glabel AWS Glue 資料表屬性以保留 Neptune 資料表的資料表名稱大小寫\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-neptune-1.png)


如需設定 AWS Glue Data Catalog 以使用 Neptune 的詳細資訊，請參閱在 GitHub.com 上[設定 AWS Glue 目錄](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-neptune/docs/aws-glue-sample-scripts)。 GitHub.com.

## 效能
<a name="connectors-neptune-performance"></a>

Athena Neptune 連接器執行述詞下推，以減少查詢掃描的資料。不過，使用主索引鍵的述詞會導致查詢失敗。`LIMIT` 子句可減少掃描的資料量，但是如果您未提供述詞，則應期望具有 `LIMIT` 子句的 `SELECT` 查詢掃描至少 16 MB 的資料。Neptune 連接器由於並行而對限流保有彈性。

## 傳遞查詢
<a name="connectors-neptune-passthrough-queries"></a>

Neptune 連接器支援[傳遞查詢](federated-query-passthrough.md)。您可以使用此功能對屬性圖執行 Gremlin 查詢，以及對 RDF 資料執行 SPARQL 查詢。

若要透過 Neptune 建立傳遞查詢，請使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            DATABASE => 'database_name',
            COLLECTION => 'collection_name',
            QUERY => 'query_string'
        ))
```

下列範例 Neptune 傳遞查詢會篩選代碼為 `ATL` 的機場。雙引號用於逸出。

```
SELECT * FROM TABLE(
        system.query(
            DATABASE => 'graph-database',
            COLLECTION => 'airport',
            QUERY => 'g.V().has(''airport'', ''code'', ''ATL'').valueMap()' 
        ))
```

## 其他資源
<a name="connectors-neptune-additional-resources"></a>

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-neptune)。

# Amazon Athena OpenSearch 連接器
<a name="connectors-opensearch"></a>

OpenSearch Service

Amazon Athena OpenSearch 連接器讓 Amazon Athena 能夠與您的 OpenSearch 執行個體通訊，以便使用 SQL 來查詢您的 OpenSearch 資料。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

**注意**  
由於已知問題，OpenSearch 連接器不能與 VPC 搭配使用。

如果您的 帳戶中已啟用 Lake Formation，則您在 中部署的 Athena 聯合 Lambda 連接器的 IAM 角色 AWS Serverless Application Repository 必須在 Lake Formation 中具有對 的讀取存取權 AWS Glue Data Catalog。

## 先決條件
<a name="connectors-opensearch-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 條款
<a name="connectors-opensearch-terms"></a>

下列術語與 OpenSearch 連接器相關。
+ **網域** - 此連接器與 OpenSearch 執行個體的端點相關聯的名稱。該網域也用作資料庫名稱。對於 Amazon OpenSearch Service 中定義的 OpenSearch 執行個體，可自動探索網域。對於其他執行個體，您必須提供網域名稱和端點之間的映射。
+ **索引** - 在您的 OpenSearch 執行個體中定義的資料庫資料表。
+ **映射** - 如果索引是資料庫資料表，則映射為其結構描述 (亦即其欄位和屬性的定義)。

  此連接器支援從 OpenSearch 執行個體和 AWS Glue Data Catalog中擷取中繼資料。如果連接器找到符合您 OpenSearch 網域和索引名稱的 AWS Glue 資料庫和資料表，連接器會嘗試使用這些資料庫和資料表進行結構描述定義。我們建議您建立 AWS Glue 資料表，使其成為 OpenSearch 索引中所有欄位的超級集合。
+ **文件** - 資料庫資料表中的記錄。
+ **資料串流** – 由多個後備索引組成的以時間為基礎的資料料。如需詳細資訊，請參閱 OpenSearch 文件中的[資料串流](https://opensearch.org/docs/latest/dashboards/im-dashboards/datastream/)和《*Amazon OpenSearch Service 開發人員指南*》中的[資料串流入門](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/data-streams.html#data-streams-example)。
**注意**  
由於資料串流索引是透過開放式搜尋在內部建立和管理的，因此連接器會從第一個可用索引中選擇結構描述映射。因此，強烈建議將 AWS Glue 資料表設定為補充中繼資料來源。如需詳細資訊，請參閱[在 中設定資料庫和資料表 AWS Glue](#connectors-opensearch-setting-up-databases-and-tables-in-aws-glue)。

## Parameters
<a name="connectors-opensearch-parameters"></a>

使用本節中的參數來設定 OpenSearch 連接器。

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。  
下方列出的參數名稱和定義適用於 2024 年 12 月 3 日之前建立的 Athena 資料來源連接器。這些可能與其對應的 [AWS Glue 連線屬性](https://docs.aws.amazon.com/glue/latest/dg/connection-properties.html)不同。從 2024 年 12 月 3 日開始，只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器時，才會使用下列參數。

### Glue 連線 (建議)
<a name="opensearch-gc"></a>

我們建議您使用 Glue 連線物件來設定 OpenSearch 連接器。為此，請將 OpenSearch 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type OPENSEARCH
```

**Lambda 環境屬性**
+  **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 OpenSearch 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 OpenSearch 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="opensearch-legacy"></a>
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。
+ **disable\$1glue** – （選用） 如果存在並設為 true，連接器不會嘗試從中擷取補充中繼資料 AWS Glue。
+ **query\$1timeout\$1cluster** - 產生平行掃描時使用的叢集運作狀態查詢的逾時時間 (以秒為單位)。
+ **query\$1timeout\$1search** - 從索引中擷取文件時使用的搜尋查詢的逾時時間 (以秒為單位)。
+ **auto\$1discover\$1endpoint** - 布林值。預設值為 `true`。當您使用 Amazon OpenSearch Service 並將此參數設定為 true 時，連接器可以透過在 OpenSearch 服務上呼叫適當的描述或清單 API 操作來自動探索您的網域和端點。對於任何其他類型的 OpenSearch 執行個體 (例如，自助託管)，您必須在 `domain_mapping` 變數中指定相關聯的網域端點。如果 `auto_discover_endpoint=true`，連接器會使用 AWS 憑證向 OpenSearch Service 進行身分驗證。否則，連接器 AWS Secrets Manager 會透過 `domain_mapping`變數從 擷取使用者名稱和密碼登入資料。
+ **domain\$1mapping** - 僅在 `auto_discover_endpoint` 設定為 false 並定義網域名稱與其關聯端點之間的映射時使用。`domain_mapping` 變數可以下列格式容納多個 OpenSearch 端點：

  ```
  domain1=endpoint1,domain2=endpoint2,domain3=endpoint3,...       
  ```

  為了對 OpenSearch 端點進行身分驗證，連接器支援使用格式 `${SecretName}` 搭配從 AWS Secrets Manager中擷取的使用者名稱和密碼來插入替代字串。該秘密應採用下列 JSON 格式進行存放：

  ```
  { "username": "your_username", "password": "your_password" }
  ```

  連接器會自動剖析此 JSON 結構，以擷取憑證。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。

  下列範例使用 `opensearch-creds` 秘密。

  ```
  movies=https://${opensearch-creds}:search-movies-ne...qu---us-east-1---es.amazonaws.com     
  ```

  在執行時，`${opensearch-creds}` 呈現為使用者名稱和密碼，如以下範例所示。

  ```
  movies=https://myusername@mypassword:search-movies-ne...qu---us-east-1---es.amazonaws.com
  ```

  在 `domain_mapping` 參數中，每個網域端點對可以使用不同的秘密。秘密本身必須指定為 *user\$1name*@*password* 格式。雖然密碼可能包含內嵌式 `@` 符號，但第一個 `@` 用作 *user\$1name* 的分隔符號。

  還需要注意的是，此連接器使用逗號 (,) 和等號 (=) 作為網域端點對的分隔符號。因此，您不應該在儲存的秘密中的任何位置使用它們。

## 在 中設定資料庫和資料表 AWS Glue
<a name="connectors-opensearch-setting-up-databases-and-tables-in-aws-glue"></a>

連接器使用 AWS Glue 或 OpenSearch 取得中繼資料資訊。您可以將 AWS Glue 資料表設定為補充中繼資料定義來源。若要啟用此功能，請定義符合您正在補充之來源網域和索引的 AWS Glue 資料庫和資料表。連接器也可以透過擷取指定索引的映射，來利用 OpenSearch 執行個體中儲存的中繼資料定義。

### 在 OpenSearch 中定義陣列的中繼資料
<a name="connectors-opensearch-defining-metadata-for-arrays-in-opensearch"></a>

OpenSearch 沒有專用的陣列資料類型。任何欄位都可以包含零個或多個值，只要它們是相同的資料類型。如果您要使用 OpenSearch 作為中繼資料定義來源，對於被視為串列或陣列的欄位，您必須為 Athena 搭配使用的所有索引定義 `_meta` 屬性。如果您無法完成此步驟，查詢只會傳回串列欄位中的第一個元素。當您指定 `_meta` 屬性時，欄位名稱應完全符合巢狀 JSON 結構 (例如，`address.street`，其中 `street` 是 `address` 結構內的巢狀欄位）。

以下範例定義 `movies` 資料表中的 `actor` 和 `genre` 清單。

```
PUT movies/_mapping 
{ 
  "_meta": { 
    "actor": "list", 
    "genre": "list" 
  } 
}
```

### 資料類型
<a name="connectors-opensearch-data-types"></a>

OpenSearch 連接器可以從 AWS Glue 或 OpenSearch 執行個體擷取中繼資料定義。連接器使用下表中的映射，將定義轉換為 Apache Arrow 資料類型，包括下一節中所述的幾點。


****  

| OpenSearch | Apache Arrow | AWS Glue | 
| --- | --- | --- | 
| 文字、關鍵字、二進位 | VARCHAR | string | 
| 長整數 | BIGINT | bigint | 
| scaled\$1float | BIGINT | SCALED\$1FLOAT(...) | 
| integer | INT | int | 
| short | SMALLINT | smallint | 
| byte | TINYINT | tinyint | 
| double | FLOAT8 | double | 
| float, half\$1float | FLOAT4 | float | 
| boolean | BIT | boolean | 
| date, date\$1nanos | DATEMILLI | timestamp | 
| JSON 結構 | STRUCT | STRUCT | 
| \$1meta (如需詳細資訊，請參閱 [在 OpenSearch 中定義陣列的中繼資料](#connectors-opensearch-defining-metadata-for-arrays-in-opensearch) 一節)。 | LIST | ARRAY | 

#### 資料類型的注意事項
<a name="connectors-opensearch-data-type-considerations-and-limitations"></a>
+ 目前，連接器僅支援前面的表格中列出的 OpenSearch 和 AWS Glue 資料類型。
+ `scaled_float` 是由固定雙精度比例係數調整的浮點數，在 Apache Arrow 中表示為 `BIGINT`。例如，若比例係數為 100，則 0.756 會四捨五入為 76。
+ 若要在 `scaled_float`中定義 AWS Glue，您必須選取`array`資料欄類型，並使用 SCALED\$1FLOAT(*scaling\$1factor*) 格式宣告欄位。

  以下範例有效：

  ```
  SCALED_FLOAT(10.51) 
  SCALED_FLOAT(100) 
  SCALED_FLOAT(100.0)
  ```

  以下範例無效：

  ```
  SCALED_FLOAT(10.) 
  SCALED_FLOAT(.5)
  ```
+ 從 `date_nanos` 轉換為 `DATEMILLI` 時，奈秒四捨五入為最接近的毫秒。`date` 和 `date_nanos` 的有效值包括但不限於下列格式：

  ```
  "2020-05-18T10:15:30.123456789" 
  "2020-05-15T06:50:01.123Z" 
  "2020-05-15T06:49:30.123-05:00" 
  1589525370001 (epoch milliseconds)
  ```
+ OpenSearch `binary` 是使用 `Base64` 編碼的二進位值的字串表示並轉換為 `VARCHAR`。

## 執行 SQL 查詢
<a name="connectors-opensearch-running-sql-queries"></a>

以下是您可以搭配此連接器使用的 DDL 查詢範例。在這些範例中，*function\$1name* 對應於 Lambda 函數的名稱，*domain* 是您要查詢的網域名稱，*index* 是索引的名稱。

```
SHOW DATABASES in `lambda:function_name`
```

```
SHOW TABLES in `lambda:function_name`.domain
```

```
DESCRIBE `lambda:function_name`.domain.index
```

## 效能
<a name="connectors-opensearch-performance"></a>

Athena OpenSearch 連接器支援碎片式平行掃描。連接器會使用從 OpenSearch 執行個體擷取的叢集運作狀態資訊，為文件搜尋查詢產生多個請求。會針對每個碎片分割請求並同時執行。

連接器也會下推述詞，作為其文件搜尋查詢的一部分。下列範例查詢和述詞顯示連接器如何使用述詞下推。

**Query**

```
SELECT * FROM "lambda:elasticsearch".movies.movies 
WHERE year >= 1955 AND year <= 1962 OR year = 1996
```

** 述詞**

```
(_exists_:year) AND year:([1955 TO 1962] OR 1996)
```

## 傳遞查詢
<a name="connectors-opensearch-passthrough-queries"></a>

OpenSearch 連接器支援[傳遞查詢](federated-query-passthrough.md)，並且使用 Query DSL 語言。如需有關使用 Query DSL 進行查詢的詳細資訊，請參閱 Elasticsearch 文件中的 [Query DSL](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html) 或 OpenSearch 文件中的[Query DSL](https://opensearch.org/docs/latest/query-dsl/)。

若要透過 OpenSearch 連接器使用傳遞查詢，請使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            schema => 'schema_name',
            index => 'index_name',
            query => "{query_string}"
        ))
```

下列 OpenSearch 範例傳遞查詢會篩選出 `default` 結構描述的 `employee` 索引中雇用狀態為作用中的員工。

```
SELECT * FROM TABLE(
        system.query(
            schema => 'default',
            index => 'employee',
            query => "{ ''bool'':{''filter'':{''term'':{''status'': ''active''}}}}"
        ))
```

## 其他資源
<a name="connectors-opensearch-additional-resources"></a>
+ 如需有關使用 Amazon Athena OpenSearch 連接器在單一查詢中查詢 Amazon OpenSearch Service 和 Amazon S3 中的資料的文章，請參閱 *AWS 大數據部落格*中的[使用 Amazon Athena 的 SQL 查詢 Amazon OpenSearch Service 中的資料](https://aws.amazon.com/blogs/big-data/query-data-in-amazon-opensearch-service-using-sql-from-amazon-athena/)。
+ 如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-elasticsearch)。

# Amazon Athena Oracle 連接器
<a name="connectors-oracle"></a>

適用於 Oracle 的 Amazon Athena 連接器可讓 Amazon Athena 能夠對內部部署或在 Amazon EC2 或 Amazon RDS 上執行的 Oracle 中存放的資料執行 SQL 查詢。您也可以使用連接器來查詢 [Oracle exadata](https://www.oracle.com/engineered-systems/exadata/) 上的資料。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-oracle-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-oracle-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 僅支援 12.1.0.2 版 Oracle 資料庫。
+ 如果 Oracle 連接器沒有使用 Glue 連線，則連接器會將資料庫、資料表和資料欄名稱轉換為大寫。

  如果 Oracle 連接器使用了 Glue 連線，則連接器不會將資料庫、資料表和資料欄名稱預設為大寫。若要變更此大小寫行為，請視需要將 Lambda 的環境變數 `casing_mode` 變更為 `upper` 或 `lower` 。

   使用 Glue 連線的 Oracle 連接器不支援使用多工處理常式。
+ 當使用 Oracle `NUMBER` 而未定義精確度與小數位數，Athena 會將此視為 `BIGINT`。若要在 Athena 中取得所需的小數位數，請在 Lambda 環境變數中指定 `default_scale=<number of decimal places>`。

## 條款
<a name="connectors-oracle-terms"></a>

下列術語與 Oracle 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-oracle-parameters"></a>

使用本節中的參數來設定 Oracle 連接器。

### Glue 連線 (建議)
<a name="oracle-gc"></a>

我們建議您使用 Glue 連線物件來設定 Oracle 連接器。為此，請將 Oracle 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type ORACLE
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。
+ **is\$1fips\$1enabled** – (選用) 啟用 FIPS 模式時，設定為 true。預設值為 false。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **lower** – 將所有指定的結構描述和資料表名稱轉換為小寫。這是具有關聯 Glue 連線的連接器的預設值。
  + **upper** – 將所有指定的結構描述和資料表名稱轉換為大寫。這是沒有關聯 Glue 連線的連接器的預設值。
  + **case\$1insensitive\$1search** – 針對 Oracle 中的結構描述和資料表名稱執行不區分大小寫搜尋。如果查詢包含不符合連接器預設大小寫的結構描述或資料表名稱，請使用此值。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 Oracle 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Oracle 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="oracle-legacy"></a>

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。

下方列出的參數名稱和定義適用於未使用關聯 Glue 連線建立的 Athena 資料來源連接器。只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器或未指定 `glue_connection` 環境屬性時，才會使用下列參數。

**Lambda 環境屬性**
+ **default** – 用來連線至 Oracle 資料庫執行個體的 JDBC 連線字串。例如 `oracle://${jdbc_connection_string}`
+ **catalog\$1connection\$1string** – 由多工處理常式使用 (使用 Glue 連線時不支援)。資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 myoraclecatalog，則環境變數名稱為 myoraclecatalog\$1connection\$1string。
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。
+ **is\$1fips\$1enabled** – (選用) 啟用 FIPS 模式時，設定為 true。預設值為 false。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **lower** – 將所有指定的結構描述和資料表名稱轉換為小寫。這是具有關聯 Glue 連線的連接器的預設值。
  + **upper** – 將所有指定的結構描述和資料表名稱轉換為大寫。這是沒有關聯 Glue 連線的連接器的預設值。
  + **case\$1insensitive\$1search** – 針對 Oracle 中的結構描述和資料表名稱執行不區分大小寫搜尋。如果查詢包含不符合連接器預設大小寫的結構描述或資料表名稱，請使用此值。

#### 連接字串
<a name="connectors-oracle-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
oracle://${jdbc_connection_string}
```

**注意**  
如果您的密碼包含特殊字元 (例如，`some.password`)，當您將密碼傳遞給連線字串時，請以雙引號括住密碼 (例如，`"some.password"`)。如果沒有這樣做，會導致指定的 Oracle URL 無效錯誤。

#### 使用單一連接處理常式
<a name="connectors-oracle-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 Oracle 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | OracleCompositeHandler | 
| 中繼資料處理常式 | OracleMetadataHandler | 
| 記錄處理常式 | OracleRecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-oracle-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 
| IsFIPSEnabled | 選用。啟用 FIPS 模式時，設定為 true。預設值為 false。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

該連接器支援基於 SSL 的 Amazon RDS 執行個體連接。支援範圍僅限於 Transport Layer Security (TLS) 通訊協定，以及用戶端對伺服器執行的身分驗證作業。Amazon RDS 中不支援相互身分驗證。下表中的第二列顯示使用 SSL 的語法。

下列範例屬性適用於 Lambda 函數所支援的單一 Oracle 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | oracle://jdbc:oracle:thin:\$1\$1Test/RDS/Oracle\$1@//hostname:port/servicename | 
|  | oracle://jdbc:oracle:thin:\$1\$1Test/RDS/Oracle\$1@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS) (HOST=<HOST\$1NAME>)(PORT=))(CONNECT\$1DATA=(SID=))(SECURITY=(SSL\$1SERVER\$1CERT\$1DN=))) | 

#### 提供憑證
<a name="connectors-oracle-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**注意**  
如果您的密碼包含特殊字元 (例如，`some.password`)，當您將密碼儲存在 Secrets Manager 時，請以雙引號括住密碼 (例如，`"some.password"`)。如果沒有這樣做，會導致指定的 Oracle URL 無效錯誤。

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${Test/RDS/Oracle}`。

```
oracle://jdbc:oracle:thin:${Test/RDS/Oracle}@//hostname:port/servicename 
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
oracle://jdbc:oracle:thin:username/password@//hostname:port/servicename
```

目前，Oracle 連接器可辨識 `UID` 和 `PWD` JDBC 屬性。

#### 使用多工處理常式
<a name="connectors-oracle-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | OracleMuxCompositeHandler | 
| 中繼資料處理常式 | OracleMuxMetadataHandler | 
| 記錄處理常式 | OracleMuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-oracle-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 myoraclecatalog，則環境變數名稱為 myoraclecatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 Oracle MUX Lambda 函數：`oracle1` (預設) 和 `oracle2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | oracle://jdbc:oracle:thin:\$1\$1Test/RDS/Oracle1\$1@//oracle1.hostname:port/servicename | 
| oracle\$1catalog1\$1connection\$1string | oracle://jdbc:oracle:thin:\$1\$1Test/RDS/Oracle1\$1@//oracle1.hostname:port/servicename | 
| oracle\$1catalog2\$1connection\$1string | oracle://jdbc:oracle:thin:\$1\$1Test/RDS/Oracle2\$1@//oracle2.hostname:port/servicename | 

## 支援的資料類型
<a name="connectors-oracle-data-type-support"></a>

下表顯示 JDBC、Oracle 和 Arrow 的相應資料類型。


****  

| JDBC | Oracle | Arrow | 
| --- | --- | --- | 
| Boolean | boolean | 位元 | 
| Integer | N/A | Tiny | 
| Short | smallint | Smallint | 
| Integer | integer | Int | 
| Long | bigint | Bigint | 
| float | float4 | Float4 | 
| Double | float8 | Float8 | 
| Date | date | DateDay | 
| 時間戳記 | timestamp | DateMilli | 
| String | text | Varchar | 
| 位元組 | 位元組 | Varbinary | 
| BigDecimal | numeric(p,s) | Decimal (小數) | 
| ARRAY | N/A (請參閱備註) | 清單 | 

## 分割區和分隔
<a name="connectors-oracle-partitions-and-splits"></a>

分割區用於決定如何產生連接器的分割。Athena 建構了類型 `varchar` 的合成資料欄，表示資料表的分割結構，以幫助連接器產生分割。連接器不會修改實際的資料表定義。

## 效能
<a name="connectors-oracle-performance"></a>

Oracle 支援原生分割區。Athena Oracle 連接器可以平行地從這些分割區中擷取資料。如果您想要查詢具有統一分割區分佈的非常大的資料集，強烈建議使用原生分割。選取資料欄子集可大幅加速查詢執行期，並減少掃描的資料。Oracle 連接器由於並行而對限流保有彈性。但是，查詢執行時間往往會很長。

Athena Oracle 連接器執行述詞下推，以減少查詢掃描的資料。簡單述詞和複雜表達式會下推至連接器，以減少掃描的資料量並減少查詢執行時間。

### 述詞
<a name="connectors-oracle-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena Oracle 連接器可以合併這些表達式，並將其直接推送至 Oracle，以增強功能並減少掃描的資料量。

下列 Athena Oracle 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-oracle-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d)) 
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%');
```

## 傳遞查詢
<a name="connectors-oracle-passthrough-queries"></a>

Oracle 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Oracle 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Oracle 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer'
        ))
```

## 授權資訊
<a name="connectors-oracle-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-oracle/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-oracle/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-oracle-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 Oracle 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-oracle/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-oracle)。

# Amazon Athena PostgreSQL 連接器
<a name="connectors-postgresql"></a>

Amazon Athena PostgreSQL 連接器讓 Athena 能夠存取您的 PostgreSQL 資料庫。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-postgres-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-postgresql-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 與 PostgreSQL 類似，Athena 會將 PostgreSQL `CHAR` 類型中的尾隨空格視為在長度和比較方面於語義上是無關緊要。請注意，這僅適用於 `CHAR`，但不適用於 `VARCHAR` 類型。Athena 會忽略 `CHAR` 類型的尾隨空格，但會將其視為對 `VARCHAR` 類型具有重要意義。
+ 當您使用 [citext](https://www.postgresql.org/docs/current/citext.html) 不區分大小寫字元字串資料類型時，PostgreSQL 會使用與 Athena 不同的不區分大小寫資料比較。此差異會在 SQL `JOIN` 操作期間產生資料差異。若要解決此問題，請使用 PostgreSQL 連接器傳遞查詢功能。如需詳細資訊，請參閱本文件後面的[傳遞查詢](#connectors-postgres-passthrough-queries)一節。

## 條款
<a name="connectors-postgresql-terms"></a>

下列術語與 PostgreSQL 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-postgresql-parameters"></a>

使用本節中的參數來設定 PostgreSQL 連接器。

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。

### Glue 連線 (建議)
<a name="connectors-postgresql-gc"></a>

我們建議您使用 Glue 連線物件來設定 PostgreSQL 連接器。

為此，請將 PostgreSQL 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type POSTGRESQL
```

**Lambda 環境屬性**

**glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 PostgreSQL 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 PostgreSQL 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-postgresql-connection-legacy"></a>

下方列出的參數名稱和定義適用於未使用關聯 Glue 連線建立的 Athena 資料來源連接器。只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器或未指定 `glue_connection` 環境屬性時，才會使用下列參數。

#### 連接字串
<a name="connectors-postgresql-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
postgres://${jdbc_connection_string}
```

#### 使用多工處理常式
<a name="connectors-postgresql-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | PostGreSqlMuxCompositeHandler | 
| 中繼資料處理常式 | PostGreSqlMuxMetadataHandler | 
| 記錄處理常式 | PostGreSqlMuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-postgresql-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 mypostgrescatalog，則環境變數名稱為 mypostgrescatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 PostGreSql MUX Lambda 函數：`postgres1` (預設) 和 `postgres2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | postgres://jdbc:postgresql://postgres1.host:5432/default?\$1\$1Test/RDS/PostGres1\$1 | 
| postgres\$1catalog1\$1connection\$1string | postgres://jdbc:postgresql://postgres1.host:5432/default?\$1\$1Test/RDS/PostGres1\$1 | 
| postgres\$1catalog2\$1connection\$1string | postgres://jdbc:postgresql://postgres2.host:5432/default?user=sample&password=sample | 

##### 提供憑證
<a name="connectors-postgresql-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${Test/RDS/PostGres1}`。

```
postgres://jdbc:postgresql://postgres1.host:5432/default?...&${Test/RDS/PostGres1}&...
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
postgres://jdbc:postgresql://postgres1.host:5432/default?...&user=sample2&password=sample2&...
```

目前，PostgreSQL 連接器可辨識 `user` 和 `password` JDBC 屬性。

##### 正在啟用 SSL
<a name="connectors-postgresql-ssl"></a>

若要在 PostgreSQL 連線中支援 SSL，請將下列內容附加到您的連線字串中：

```
&sslmode=verify-ca&sslfactory=org.postgresql.ssl.DefaultJavaSSLFactory
```

**範例**  
下列範例連線字串並未使用 SSL。

```
postgres://jdbc:postgresql://example-asdf-aurora-postgres-endpoint:5432/asdf?user=someuser&password=somepassword
```

若要啟用 SSL，請依照下列方式修改字串。

```
postgres://jdbc:postgresql://example-asdf-aurora-postgres-endpoint:5432/asdf?user=someuser&password=somepassword&sslmode=verify-ca&sslfactory=org.postgresql.ssl.DefaultJavaSSLFactory
```

#### 使用單一連接處理常式
<a name="connectors-postgresql-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 PostgreSQL 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | PostGreSqlCompositeHandler | 
| 中繼資料處理常式 | PostGreSqlMetadataHandler | 
| 記錄處理常式 | PostGreSqlRecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-postgresql-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函數所支援的單一 PostgreSQL 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | postgres://jdbc:postgresql://postgres1.host:5432/default?secret=\$1\$1Test/RDS/PostgreSQL1\$1 | 

#### 溢出參數
<a name="connectors-postgresql-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-postgresql-data-type-support"></a>

下表顯示 JDBC、PostGreSQL 和 Arrow 的相應資料類型。


****  

| JDBC | PostGreSQL | Arrow | 
| --- | --- | --- | 
| Boolean | Boolean | 位元 | 
| Integer | N/A | Tiny | 
| Short | smallint | Smallint | 
| Integer | integer | Int | 
| Long | bigint | Bigint | 
| float | float4 | Float4 | 
| Double | float8 | Float8 | 
| Date | date | DateDay | 
| 時間戳記 | timestamp | DateMilli | 
| String | text | Varchar | 
| 位元組 | 位元組 | Varbinary | 
| BigDecimal | numeric(p,s) | Decimal (小數) | 
| ARRAY | N/A (請參閱備註) | 清單 | 

**注意**  
PostgreSQL 連接器支援 `ARRAY` 類型，但有以下限制：不支援多維陣列 (`<data_type>[][]` 或巢狀陣列)。具有不受支援之 `ARRAY` 資料類型的資料欄被轉換為字串元素陣列 (`array<varchar>`)。

## 分割區和分隔
<a name="connectors-postgresql-partitions-and-splits"></a>

分割區用於決定如何產生連接器的分割。Athena 建構了類型 `varchar` 的合成資料欄，表示資料表的分割結構，以幫助連接器產生分割。連接器不會修改實際的資料表定義。

## 效能
<a name="connectors-postgresql-performance"></a>

PostgreSQL 支援原生分割區。Athena PostgreSQL 連接器可以平行地從這些分割區中擷取資料。如果您想要查詢具有統一分割區分佈的非常大的資料集，強烈建議使用原生分割。

Athena PostgreSQL 連接器執行述詞下推，以減少查詢掃描的資料。`LIMIT` 子句、簡單述詞和複雜的表達式會下推至連接器，以減少掃描的資料量並縮短查詢執行時間。不過，選取資料欄子集有時會導致查詢執行期更長。

### LIMIT 子句
<a name="connectors-postgres-performance-limit-clauses"></a>

`LIMIT N` 陳述句可減少查詢掃描的資料。透過 `LIMIT N` 下推，連接器只會向 Athena 傳回 `N` 個資料列。

### 述詞
<a name="connectors-postgres-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena PostgreSQL 連接器可以合併這些表達式，並將其直接推送至 PostgreSQL，以增強功能並減少掃描的資料量。

下列 Athena PostgreSQL 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1DISTINCT\$1FROM、NULL\$1IF、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-postgres-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d))
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%') 
LIMIT 10;
```

## 傳遞查詢
<a name="connectors-postgres-passthrough-queries"></a>

PostgreSQL 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 PostgreSQL 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 PostgreSQL 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 其他資源
<a name="connectors-postgresql-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 PostgreSQL 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-postgresql/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-postgresql)。

# Amazon Athena Redis OSS 連接器
<a name="connectors-redis"></a>

Amazon Athena Redis OSS 連接器讓 Amazon Athena 能夠與您的 Redis OSS 執行個體通訊，以便使用 SQL 來查詢您的 Redis OSS 資料。您可以使用 AWS Glue Data Catalog 將 Redis OSS 金鑰/值對映射至虛擬資料表。

與傳統的關聯式資料存放區不同，Redis OSS 沒有資料表或資料欄概念。相反，Redis OSS 提供索引鍵/值存取模式，其中索引鍵本質上是一個 `string`，而值是 `string`、`z-set` 或 `hmap`。

您可以使用 AWS Glue Data Catalog 來建立結構描述和設定虛擬資料表。特殊資料表屬性會告知 Athena Redis OSS 連接器如何將 Redis OSS 索引鍵和值映射到資料表中。如需詳細資訊，請參閱本文件稍後的[在 中設定資料庫和資料表 AWS Glue](#connectors-redis-setting-up-databases-and-tables-in-glue)。

此連接器不會使用 Glue 連線來集中 Glue 中的組態屬性。連線組態是透過 Lambda 完成的。

如果您的 帳戶中已啟用 Lake Formation，則您在 中部署的 Athena 聯合 Lambda 連接器的 IAM 角色 AWS Serverless Application Repository 必須在 Lake Formation 中具有對 的讀取存取權 AWS Glue Data Catalog。

Amazon Athena Redis OSS 連接器支援 Amazon MemoryDB 和 Amazon ElastiCache (Redis OSS)。

## 先決條件
<a name="connectors-redis-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。
+ 您必須先設定 VPC 和安全群組，才能使用此連接器。如需詳細資訊，請參閱[為資料來源連接器或 AWS Glue 連線建立 VPC](athena-connectors-vpc-creation.md)。

## Parameters
<a name="connectors-redis-parameters"></a>

使用本節中的參數來設定 Redis 連接器。
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。
+ **glue\$1catalog** - (選用) 使用此選項可指定[跨帳戶 AWS Glue 目錄](data-sources-glue-cross-account.md)。根據預設，連接器會嘗試從自己的 AWS Glue 帳戶取得中繼資料。

## 在 中設定資料庫和資料表 AWS Glue
<a name="connectors-redis-setting-up-databases-and-tables-in-glue"></a>

若要啟用 AWS Glue 資料表以搭配 Redis OSS 使用，您可以在 資料表上設定下列資料表屬性：`redis-value-type`、 `redis-endpoint`和 `redis-keys-zset`或 `redis-key-prefix`。

此外，包含 Redis OSS 資料表的任何 AWS Glue 資料庫都必須在資料庫的 URI 屬性`redis-db-flag`中具有 。若要設定 `redis-db-flag` URI 屬性，請使用 AWS Glue 主控台編輯資料庫。

以下清單說明資料表屬性。
+ **redis-endpoint** – （必要） Redis OSS 伺服器的 *hostname*`:`*port*`:`**password，其中包含此資料表的資料 （例如 `athena-federation-demo.cache.amazonaws.com:6379`) 或者，您可以使用 AWS Secrets Manager \$1\$1*Secret\$1Name*\$1 作為資料表屬性值，在 中存放端點或部分端點。

**注意**  
若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。
+ **redis-keys-zset** - (不使用 `redis-key-prefix` 時需要) 以逗號分隔的索引鍵清單，其值為 [zset](https://redis.com/ebook/part-2-core-concepts/chapter-3-commands-in-redis/3-5-sorted-sets/) (例如，`active-orders,pending-orders`)。zset 中的每個值都會被視為屬於資料表的索引鍵。必須設定 `redis-keys-zset` 屬性或 `redis-key-prefix` 屬性。
+ **redis-key-prefix** - (不使用 `redis-keys-zset` 時需要) 以逗號分隔的索引鍵字首清單，可掃描資料表中的值 (例如，`accounts-*,acct-`)。必須設定 `redis-key-prefix` 屬性或 `redis-keys-zset` 屬性。
+ **redis-value-type** - (必要) 定義由 `redis-key-prefix` 或 `redis-keys-zset` 定義的索引鍵/值如何映射至您的資料表。常值映射到單個欄。zset 也映射到單個欄，但每個索引鍵可以存儲許多列。雜湊可讓每個索引鍵成為包含多個欄的資料列 (例如雜湊、常值或 zset)。
+ **redis-ssl-flag** - (選用) 如果為 `True`，建立使用 SSL/TLS 的 Redis 連接。預設值為 `False`。
+ **redis-cluster-flag** - (選用) 如果為 `True`，啟用對叢集 Redis 執行個體的支援。預設值為 `False`。
+ **redis-db-number** - (選用) 僅適用於獨立的非叢集執行個體。設定此數字 (例如 1、2 或 3) 以便從非預設 Redis 資料庫中讀取。預設值為 Redis 邏輯資料庫 0。此數字不是指 Athena 中的資料庫 AWS Glue，也不是指 Redis 邏輯資料庫。如需詳細資訊，請參閱 Redis 文件中的 [SELECT 索引](https://redis.io/commands/select)。

## 資料類型
<a name="connectors-redis-data-types"></a>

Redis OSS 連接器支援下列資料類型。不支援 Redis OSS 串流。
+ [：字串](https://redis.com/ebook/part-1-getting-started/chapter-1-getting-to-know-redis/1-2-what-redis-data-structures-look-like/1-2-1-strings-in-redis/)
+ [雜湊](https://redis.com/ebook/part-1-getting-started/chapter-1-getting-to-know-redis/1-2-what-redis-data-structures-look-like/1-2-4-hashes-in-redis/)
+ 排序集 ([ZSet](https://redis.com/ebook/part-2-core-concepts/chapter-3-commands-in-redis/3-5-sorted-sets/))

所有 Redis OSS 值被擷取為 `string` 資料類型。然後根據在 AWS Glue Data Catalog中定義資料表的方式，將它們轉換為以下 Apache Arrow 資料類型之一。


****  

| AWS Glue 資料類型 | Apache Arrow 資料類型 | 
| --- | --- | 
| int | INT | 
| string | VARCHAR | 
| bigint | BIGINT | 
| double | FLOAT8 | 
| float | FLOAT4 | 
| smallint | SMALLINT | 
| tinyint | TINYINT | 
| boolean | BIT | 
| binary | VARBINARY | 

## 所需的許可
<a name="connectors-redis-required-permissions"></a>

如需詳細了解此連接器所需的 IAM 政策，請檢閱 [athena-redis.yaml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-redis/athena-redis.yaml) 檔案的 `Policies` 部分。以下清單摘要說明所需的許可。
+ **Amazon S3 寫入存取** - 連接器需要 Amazon S3 中某個位置的寫入存取權，以便從大型查詢中溢寫結果。
+ **Athena GetQueryExecution** - 當上游 Athena 查詢終止時，連接器會使用此許可快速失敗。
+ **AWS Glue Data Catalog** – Redis 連接器需要對 的唯讀存取權 AWS Glue Data Catalog ，才能取得結構描述資訊。
+ **CloudWatch Logs** - 連接器需要存取 CloudWatch Logs 以儲存日誌。
+ **AWS Secrets Manager 讀取存取** – 如果您選擇將 Redis 端點詳細資訊存放在 Secrets Manager 中，則必須授予連接器存取這些秘密的權限。
+ **VPC 存取** - 連接器需要能夠將介面連接到 VPC 並能進行分離，以便可進行連接並與 Redis 執行個體通訊。

## 效能
<a name="connectors-redis-performance"></a>

Athena Redis OSS 連接器會嘗試根據您定義的資料表類型 (例如，zset 索引鍵或字首索引鍵)，對 Redis OSS 執行個體進行並行查詢。

Athena Redis 連接器執行述詞下推，以減少查詢掃描的資料。不過，包含針對主索引鍵的述詞的查詢因逾時而失敗。`LIMIT` 子句可減少掃描的資料量，但是如果您未提供述詞，則應期望具有 `LIMIT` 子句的 `SELECT` 查詢掃描至少 16 MB 的資料。Redis 連接器由於並行而對限流保有彈性。

## 傳遞查詢
<a name="connectors-redis-passthrough-queries"></a>

Redis 連接器支援[傳遞查詢](federated-query-passthrough.md)。您可以使用此功能，以在 Redis 資料庫上執行使用 Lua 指令碼的查詢。

若要透過 Redis 建立傳遞查詢，請使用下列語法：

```
SELECT * FROM TABLE(
        system.script(
            script => 'return redis.[call|pcall](query_script)',
            keys => '[key_pattern]',
            argv => '[script_arguments]'
))
```

下列範例會執行 Lua 指令碼，以取得索引鍵 `l:a` 的值。

```
SELECT * FROM TABLE(
        system.script(
            script => 'return redis.call("GET", KEYS[1])',
            keys => '[l:a]',
            argv => '[]'
))
```

## 授權資訊
<a name="connectors-redis-license-information"></a>

Amazon Athena Redis 連接器專案是依據 [Apache-2.0 License](https://www.apache.org/licenses/LICENSE-2.0.html) 來授權的。

## 其他資源
<a name="connectors-redis-additional-resources"></a>

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-redis)。

# Amazon Athena Redshift 連接器
<a name="connectors-redshift"></a>

Amazon Athena Redshift 連接器讓 Amazon Athena 能夠存取 Amazon Redshift 和 Amazon Redshift Serverless 資料庫，包括 Redshift Serverless 檢視。您可以使用此頁面所述的 JDBC 連線字串組態設定來連線至任一服務。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-redshift-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-redshift-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 由於 Redshift 不支援外部分割區，因此每次都會擷取由查詢指定的所有資料。
+ 與 Redshift 類似，Athena 會將 Redshift `CHAR` 類型中的尾隨空格視為在長度和比較方面於語義上是無關緊要。請注意，這僅適用於 `CHAR`，但不適用於 `VARCHAR` 類型。Athena 會忽略 `CHAR` 類型的尾隨空格，但會將其視為對 `VARCHAR` 類型具有重要意義。

## 條款
<a name="connectors-redshift-terms"></a>

下列術語與 Redshift 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-redshift-parameters"></a>

使用本節中的參數來設定 Redshift 連接器。

### Glue 連線 (建議)
<a name="redshift-gc"></a>

我們建議您使用 Glue 連線物件來設定 Redshift 連接器。為此，請將 Amazon Redshift 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type REDSHIFT
```

**Lambda 環境屬性**

**glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 Redshift 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Redshift 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="redshift-legacy"></a>

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。

下方列出的參數名稱和定義適用於未使用關聯 Glue 連線建立的 Athena 資料來源連接器。只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器或未指定 `glue_connection` 環境屬性時，才會使用下列參數。

**Lambda 環境屬性**
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。
+ **disable\$1glue** – （選用） 如果存在並設為 true，連接器不會嘗試從中擷取補充中繼資料 AWS Glue。
+ **glue\$1catalog** - (選用) 使用此選項可指定[跨帳戶 AWS Glue 目錄](data-sources-glue-cross-account.md)。根據預設，連接器會嘗試從自己的 AWS Glue 帳戶取得中繼資料。

#### 連接字串
<a name="connectors-redshift-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
redshift://${jdbc_connection_string}
```

#### 使用多工處理常式
<a name="connectors-redshift-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | RedshiftMuxCompositeHandler | 
| 中繼資料處理常式 | RedshiftMuxMetadataHandler | 
| 記錄處理常式 | RedshiftMuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-redshift-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 myredshiftcatalog，則環境變數名稱為 myredshiftcatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 Redshift MUX Lambda 函數：`redshift1` (預設) 和 `redshift2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | redshift://jdbc:redshift://redshift1.host:5439/dev?user=sample2&password=sample2 | 
| redshift\$1catalog1\$1connection\$1string | redshift://jdbc:redshift://redshift1.host:3306/default?\$1\$1Test/RDS/Redshift1\$1 | 
| redshift\$1catalog2\$1connection\$1string | redshift://jdbc:redshift://redshift2.host:3333/default?user=sample2&password=sample2 | 

##### 提供憑證
<a name="connectors-redshift-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 \$1\$1Test/RDS/ `Redshift1`\$1。

```
redshift://jdbc:redshift://redshift1.host:3306/default?...&${Test/RDS/Redshift1}&...
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
redshift://jdbc:redshift://redshift1.host:3306/default?...&user=sample2&password=sample2&...
```

目前，Redshift 連接器可辨識 `user` 和 `password` JDBC 屬性。

## 支援的資料類型
<a name="connectors-redshift-data-type-support"></a>

下表顯示 JDBC 和 Apache Arrow 的相應資料類型。


****  

| JDBC | Arrow | 
| --- | --- | 
| Boolean | 位元 | 
| Integer | Tiny | 
| Short | Smallint | 
| Integer | Int | 
| Long | Bigint | 
| float | Float4 | 
| Double | Float8 | 
| Date | DateDay | 
| 時間戳記 | DateMilli | 
| String | Varchar | 
| 位元組 | Varbinary | 
| BigDecimal | Decimal (小數) | 
| ARRAY | 清單 | 

## 分割區和分隔
<a name="connectors-redshift-partitions-and-splits"></a>

Redshift 不支援外部分割區。如需效能相關問題的資訊，請參閱 [效能](#connectors-redshift-performance)。

## 效能
<a name="connectors-redshift-performance"></a>

Athena Redshift 連接器執行述詞下推，以減少查詢掃描的資料。`LIMIT` 子句、`ORDER BY` 子句、簡單述詞和複雜的表達式會下推至連接器，以減少掃描的資料量並縮短查詢執行時間。不過，選取資料欄子集有時會導致查詢執行期更長。同時執行多個查詢時，Amazon Redshift 特別容易受到查詢執行速度減慢的影響。

### LIMIT 子句
<a name="connectors-redshift-performance-limit-clauses"></a>

`LIMIT N` 陳述句可減少查詢掃描的資料。透過 `LIMIT N` 下推，連接器只會向 Athena 傳回 `N` 個資料列。

### 前 N 個查詢
<a name="connectors-redshift-performance-top-n-queries"></a>

前 `N` 個查詢會指定結果集的順序，以及傳回的資料列數目的限制。您可以使用這種查詢類型，判斷資料集的前 `N` 個最大值或前 `N` 個最小值。透過前 `N` 個下推，連接器只會向 Athena 傳回 `N` 個排序的資料列。

### 述詞
<a name="connectors-redshift-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena Redshift 連接器可以合併這些表達式，並將其直接推送至 Redshift，以增強功能並減少掃描的資料量。

下列 Athena Redshift 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1DISTINCT\$1FROM、NULL\$1IF、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-redshift-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d)) 
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%') 
ORDER BY col_a DESC 
LIMIT 10;
```

如需有關使用述詞下推以改善聯合查詢中的效能 (包括 Amazon Redshift) 的文章，請參閱 *AWS 大數據部落格*中的[使用 Amazon Athena 中的述詞下推改善聯合查詢](https://aws.amazon.com/blogs/big-data/improve-federated-queries-with-predicate-pushdown-in-amazon-athena/)。

## 傳遞查詢
<a name="connectors-redshift-passthrough-queries"></a>

Redshift 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Redshift 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Redshift 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 其他資源
<a name="connectors-redshift-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 Redshift 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-redshift/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-redshift)。

# Amazon Athena SAP HANA 連接器
<a name="connectors-sap-hana"></a>

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-saphana-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-sap-hana-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 在 SAP HANA 中，當物件名稱儲存在 SAP HANA 資料庫中時會轉換為大寫。但是，由於引號中的名稱區分大小寫，因此兩個資料表的名稱可能會相同，分別為小寫和大寫 (例如，`EMPLOYEE` 和 `employee`)。

  在 Athena 聯合查詢中，結構描述資料表名稱會以小寫形式提供給 Lambda 函數。若要解決此問題，您可以提供 `@schemaCase` 查詢提示以便從名稱區分大小寫的資料表中擷取資料。以下是具有查詢提示的兩個查詢範例。

  ```
  SELECT * 
  FROM "lambda:saphanaconnector".SYSTEM."MY_TABLE@schemaCase=upper&tableCase=upper"
  ```

  ```
  SELECT * 
  FROM "lambda:saphanaconnector".SYSTEM."MY_TABLE@schemaCase=upper&tableCase=lower"
  ```

## 條款
<a name="connectors-sap-hana-terms"></a>

下列術語與 SAP HANA 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-sap-hana-parameters"></a>

使用本節中的參數來設定 SAP HANA 連接器。

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。  
下方列出的參數名稱和定義適用於 2024 年 12 月 3 日之前建立的 Athena 資料來源連接器。這些可能與其對應的 [AWS Glue 連線屬性](https://docs.aws.amazon.com/glue/latest/dg/connection-properties.html)不同。從 2024 年 12 月 3 日開始，只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器時，才會使用下列參數。

### Glue 連線 (建議)
<a name="connectors-sap-hana-gc"></a>

我們建議您使用 Glue 連線物件來設定 SAP HANA 連接器。為此，請將 SAP HANA 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type SAPHANA
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **none** – 請勿變更指定的結構描述和資料表名稱的大小寫。這是具有關聯 Glue 連線的連接器的預設值。
  + **upper** – 將所有指定的結構描述和資料表名稱轉換為大寫。
  + **lower** – 將所有指定的結構描述和資料表名稱轉換為小寫。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 SAP HANA 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 SAP HANA 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-sap-hana-legacy"></a>

#### 連接字串
<a name="connectors-sap-hana-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
saphana://${jdbc_connection_string}
```

#### 使用多工處理常式
<a name="connectors-sap-hana-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | SaphanaMuxCompositeHandler | 
| 中繼資料處理常式 | SaphanaMuxMetadataHandler | 
| 記錄處理常式 | SaphanaMuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-sap-hana-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 mysaphanacatalog，則環境變數名稱為 mysaphanacatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 Saphana MUX Lambda 函數：`saphana1` (預設) 和 `saphana2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | saphana://jdbc:sap://saphana1.host:port/?\$1\$1Test/RDS/ Saphana1\$1 | 
| saphana\$1catalog1\$1connection\$1string | saphana://jdbc:sap://saphana1.host:port/?\$1\$1Test/RDS/ Saphana1\$1 | 
| saphana\$1catalog2\$1connection\$1string | saphana://jdbc:sap://saphana2.host:port/?user=sample2&password=sample2 | 

##### 提供憑證
<a name="connectors-sap-hana-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${Test/RDS/Saphana1}`。

```
saphana://jdbc:sap://saphana1.host:port/?${Test/RDS/Saphana1}&...
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
saphana://jdbc:sap://saphana1.host:port/?user=sample2&password=sample2&...
```

目前，SAP HANA 連接器可辨識 `user` 和 `password` JDBC 屬性。

#### 使用單一連接處理常式
<a name="connectors-sap-hana-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 SAP HANA 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | SaphanaCompositeHandler | 
| 中繼資料處理常式 | SaphanaMetadataHandler | 
| 記錄處理常式 | SaphanaRecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-sap-hana-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函數所支援的單一 SAP HANA 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | saphana://jdbc:sap://saphana1.host:port/?secret=Test/RDS/Saphana1 | 

#### 溢出參數
<a name="connectors-sap-hana-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-sap-hana-data-type-support"></a>

下表顯示 JDBC 和 Apache Arrow 的相應資料類型。


****  

| JDBC | Arrow | 
| --- | --- | 
| Boolean | 位元 | 
| Integer | Tiny | 
| Short | Smallint | 
| Integer | Int | 
| Long | Bigint | 
| float | Float4 | 
| Double | Float8 | 
| Date | DateDay | 
| 時間戳記 | DateMilli | 
| String | Varchar | 
| 位元組 | Varbinary | 
| BigDecimal | Decimal (小數) | 
| ARRAY | 清單 | 

## 資料類型轉換
<a name="connectors-sap-hana-data-type-conversions"></a>

除了 JDBC 到 Arrow 轉換之外，連接器還會執行一些其他轉換，以使 SAP HANA 來源和 Athena 資料類型相容。這些轉換有助於確保成功執行查詢。下表顯示了這些轉換。


****  

| 來源資料類型 (SAP HANA) | 轉換後的資料類型 (Athena) | 
| --- | --- | 
| DECIMAL | BIGINT | 
| INTEGER | INT | 
| DATE | DATEDAY | 
| TIMESTAMP | DATEMILLI | 

所有其他不受支援的資料類型都會轉換為 `VARCHAR`。

## 分割區和分隔
<a name="connectors-sap-hana-partitions-and-splits"></a>

分割區由 `Integer` 類型的單一分割區資料欄表示。此資料欄包含 SAP HANA 資料表中所定義之分割區的分割區名稱。對於沒有分割區名稱的資料表，會傳回 \$1，這相當於一個單一的分割區。分割區等同於分隔。


****  

| 名稱 | 類型 | 說明 | 
| --- | --- | --- | 
| PART\$1ID | Integer | SAP HANA 中的已命名分割區。 | 

## 效能
<a name="connectors-sap-hana-performance"></a>

SAP HANA 支援原生分割區。Athena SAP HANA 連接器可以平行地從這些分割區中擷取資料。如果您想要查詢具有統一分割區分佈的非常大的資料集，強烈建議使用原生分割。選取資料欄子集可大幅加速查詢執行期，並減少掃描的資料。由於並行，連接器會顯示嚴重限流，且有時會顯示查詢失敗。

Athena SAP HANA 連接器執行述詞下推，以減少查詢掃描的資料。`LIMIT` 子句、簡單述詞和複雜的表達式會下推至連接器，以減少掃描的資料量並縮短查詢執行時間。

### LIMIT 子句
<a name="connectors-saphana-performance-limit-clauses"></a>

`LIMIT N` 陳述句可減少查詢掃描的資料。透過 `LIMIT N` 下推，連接器只會向 Athena 傳回 `N` 個資料列。

### 述詞
<a name="connectors-saphana-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena SAP HANA 連接器可以合併這些表達式，並將其直接推送至 SAP HANA，以增強功能並減少掃描的資料量。

下列 Athena SAP HANA 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1DISTINCT\$1FROM、NULL\$1IF、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-saphana-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d))
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%') 
LIMIT 10;
```

## 傳遞查詢
<a name="connectors-saphana-passthrough-queries"></a>

SAP HANA 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 SAP HANA 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 SAP HANA 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-saphana-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-saphana/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-saphana/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-saphana-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 SAP HANA 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-saphana/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-saphana)。

# Amazon Athena Snowflake 連接器
<a name="connectors-snowflake"></a>

適用於 [Snowflake](https://www.snowflake.com/) 的 Amazon Athena 連接器可讓 Amazon Athena 使用 JDBC 對存放在 Snowflake SQL 資料庫或 RDS 執行個體中的資料執行 SQL 查詢。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

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

使用 Athena 主控台或 `CreateDataCatalog` API 操作，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱[建立資料來源連線](connect-to-a-data-source.md)。

## 限制
<a name="connectors-snowflake-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 只有舊版連線支援多工器設定。
+ 目前支援採用單一分割方式的 Snowflake 檢視。
+  在 Snowflake 中，物件名稱區分大小寫。Athena 在 DDL 和 DML 查詢中接受混合大小寫，但在預設情況下，會在執行查詢時[接受](https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html#table-names-and-table-column-names-in-ate-must-be-lowercase)物件名稱。使用 Glue Catalog/Lake Formation 時，Snowflake 連接器僅支援小寫。使用 Athena Catalog 時，客戶可以使用 `casing_mode` Lambda 環境變數控制大小寫行為，其可能的值列於 [Parameters](#connectors-snowflake-parameters)區段 （例如 `key=casing_mode, value = CASE_INSENSITIVE_SEARCH`)。

## 條款
<a name="connectors-snowflake-terms"></a>

下列術語與 Snowflake 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-snowflake-parameters"></a>

使用本節中的參數來設定 Snowflake 連接器。

### Glue 連線 (建議)
<a name="snowflake-gc"></a>

我們建議您使用 Glue 連線物件來設定 Snowflake 連接器。為此，請將 Snowflake 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type SNOWFLAKE
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **NONE** – 請勿變更指定結構描述和資料表名稱的大小寫 （對 Snowflake 執行查詢）。這是未指定 **casing\$1mode** 時的預設值。
  + **UPPER** – 在針對 Snowflake 執行之前，查詢中所有指定結構描述和資料表名稱的大寫。
  + **LOWER** – 在針對 Snowflake 執行之前，查詢中所有指定結構描述和資料表名稱的較小大小寫。
  + **CASE\$1INSENSITIVE\$1SEARCH** – 針對 Snowflake 中的結構描述和資料表名稱執行不區分大小寫的搜尋。例如，當您有類似 的查詢，`SELECT * FROM EMPLOYEE`且 Snowflake 包含名為 的資料表時，您可以使用此模式`Employee`。不過，在出現名稱衝突的情況下，例如在 Snowflake `Employee`中有一個名為 的資料表`EMPLOYEE`和另一個名為 的資料表，查詢將會失敗。

**注意**  
使用 Glue 連線建立的 Snowflake 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Snowflake 連接器僅支援 `ConnectionSchemaVersion` 2。

**儲存登入資料**

使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。如需詳細資訊，請參閱[使用 Snowflake 進行身分驗證](connectors-snowflake-authentication.md)。

### 舊版連線
<a name="snowflake-legacy"></a>

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。

下方列出的參數名稱和定義適用於未使用關聯 Glue 連線建立的 Athena 資料來源連接器。只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器或未指定 `glue_connection` 環境屬性時，才會使用下列參數。

**Lambda 環境屬性**
+ **default** – 用來連線至 Snowflake 資料庫執行個體的 JDBC 連線字串。例如 `snowflake://${jdbc_connection_string}`
+ **catalog\$1connection\$1string** – 由多工處理常式使用 (使用 Glue 連線時不支援)。資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 mysnowflakecatalog，則環境變數名稱為 mysnowflakecatalog\$1connection\$1string。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **NONE** – 請勿變更指定結構描述和資料表名稱的大小寫 （對 Snowflake 執行查詢）。這是未指定 **casing\$1mode** 時的預設值。
  + **UPPER** – 在針對 Snowflake 執行之前，查詢中所有指定結構描述和資料表名稱的大寫。
  + **LOWER** – 在針對 Snowflake 執行之前，查詢中所有指定結構描述和資料表名稱的較小大小寫。
  + **CASE\$1INSENSITIVE\$1SEARCH** – 針對 Snowflake 中的結構描述和資料表名稱執行不區分大小寫的搜尋。例如，當您有類似 的查詢，`SELECT * FROM EMPLOYEE`且 Snowflake 包含名為 的資料表時，您可以使用此模式`Employee`。不過，在出現名稱衝突的情況下，例如在 Snowflake `Employee`中有一個名為 的資料表`EMPLOYEE`和另一個名為 的資料表，查詢將會失敗。
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。

#### 連接字串
<a name="connectors-snowflake-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
snowflake://${jdbc_connection_string}
```

#### 使用多工處理常式
<a name="connectors-snowflake-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | SnowflakeMuxCompositeHandler | 
| 中繼資料處理常式 | SnowflakeMuxMetadataHandler | 
| 記錄處理常式 | SnowflakeMuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-snowflake-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 mysnowflakecatalog，則環境變數名稱為 mysnowflakecatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 Snowflake MUX Lambda 函數：`snowflake1` (預設) 和 `snowflake2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | snowflake://jdbc:snowflake://snowflake1.host:port/?warehouse=warehousename&db=db1&schema=schema1&\$1\$1Test/RDS/Snowflake1\$1 | 
| snowflake\$1catalog1\$1connection\$1string | snowflake://jdbc:snowflake://snowflake1.host:port/?warehouse=warehousename&db=db1&schema=schema1\$1\$1Test/RDS/Snowflake1\$1 | 
| snowflake\$1catalog2\$1connection\$1string | snowflake://jdbc:snowflake://snowflake2.host:port/?warehouse=warehousename&db=db1&schema=schema1&user=sample2&password=sample2 | 

##### 提供憑證
<a name="connectors-snowflake-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${Test/RDS/Snowflake1}`。

```
snowflake://jdbc:snowflake://snowflake1.host:port/?warehouse=warehousename&db=db1&schema=schema1${Test/RDS/Snowflake1}&... 
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
snowflake://jdbc:snowflake://snowflake1.host:port/warehouse=warehousename&db=db1&schema=schema1&user=sample2&password=sample2&... 
```

目前，Snowflake 可辨識 `user` 和 `password` JDBC 屬性。它也接受格式為 *username*`/`*password* 的使用者名稱和密碼，而不使用金鑰 `user` 或 `password`。

#### 使用單一連接處理常式
<a name="connectors-snowflake-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 Snowflake 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | SnowflakeCompositeHandler | 
| 中繼資料處理常式 | SnowflakeMetadataHandler | 
| 記錄處理常式 | SnowflakeRecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-snowflake-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函數所支援的單一 Snowflake 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | snowflake://jdbc:snowflake://snowflake1.host:port/?secret=Test/RDS/Snowflake1 | 

#### 溢出參數
<a name="connectors-snowflake-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-snowflake-data-type-support"></a>

下表顯示 JDBC 和 Apache Arrow 的相應資料類型。


****  

| JDBC | Arrow | 
| --- | --- | 
| Boolean | 位元 | 
| Integer | Tiny | 
| Short | Smallint | 
| Integer | Int | 
| Long | Bigint | 
| float | Float4 | 
| Double | Float8 | 
| Date | DateDay | 
| 時間戳記 | DateMilli | 
| String | Varchar | 
| 位元組 | Varbinary | 
| BigDecimal | Decimal (小數) | 
| ARRAY | 清單 | 

## 資料類型轉換
<a name="connectors-snowflake-data-type-conversions"></a>

除了 JDBC 到 Arrow 轉換之外，連接器還會執行一些其他轉換，以使 Snowflake 來源和 Athena 資料類型相容。這些轉換有助於確保成功執行查詢。下表顯示了這些轉換。


****  

| 來源資料類型 (Snowflake) | 轉換後的資料類型 (Athena) | 
| --- | --- | 
| TIMESTAMP | TIMESTAMPMILLI | 
| DATE | TIMESTAMPMILLI | 
| INTEGER | INT | 
| DECIMAL | BIGINT | 
| TIMESTAMP\$1NTZ | TIMESTAMPMILLI | 

所有其他不受支援的資料類型都會轉換為 `VARCHAR`。

## 分割區和分隔
<a name="connectors-snowflake-partitions-and-splits"></a>

分割區用於決定如何產生連接器的分割。Athena 建構了類型 `varchar` 的合成資料欄，表示資料表的分割結構，以幫助連接器產生分割。連接器不會修改實際的資料表定義。

若要建立此合成資料欄和分割區，Athena 需要定義主索引鍵。不過，由於 Snowflake 不會強制執行主索引鍵限制，您必須自行強制執行唯一性。否則，Athena 會預設為單一分割。

## 效能
<a name="connectors-snowflake-performance"></a>

為了獲得最佳效能，請盡可能在查詢中使用篩選條件。此外，我們強烈建議使用原生分割來擷取具有統一分割區分佈的龐大資料集。選取資料欄子集可大幅加速查詢執行期，並減少掃描的資料。Snowflake 連接器由於並行而對限流保有彈性。

Athena Snowflake 連接器執行述詞下推，以減少查詢掃描的資料。`LIMIT` 子句、簡單述詞和複雜的表達式會下推至連接器，以減少掃描的資料量並縮短查詢執行期。

### LIMIT 子句
<a name="connectors-snowflake-performance-limit-clauses"></a>

`LIMIT N` 陳述句可減少查詢掃描的資料。透過 `LIMIT N` 下推，連接器只會向 Athena 傳回 `N` 個資料列。

### 述詞
<a name="connectors-snowflake-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena Snowflake 連接器可以合併這些表達式，並將其直接推送至 Snowflake，以增強功能並減少掃描的資料量。

下列 Athena Snowflake 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1DISTINCT\$1FROM、NULL\$1IF、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-snowflake-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d))
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%') 
LIMIT 10;
```

# 使用 Snowflake 進行身分驗證
<a name="connectors-snowflake-authentication"></a>

您可以設定 Amazon Athena Snowflake 連接器，讓其使用金鑰對身分驗證或 OAuth 身分驗證方法來連線至 Snowflake 資料倉儲。這兩種方法都能安全存取 Snowflake，而無需在連線字串中存放密碼。
+ **金鑰對身分驗證** – 此方法使用 RSA 公有或私有金鑰對，以進行 Snowflake 的身分驗證。當對應的公有金鑰在 Snowflake 中註冊以進行驗證時，私有金鑰會以數位方式簽署身分驗證請求。此方法無需密碼儲存。
+ **OAuth 身分驗證** –此方法使用授權權杖和重新整理權杖，以進行 Snowflake 的身分驗證。此方法支援自動權杖重新整理，因此適用於長時間執行的應用程式。

如需詳細資訊，請參閱《Snowflake 使用者指南》中的[金鑰對身分驗證](https://docs.snowflake.com/en/user-guide/key-pair-auth)和 [OAuth 身分驗證](https://docs.snowflake.com/en/user-guide/oauth-custom)。

## 先決條件
<a name="connectors-snowflake-authentication-prerequisites"></a>

開始之前，請先完成以下先決條件：
+ 擁有管理權限的 Snowflake 帳戶存取。
+ 專屬於 Athena 連接器的 Snowflake 使用者帳戶。
+ OpenSSL 或同等金鑰產生工具，以進行金鑰對身份驗證。
+ AWS Secrets Manager 建立和管理秘密的存取權。
+ Web 瀏覽器，以完成進行 OAuth 身分驗證的 OAuth 流程。

## 設定金鑰對身分驗證
<a name="connectors-snowflake-keypair-authentication"></a>

此程序包括產生 RSA 金鑰對、使用公有金鑰設定 Snowflake 帳戶，以及將私有金鑰安全地存放在 AWS Secrets Manager中。下列步驟將引導您建立密碼編譯金鑰、設定必要的 Snowflake 許可，以及設定 AWS 登入資料以進行無縫身分驗證。

1. **產生 RSA 金鑰對**

   使用 OpenSSL 產生私有和公有金鑰對。
   + 若要產生未加密版本，請在本機命令列應用程式中使用下列命令。

     ```
     openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
     ```
   + 若要產生加密版本，請使用下列命令，而這會省略 `-nocrypt`。

     ```
     openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 des3 -inform PEM -out rsa_key.p8
     ```
   + 從私有金鑰產生公有金鑰。

     ```
     openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
     # Set appropriate permissions (Unix/Linux)
     chmod 600 rsa_key.p8
     chmod 644 rsa_key.pub
     ```
**注意**  
請勿共用您的私有金鑰。只有需要進行 Snowflake 身分驗證的應用程式才能存取私有金鑰。

1. **擷取 Snowflake 的公有金鑰內容 (不含分隔符號)**

   ```
   # Extract public key content (remove BEGIN/END lines and newlines)
   cat rsa_key.pub | grep -v "BEGIN\|END" | tr -d '\n'
   ```

   儲存此輸出，因為您在後續步驟中需要此輸出。

1. **設定 Snowflake 使用者**

   依照以下步驟，設定 Snowflake 使用者。

   1. 如果 Athena 連接器尚未存在，請為其建立專用使用者。

      ```
      -- Create user for Athena connector
      CREATE USER athena_connector_user;
      
      -- Grant necessary privileges
      GRANT USAGE ON WAREHOUSE your_warehouse TO ROLE athena_connector_role;
      GRANT USAGE ON DATABASE your_database TO ROLE athena_connector_role;
      GRANT SELECT ON ALL TABLES IN DATABASE your_database TO ROLE athena_connector_role;
      ```

   1. 授予身分驗證權限。若要將公有金鑰指派給使用者，您必須擁有下列其中一個角色或權限。
      + 使用者的 `MODIFY PROGRAMMATIC AUTHENTICATION METHODS` 或 `OWNERSHIP` 權限。
      + `SECURITYADMIN` 角色或更高權限。

      授予必要權限，以使用下列命令指派公有金鑰。

      ```
      GRANT MODIFY PROGRAMMATIC AUTHENTICATION METHODS ON USER athena_connector_user TO ROLE your_admin_role;
      ```

   1. 使用下列命令，將公有金鑰指派給 Snowflake 使用者。

      ```
      ALTER USER athena_connector_user SET RSA_PUBLIC_KEY='RSAkey';
      ```

      使用以下命令，驗證公有金鑰是否已成功指派給使用者。

      ```
      DESC USER athena_connector_user;
      ```

1. **在 中存放私有金鑰 AWS Secrets Manager**

   1. 將您的私有金鑰轉換為連接器所需的格式。

      ```
      # Read private key content
      cat rsa_key.p8
      ```

   1.  AWS Secrets Manager 使用下列結構在 中建立秘密。

      ```
      {
        "sfUser": "your_snowflake_user",
        "pem_private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----",
        "pem_private_key_passphrase": "passphrase_in_case_of_encrypted_private_key(optional)"
      }
      ```
**注意**  
標頭和頁尾為選用項。
私有金鑰必須以 `\n` 分隔。

## 設定 OAuth 身分驗證
<a name="connectors-snowflake-oauth-authentication"></a>

此身分驗證方法可利用自動憑證重新整理功能，啟用對 Snowflake 的安全權杖型存取。組態程序包括在 Snowflake 中建立安全整合、擷取 OAuth 用戶端憑證、完成授權流程以取得存取碼，以及將 OAuth 憑證存放在 AWS Secrets Manager 中以供連接器使用。

1. **在 Snowflake 中建立安全整合**

   在 Snowflake 中執行下列 SQL 命令，以建立 Snowflake OAuth 安全整合。

   ```
   CREATE SECURITY INTEGRATION my_snowflake_oauth_integration_a
     TYPE = OAUTH
     ENABLED = TRUE
     OAUTH_CLIENT = CUSTOM
     OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'
     OAUTH_REDIRECT_URI = 'https://localhost:8080/oauth/callback'
     OAUTH_ISSUE_REFRESH_TOKENS = TRUE
     OAUTH_REFRESH_TOKEN_VALIDITY = 7776000;
   ```

   **組態參數**
   + `TYPE = OAUTH` – 指定 OAuth 身分驗證類型。
   + `ENABLED = TRUE` – 啟用安全整合。
   + `OAUTH_CLIENT = CUSTOM` – 使用自訂 OAuth 用戶端組態。
   + `OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'` – 設定安全應用程式的用戶端類型。
   + `OAUTH_REDIRECT_URI` – OAuth 流程的回呼 URL。其可設為 localhost 以用於測試。
   + `OAUTH_ISSUE_REFRESH_TOKENS = TRUE` – 啟用重新整理權杖產生。
   + `OAUTH_REFRESH_TOKEN_VALIDITY = 7776000` – 設定重新整理權杖有效性 (90 天，以秒為單位)。

1. **擷取 OAuth 用戶端秘密**

   1. 請執行下列 SQL 命令，以取得用戶端憑證。

      ```
      DESC SECURITY INTEGRATION 'MY_SNOWFLAKE_OAUTH_INTEGRATION_A';
      ```

   1. 擷取 OAuth 用戶端秘密。

      ```
      SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('MY_SNOWFLAKE_OAUTH_INTEGRATION_A');
      ```

      **回應範例**

      ```
      {
        "OAUTH_CLIENT_SECRET_2": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "OAUTH_CLIENT_SECRET": "je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY,
        "OAUTH_CLIENT_ID": "AIDACKCEVSQ6C2EXAMPLE"
      }
      ```
**注意**  
保護這些憑證的安全，切勿共用。這些將用於設定 OAuth 用戶端。

1. **授權使用者並擷取授權碼**

   1. 在瀏覽器中開啟下列 URL。

      ```
      https://<your_account>.snowflakecomputing.com/oauth/authorize?client_id=<OAUTH_CLIENT_ID>&response_type=code&redirect_uri=https://localhost:8080/oauth/callback
      ```

   1. 完成授權流程。

      1. 使用您的 Snowflake 憑證登入。

      1. 授予所需的許可。您會被重新導向至具有授權碼的回呼 URI。

   1. 從重新導向 URL 複製程式碼參數，擷取授權碼。

      ```
      https://localhost:8080/oauth/callback?code=<authorizationcode>
      ```
**注意**  
授權碼有效期限有限，且只能使用一次。

1. **在 中存放 OAuth 登入資料 AWS Secrets Manager**

    AWS Secrets Manager 使用下列結構在 中建立秘密。

   ```
   {
     "redirect_uri": "https://localhost:8080/oauth/callback",
     "client_secret": "je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY",
     "token_url": "https://<your_account>.snowflakecomputing.com/oauth/token-request",
     "client_id": "AIDACKCEVSQ6C2EXAMPLE,
     "username": "your_snowflake_username",
     "auth_code": "authorizationcode"
   }
   ```

   **必要欄位**
   + `redirect_uri` – 您從步驟 1 取得的 OAuth 重新導向 URI。
   + `client_secret` – 您從步驟 2 取得的 OAuth 用戶端秘密。
   + `token_url` – Snowflake OAuth 權杖端點。
   + `client_id` – 從步驟 2 取得的 OAuth 用戶端 ID。
   + `username` – 連接器的 Snowflake 使用者名稱。
   + `auth_code` – 您從步驟 3 取得的授權碼。

建立秘密後，您即會取得秘密 ARN，並且您可以在[建立資料來源連線](connect-to-a-data-source.md)時，於 Glue 連線中使用該 ARN。

## 傳遞查詢
<a name="connectors-snowflake-passthrough-queries"></a>

Snowflake 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Snowflake 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Snowflake 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-snowflake-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-snowflake/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-snowflake/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-snowflake-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 Snowflake 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-snowflake/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-snowflake)。

# Amazon Athena Microsoft SQL Server 連接器
<a name="connectors-microsoft-sql-server"></a>

適用於 [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/?view=sql-server-ver15) 的 Amazon Athena 連接器可讓 Amazon Athena 使用 JDBC 對存放在 Microsoft SQL Server 中的資料執行 SQL 查詢。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-sqlserver-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-microsoft-sql-server-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。
+ 在篩選條件中，您必須將 `Date` 和 `Timestamp` 資料類型轉換為適當的資料類型。
+ 若要搜尋類型 `Real` 和 `Float` 的負值，請使用 `<=` 或者 `>=` 運算子。
+ 不支援 `binary`、`varbinary`、`image`、和 `rowversion` 資料類型。

## 條款
<a name="connectors-microsoft-sql-server-terms"></a>

下列術語與 SQL Server 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-microsoft-sql-server-parameters"></a>

使用本節中的參數來設定 SQL Server 連接器。

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。  
下方列出的參數名稱和定義適用於 2024 年 12 月 3 日之前建立的 Athena 資料來源連接器。這些可能與其對應的 [AWS Glue 連線屬性](https://docs.aws.amazon.com/glue/latest/dg/connection-properties.html)不同。從 2024 年 12 月 3 日開始，只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器時，才會使用下列參數。

### Glue 連線 (建議)
<a name="connectors-microsoft-sql-server-gc"></a>

我們建議您使用 Glue 連線物件來設定 SQL Server 連接器。為此，請將 SQL Server 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type SQLSERVER
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **none** – 請勿變更指定的結構描述和資料表名稱的大小寫。這是具有關聯 Glue 連線的連接器的預設值。
  + **upper** – 將所有指定的結構描述和資料表名稱轉換為大寫。
  + **lower** – 將所有指定的結構描述和資料表名稱轉換為小寫。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 SQL Server 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 SQL Server 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-microsoft-sql-server-legacy"></a>

#### 連接字串
<a name="connectors-microsoft-sql-server-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
sqlserver://${jdbc_connection_string}
```

#### 使用多工處理常式
<a name="connectors-microsoft-sql-server-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | SqlServerMuxCompositeHandler | 
| 中繼資料處理常式 | SqlServerMuxMetadataHandler | 
| 記錄處理常式 | SqlServerMuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-microsoft-sql-server-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 mysqlservercatalog，則環境變數名稱為 mysqlservercatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 SqlServer MUX Lambda 函數：`sqlserver1` (預設) 和 `sqlserver2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | sqlserver://jdbc:sqlserver://sqlserver1.hostname:port;databaseName=<database\$1name>;\$1\$1secret1\$1name\$1 | 
| sqlserver\$1catalog1\$1connection\$1string | sqlserver://jdbc:sqlserver://sqlserver1.hostname:port;databaseName=<database\$1name>;\$1\$1secret1\$1name\$1 | 
| sqlserver\$1catalog2\$1connection\$1string | sqlserver://jdbc:sqlserver://sqlserver2.hostname:port;databaseName=<database\$1name>;\$1\$1secret2\$1name\$1 | 

##### 提供憑證
<a name="connectors-microsoft-sql-server-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${secret_name}`。

```
sqlserver://jdbc:sqlserver://hostname:port;databaseName=<database_name>;${secret_name}
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
sqlserver://jdbc:sqlserver://hostname:port;databaseName=<database_name>;user=<user>;password=<password>
```

#### 使用單一連接處理常式
<a name="connectors-microsoft-sql-server-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 SQL Server 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | SqlServerCompositeHandler | 
| 中繼資料處理常式 | SqlServerMetadataHandler | 
| 記錄處理常式 | SqlServerRecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-microsoft-sql-server-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函數所支援的單一 SQL Server 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | sqlserver://jdbc:sqlserver://hostname:port;databaseName=<database\$1name>;\$1\$1secret\$1name\$1 | 

#### 溢出參數
<a name="connectors-microsoft-sql-server-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-microsoft-sql-server-data-type-support"></a>

下表顯示 SQL Server 和 Apache Arrow 的相應資料類型。


****  

| SQL Server | Arrow | 
| --- | --- | 
| bit | TINYINT | 
| tinyint | SMALLINT | 
| smallint | SMALLINT | 
| int | INT | 
| bigint | BIGINT | 
| decimal | DECIMAL | 
| numeric | FLOAT8 | 
| smallmoney | FLOAT8 | 
| money | DECIMAL | 
| float[24] | FLOAT4 | 
| float[53] | FLOAT8 | 
| real | FLOAT4 | 
| datetime | Date(MILLISECOND) | 
| datetime2 | Date(MILLISECOND) | 
| smalldatetime | Date(MILLISECOND) | 
| date | Date(DAY) | 
| time | VARCHAR | 
| datetimeoffset | Date(MILLISECOND) | 
| char[n] | VARCHAR | 
| varchar[n/max] | VARCHAR | 
| nchar[n] | VARCHAR | 
| nvarchar[n/max] | VARCHAR | 
| text | VARCHAR | 
| ntext | VARCHAR | 

## 分割區和分隔
<a name="connectors-microsoft-sql-server-partitions-and-splits"></a>

分割區由 `varchar` 類型的單一分割區資料欄表示。如果是 SQL Server 連接器，分割區函數會決定在資料表上套用分割區的方式。從 SQL Server 中繼資料表中擷取分割區函數和資料欄名稱資訊。然後，自訂查詢可獲取分割區。根據收到的不同分割區數目建立分割。

## 效能
<a name="connectors-microsoft-sql-server-performance"></a>

選取資料欄子集可大幅加速查詢執行期，並減少掃描的資料。SQL Server 連接器由於並行而對限流保有彈性。

Athena SQL Server 連接器執行述詞下推，以減少查詢掃描的資料。簡單述詞和複雜表達式會下推至連接器，以減少掃描的資料量並減少查詢執行時間。

### 述詞
<a name="connectors-sqlserver-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。 Athena SQL Server 連接器可以合併這些表達式，並將其直接推送至 SQL Server，以增強功能並減少掃描的資料量。

下列 Athena SQL Server 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、IS\$1DISTINCT\$1FROM、NULL\$1IF、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-sqlserver-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d)) 
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%');
```

## 傳遞查詢
<a name="connectors-sqlserver-passthrough-queries"></a>

SQL Server 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 SQL Server 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 SQL Server 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-sqlserver-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-sqlserver/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-sqlserver/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-sqlserver-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 SQL Server 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-sqlserver/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-sqlserver)。

# Amazon Athena Teradata 連接器
<a name="connectors-teradata"></a>

 適用於 Teradata 的 Amazon Athena 連接器可讓 Athena 對存放在 Teradata 資料庫中的資料執行 SQL 查詢。

此連接器不會使用 Glue 連線來集中 Glue 中的組態屬性。連線組態是透過 Lambda 完成的。

## 先決條件
<a name="connectors-teradata-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## 限制
<a name="connectors-teradata-limitations"></a>
+ 不支援寫入 DDL 操作。
+ 在多工器設定中，在所有資料庫執行個體之間共用溢出儲存貯體和字首。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。

## 條款
<a name="connectors-teradata-terms"></a>

下列術語與 Teradata 連接器相關。
+ **資料庫執行個體** - 在內部部署、Amazon EC2 或 Amazon RDS 上部署的任何資料庫執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。
+ **多工處理常式** - 可以接受和使用多個資料庫連接的 Lambda 處理常式。

## Parameters
<a name="connectors-teradata-parameters"></a>

使用本節中的參數來設定 Teradata 連接器。

### Glue 連線 (建議)
<a name="connectors-teradata-gc"></a>

我們建議您使用 Glue 連線物件來設定 Teradata 連接器。為此，請將 Teradata 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type TERADATA
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **none** – 請勿變更指定的結構描述和資料表名稱的大小寫。這是具有關聯 Glue 連線的連接器的預設值。
  + **upper** – 將所有指定的結構描述和資料表名稱轉換為大寫。
  + **lower** – 將所有指定的結構描述和資料表名稱轉換為小寫。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 Teradata 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Teradata 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-teradata-legacy"></a>

#### 連接字串
<a name="connectors-teradata-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
teradata://${jdbc_connection_string}
```

#### 使用多工處理常式
<a name="connectors-teradata-using-a-multiplexing-handler"></a>

您可以使用多工器透過單一 Lambda 函數連接到多個資料庫執行個體。按目錄名稱路由請求。在 Lambda 中使用下列類別。


****  

| 處理常式 | 類別 | 
| --- | --- | 
| 複合處理常式 | TeradataMuxCompositeHandler | 
| 中繼資料處理常式 | TeradataMuxMetadataHandler | 
| 記錄處理常式 | TeradataMuxRecordHandler | 

##### 多工處理常式參數
<a name="connectors-teradata-multiplexing-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必要. 資料庫執行個體連接字串。在環境變數前面加上 Athena 中使用的目錄名稱。例如，如果向 Athena 註冊的目錄為 myteradatacatalog，則環境變數名稱為 myteradatacatalog\$1connection\$1string。 | 
| default | 必要. 預設的連接字串。目錄為 lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 時，使用此字串。 | 

下列範例屬性適用於支援兩個資料庫執行個體的 Teradata MUX Lambda 函數：`teradata1` (預設) 和 `teradata2`。


****  

| 屬性 | Value | 
| --- | --- | 
| default | teradata://jdbc:teradata://teradata2.host/TMODE=ANSI,CHARSET=UTF8,DATABASE=TEST,user=sample2&password=sample2 | 
| teradata\$1catalog1\$1connection\$1string | teradata://jdbc:teradata://teradata1.host/TMODE=ANSI,CHARSET=UTF8,DATABASE=TEST,\$1\$1Test/RDS/Teradata1\$1 | 
| teradata\$1catalog2\$1connection\$1string | teradata://jdbc:teradata://teradata2.host/TMODE=ANSI,CHARSET=UTF8,DATABASE=TEST,user=sample2&password=sample2 | 

##### 提供憑證
<a name="connectors-teradata-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 `${Test/RDS/Teradata1}`。

```
teradata://jdbc:teradata1.host/TMODE=ANSI,CHARSET=UTF8,DATABASE=TEST,${Test/RDS/Teradata1}&...
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
teradata://jdbc:teradata://teradata1.host/TMODE=ANSI,CHARSET=UTF8,DATABASE=TEST,...&user=sample2&password=sample2&...
```

目前，Teradata 可辨識 `user` 和 `password` JDBC 屬性。它也接受格式為 *username*`/`*password* 的使用者名稱和密碼，而不使用金鑰 `user` 或 `password`。

#### 使用單一連接處理常式
<a name="connectors-teradata-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 Teradata 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | TeradataCompositeHandler | 
| 中繼資料處理常式 | TeradataMetadataHandler | 
| 記錄處理常式 | TeradataRecordHandler | 

##### 單一連接處理常式參數
<a name="connectors-teradata-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

下列範例屬性適用於 Lambda 函數支援的單一 Teradata 執行個體。


****  

| 屬性 | Value | 
| --- | --- | 
| default | teradata://jdbc:teradata://teradata1.host/TMODE=ANSI,CHARSET=UTF8,DATABASE=TEST,secret=Test/RDS/Teradata1 | 

#### 溢出參數
<a name="connectors-teradata-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-teradata-data-type-support"></a>

下表顯示 JDBC 和 Apache Arrow 的相應資料類型。


****  

| JDBC | Arrow | 
| --- | --- | 
| Boolean | 位元 | 
| Integer | Tiny | 
| Short | Smallint | 
| Integer | Int | 
| Long | Bigint | 
| float | Float4 | 
| Double | Float8 | 
| Date | DateDay | 
| 時間戳記 | DateMilli | 
| String | Varchar | 
| 位元組 | Varbinary | 
| BigDecimal | Decimal (小數) | 
| ARRAY | 清單 | 

## 分割區和分隔
<a name="connectors-teradata-partitions-and-splits"></a>

分割區由 `Integer` 類型的單一分割區資料欄表示。此資料欄包含 Teradata 資料表中所定義之分割區的分割區名稱。對於沒有分割區名稱的資料表，會傳回 \$1，這相當於一個單一的分割區。分割區等同於分隔。


****  

| 名稱 | 類型 | 說明 | 
| --- | --- | --- | 
| 分割區 | Integer | Teradata 中的已命名分割區。 | 

## 效能
<a name="connectors-teradata-performance"></a>

Teradata 支援原生分割區。Athena Teradata 連接器可以平行地從這些分割區中擷取資料。如果您想要查詢具有統一分割區分佈的非常大的資料集，強烈建議使用原生分割。選取資料欄子集會大幅拖慢查詢執行時間。連接器會顯示因為並行而導致的部分限流。

Athena Teradata 連接器執行述詞下推，以減少查詢掃描的資料。簡單述詞和複雜表達式會下推至連接器，以減少掃描的資料量並減少查詢執行時間。

### 述詞
<a name="connectors-teradata-performance-predicates"></a>

述詞是 SQL 查詢的 `WHERE` 子句中的一種表達式，它會評估為布林值，並根據多個條件篩選資料列。Athena Teradata 連接器可以合併這些表達式，並將其直接推送至 Teradata，以增強功能並減少掃描的資料量。

下列 Athena Teradata 連接器運算子支援述詞下推：
+ **布林值：**AND、OR、NOT
+ **等式：**EQUAL、NOT\$1EQUAL、LESS\$1THAN、LESS\$1THAN\$1OR\$1EQUAL、GREATER\$1THAN、GREATER\$1THAN\$1OR\$1EQUAL、NULL\$1IF、IS\$1NULL
+ **算術：**ADD、SUBTRACT、MULTIPLY、DIVIDE、MODULUS、NEGATE
+ **其他：**LIKE\$1PATTERN、IN

### 合併下推範例
<a name="connectors-teradata-performance-pushdown-example"></a>

如需增強的查詢功能，請合併下推類型，如以下範例所示：

```
SELECT * 
FROM my_table 
WHERE col_a > 10 
    AND ((col_a + col_b) > (col_c % col_d)) 
    AND (col_e IN ('val1', 'val2', 'val3') OR col_f LIKE '%pattern%');
```

## 傳遞查詢
<a name="connectors-teradata-passthrough-queries"></a>

Teradata 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Teradata 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Teradata 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer'
        ))
```

## 授權資訊
<a name="connectors-teradata-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-teradata/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-teradata/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-teradata-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 Teradata 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-teradata/pom.xml) 檔案。

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-teradata)。

# Amazon Athena Timestream 連接器
<a name="connectors-timestream"></a>

Amazon Athena Timestream 連接器讓 Amazon Athena 能夠與 [Amazon Timestream](https://aws.amazon.com/timestream/) 進行通訊，從而可透過 Amazon Athena 存取您的時間序列資料。您可以選擇使用 AWS Glue Data Catalog 作為補充中繼資料的來源。

Amazon Timestream 是快速、可擴展、全受管、專門打造的時間序列資料庫，可讓您每天輕鬆存放和分析數兆個時間序列資料點。Timestream 會將最近的資料保存在記憶體中，並根據使用者定義的政策將歷史資料移到成本最佳化的儲存層，藉此節省您管理時間序列資料生命週期的時間和成本。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

如果您的 帳戶中已啟用 Lake Formation，則您在 中部署的 Athena 聯合 Lambda 連接器的 IAM 角色 AWS Serverless Application Repository 必須在 Lake Formation 中具有對 的讀取存取權 AWS Glue Data Catalog。

## 先決條件
<a name="connectors-timestream-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## Parameters
<a name="connectors-timestream-parameters"></a>

使用本節中的參數來設定 Timestream 連接器。

### Glue 連線 (建議)
<a name="connectors-timestream-gc"></a>

我們建議您使用 Glue 連線物件來設定 Timestream 連接器。為此，請將 Timestream 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type TIMESTREAM
```

**Lambda 環境屬性**

**glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 Timestream 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Timestream 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-timestream-legacy"></a>

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。

下方列出的參數名稱和定義適用於未使用關聯 Glue 連線建立的 Athena 資料來源連接器。只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器或未指定 `glue_connection` 環境屬性時，才會使用下列參數。

**Lambda 環境屬性**
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。
+ **glue\$1catalog** - (選用) 使用此選項可指定[跨帳戶 AWS Glue 目錄](data-sources-glue-cross-account.md)。根據預設，連接器會嘗試從自己的 AWS Glue 帳戶取得中繼資料。

## 在 中設定資料庫和資料表 AWS Glue
<a name="connectors-timestream-setting-up-databases-and-tables-in-aws-glue"></a>

您可以選擇使用 AWS Glue Data Catalog 作為補充中繼資料的來源。若要啟用 AWS Glue 資料表以與 Timestream 搭配使用，您必須擁有 AWS Glue 資料庫和資料表，其名稱符合您要為其提供補充中繼資料的 Timestream 資料庫和資料表。

**注意**  
為了獲得最佳效能，請僅使用小寫作為資料庫名稱和資料表名稱。使用混合大小寫會導致連接器執行運算密集程度較高的不區分大小寫搜尋。

若要設定 AWS Glue 資料表以搭配 Timestream 使用，您必須在 中設定其資料表屬性 AWS Glue。

**使用 AWS Glue 資料表補充中繼資料**

1. 在 AWS Glue 主控台中編輯資料表，以新增下列資料表屬性：
   + **timestream-metadata-flag** - 此屬性向 Timestream 連接器發出指示，連接器可使用資料表作為補充中繼資料。您可以為 `timestream-metadata-flag` 提供任何值，只要 `timestream-metadata-flag` 屬性存在於資料表屬性清單中。
   + **\$1view\$1template** - 當您使用 AWS Glue 作為補充中繼資料時，可以使用此資料表屬性，並指定任何 Timestream SQL 作為檢視。Athena Timestream 連接器會使用檢視中的 SQL 以及 Athena 中的 SQL 來執行查詢。如果您想要使用 Athena 中沒有的 Timestream SQL 功能，這會非常有用。

1. 請確定您使用適用於本文件 AWS Glue 所列 的資料類型。

### 資料類型
<a name="connectors-timestream-data-types"></a>

目前，Timestream 連接器僅支援 Timestream 中部份的可用資料類型，尤其是：純量值 `varchar`、`double` 和 `timestamp`。

若要查詢 `timeseries` 資料類型，您必須在 AWS Glue 資料表屬性中設定一個使用 Timestream `CREATE_TIME_SERIES` 函數的檢視。您還需要為檢視提供結構描述，它使用語法 `ARRAY<STRUCT<time:timestamp,measure_value::double:double>>` 作為任何時間序列欄的類型。請務必將 `double` 取代為適合您的資料表的純量類型。

下圖顯示設定為在時間序列中設定檢視的 AWS Glue 資料表屬性範例。

![\[在 中設定資料表屬性 AWS Glue ，以設定時間序列的檢視。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-timestream-1.png)


## 所需的許可
<a name="connectors-timestream-required-permissions"></a>

如需詳細了解此連接器所需的 IAM 政策，請檢閱 [athena-timestream.yaml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-timestream/athena-timestream.yaml) 檔案的 `Policies` 部分。以下清單摘要說明所需的許可。
+ **Amazon S3 寫入存取** - 連接器需要 Amazon S3 中某個位置的寫入存取權，以便從大型查詢中溢寫結果。
+ **Athena GetQueryExecution** - 當上游 Athena 查詢終止時，連接器會使用此許可快速失敗。
+ **AWS Glue Data Catalog** – Timestream 連接器需要對 的唯讀存取權 AWS Glue Data Catalog ，才能取得結構描述資訊。
+ **CloudWatch Logs** - 連接器需要存取 CloudWatch Logs 以儲存日誌。
+ **Timestream Access** - 用於執行 Timestream 查詢。

## 效能
<a name="connectors-timestream-performance"></a>

建議您使用 `LIMIT` 子句將傳回的資料 (非掃描的資料) 限制在 256 MB 以下，以確保互動式查詢效能良好。

Athena Timestream 連接器執行述詞下推，以減少查詢掃描的資料。`LIMIT` 子句可減少掃描的資料量，但是如果未提供述詞，則應預期含有 `LIMIT` 子句的 `SELECT` 查詢可掃描至少 16 MB 的資料。選取資料欄子集可大幅加速查詢執行時間，並減少掃描的資料。Timestream 連接器由於並行而對限流保有彈性。

## 傳遞查詢
<a name="connectors-timestream-passthrough-queries"></a>

Timestream 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Timestream 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Timestream 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-timestream-license-information"></a>

Amazon Athena Timestream 連接器專案是依據 [Apache-2.0 License](https://www.apache.org/licenses/LICENSE-2.0.html) 來授權的。

## 其他資源
<a name="connectors-timestream-additional-resources"></a>

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-timestream)。

# Amazon Athena TPC benchmark DS (TPC-DS) 連接器
<a name="connectors-tpcds"></a>

Amazon Athena TPC-DS 連接器讓 Amazon Athena 能夠與隨機產生的 TPC Benchmark DS 資料來源通訊，以用於 Athena Federation 的基準化分析和功能測試。Athena TPC-DS 連接器會以四種縮放比例之一產生符合 TPC-DS 規範的資料庫。我們不建議使用此連接器作為 Amazon S3 資料湖效能測試的替代方案。

此連接器可以作為聯合目錄向 Glue Data Catalog 註冊。它可在目錄、資料庫、資料表、資料欄、資料列和標籤層級支援 Lake Formation 中定義的資料存取控制。此連接器使用 Glue 連線來集中 Glue 中的組態屬性。

## 先決條件
<a name="connectors-tpcds-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。

## Parameters
<a name="connectors-tpcds-parameters"></a>

使用本節中的參數來設定 TPC-DS 連接器。

**注意**  
2024 年 12 月 3 日及更新版本建立的 Athena 資料來源連接器會使用 AWS Glue 連線。  
下方列出的參數名稱和定義適用於 2024 年 12 月 3 日之前建立的 Athena 資料來源連接器。這些可能與其對應的 [AWS Glue 連線屬性](https://docs.aws.amazon.com/glue/latest/dg/connection-properties.html)不同。從 2024 年 12 月 3 日開始，只有在您[手動部署](connect-data-source-serverless-app-repo.md)舊版 Athena 資料來源連接器時，才會使用下列參數。

### Glue 連線 (建議)
<a name="connectors-tpcds-gc"></a>

我們建議您使用 Glue 連線物件來設定 TPC-DS 連接器。為此，請將 TPC-DS 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type TPCDS
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 TPC-DS 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 TPC-DS 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-tpcds-legacy"></a>
+ **spill\$1bucket** - 針對超過 Lambda 函數限制的資料，指定 Amazon S3 儲存貯體。
+ **spill\$1prefix** - (選用) 預設為指定的 `spill_bucket` 中名為 `athena-federation-spill` 的子資料夾。我們建議您在此位置設定 Amazon S3 [儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以刪除超過預定天數或小時數的溢出。
+ **spill\$1put\$1request\$1headers** – (選用) 用於溢出的 Amazon S3 `putObject` 請求的請求標頭和值的 JSON 編碼映射 (例如，`{"x-amz-server-side-encryption" : "AES256"}`)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考**》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。
+ **kms\$1key\$1id** - (選用) 依預設，任何溢出到 Amazon S3 的資料都會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。為了讓您的 Lambda 函數使用 KMS 產生的更強大的加密金鑰，例如 `a7e63k4b-8loc-40db-a2a1-4d0en2cd8331`，您可以指定 KMS 金鑰 ID。
+ **disable\$1spill\$1encryption** - (選用) 當設定為 `True` 時，停用溢出加密。預設為 `False`，因此溢出 S3 的資料會使用 AES-GCM 進行加密 — 使用隨機產生的金鑰或 KMS 來產生金鑰。停用溢出加密可以提高效能，尤其是如果溢出位置使用[伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。

## 測試資料庫和資料表
<a name="connectors-tpcds-test-databases-and-tables"></a>

Athena TPC-DS 連接器會以四種縮放比例 (`tpcds1`、`tpcds10`、`tpcds100`、`tpcds250` 或 `tpcds1000`) 之一產生符合 TPC-DS 規範的資料庫。

### 資料表摘要
<a name="connectors-tpcds-table-summary"></a>

如需測試資料表和資料欄的完整清單，請執行 `SHOW TABLES` 或者 `DESCRIBE TABLE` 查詢。為了方便起見，提供以下資料表摘要。

1. call\$1center

1. catalog\$1page

1. catalog\$1returns

1. catalog\$1sales

1. customer

1. customer\$1address

1. customer\$1demographics

1. date\$1dim

1. dbgen\$1version

1. household\$1demographics

1. income\$1band

1.  庫存

1. item

1. promotion

1. reason

1. ship\$1mode

1. 存放

1. store\$1returns

1. store\$1sales

1. time\$1dim

1. warehouse

1. web\$1page

1. web\$1returns

1. web\$1sales

1. web\$1site

如需與此產生的結構描述和資料相容的 TPC-DS 查詢，請參閱 GitHub 上的 [athena-tpcds/src/main/resources/queries/](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-tpcds/src/main/resources/queries) 目錄。

### 查詢範例
<a name="connectors-tpcds-example-query"></a>

下列 `SELECT` 查詢範例會查詢特定郡的客戶人口統計的 `tpcds` 目錄。

```
SELECT
  cd_gender,
  cd_marital_status,
  cd_education_status,
  count(*) cnt1,
  cd_purchase_estimate,
  count(*) cnt2,
  cd_credit_rating,
  count(*) cnt3,
  cd_dep_count,
  count(*) cnt4,
  cd_dep_employed_count,
  count(*) cnt5,
  cd_dep_college_count,
  count(*) cnt6
FROM
  "lambda:tpcds".tpcds1.customer c, "lambda:tpcds".tpcds1.customer_address ca, "lambda:tpcds".tpcds1.customer_demographics
WHERE
  c.c_current_addr_sk = ca.ca_address_sk AND
    ca_county IN ('Rush County', 'Toole County', 'Jefferson County',
                  'Dona Ana County', 'La Porte County') AND
    cd_demo_sk = c.c_current_cdemo_sk AND
    exists(SELECT *
           FROM "lambda:tpcds".tpcds1.store_sales, "lambda:tpcds".tpcds1.date_dim
           WHERE c.c_customer_sk = ss_customer_sk AND
             ss_sold_date_sk = d_date_sk AND
             d_year = 2002 AND
             d_moy BETWEEN 1 AND 1 + 3) AND
    (exists(SELECT *
            FROM "lambda:tpcds".tpcds1.web_sales, "lambda:tpcds".tpcds1.date_dim
            WHERE c.c_customer_sk = ws_bill_customer_sk AND
              ws_sold_date_sk = d_date_sk AND
              d_year = 2002 AND
              d_moy BETWEEN 1 AND 1 + 3) OR
      exists(SELECT *
             FROM "lambda:tpcds".tpcds1.catalog_sales, "lambda:tpcds".tpcds1.date_dim
             WHERE c.c_customer_sk = cs_ship_customer_sk AND
               cs_sold_date_sk = d_date_sk AND
               d_year = 2002 AND
               d_moy BETWEEN 1 AND 1 + 3))
GROUP BY cd_gender,
  cd_marital_status,
  cd_education_status,
  cd_purchase_estimate,
  cd_credit_rating,
  cd_dep_count,
  cd_dep_employed_count,
  cd_dep_college_count
ORDER BY cd_gender,
  cd_marital_status,
  cd_education_status,
  cd_purchase_estimate,
  cd_credit_rating,
  cd_dep_count,
  cd_dep_employed_count,
  cd_dep_college_count
LIMIT 100
```

## 所需的許可
<a name="connectors-tpcds-required-permissions"></a>

如需詳細了解此連接器所需的 IAM 政策，請檢閱 [athena-tpcds.yaml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-tpcds/athena-tpcds.yaml) 檔案的 `Policies` 部分。以下清單摘要說明所需的許可。
+ **Amazon S3 寫入存取** - 連接器需要 Amazon S3 中某個位置的寫入存取權，以便從大型查詢中溢寫結果。
+ **Athena GetQueryExecution** - 當上游 Athena 查詢終止時，連接器會使用此許可快速失敗。

## 效能
<a name="connectors-tpcds-performance"></a>

Athena TPC-DS 連接器會嘗試根據您選擇的比例因數平行處理查詢。在 Lambda 函數內執行述詞下推。

## 授權資訊
<a name="connectors-tpcds-license-information"></a>

Amazon Athena TPC-DS 連接器專案是依據 [Apache-2.0 License](https://www.apache.org/licenses/LICENSE-2.0.html) 來授權的。

## 其他資源
<a name="connectors-tpcds-additional-resources"></a>

如需此連接器的其他資訊，請造訪 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-tpcds)。

# Amazon Athena Vertica 連接器
<a name="connectors-vertica"></a>

Vertica 是一種單欄式資料庫平台，可部署在雲端或進行內部部署，以支援 Exabyte 艾位元組規模的資料倉儲。您可以在聯合查詢中使用 Amazon Athena Vertica 連接器，查詢來自 Athena 的 Vertica 資料來源。例如，您可以在 Vertica 上的資料倉儲和 Simple Storage Service (Amazon S3) 中的資料湖上執行分析查詢。

此連接器不會使用 Glue 連線來集中 Glue 中的組態屬性。連線組態是透過 Lambda 完成的。

## 先決條件
<a name="connectors-vertica-prerequisites"></a>
+ 使用 Athena 主控台或 AWS Serverless Application Repository，將連接器部署到您的 AWS 帳戶 。如需詳細資訊，請參閱 [建立資料來源連線](connect-to-a-data-source.md) 或 [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md) 。
+ 您必須先設定 VPC 和安全群組，才能使用此連接器。如需詳細資訊，請參閱[為資料來源連接器或 AWS Glue 連線建立 VPC](athena-connectors-vpc-creation.md)。

## 限制
<a name="connectors-vertica-limitations"></a>
+ 因為 Athena Vertica 連接器會從 Amazon S3 中讀取已匯出的 Parquet 檔案，所以連接器的效能可能會很慢。查詢大型資料表時，建議您使用 [CREATE TABLE AS (SELECT ...) ](ctas.md)查詢和 SQL 述詞。
+ 目前，由於 Athena Federated Query 中存在已知問題，連接器會讓 Vertica 將已查詢資料表的所有資料欄匯出至 Amazon S3，但在 Athena 主控台的結果中只能看到已查詢的資料欄。
+ 不支援寫入 DDL 操作。
+ 任何相關的 Lambda 限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。

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

下圖顯示使用 Vertica 連接器的查詢工作流程。

![\[來自 Amazon Athena 的 Vertica 查詢工作流程\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-vertica-1.png)


1. 針對 Vertica 中的一個或多個資料表發出 SQL 查詢。

1. 連接器會解析 SQL 查詢，以透過 JDBC 連接將相關部分傳送至 Vertica。

1. 連線字串使用存放在 中的使用者名稱和密碼 AWS Secrets Manager 來存取 Vertica。

1. 連接器使用 Vertica `EXPORT` 命令包裝 SQL 查詢，如下例所示。

   ```
   EXPORT TO PARQUET (directory = 's3://amzn-s3-demo-bucket/folder_name, 
      Compression='Snappy', fileSizeMB=64) OVER() as 
   SELECT
   PATH_ID,
   ...
   SOURCE_ITEMIZED,
   SOURCE_OVERRIDE
   FROM DELETED_OBJECT_SCHEMA.FORM_USAGE_DATA
   WHERE PATH_ID <= 5;
   ```

1. Vertica 處理 SQL 查詢，並將結果集傳送至 Amazon S3 儲存貯體。為了獲得更好的輸送量，Vertica 使用 `EXPORT` 選項來平行處理多個 Parquet 檔案的寫入操作。

1. Athena 會掃描 Amazon S3 儲存貯體，以確定要為結果集讀取的檔案數。

1. Athena 對 Lambda 函式發出多個呼叫並使用 Apache `ArrowReader` 從結果資料集中讀取 Parquet 檔案。多個呼叫可讓 Athena 平行讀取 Amazon S3 檔案，並達到每秒高達 100GB 的輸送量。

1. Athena 會使用從資料湖掃描的資料來處理從 Vertica 傳回的資料，並傳回結果。

## 條款
<a name="connectors-vertica-terms"></a>

下列術語與 Vertica 連接器相關。
+ **資料庫執行個體** - 部署在 Amazon EC2 上的 Vertica 資料庫的任何執行個體。
+ **處理常式** - 存取資料庫執行個體的 Lambda 處理常式。處理常式可以用於中繼資料或資料記錄。
+ **中繼資料處理常式** - 從資料庫執行個體中擷取中繼資料的 Lambda 處理常式。
+ **記錄處理常式** - 從資料庫執行個體中擷取資料記錄的 Lambda 處理常式。
+ **複合處理常式** - 從資料庫執行個體中擷取中繼資料和資料記錄的 Lambda 處理常式。
+ **屬性或參數** - 處理常式用來擷取資料庫資訊的資料庫屬性。您可以將這些屬性設定為 Lambda 環境變數。
+ **連接字串** - 用來建立資料庫執行個體連線的文字字串。
+ **Catalog** – 向 Athena 註冊的非AWS Glue 目錄，是 `connection_string` 屬性的必要字首。

## Parameters
<a name="connectors-vertica-parameters"></a>

使用本節中的參數來設定 Vertica 連接器。

### Glue 連線 (建議)
<a name="connectors-vertica-gc"></a>

我們建議您使用 Glue 連線物件來設定 Vertica 連接器。為此，請將 Vertica 連接器 Lambda 的 `glue_connection` 環境變數設定為要使用的 Glue 連線名稱。

**Glue 連線屬性**

使用下列命令來取得 Glue 連線物件的結構描述。此結構描述包含可用於控制連線的所有參數。

```
aws glue describe-connection-type --connection-type VERTICA
```

**Lambda 環境屬性**
+ **glue\$1connection** – 指定與聯合連接器關聯的 Glue 連線名稱。
+ **casing\$1mode** – (選用) 指定如何處理結構描述和資料表名稱的大小寫。`casing_mode` 參數使用下列值來指定大小寫的行為：
  + **none** – 請勿變更指定的結構描述和資料表名稱的大小寫。這是具有關聯 Glue 連線的連接器的預設值。
  + **upper** – 將所有指定的結構描述和資料表名稱轉換為大寫。
  + **lower** – 將所有指定的結構描述和資料表名稱轉換為小寫。

**注意**  
使用 Glue 連線的所有連接器都必須使用 AWS Secrets Manager 來存放登入資料。
使用 Glue 連線建立的 Vertica 連接器不支援使用多工處理常式。
使用 Glue 連線建立的 Vertica 連接器僅支援 `ConnectionSchemaVersion` 2。

### 舊版連線
<a name="connectors-vertica-legacy"></a>

Amazon Athena Vertica 連接器透過 Lambda 環境變數公開組態選項。您可以使用下列 Lambda 環境變數來設定連接器。
+  **AthenaCatalogName** - Lambda 函數名稱 
+  **ExportBucket** - 匯出 Vertica 查詢結果的 Amazon S3 儲存貯體。
+  **SpillBucket** - 此函數可在其中溢出資料的 Amazon S3 儲存貯體的名稱。
+  **SpillPrefix** - 此函數可在其中溢出資料的 `SpillBucket` 位置的字首。
+  **SecurityGroupIds** - 一個或多個 ID，其對應於應套用至 Lambda 函數的安全群組 (例如，`sg1`、`sg2` 或 `sg3`)。
+  **SubnetIds** - 一個或多個子網 ID，其對應於 Lambda 函數可用來存取資料來源的子網 (例如，`subnet1` 或 `subnet2`)。
+  **SecretNameOrPrefix** - 此函數可以存取的 Secrets Manager 中的一組名稱的名稱或字首 (例如，`vertica-*`) 
+  **VerticaConnectionString** - 如果未定義目錄特定連接，預設會使用 Vertica 連接詳細資訊。字串可以選擇性地使用語法 AWS Secrets Manager （例如 `${secret_name}`)。
+  **VPC ID** - 連接至 Lambda 函數的 VPC ID。

#### 連接字串
<a name="connectors-vertica-connection-string"></a>

使用下列格式的 JDBC 連接字串來連接資料庫執行個體。

```
vertica://jdbc:vertica://host_name:
                        port/database?user=vertica-username&password=
                        vertica-password
```

#### 使用單一連接處理常式
<a name="connectors-vertica-using-a-single-connection-handler"></a>

您可以使用下列單一連接中繼資料和記錄處理常式來連接至單一 Vertica 執行個體。


****  

| 處理常式類型 | 類別 | 
| --- | --- | 
| 複合處理常式 | VerticaCompositeHandler | 
| 中繼資料處理常式 | VerticaMetadataHandler | 
| 記錄處理常式 | VerticaRecordHandler | 

#### 單一連接處理常式參數
<a name="connectors-vertica-single-connection-handler-parameters"></a>


****  

| 參數 | Description | 
| --- | --- | 
| default | 必要. 預設的連接字串。 | 

單一連接處理常式支援一個資料庫執行個體，並且必須提供 `default` 連接字串參數。忽略所有其他連接字串。

#### 提供憑證
<a name="connectors-vertica-providing-credentials"></a>

要在 JDBC 連接字串中提供資料庫的使用者名稱和密碼，可以使用連接字串屬性或 AWS Secrets Manager。
+ **連接字串** - 可以將使用者名稱和密碼指定為 JDBC 連接字串中的屬性。
**重要**  
作為安全最佳實務，請勿在您的環境變數或連線字串中使用硬式編碼憑證。如需有關將硬式編碼秘密移至 的資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[將硬式編碼秘密移至 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html) 。
+ **AWS Secrets Manager** – 若要搭配 使用 Athena 聯合查詢功能 AWS Secrets Manager，連接至 Lambda 函數的 VPC 應具有[網際網路存取](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)或 [VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)，以連接至 Secrets Manager。

  您可以將秘密的名稱放入 JDBC 連線字串 AWS Secrets Manager 中的 。連接器將秘密名稱取代為 Secrets Manager 中的 `username` 和 `password` 值。

  對於 Amazon RDS 資料庫執行個體，已緊密整合此支援。如果您使用 Amazon RDS，強烈建議使用 AWS Secrets Manager 和 登入資料輪換。如果您的資料庫不使用 Amazon RDS，請以下列格式將憑證儲存為 JSON：

  ```
  {"username": "${username}", "password": "${password}"}
  ```

**帶有秘密名稱的連接字串範例**  
以下字串具有秘密名稱 \$1\$1`vertica-username`\$1 和 `${vertica-password}`。

```
vertica://jdbc:vertica://
                        host_name:port/database?user=${vertica-username}&password=${vertica-password}
```

連接器會使用秘密名稱來擷取秘密並提供使用者名稱和密碼，如下列範例所示。

```
vertica://jdbc:vertica://
                        host_name:port/database?user=sample-user&password=sample-password
```

目前，Vertica 連接器可辨識 `vertica-username` 和 `vertica-password` JDBC 屬性。

#### 溢出參數
<a name="connectors-vertica-spill-parameters"></a>

Lambda SDK 可能會將資料溢出至 Amazon S3。由相同 Lambda 函數存取的所有資料庫執行個體溢出到相同的位置。


****  

| 參數 | Description | 
| --- | --- | 
| spill\$1bucket | 必要. 溢出儲存貯體名稱。 | 
| spill\$1prefix | 必要. 溢出儲存貯體金鑰字首。 | 
| spill\$1put\$1request\$1headers | (選用) 用於溢出的 Amazon S3 putObject 請求的請求標頭和值的 JSON 編碼映射 (例如，\$1"x-amz-server-side-encryption" : "AES256"\$1)。如需其他可能的標頭，請參閱《Amazon Simple Storage Service API 參考》中的 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)。 | 

## 支援的資料類型
<a name="connectors-vertica-data-type-support"></a>

下表顯示 Vertica 連接器支援的資料類型。


****  

| Boolean | 
| --- | 
| BigInt | 
| Short | 
| Integer | 
| Long | 
| Float | 
| Double | 
| Date | 
| Varchar | 
| 位元組 | 
| BigDecimal | 
| TimeStamp as Varchar | 

## 效能
<a name="connectors-vertica-performance"></a>

Lambda 函式執行投影下推，以減少查詢掃描的資料。`LIMIT` 子句可減少掃描的資料量，但是如果未提供述詞，則應預期含有 `LIMIT` 子句的 `SELECT` 查詢可掃描至少 16 MB 的資料。Vertica 連接器由於並行而對限流保有彈性。

## 傳遞查詢
<a name="connectors-vertica-passthrough-queries"></a>

Vertica 連接器支援[傳遞查詢](federated-query-passthrough.md)。傳遞查詢使用資料表函式，可將您的完整查詢下推到資料來源以便執行。

若要透過 Vertica 使用傳遞查詢，您可以使用下列語法：

```
SELECT * FROM TABLE(
        system.query(
            query => 'query string'
        ))
```

下列範例查詢會將查詢下推到 Vertica 中的資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        system.query(
            query => 'SELECT * FROM customer LIMIT 10'
        ))
```

## 授權資訊
<a name="connectors-vertica-license-information"></a>

使用此連接器，即表示您確認已包含第三方元件，可在此連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-vertica/pom.xml) 檔案中找到其清單，並同意 GitHub.com 上 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-vertica/LICENSE.txt) 檔案中提供的相應第三方授權中的條款。

## 其他資源
<a name="connectors-vertica-additional-resources"></a>

如需最新的 JDBC 驅動程式版本資訊，請參閱 GitHub.com 上 Vertica 連接器的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-vertica/pom.xml) 檔案。

如需有關此連接器的其他資訊，請參閱 GitHub.com 上的[相應網站](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-vertica)，以及 *AWS 大數據部落格*中的[使用 Athena 聯合查詢 SDK 在 Amazon Athena 中查詢 Vertica 資料來源](https://aws.amazon.com/blogs/big-data/querying-a-vertica-data-source-in-amazon-athena-using-the-athena-federated-query-sdk/)。

# 建立資料來源連線
<a name="connect-to-a-data-source"></a>

若要使用 Athena 資料來源連接器，您可以建立 AWS Glue 連線來存放連接器和資料來源的連線資訊。建立連線時，您會為資料來源指定名稱，以便在 SQL 查詢中參考資料來源。

您可以使用[主控台](connect-to-a-data-source-console-steps.md)或 [CreateDataCatalog API](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateDataCatalog.html) 操作，在 Athena 中建立和設定資料來源連線。

**Topics**
+ [在 Athena 中建立和使用資料來源的許可](connect-to-a-data-source-permissions.md)
+ [使用 Athena 主控台以連線到資料來源](connect-to-a-data-source-console-steps.md)
+ [使用 AWS Serverless Application Repository 部署資料來源連接器](connect-data-source-serverless-app-repo.md)
+ [為資料來源連接器或 AWS Glue 連線建立 VPC](athena-connectors-vpc-creation.md)
+ [將 ECR 映像提取至 AWS 您的帳戶](pull-ecr-customer-account.md)
+ [將您的連線註冊為 Glue Data Catalog](register-connection-as-gdc.md)
+ [啟用跨帳戶聯合查詢](xacct-fed-query-enable.md)
+ [更新資料來源連接器](connectors-updating.md)

# 在 Athena 中建立和使用資料來源的許可
<a name="connect-to-a-data-source-permissions"></a>

若要建立和使用資料來源，您需要下列許可集。
+ AmazonAthenaFullAccess 可提供 Amazon Athena 的完整存取權，也會提供相依性的限定範圍存取權，而啟用查詢、寫入結果和資料管理需要這些相依性。如需詳細資訊，請參閱《 AWS 受管政策參考指南》中的 [AmazonAthenaFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html)。
+ 呼叫 CreateDataCatalog API 的許可。只有在建立與 Glue 連線整合的資料來源時，才需要這些許可。如需有關範例政策的詳細資訊，請參閱 [建立連接器和 Athena 目錄所需的許可](athena-catalog-access.md)。
+ 如果您想要使用 Lake Formation 精細存取控制，則除了上面所列的許可外，您還需要下列許可。

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

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "lakeformation:RegisterResource",
          "iam:ListRoles",
          "glue:CreateCatalog",
          "glue:GetCatalogs",
          "glue:GetCatalog"
        ],
        "Resource": "*"
      }
    ]
  }
  ```

------

# 使用 Athena 主控台以連線到資料來源
<a name="connect-to-a-data-source-console-steps"></a>

您可以使用 Athena 主控台來建立和設定資料來源連線。

**建立與資料來源的連線**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 在導覽窗格中，選擇**資料來源和目錄**。

1. 在**資料來源和目錄**頁面上，選擇**建立資料來源**。

1. 針對 **Choose a data source** (選擇資料來源)，請參考下列指導方針，選擇您希望 Athena 查詢的資料來源：
   + 選擇與您的資料來源對應的連線選項。使用 Athena 預先建置的資料來源連接器可以設定包括 MySQL、Amazon DocumentDB 和 PostgreSQL 在內的來源。
   + 如果想要查詢 Simple Storage Service (Amazon S3) 中的資料，而且沒有使用 Apache Hive 中繼存放區或此頁面上的其他任何一個聯合查詢資料來源選項，請選擇 **S3 - AWS Glue Data Catalog**。Athena 使用 AWS Glue Data Catalog 以將資料來源的中繼資料和結構描述資訊存放在 Simple Storage Service (Amazon S3) 中。這是預設的 (非聯合) 選項。如需詳細資訊，請參閱[使用 AWS Glue Data Catalog 連線到您的資料](data-sources-glue.md)。如需使用此工作流程的步驟，請參閱 [在 Athena 中註冊和使用資料目錄](gdc-register.md)。
   + 選擇 **S3 - Apache Hive metastore** (S3 - Apache Hive 中繼存放區) 可查詢使用 Apache Hive 中繼存放區的 Simple Storage Service (Amazon S3) 資料集。如需有關此選項的詳細資訊，請參閱 [將 Athena 連接至 Apache Hive 中繼存放區](connect-to-data-source-hive-connecting-athena-to-an-apache-hive-metastore.md)。
   + 如果想要建立用於 Athena 的資料來源連接器，請選擇 **Custom or shared connector** (自訂或共用連接器)。如需寫入資料來源連接器的相關資訊，請參閱[使用 Athena Query Federation SDK 開發資料來源連接器](connect-data-source-federation-sdk.md)。

1. 選擇**下一步**。

1. 在**輸入資料來源詳細資訊頁面**中，對於**資料來源名稱**，當您從 Athena 查詢資料來源時，請使用自動產生的名稱，或輸入要在 SQL 陳述式中使用的唯一名稱。名稱最多可包含 127 個字元，且在您的帳戶中必須是唯一的。建立後便無法變更。有效字元包括 a-z、A-Z、0-9、\$1 (底線)、@ (at 符號) 和 - (連字號)。Athena 已保留名稱 `awsdatacatalog`、`hive`、`jmx` 和 `system`，這些名稱不能用於資料來源名稱。

1. 如果您選擇的資料來源與 AWS Glue 連線整合。

   1. 對於 **AWS Glue 連線詳細資訊**，請輸入所需的資訊。連線包含連接到特定資料來源所需的屬性。所需的屬性會因連線類型而異。如需有關連接器相關屬性的詳細資訊，請參閱 [可用資料來源連接器](connectors-available.md)。如需有關其他連線屬性的詳細資訊，請參閱《AWS Glue 使用者指南**》中的 [AWS Glue 連線屬性](https://docs.aws.amazon.com/glue/latest/dg/connection-properties.html)。
**注意**  
更新 Glue 連線屬性時，需要重新啟動 Lambda 連接器以取得更新的屬性。為此，請編輯環境屬性並將其儲存，而無需實際變更任何內容。
更新 Glue 連線時，對應 Lambda 函式中的下列屬性不會自動更新。您必須手動更新 Lambda 函式以獲取這些屬性。  
Lambda VPC 組態 – `security_group_ids`、`subnet_ids`
Lambda 執行角色 – `spill_bucket`、`secret_name`、`spill_kms_key_id`

   1. 針對 **Lambda 執行 IAM 角色**，請選擇下列其中一個選項：
      + **建立並使用新的執行角色** – （預設） Athena 會建立執行角色，然後用來 AWS Lambda 代表您存取 中的資源。Athena 需要此角色來建立您的聯合資料來源。
      + **使用現有的執行角色** – 使用此選項可選擇現有的執行角色。針對此選項，從**執行角色**下拉式清單中選擇您要使用的執行角色。

1. 如果您選擇的資料來源不會與 AWS Glue 連線整合。

   1. 針對 **Lambda function** (Lambda 函數)，選擇 **Create Lambda function** (建立 Lambda 函數)。您所選連接器的函數頁面會在 AWS Lambda 主控台中開啟。此頁面包含連接器的詳細資訊。

   1. 在 **Application settings** (應用程式設定) 下，仔細閱讀每個應用程式設定的說明，然後輸入符合您需求的數值。

      您看到的應用程式設定會根據資料來源的連接器而有所不同。所需最低設定包括：
      + **AthenaCatalogName** – 小寫的 Lambda 函數名稱，表示其目標資料來源，例如 `cloudwatchlogs`。
      + **SpillBucket** – 您帳戶中的 Simple Storage Service (Amazon S3) 儲存貯體，存放超過 Lambda 函數回應大小限制的資料。
**注意**  
溢出的資料不會在後續執行中重複使用，並且可安全刪除。Athena 不會替您刪除此資料。若要管理這些物件，請考慮新增一個會刪除您 Simple Storage Service (Amazon S3) 溢出儲存貯體中的舊資料的物件生命週期政策。如需詳細資訊，請參閱《Amazon S3 使用者指南》中的[管理儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)。

   1. 選擇 **I acknowledge that this app creates custom IAM roles and resource policies** (我認可此應用程式建立自訂的 IAM 角色和資源政策)。如需詳細資訊，請選擇 **Info (資訊)** 連結。

   1. 選擇**部署**。部署完成後，Lambda 函數會出現在 Lambda 主控台的 **Resources** (資源) 區段中。

      將資料來源連接器部署到您的帳戶之後，即可使 Athena 與其連接。

   1. 返回 Athena 主控台的 **Enter data source details** (輸入資料來源) 頁面。

   1. 在 **Connection details** (連線詳細資訊) 區段中，選擇 **Select or enter a Lambda function** (選取或輸入 Lambda 函數) 搜尋方塊旁的重新整理圖示。

   1. 選擇您剛才在 Lambda 主控台中建立的函數名稱。隨即顯示 Lambda 函數的 ARN。

1. (選用) 在 **Tags** (標籤) 中，新增要與此資料來源相關聯的鍵值對。如需標籤的詳細資訊，請參閱[標記 Athena 資源](tags.md)。

1. 選擇**下一步**。

1. 在**檢閱和建立**頁面上，檢閱資料來源詳細資訊。若要進行變更，請選擇**編輯**。

1. 閱讀 **Athena 將在您的帳戶中建立資源**中的資訊。若您同意，請選取**我確認 Athena 會代表我建立資源**。

1. 選擇 **Create data source (建立資料來源)**。**Athena ** 將為您建立下列資源。
   + Lambda 執行 IAM 角色
   + AWS Glue connection （僅當資料來源與 AWS Glue Connections 相容時）
   + Lambda 函式

該頁面的 **Data source details** (資料來源詳細資訊) 區段顯示了有關新連接器的資訊。您現在可以在 Athena 查詢中使用此連接器。

如需有關在查詢中使用資料連接器的資訊，請參閱 [執行聯合查詢](running-federated-queries.md)。

# 使用 AWS Serverless Application Repository 部署資料來源連接器
<a name="connect-data-source-serverless-app-repo"></a>

若要部署資料來源連接器，可以使用 [AWS Serverless Application Repository](https://aws.amazon.com/serverless/serverlessrepo/)，而不是使用 AWS Glue 連線。

**注意**  
我們建議您，僅在擁有自訂連接器或需要使用較舊的連接器時才使用 SAR。否則，建議使用 Athena 主控台。

您可以使用 AWS Serverless Application Repository 尋找要使用的連接器、提供連接器所需的參數，然後將連接器部署到您的帳戶。然後，部署連接器後，可以使用 Athena 主控台讓資料來源可供 Athena 使用。

## 將連接器部署到您的帳戶
<a name="connect-data-source-serverless-app-repo-deploying"></a>

**使用 AWS Serverless Application Repository 將資料來源連接器部署至您的帳戶**

1. 登入 AWS 管理主控台 並開啟**無伺服器應用程式儲存庫**。

1. 選擇在導覽窗格中的 **Available applications** (可用的應用程式)。

1. 選取選項 **Show apps that create custom IAM roles or resource policies** (顯示建立自訂 IAM 角色或資源政策的應用程式)。

1. 在搜尋方塊中，輸入連接器的名稱。如需預先建置的 Athena 資料連接器之清單，請參閱[可用資料來源連接器](connectors-available.md)。

1. 選擇連接器的名稱。在 AWS Lambda 主控台中選擇連接器會開啟 Lambda 函數的 **Application details** (應用程式詳細資訊) 頁面。

1. 在此詳細資訊頁面右側的 **Application settings (應用程式設定)** 中，輸入必要資訊。至少需設定下列內容。如需 Athena 所建立之資料連接器的其餘可設定選項的相關資訊，請參閱 GitHub 上相關的[可用的連接器](https://github.com/awslabs/aws-athena-query-federation/wiki/Available-Connectors)主題。
   + **AthenaCatalogName** – 小寫的 Lambda 函數名稱，表示其目標資料來源，例如 `cloudwatchlogs`。
   + **SpillBucket** – 指定您帳戶中用來接收所有大型回應承載資料 (超過 Lambda 函數回應大小限制的資料) 的 Simple Storage Service (Amazon S3) 儲存貯體。

1. 選擇 **I acknowledge that this app creates custom IAM roles and resource policies** (我認可此應用程式建立自訂的 IAM 角色和資源政策)。如需詳細資訊，請選擇 **Info (資訊)** 連結。

1. 在 **Application settings** (應用程式設定) 部分的右下方，選擇 **Deploy** (部署)。部署完成後，Lambda 函數會出現在 Lambda 主控台的 **Resources** (資源) 區段中。

## 使連接器可供 Athena 使用
<a name="connect-data-source-serverless-app-repo-making-the-connector-available-in-athena"></a>

現在，您可以所示使用 Athena 主控台使資料來源連接器可供 Athena 使用。

**使資料來源連接器可供 Athena 使用**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 在導覽窗格中，選擇**資料來源和目錄**。

1. 在**資料來源和目錄**頁面上，選擇**建立資料來源**。

1. 針對 **Choose a data source** (選擇資料來源)，選擇您在 AWS Serverless Application Repository中為其建立連接器的資料來源。本教學使用 **Amazon CloudWatch Logs** 作為聯合資料來源。

1. 選擇**下一步**。

1. 在 **Enter data source details** (輸入資料來源詳細資訊) 頁面中，當您從 Athena 查詢資料來源 (例如 `CloudWatchLogs`)，請於 **Data Source Name** (資料來源名稱) 輸入要在 SQL 陳述式中使用的名稱。名稱最多可包含 127 個字元，且在您的帳戶中必須是唯一的。建立後便無法變更。有效字元包括 a-z、A-Z、0-9、\$1 (底線)、@ (at 符號) 和 - (連字號)。Athena 已保留名稱 `awsdatacatalog`、`hive`、`jmx` 和 `system`，這些名稱不能用於資料來源名稱。

1. 在 **Connection details** (連線詳細資訊) 區段中，使用 **Select or enter a Lambda function** (選取或輸入 Lambda 函數) 方塊，以選擇您剛才建立的函數名稱。隨即顯示 Lambda 函數的 ARN。

1. (選用) 在 **Tags** (標籤) 中，新增要與此資料來源相關聯的鍵值對。如需標籤的詳細資訊，請參閱[標記 Athena 資源](tags.md)。

1. 選擇**下一步**。

1. 在 **Review and create** (檢閱並建立) 頁面上，檢閱資料來源詳細資訊，然後選擇 **Create data source** (建立資料來源)。

1. 該頁面的 **Data source details** (資料來源詳細資訊) 區段顯示了有關新連接器的資訊。您現在可以在 Athena 查詢中使用此連接器。

   如需有關在查詢中使用資料連接器的資訊，請參閱 [執行聯合查詢](running-federated-queries.md)。

# 為資料來源連接器或 AWS Glue 連線建立 VPC
<a name="athena-connectors-vpc-creation"></a>

有些 Athena 資料來源連接器和 AWS Glue 連線需要 VPC 和安全群組。本主題將說明如何建立具有子網路的 VPC 和 VPC 的安全群組。在此程序中，您可擷取您建立的 VPC、子網路和安全群組的 ID。當您設定 AWS Glue 連線或資料來源連接器以與 Athena 搭配使用時，需要這些 IDs。

**為 Athena 資料來源連接器建立 VPC**

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

1. 選擇**建立 VPC**。

1. 在**建立 VPC** 頁面的 **VPC 設定**下，針對**要建立的資源**，選擇 **VPC 和更多**。

1. 在**自動產生名稱標籤**下，針對**自動產生**，輸入將用於為 VPC 中的所有資源產生名稱標籤的值。

1. 選擇**建立 VPC**。

1. 程序完成後，選擇**檢視 VPC**。

1. 在 **Details** (詳細資訊) 區段的 **VPC ID** 中，複製您的 VPC ID 以供日後參考。

現在，您已準備好擷取剛建立的 VPC 的子網路 ID。

**擷取您的 VPC 子網路 ID**

1. 在 VPC 主控台的導覽窗格中，選擇 **Subnets** (子網路)。

1. 選取子網路名稱，且該名稱的 **VPC** 資料欄具有您記下的 VPC ID。

1. 在 **Details** (詳細資訊) 區段的 **Subnet ID** (子網路 ID) 中，複製您的子網路 ID 以供日後參考。

接著，為您的 VPC 建立安全群組。

**為 VPC 建立安全群組**

1. 在 VPC 主控台的導覽窗格中，選擇 **Security** (安全)、**Security Groups** (安全群組)。

1. 選擇**建立安全群組**。

1. 在 **Create Security Group** (建立安全群組) 頁面，輸入下列資訊：
   + 在 **Security group name** (安全群組名稱) 中，輸入您的安全群組名稱。
   + 在 **Description** (說明) 中，輸入安全群組的說明。描述為必要項目。
   + 在 **VPC** 中，選擇您為資料來源連接器建立的 VPC 的 VPC ID。
   + 在 **Inbound rules ** (傳入規則) 和 **Outbound rules** (傳出規則) 中，新增您所需的任何傳入和傳出規則。

1. 選擇**建立安全群組**。

1. 在安全群組的 **Details** (詳細資訊) 頁面，複製 **Security group ID** (安全群組 ID) 以供日後參考。

## 搭配使用 VPC 與 Athena 連接器時的重要考量事項
<a name="vpc-warning-instructions"></a>

由於所有連接器都可以使用 VPC，因此下列說明適用於所有 Athena 連接器。

**注意**  
搭配 Glue AWS 連線使用 VPC 時，您需要設定下列 PrivateLink 端點：  
Amazon S3
AWS Glue
AWS Secrets Manager

或者，您可以使用公有網際網路存取，但基於安全理由，不建議這麼做。

**警告**  
使用公有網際網路存取可能會讓您的資源面臨額外的安全風險。為增強安全性，強烈建議在 VPC 組態中使用 PrivateLink 端點。

# 將 ECR 映像提取至 AWS 您的帳戶
<a name="pull-ecr-customer-account"></a>

Athena Federation Connector Lambda 函式會使用存放在 Athena 受管 Amazon ECR 儲存庫中的容器映像。若要在這些容器映像上執行安全掃描，您必須先將其複製到帳戶中的 Amazon ECR 儲存庫。本節提供如何將映像複製到您的儲存庫，並設定 Lambda 函式以使用映像的逐步說明。

## 先決條件
<a name="pull-ecr-customer-account-prereq"></a>
+ Athena Federation Connector – 該連接器可以透過任何來源建立，前提是其使用了容器映像。
**注意**  
若要驗證映像部署，請檢查 Athena Federation Connector Lambda 中的映像索引標籤
+ Docker 已安裝且在執行中
+ AWS CLI 已安裝
+ 具有適當提取許可的帳戶憑證

## 如何傳輸映像
<a name="image-transfer-procedure"></a>

1. 從 Athena Federation Connector Lambda 找到映像 URI  
**Example**  

   ```
   account_id_1.dkr.ecr.us-east-1.amazonaws.com/athena-federation-repository:2025.15.1
   ```

1. 為 Athena 受管帳戶產生 Docker 身分驗證權杖：

   ```
   aws ecr get-login-password --region regionID | docker login --username AWS --password-stdin athena-managed-registry
   ```

   其中：
   + *regionID* 是您的部署區域 (例如 us-east-1)
   + *athena-managed-registry* 是映像 URI 的登錄檔部分 (例如 account\$1id\$11.dkr.ecr.us-east-1.amazonaws.com)

1. 從 Athena 受管帳戶提取映像：

   ```
   docker pull athenaImageURI
   ```

1. 向您的登錄檔驗證 Docker：

   ```
   aws ecr get-login-password --region regionID | docker login --username AWS --password-stdin customer-registry
   ```

   其中 *customer-registry* 是您的 ECR 登錄檔 (例如 account\$1id\$12.dkr.ecr.us-east-1.amazonaws.com)

1. 為您的儲存庫標記提取的映像：

   ```
   docker tag athenaImageURI yourImageURI
   ```

1. 將映像推送到您的儲存庫：

   ```
   docker push yourImageURI
   ```

1. 更新您的 Athena Federation Connector：

   1. 導覽至您的 Lambda 函式

   1. 選取**部署新映像**

   1. 輸入您的新映像 URI

   Athena 聯合連接器映像現在位於您的帳戶中，可讓您在映像上執行 CVE 掃描。

# 將您的連線註冊為 Glue Data Catalog
<a name="register-connection-as-gdc"></a>

建立資料來源之後，您可以使用 Athena 主控台，將您的連線註冊為 Glue Data Catalog。註冊後，您可以使用 Lake Formation 來管理聯合資料目錄並啟用精細存取控制。如需詳細資訊，請參閱[建立聯合目錄](https://docs.aws.amazon.com/lake-formation/latest/dg/create-fed-catalog-data-source.html)。

您可以註冊下列連接器，以與 整合 AWS Glue 以進行精細存取控制。
+ Redshift
+ BigQuery
+ DynamoDB (預覽版)
+ Snowflake (預覽版)
+ MySQL
+ PostgreSQL
+ AWS CMDB
+ Timestream
+ Azure Data Lake Storage
+ Azure Synapse
+ IBM Db2
+ IBM Db2 AS/400 (Db2 iSeries)
+ DocumentDB
+ Google Cloud Storage
+ HBase
+ OpenSearch
+ Oracle
+ SAP HANA
+ SQL Server
+ TPC-DS
+ Cloudera Hive
+ Cloudwatch
+ Cloudwatch 指標
+ Teradata
+ Vertica

## 先決條件
<a name="register-connection-as-gdc-pre"></a>

在開始之前，您必須完成以下先決條件。
+ 請確保您具有註冊位置所需的角色和許可。如需詳細資訊，請參閱《 AWS Lake Formation 開發人員指南》中的 [角色需求](https://docs.aws.amazon.com/lake-formation/latest/dg/registration-role.html)。
+ 請確保您具有必要的 Lake Formation 角色。如需詳細資訊，請參閱《 AWS Lake Formation 開發人員指南》中的[將 Data Catalog 連接到外部資料來源的先決條件](https://docs.aws.amazon.com/lake-formation/latest/dg/federated-catalog-data-connection.html)。
+ 您在 Glue 中註冊的角色必須具有下列範例中列出的許可。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "s3:ListBucket",
                  "s3:GetObject"
              ],
              "Resource": [
      "arn:aws:s3:::amzn-s3-demo-bucket/spill-prefix/*",
      "arn:aws:s3:::amzn-s3-demo-bucket/spill-prefix"
              ]
          },
          {
              "Sid": "lambdainvoke",
              "Effect": "Allow",
              "Action": "lambda:InvokeFunction",
              "Resource": "arn:aws:lambda:us-east-1:111122223333:function:lambda_function_name"
          },
          {
              "Sid": "gluepolicy",
              "Effect": "Allow",
              "Action": "glue:*",
              "Resource": [
              "arn:aws:glue:us-east-1:111122223333:connection/<connection_name>",
      "arn:aws:glue:us-east-1:111122223333:catalog"
              ]
          }
      ]
  }
  ```

------
+ 您負責判斷和管理適當的資料存取。由於對聯合查詢進行精細存取控制，建議您使用 [AmazonAthenaFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html) 受管政策。如果您想要使用自己的政策，您必須確保執行聯合查詢的使用者無法存取下列資源。
  + 在 Glue 連線中指定的 Lambda 連接器上的 `lambda:InvokeFunction`
  + IAM 中的溢出儲存貯體位置存取
  + 存取與聯合目錄相關的 Glue 連線
  + IAM 中的 Lake Formation 角色

## 使用主控台註冊您的連線
<a name="register-connection-as-gdc-steps"></a>

**將您的連線註冊為 Glue Data Catalog**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在導覽窗格中，選擇**資料來源和目錄**。

1. 從**資料來源**清單中，選擇您建立的資料來源，以開啟**資料來源詳細資訊**頁面。

1. 選擇**開始使用 AWS Lake Formation**。
**注意**  
選擇此選項後，您必須自行管理您的 Lambda 函式。Athena 不會刪除您的 Lambda 函式。

1. 對於**資料目錄名稱**，請提供您目錄的唯一名稱。

1. 選擇 **Lake Formation IAM 角色**，其中該角色可授予 Lake Formation 調用 Lambda 函式的許可。請確保角色具有許可，如[範例](#register-connection-as-gdc-pre)所示。

1. 在文字方塊中，輸入 **confirm** 以刪除 Athena 資料來源，並將其取代為 Glue 資料目錄註冊。
**注意**  
此動作會刪除您的 Athena 資料來源，並在其位置建立新的 Glue Data Catalog。此程序完成後，您可能需要更新存取資料來源的查詢，以改為參考新建立的 Glue 資料目錄。

1. 選擇**建立目錄並前往 Lake Formation**。這會開啟 Lake Formation 主控台，您可以在其中管理目錄，並將許可授予目錄、資料庫和資料表上的使用者。

# 啟用跨帳戶聯合查詢
<a name="xacct-fed-query-enable"></a>

聯合查詢允許您使用部署在 AWS Lambda上的資料來源連接器查詢 Amazon S3 以外的資料來源。跨帳戶聯合查詢功能允許 Lambda 函數和要查詢的資料來源位於不同的帳戶中。

**注意**  
只有在您尚未向 AWS Glue Data Catalog註冊聯合資料來源時，才會使用此方法。如果您已向 註冊資料來源 AWS Glue Data Catalog，請使用 AWS Glue Data Catalog 跨帳戶功能和許可模型。如需詳細資訊，請參閱《AWS Glue 使用者指南**》中的[授予跨帳戶存取權](https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html)。

作為資料管理員，您可以透過與資料分析師的帳戶共用資料連接器來啟用跨帳戶聯合查詢，或者作為資料分析師，透過使用資料管理員提供的共用 Lambda ARN 新增至您的帳戶，來啟用此功能。當對原始帳戶中的連接器進行組態變更時，更新的組態將自動套用於其他使用者帳戶中的連接器共用執行個體。

## 考量和限制
<a name="xacct-fed-query-enable-considerations-and-limitations"></a>
+ 跨帳戶聯合查詢功能適用於使用 Lambda 型資料來源的非 Hive 中繼儲存資料連接器。
+ 此功能不適用於 AWS Glue Data Catalog 資料來源類型。如需跨帳戶存取 AWS Glue Data Catalog的資訊，請參閱 [設定 AWS Glue 資料目錄的跨帳戶存取](security-iam-cross-account-glue-catalog-access.md)。
+ 如果來自連接器 Lambda 函數的回應超過 6 MB 的 Lambda 回應大小限制，Athena 會自動對您設定的 Amazon S3 儲存貯體進行加密、批次處理和溢出回應。執行 Athena 查詢的實體必須能夠存取溢出位置，這樣 Athena 才能讀取溢出的資料。建議您設定 Amazon S3 生命週期政策，從溢出位置刪除物件，因為查詢完成後就不需要資料了。
+  AWS 區域 不支援跨 使用聯合查詢。

## 所需的許可
<a name="xacct-fed-query-enable-required-permissions"></a>

若要設定所需的許可，必須在帳戶 A (*444455556666*) 和帳戶 B (*111122223333*) 中採取動作。

### 帳戶 A 的動作
<a name="xacct-fed-query-enable-required-permissions-account-a"></a>

若資料管理員帳戶 A 要與資料分析師帳戶 B 共用 Lambda 函數，帳戶 B 需要 Lambda 叫用函數和溢出儲存貯體存取權限。因此，帳戶 A 應將[資源型政策](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)新增至 Lambda 函數中，並將[主體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html)存取權限新增至 Amazon S3 中的溢出儲存貯體。

1. 以下政策向帳戶 B 授予帳戶 A 中 Lambda 函數的 Lambda 叫用函數許可。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "CrossAccountInvocationStatement",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:user/username"
                   ]
               },
               "Action": "lambda:InvokeFunction",
               "Resource": "arn:aws:lambda:us-east-1:444455556666:function:lambda-function-name"
           }
       ]
   }
   ```

------

1. 以下政策允許溢出儲存貯體存取帳戶 B 中的主體。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
               "AWS": ["arn:aws:iam::111122223333:user/username"]
               },
               "Action": [
                   "s3:GetObject",
                   "s3:ListBucket"
                ],
               "Resource": [
                   "arn:aws:s3:::spill-bucket",
                   "arn:aws:s3:::spill-bucket/*"
               ]
           }
        ]
    }
   ```

------

1. 如果 Lambda 函數使用 AWS KMS 金鑰加密溢出儲存貯體，而不是聯合 SDK 提供的預設加密，帳戶 A AWS KMS 中的金鑰政策必須將存取權授予帳戶 B 中的使用者，如下列範例所示。

   ```
   { 
       "Sid": "Allow use of the key", 
       "Effect": "Allow", 
       "Principal": 
       { 
          "AWS": ["arn:aws:iam::account-B-id:user/username"] 
       }, 
       "Action": [ "kms:Decrypt" ], 
       "Resource": "*" // Resource policy that gets placed on the KMS key. 
    }
   ```

### 帳戶 B 的動作
<a name="xacct-fed-query-enable-required-permissions-account-b"></a>

若要讓帳戶 A 與帳戶 B 共用其連接器，帳戶 B 必須透過呼叫 AWS 安全字符服務 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 動作來建立名為`AthenaCrossAccountCreate-account-A-id`帳戶 A 擔任的角色。

1. 使用 IAM 主控台或 AWS CLI 在 中建立`AthenaCrossAccountCreate-account-A-id`角色做為自訂信任政策角色。自訂信任政策會委派存取權，並允許其他人在您的 AWS 帳戶中執行動作。如需相關步驟，請參閱《IAM 使用者指南**》中的[使用自訂信任政策建立角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-custom.html)。

   信任關係應該有一個主體物件，其中索引鍵為 `AWS`，值為帳戶 A 的 ARN，如下列範例所示。

   ```
   ...
   "Principal": 
   { 
      "AWS": ["arn:aws:iam::account-A-id:user/username"]
   }, 
   ...
   ```

1. 此外，在帳戶 B 中建立如下所示的政策，以允許 `CreateDataCatalog` 動作。

   ```
   {
    "Effect": "Allow",
    "Action": "athena:CreateDataCatalog",
    "Resource": "arn:aws:athena:*:account-B-id:datacatalog/*"
   }
   ```

1. 將允許 `CreateDataCatalog` 動作的政策新增至您使用帳戶 B 建立的 `AthenaCrossAccountCreate-account-A-id` 角色。

## 與帳戶 B 共享帳戶 A 中的資料來源
<a name="xacct-fed-query-enable-sharing-a-lambda-data-source-in-account-a-with-account-b"></a>

設定許可後，即可使用 Athena 主控台中的**資料來源和目錄**頁面，將您的帳戶 (帳戶 A) 中的資料連接器與另一個帳戶 (帳戶 B) 共用。帳戶 A 保留連接器的完全控制權和擁有權。當帳戶 A 對連接器進行組態變更時，更新的組態將套用於帳戶 B 中的共用連接器。

**注意**  
您只能共用 Lambda 類型資料來源，而且無法共用使用 AWS Glue 連線的資料來源。如需詳細資訊，請參閱[可用資料來源連接器](connectors-available.md)。

**與帳戶 B 共用帳戶 A 中的 Lambda 資料來源**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 選擇**資料來源和目錄**。

1. 在**資料來源和目錄**頁面上，選擇您要共用的連接器連結。

1. 在 Lambda 資料來源的詳細資訊頁面上，從右上角的**動作**功能表，選擇**共用**。

1. 在**與另一個帳戶共用 *Lambda-name*** 對話方塊中，輸入所需的資訊。
   + 針對 **Data source name** (資料來源名稱) 中，輸入您希望複製的資料來源在其他帳戶中顯示的名稱。
   + 針對 **Account ID** (帳戶 ID) 中，輸入要與其共用資料來源的帳戶 ID (在本例中為帳戶 B)。

1. 選擇**共用**。您指定的共用資料連接器會建立在帳戶 B 中。帳戶 A 中連接器的組態變更會套用於帳戶 B 中的連接器。

## 將共用資料來源從帳戶 A 新增至帳戶 B
<a name="xacct-fed-query-enable-add-a-shared-lambda-function-arn-to-your-account"></a>

作為資料分析師，您可能會從資料管理員處獲得連接器的 ARN，以將其新增至您的帳戶中。您可以使用 Athena 主控台的**資料來源和目錄**頁面，將管理員提供的 Lambda ARN 新增至您的帳戶。

**將共用資料連接器的 Lambda ARN 新增至您的帳戶**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示導覽窗格，請選擇左側的展開選單。

1. 選擇**資料來源和目錄**。

1. 在**資料來源和目錄**頁面上，選擇**建立資料來源**。

1. 在**選擇資料來源**頁面上，選擇**自訂或共用連接器**。

1. 選擇**下一步**。

1. 在**輸入資料來源詳細資訊**頁面的**連線詳細資訊**區段中，針對**選取或輸入 Lambda 函式**，輸入帳戶 A 的 Lambda ARN。

1. 選擇**下一步**。

1. 在**檢閱和建立**頁面上，選擇**建立資料來源**。

## 疑難排解
<a name="xacct-fed-query-enable-troubleshooting"></a>

如果您收到錯誤訊息，指出帳戶 A 沒有在帳戶 B 中擔任角色的許可，請確認在帳戶 B 中建立的角色的名稱拼寫正確，並且連接了正確的政策。

# 更新資料來源連接器
<a name="connectors-updating"></a>

Athena 建議您定期將使用的資料來源連接器更新到最新版本，以利用新功能和增強功能。更新資料來源連接器包含下列步驟：

# Glue 連線 (建議)
<a name="connectors-updating-gc"></a>

## 尋找最新的 Athena Query Federation 版本
<a name="connectors-updating-finding-the-latest-version"></a>

Athena 資料來源連接器的最新版本編號對應於最新的 Athena Query Federation 版本。在某些情況下，GitHub 版本可能會比 AWS Serverless Application Repository (SAR) 上提供的版本稍微更新。

**若要找到最新的 Athena Query Federation 版本編號**

1. 造訪 GitHub URL [https://github.com/awslabs/aws-athena-query-federation/releases/latest](https://github.com/awslabs/aws-athena-query-federation/releases/latest)。

1. 請注意主頁面標題中的版本編號，格式如下：

   **Release v** *year*.*week\$1of\$1year*.*iteration\$1of\$1week* **of Athena Query Federation **

   例如，**Release v2023.8.3 of Athena Query Federation** 的版本編號為 2023.8.3。

## 尋找連接器版本
<a name="connectors-find-version"></a>

依照以下步驟，判斷您目前使用的連接器版本。

**尋找連接器版本**

1. 在 Lambda 應用程式的 Lambda 主控台頁面上，選擇**映像**索引標籤。

1. 在映像索引標籤下，找到映像 URI。URI 遵循此格式：

   ```
   Image_location_account.dkr.ecr.us-west-2.amazonaws.com/athena-federation-repository:Version
   ```

1. 映像 URI 中的版本編號遵循格式 `year.week_of_year.iteration_of_week` (例如 `2021.42.1`)。此數字代表連接器版本。

## 部署新的連接器版本
<a name="connectors-deploy-new-version"></a>

依照以下步驟，部署連接器的新版本。

**部署新的連接器版本**

1. 依照程序尋找所需的版本，以尋找最新的 Athena Query Federation 版本。

1. 在聯合連接器 Lambda 函式中，找到 ImageURI 並將標籤更新為所需的版本。例如：

   從：

   ```
   509399631660.dkr.ecr.us-east-1.amazonaws.com/athena-federation-repository:2025.15.1
   ```

   至：

   ```
   509399631660.dkr.ecr.us-east-1.amazonaws.com/athena-federation-repository:2025.26.1
   ```

**注意**  
如果您目前的版本早於 2025.15.1，請注意下列重要變更：  
儲存庫名稱已更新為 `athena-federation-repository`
對於此更新之前的版本，可能不會設定命令覆寫。您必須將其設定為複合處理常式。

# 舊版連線
<a name="connectors-updating-legacy"></a>

## 尋找最新的 Athena Query Federation 版本
<a name="connectors-updating-finding-the-latest-version"></a>

Athena 資料來源連接器的最新版本編號對應於最新的 Athena Query Federation 版本。在某些情況下，GitHub 版本可能會比 AWS Serverless Application Repository (SAR) 上提供的版本稍微更新。

**若要找到最新的 Athena Query Federation 版本編號**

1. 造訪 GitHub URL [https://github.com/awslabs/aws-athena-query-federation/releases/latest](https://github.com/awslabs/aws-athena-query-federation/releases/latest)。

1. 請注意主頁面標題中的版本編號，格式如下：

   **Release v** *year*.*week\$1of\$1year*.*iteration\$1of\$1week* **of Athena Query Federation **

   例如，**Release v2023.8.3 of Athena Query Federation** 的版本編號為 2023.8.3。

## 尋找並記下資源名稱
<a name="connectors-updating-finding-and-noting-resource-names"></a>

在準備升級時，您必須尋找並記下以下資訊：

1. 連接器的 Lambda 函數名稱。

1. Lambda 函數環境變數。

1. Lambda 應用程式名稱，可管理連接器的 Lambda 函數。

**若要從 Athena 主控台尋找資源名稱**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 在導覽窗格中，選擇**資料來源和目錄**。

1. 在**資料來源名稱**資料欄中，選擇連接器資料來源的連結。

1. 在 **資料來源詳細資訊**區段的 **Lambda 函數**下，選擇 Lambda 函數的連結。  
![\[選擇 Lambda 函數的連結。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-updating-1.png)

1. 在**函數**頁面的**函數名稱**資料欄中，記下連接器的函數名稱。  
![\[記下函數名稱。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-updating-2.png)

1. 選擇函數名稱連結。

1. 在**函數概觀**區段下，選擇**組態**索引標籤。

1. 在左側的窗格中，選擇**環境變數**。

1. 在**環境變數**區段中，記下索引鍵及其對應值。

1. 捲動至頁面頂端。

1. 在訊息**此函數屬於一個應用程式。中 按一下此處進行管理**，選擇**按一下此處**連結。

1. 在 **serverlessrepo-*your\$1application\$1name*** 頁面上，記下不帶 **serverlessrepo** 的應用程式名稱。例如，如果應用程式名稱是 **serverlessrepo-DynamoDbTestApp**，則您的應用程式名稱就是 **DynamoDbTestApp**。

1. 停留在應用程式的 Lambda 主控台頁面上，然後繼續執行**尋找正在使用的連接器版本**中的步驟。

## 尋找正在使用的連接器版本
<a name="connectors-updating-finding-the-version-that-you-are-using"></a>

依照以下步驟，尋找正在使用的連接器版本。

**若要尋找正在使用的連接器版本**

1. 在 Lambda 應用程式的 Lambda 主控台頁面上，選擇**部署**索引標籤。

1. 在**部署**索引標籤上，展開 **SAM 範本**。

1. 搜尋 **CodeUri**。

1. 在 **CodeUri** 下的**索引鍵**欄位中，尋找下列字串：

   ```
   applications-connector_name-versions-year.week_of_year.iteration_of_week/hash_number
   ```

   下列範例顯示 CloudWatch 連接器的字串：

   ```
   applications-AthenaCloudwatchConnector-versions-2021.42.1/15151159...
   ```

1. 記錄 *year*.*week\$1of\$1year*.*iteration\$1of\$1week* 的值 (例如 **2021.42.1**)。這是連接器的版本。

## 部署連接器的新版本
<a name="connectors-updating-deploying-the-new-version"></a>

依照以下步驟，部署連接器的新版本。

**若要部署連接器的新版本**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 在導覽窗格中，選擇**資料來源和目錄**。

1. 在**資料來源和目錄**頁面上，選擇**建立資料來源**。

1. 選擇您想要升級的資料來源，然後選擇**下一步**。

1. 在**連線詳細資訊**區段中，選擇**建立 Lambda 函數**。這會開啟 Lambda 主控台，您將能在其中部署更新的應用程式。  
![\[AWS Lambda 主控台中的連接器頁面。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-updating-3.png)

1. 由於您實際上並未建立新的資料來源，因此您可以關閉 Athena 主控台索引標籤。

1. 在連接器的 Lambda 主控台頁面上，執行以下步驟：

   1. 請確定您已從應用程式名稱中移除 **serverlessrepo-** 字首，然後將應用程式名稱複製到**應用程式名稱**欄位。

   1. 將您的 Lambda 函數名稱複製到 **AthenaCatalogName** 欄位。某些連接器將此欄位稱為 **LambdaFunctionName**。

   1. 將您記錄的環境變數複製到其對應欄位中。

1. 選擇選項**我認可此應用程式建立自訂的 IAM 角色和資源政策**，然後選擇**部署**。

1. 若要確認您的應用程式是否已更新，請選擇**部署**索引標籤。

   **部署歷史記錄**區段會顯示您的更新已完成。  
![\[連接器更新已完成。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connectors-updating-4.png)

1. 若要確認新的版本編號，您可以像以前一樣展開 **SAM 範本**，尋找 **CodeUri**，然後在**索引鍵**欄位中檢查連接器版本編號。

您現在可以使用更新的連接器來建立 Athena 聯合查詢。

# 編輯或刪除資料來源連線
<a name="connectors-edit-data-source"></a>

您可以使用 Athena 主控台來更新現有連線的描述、主機、連接埠、資料庫和其他屬性。您也可以從 Athena 主控台刪除資料來源。

## 編輯資料來源連線
<a name="connectors-edit-data-source-editsteps"></a>

**編輯資料來源連線**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 在導覽窗格中，選擇**資料來源和目錄**。

1. 在**資料來源和目錄**頁面上，選擇您要編輯的資料來源連線。

1. 如需 **AWS Glue 連線詳細資訊**，請選擇**編輯**。

1. 選擇**下一步**。

1. 在**編輯 <connection-name>** 頁面上，視需要更新資訊。可用屬性視連線類型而定。
**注意**  
當您更新秘密、溢出位置或 AWS KMS 金鑰 ID 的連線屬性時，請確保 Lambda 執行角色仍然可以存取更新的資源。如需詳細資訊，請參閱《 AWS Lambda 開發人員指南》中的[檢視並更新執行角色中的許可](https://docs.aws.amazon.com/lambda/latest/dg/permissions-executionrole-update.html)。
   + **描述** – 編輯連線的描述。
   + **主機** – 編輯資料庫的主機名稱。
   + **連接埠** – 編輯資料庫的連接埠號碼。
   + **資料庫** – 編輯資料庫的名稱。
   + **JDBC 參數** – 編輯連線所需的任何其他 JDBC 參數。
   + **秘密** – 從 AWS Secrets Manager選擇或建立秘密。使用 AWS 秘密以避免在 JDBC 連線字串中硬式編碼敏感資訊。如需詳細資訊，請參閱[什麼是 AWS Secrets Manager？](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 如需有關在 Secrets Manager 中建立秘密的資訊，請參閱《AWS Secrets Manager 使用者指南**》中的[建立 AWS Secrets Manager 秘密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)。

     若要 AWS Secrets Manager 搭配 Athena 聯合查詢使用 ，您必須為 Secrets Manager 設定 Amazon VPC 私有端點。如需詳細資訊，請參閱《AWS Secrets Manager 使用者指南》**中的[建立 Secrets Manager VPC 私有端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html#vpc-endpoint-create)。
   + **Amazon S3 中的溢出位置** – 在您帳戶中選擇或建立 Amazon S3 儲存貯體位置，以存放超出 Lambda 函式回應大小限制的資料。
**注意**  
溢出的資料不會在後續執行中重複使用，並且可以在 12 小時後安全刪除。Athena 不會替您刪除此資料。若要管理這些物件，請考慮新增一個會刪除您 Simple Storage Service (Amazon S3) 溢出儲存貯體中的舊資料的物件生命週期政策。如需詳細資訊，請參閱 *Simple Storage Service (Amazon S3) 使用者指南*中的[管理儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)。
   + **為 S3 中的查詢結果加密** – 選擇下列其中一項：
     + (預設) **使用隨機產生的金鑰** – 溢出到 Amazon S3 的資料會使用 AES-GCM 驗證加密模式和隨機產生的金鑰進行加密。
     + **使用 AWS KMS 金鑰** – 選擇或建立更強大、 AWS KMS 產生的加密金鑰。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[建立金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。
     + **關閉** – 請勿加密溢出資料。
   + **網路設定** – 有些連線需要虛擬私有雲端 (VPC)。選擇或建立 VPC (具有您要存取的資料存放區)、子網路，以及一或多個安全群組。如需詳細資訊，請參閱[為資料來源連接器或 AWS Glue 連線建立 VPC](athena-connectors-vpc-creation.md)。
**注意**  
更新秘密、溢出位置或 AWS KMS 金鑰 ID 等資源的連線屬性之後，請確定 Lambda 執行角色持續有權存取更新的資源。
更新連線的網路設定後，請確保使用相同的設定更新 Lambda 函式，以使您的連線與資料來源相容。

   如需有關其他連線屬性的資訊，請參閱《AWS Glue 使用者指南**》中的 [AWS Glue 連線屬性](https://docs.aws.amazon.com/glue/latest/dg/connection-properties.html) 或《Amazon Athena 使用者指南**》中的 [可用資料來源連接器](connectors-available.md)。

1. 選擇**儲存**。

資料來源頁面的 **AWS Glue 連線詳細資訊**區段顯示了有關連接器的最新資訊。

## 刪除資料來源
<a name="connectors-edit-data-source-delete"></a>

刪除資料來源時，只會刪除 Athena 資料來源，而不會刪除 Glue 連線、IAM 執行角色和 Lambda 函式等資源。

**刪除資料來源**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在導覽窗格中，選擇**資料來源和目錄**。

1. 在**資料來源和目錄**頁面上，選擇您要刪除的資料來源線。

1. 選擇 **刪除**。

1. 在**刪除資料來源**頁面上，輸入 *confirm* 以確認刪除，然後選擇**刪除**。可能需要一些時間才能完成資料來源刪除。刪除資料來源後，您會立即收到成功提醒。

# 執行聯合查詢
<a name="running-federated-queries"></a>

設定一或多個資料連接器並部署到您的帳戶之後，您就可以在 Athena 查詢中使用這些資料連接器。

## 查詢單一資料來源
<a name="running-federated-queries-single-data-source"></a>

本節中的範例假設您已設定 [Amazon Athena CloudWatch 連接器](connectors-cloudwatch.md) 並將其部署到您的帳戶。使用其他連接器時，請使用相同的方法進行查詢。

**若要建立使用 CloudWatch 連接器的 Athena 查詢**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在 Athena 查詢編輯器中，建立在 `FROM` 子句中使用下列語法的 SQL 查詢。

   ```
   MyCloudwatchCatalog.database_name.table_name       
   ```

### 範例
<a name="running-federated-queries-single-data-source-examples"></a>

下列範例使用 Athena CloudWatch 連接器連接到 `/var/ecommerce-engine/order-processor` CloudWatch Logs [ 日誌群組](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html) 中的 `all_log_streams` 檢視。`all_log_streams` 檢視是日誌群組中所有日誌串流的檢視。範例查詢將傳回的列數限制為 100。

```
SELECT * 
FROM "MyCloudwatchCatalog"."/var/ecommerce-engine/order-processor".all_log_streams 
LIMIT 100;
```

下列範例剖析的資訊來自前一個範例的檢視。此範例擷取訂單 ID 和日誌等級，並篩選掉等級為 `INFO` 的任何訊息。

```
SELECT 
    log_stream as ec2_instance, 
    Regexp_extract(message '.*orderId=(\d+) .*', 1) AS orderId, 
    message AS order_processor_log, 
    Regexp_extract(message, '(.*):.*', 1) AS log_level 
FROM MyCloudwatchCatalog."/var/ecommerce-engine/order-processor".all_log_streams 
WHERE Regexp_extract(message, '(.*):.*', 1) != 'INFO'
```

## 查詢多個資料來源
<a name="running-federated-queries-multiple-sources"></a>

舉一個更複雜的範例，假設一家電子商務公司使用以下資料來源來儲存與客戶購買相關的資料：
+ [Amazon RDS for MySQL](https://aws.amazon.com/rds/mysql/)，儲存產品目錄資料
+ [Amazon DocumentDB](https://aws.amazon.com/documentdb/)，儲存客戶帳戶資料，例如電子郵件和收貨地址
+ [Amazon DynamoDB](https://aws.amazon.com/dynamodb/)，儲存訂單運送和追蹤資料

假設此電子商務應用程式的資料分析師了解到，某些區域的運送時間受到當地天氣狀況的影響。分析師想知道有多少訂單已延誤，受影響客戶所在的位置，以及哪些產品受影響最大。分析師使用 Athena 在單一聯合查詢中將資料聯結起來，而不是個別調查資訊來源。

**Example**  

```
SELECT 
     t2.product_name AS product, 
     t2.product_category AS category, 
     t3.customer_region AS region, 
     count(t1.order_id) AS impacted_orders 
FROM my_dynamodb.default.orders t1 
JOIN my_mysql.products.catalog t2 ON t1.product_id = t2.product_id 
JOIN my_documentdb.default.customers t3 ON t1.customer_id = t3.customer_id 
WHERE 
     t1.order_status = 'PENDING'
     AND t1.order_date between '2022-01-01' AND '2022-01-05' 
GROUP BY 1, 2, 3 
ORDER BY 4 DESC
```

## 查詢聯合檢視
<a name="running-federated-queries-federated-views"></a>

查詢聯合來源時，您可以使用檢視來混淆基礎資料來源，或隱藏來自其他查詢資料分析師的複雜聯結。

### 考量和限制
<a name="running-federated-queries-federated-views-considerations"></a>
+ 聯合檢視需要 Athena 引擎版本 3。
+ 聯合檢視存放在 中 AWS Glue，而不是使用基礎資料來源。
+ [註冊為 Glue Data Catalog](register-connection-as-gdc.md) 的資料來源不支援聯合檢視。
+ 使用聯合目錄建立的檢視必須使用完全合格的名稱語法，如下列範例所示：

  ```
  "ddbcatalog"."default"."customers"
  ```
+ 在聯合來源上執行查詢的使用者，必須擁有查詢聯合來源的許可。
+ 聯合檢視需要 `athena:GetDataCatalog` 許可。如需詳細資訊，請參閱[允許存取 Athena 聯合查詢：範例政策](federated-query-iam-access.md)。

### 範例
<a name="running-federated-queries-federated-views-examples"></a>

以下範例為儲存在聯合資料來源中的資料建立一個名為 `customers` 的檢視。

**Example**  

```
CREATE VIEW customers AS
SELECT *
FROM my_federated_source.default.table
```

以下範例顯示一個查詢，其參考了 `customers` 檢視而非基礎聯合資料來源。

**Example**  

```
SELECT id, SUM(order_amount)
FROM customers
GROUP by 1
ORDER by 2 DESC
LIMIT 50
```

以下範例建立一個名為 `order_summary` 的檢視，該檢視結合了來自聯合資料來源和 Amazon S3 資料來源的資料。從已在 Athena 建立的聯合來源中，檢視會使用 `person` 和 `profile` 資料表。從 Amazon S3，檢視使用 `purchase` 和 `payment` 資料表。要參閱 Amazon S3，陳述式需使用關鍵字 `awsdatacatalog`。請注意，聯合資料來源會使用完整名稱語法 *federated\$1source\$1name*.*federated\$1source\$1database*.*federated\$1source\$1table*。

**Example**  

```
CREATE VIEW default.order_summary AS
SELECT *
FROM federated_source_name.federated_source_database."person" p
    JOIN federated_source_name.federated_source_database."profile" pr ON pr.id = p.id
    JOIN awsdatacatalog.default.purchase i ON p.id = i.id
    JOIN awsdatacatalog.default.payment pay ON pay.id = p.id
```

### 其他資源
<a name="running-federated-queries-federated-views-additional-resources"></a>
+ 如需與原始來源分離並可在多使用者模型中進行隨選分析的聯合檢視範例，請參閱 *AWS 大數據部落格*中的[使用 Amazon Athena 和聯合檢視擴展資料網格](https://aws.amazon.com/blogs/big-data/extend-your-data-mesh-with-amazon-athena-and-federated-views/)。
+ 如需有關在 Athena 中使用檢視的詳細資訊，請參閱 [使用檢視](views.md)。

# 使用聯合傳遞查詢
<a name="federated-query-passthrough"></a>

在 Athena 中，您可以使用資料來源本身的查詢語言對聯合資料來源執行查詢，並將完整查詢下推到資料來源以便執行。這些查詢稱為傳遞查詢。若要執行傳遞查詢，您可在 Athena 查詢中使用資料表函式。您可以將要在資料來源上執行的傳遞查詢包含在資料表函式的其中一個引數中。傳遞查詢會傳回可使用 Athena SQL 分析的資料表。

## 支援的連接器
<a name="federated-query-passthrough-supported-connectors"></a>

下列 Athena 資料來源連接器支援傳遞查詢。
+ [Azure Data Lake Storage](connectors-adls-gen2.md)
+ [Azure Synapse](connectors-azure-synapse.md)
+ [Cloudera Hive](connectors-cloudera-hive.md)
+ [Cloudera Impala](connectors-cloudera-impala.md)
+ [CloudWatch](connectors-cloudwatch.md)
+ [Db2](connectors-ibm-db2.md)
+ [Db2 iSeries](connectors-ibm-db2-as400.md)
+ [DocumentDB](connectors-docdb.md) 
+ [DynamoDB](connectors-dynamodb.md) 
+ [HBase](connectors-hbase.md)
+ [Google BigQuery](connectors-bigquery.md)
+ [Hortonworks](connectors-hortonworks.md)
+ [MySQL](connectors-mysql.md)
+ [Neptune](connectors-neptune.md)
+ [OpenSearch](connectors-opensearch.md) 
+ [Oracle](connectors-oracle.md)
+ [PostgreSQL](connectors-postgresql.md)
+ [Redshift](connectors-redshift.md)
+ [SAP HANA](connectors-sap-hana.md)
+ [Snowflake](connectors-snowflake.md)
+ [SQL Server](connectors-microsoft-sql-server.md)
+ [Teradata](connectors-teradata.md)
+ [Timestream](connectors-timestream.md)
+ [Vertica](connectors-vertica.md)

## 考量和限制
<a name="federated-query-passthrough-considerations-and-limitations"></a>

在 Athena 中使用傳遞查詢時，請考慮下列幾點：
+ 查詢傳遞僅支援 Athena `SELECT` 陳述式或讀取操作。
+ 查詢效能可能會因資料來源的組態而異。
+ 查詢傳遞不支援 Lake Formation 精細存取控制。
+ [註冊為 Glue Data Catalog](register-connection-as-gdc.md) 的資料來源不支援傳遞查詢。

## 語法
<a name="federated-query-passthrough-syntax"></a>

一般 Athena 查詢傳遞語法如下所示。

```
SELECT * FROM TABLE(catalog.system.function_name(arg1 => 'arg1Value'[, arg2 => 'arg2Value', ...]))
```

注意下列事項：
+ **catalog** – 目標 Athena 聯合連接器名稱或資料目錄名稱。
+ **system** – 包含函式的命名空間。所有 Athena 連接器實作都使用此命名空間。
+ **function\$1name** – 將傳遞查詢下推到資料來源的函式的名稱。這通常稱為 `query`。組合 `catalog.system.function_name` 是函式的完整解析路徑。
+ **arg1、arg2 等** – 函式引數。使用者必須將這些引數傳遞給函式。在大多數情況下，這是傳遞給資料來源的查詢字串。

對於大多數資料來源，第一個和唯一引數是 `query`，後跟箭頭運算子 `=>` 和查詢字串。

```
SELECT * FROM TABLE(catalog.system.query(query => 'query string'))
```

為了簡單起見，您可以省略選用的具名引數 `query` 和箭頭運算子 `=>`。

```
SELECT * FROM TABLE(catalog.system.query('query string'))
```

如果查詢在目標目錄內容中執行，則您可以透過移除 `catalog` 名稱來進一步簡化查詢。

```
SELECT * FROM TABLE(system.query('query string'))
```

如果資料來源需要的引數超出查詢字串所能提供的範圍，則請依資料來源預期的順序使用具名引數。例如，表達式 `arg1 => 'arg1Value'` 包含第一個引數及其值。名稱 *arg1* 專屬於資料來源，並且可能因連接器而異。

```
SELECT * FROM TABLE(
        system.query(
            arg1 => 'arg1Value',
            arg2 => 'arg2Value',
            arg3 => 'arg3Value'
        ));
```

另外，還可以省略引數名稱，進而簡化上述內容。不過，您必須遵循該方法簽章的順序。如需有關函式簽章的詳細資訊，請參閱每個連接器的文件。

```
SELECT * FROM TABLE(catalog.system.query('arg1Value', 'arg2Value', 'arg3Value'))
```

您可以使用完整的函式解析路徑，跨不同的 Athena 連接器執行多個傳遞查詢，如下列範例所示。

```
SELECT c_customer_sk 
    FROM TABLE (postgresql.system.query('select * from customer limit 10'))
UNION
SELECT c_customer_sk 
    FROM TABLE(dynamodb.system.query('select * from customer')) LIMIT 10
```

您可以使用傳遞查詢作為聯合檢視的一部分。適用相同限制。如需詳細資訊，請參閱[查詢聯合檢視](https://docs.aws.amazon.com/athena/latest/ug/running-federated-queries.html#running-federated-queries-federated-views)。

```
CREATE VIEW catalog.database.ViewName AS
    SELECT * FROM TABLE (
        catalog.system.query('query')
    )
```

如需有關搭配使用特定連接器的確切語法的資訊，請參閱個別連接器文件。

### 引號用量
<a name="federated-query-passthrough-syntax-quotation-marks"></a>

引數值 (包括您傳遞的查詢字串) 必須以單引號括住，如下列範例所示。

```
SELECT * FROM TABLE(system.query(query => 'SELECT * FROM testdb.persons LIMIT 10'))
```

當查詢字串以雙引號括住時，查詢會失敗。下列查詢失敗，並顯示錯誤訊息 COLUMN\$1NOT\$1FOUND：行 1:43：無法解析資料欄 'select \$1 from testdb.persons limit 10'。

```
SELECT * FROM TABLE(system.query(query => "SELECT * FROM testdb.persons LIMIT 10"))
```

若要逸出單引號，請在原引號上新增一個單引號 (例如，從 `terry's_group` 變更為 `terry''s_group`)。

## 範例
<a name="federated-query-passthrough-sql-based-connectors-examples"></a>

下列範例查詢會將查詢下推到資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        catalog.system.query(
            query => 'SELECT * FROM customer LIMIT 10;'
        ))
```

下列陳述式會執行相同的查詢，但無需選用的具名引數 `query` 和箭頭運算子 `=>`。

```
SELECT * FROM TABLE(
        catalog.system.query(
            'SELECT * FROM customer LIMIT 10;'
        ))
```

為便於重複使用，也可以將其封裝在聯合檢視中。與檢視搭配使用時，您必須使用完整的函式解析路徑。

```
CREATE VIEW AwsDataCatalog.default.example_view AS
    SELECT * FROM TABLE (
        catalog.system.query('SELECT * FROM customer LIMIT 10;')
    )
```

## 選擇不執行查詢傳遞
<a name="federated-query-passthrough-sql-based-connectors-opting-out"></a>

若要停用傳遞查詢，請新增名為 `enable_query_passthrough` 的 Lambda 環境變數，並將其設定為 `false`。

# 了解聯合資料表名稱限定詞
<a name="tables-qualifiers"></a>

Athena 使用下列術語來表示資料物件的階層：
+ **資料來源** – 一組資料庫
+ **資料表** – 一組資料表
+ **表格** – 組織為一組資料列或資料欄的資料

有時候，這些物件也會指稱為替代但對等的名稱，如下所示：
+ 資料來源有時被稱為目錄。
+ 資料庫有時被稱為結構描述。

## 聯合資料來源中的術語
<a name="tables-qualifiers-terms-in-federated-data-sources"></a>

查詢聯合資料來源時，請注意，基礎資料來源可能不會使用與 Athena 相同的術語。寫入聯合查詢時，請牢記這項差異性。下列各節說明 Athena 中的資料物件術語如何與聯合資料來源中的術語進行對應。

### Amazon Redshift
<a name="tables-qualifiers-redshift"></a>

Amazon Redshift *資料庫*是一組 Redshift *結構描述*，其中包含一組 Redshift *資料表*。


****  

| Athena | Redshift | 
| --- | --- | 
| Redshift 資料來源 | 設定為指向 Redshift database 的 Redshift 連接器 Lambda 函數。 | 
| data\$1source.database.table | database.schema.table | 

查詢範例

```
SELECT * FROM 
Athena_Redshift_connector_data_source.Redshift_schema_name.Redshift_table_name
```

如需有關此連接器的詳細資訊，請參閱 [Amazon Athena Redshift 連接器](connectors-redshift.md)。

### Cloudera Hive
<a name="tables-qualifiers-cloudera-hive"></a>

Cloudera Hive *伺服器*或*叢集*是一組 Cloudera Hive *資料庫*，其中包含一組 Cloudera Hive *資料表*。


****  

| Athena | Hive | 
| --- | --- | 
| Cloudera Hive 資料來源 | Cloudera Hive 連接器 Lambda 函數設定為指向 Cloudera Hive server。 | 
| data\$1source.database.table | server.database.table | 

查詢範例

```
SELECT * FROM 
Athena_Cloudera_Hive_connector_data_source.Cloudera_Hive_database_name.Cloudera_Hive_table_name
```

如需有關此連接器的詳細資訊，請參閱 [Amazon Athena Cloudera Hive 連接器](connectors-cloudera-hive.md)。

### Cloudera Impala
<a name="tables-qualifiers-cloudera-impala"></a>

Impala *伺服器*或*叢集*是一組 Impala *資料庫*，其中包含一組 Impala *資料表*。


****  

| Athena | Impala | 
| --- | --- | 
| Impala 資料來源 | Impala 連接器 Lambda 函數設定為指向 Impala server。 | 
| data\$1source.database.table | server.database.table | 

查詢範例

```
SELECT * FROM 
Athena_Impala_connector_data_source.Impala_database_name.Impala_table_name
```

如需有關此連接器的詳細資訊，請參閱 [Amazon Athena Cloudera Impala 連接器](connectors-cloudera-impala.md)。

### MySQL
<a name="tables-qualifiers-mysql"></a>

MySQL *伺服器*是一組 MySQL *資料庫*，其中包含一組 MySQL *資料表*。


****  

| Athena | MySQL | 
| --- | --- | 
| MySQL 資料來源 | MySQL 連接器 Lambda 函數設定為指向 MySQL server。 | 
| data\$1source.database.table | server.database.table | 

查詢範例

```
SELECT * FROM 
Athena_MySQL_connector_data source.MySQL_database_name.MySQL_table_name
```

如需有關此連接器的詳細資訊，請參閱 [Amazon Athena MySQL 連接器](connectors-mysql.md)。

### Oracle
<a name="tables-qualifiers-oracle"></a>

Oracle *伺服器* (或*資料庫*) 是一組 Oracle *結構描述*，其中包含一組 Oracle *資料表*。


****  

| Athena | Oracle | 
| --- | --- | 
| Oracle 資料來源 | Oracle 連接器 Lambda 函數設定為指向 Oracle server。 | 
| data\$1source.database.table | server.schema.table | 

查詢範例

```
SELECT * FROM 
Athena_Oracle_connector_data_source.Oracle_schema_name.Oracle_table_name
```

如需有關此連接器的詳細資訊，請參閱 [Amazon Athena Oracle 連接器](connectors-oracle.md)。

### Postgres
<a name="tables-qualifiers-postgres"></a>

Postgres *伺服器* (或*叢集*) 是一組 Postgres *資料庫*。Postgres *資料庫*是一組 Postgres *結構描述*，其中包含一組 Postgres *資料表*。


****  

| Athena | Postgres | 
| --- | --- | 
| Postgres 資料來源 | Postgres 連接器 Lambda 函數設定為指向 Postgres server 和 database。 | 
| data\$1source.database.table | server.database.schema.table | 

查詢範例

```
SELECT * FROM 
Athena_Postgres_connector_data_source.Postgres_schema_name.Postgres_table_name
```

如需有關此連接器的詳細資訊，請參閱 [Amazon Athena PostgreSQL 連接器](connectors-postgresql.md)。

# 使用 Athena Query Federation SDK 開發資料來源連接器
<a name="connect-data-source-federation-sdk"></a>

若要撰寫您的資料來源連接器，您可以使用 [Athena Query Federation SDK](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-federation-sdk)。Athena Query Federation 軟體開發套件定義一組界面和連線通訊協定，可讓 Athena 將部分查詢執行計劃委派給您撰寫和部署的程式碼。SDK 包含連接器套件和範例連接器。

自訂連接器不會使用 Glue 連線來集中 Glue 中的組態屬性。連線組態是透過 Lambda 完成的。

您也可以自訂 Amazon Athena [預先建置的連接器](https://github.com/awslabs/aws-athena-query-federation/wiki/Available-Connectors)供您使用。您可以從 GitHub 修改原始碼的副本，然後使用 [Connector 發佈工具](https://github.com/awslabs/aws-athena-query-federation/wiki/Connector_Publish_Tool)建立您自己的 AWS Serverless Application Repository 套件。以這種方式部署連接器之後，您就可以在 Athena 查詢中使用連接器。

如需有關如何下載軟體開發套件以及自行撰寫連接器的資訊，請參閱 GitHub 上的[範例 Athena 連接器](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-example)。

# 使用適用於 Apache Spark 的資料來源連接器
<a name="connectors-spark"></a>

有些 Athena 資料來源連接器可做為 Spark DSV2 連接器使用。Spark DSV2 連接器名稱具有 `-dsv2` 字尾 (例如，`athena-dynamodb-dsv2`)。

以下是目前可用的 DSV2 連接器、其 Spark `.format()` 類別名稱，以及對應的 Amazon Athena 聯合查詢文件的連結：


| DSV2 連接器 | Spark .format() 類別名稱 | 文件 | 
| --- | --- | --- | 
| athena-cloudwatch-dsv2 | com.amazonaws.athena.connectors.dsv2.cloudwatch.CloudwatchTableProvider | [CloudWatch](connectors-cloudwatch.md) | 
| athena-cloudwatch-metrics-dsv2 | com.amazonaws.athena.connectors.dsv2.cloudwatch.metrics.CloudwatchMetricsTableProvider | [CloudWatch 指標](connectors-cwmetrics.md) | 
| athena-aws-cmdb-dsv2 | com.amazonaws.athena.connectors.dsv2.aws.cmdb.AwsCmdbTableProvider | [CMDB](connectors-cmdb.md) | 
| athena-dynamodb-dsv2 | com.amazonaws.athena.connectors.dsv2.dynamodb.DDBTableProvider | [DynamoDB](connectors-dynamodb.md) | 

若要下載 DSV2 連接器的 `.jar` 檔案，請造訪 [Amazon Athena Query Federation DSV2](https://github.com/awslabs/aws-athena-query-federation-dsv2) GitHub 頁面，並參閱**發行**、**發行 *<版本>***、**資產**章節。

## 將 jar 指定至 Spark
<a name="connectors-spark-specifying-the-jar-to-spark"></a>

若要搭配使用 Athena DSV2 連接器與 Spark，請將連接器的 `.jar` 檔案提交至您正在使用的 Spark 環境。下列各節說明了特定情況。

### Athena for Spark
<a name="connectors-spark-ate"></a>

如需有關新增自訂 `.jar` 檔案和自訂組態至 Amazon Athena for Apache Spark 的資訊，請參閱 [使用 Spark 屬性指定自訂組態](notebooks-spark-custom-jar-cfg.md)。

### General Spark
<a name="connectors-spark-general"></a>

若要將連接器 `.jar` 檔案傳遞給 Spark，請使用 `spark-submit` 命令並在 `--jars` 選項中指定 `.jar` 檔案，如下列範例所示：

```
spark-submit \ 
  --deploy-mode cluster \ 
  --jars https://github.com/awslabs/aws-athena-query-federation-dsv2/releases/download/some_version/athena-dynamodb-dsv2-some_version.jar
```

### Amazon EMR Spark
<a name="connectors-spark-emr"></a>

為在 Amazon EMR 上使用 `--jars` 參數執行 `spark-submit` 命令，您必須新增步驟至您的 Amazon EMR Spark 叢集。如需有關如何使用 Amazon EMR 上的 `spark-submit`，請參閱《*Amazon EMR 版本指南*》中的[新增 Spark 步驟](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-submit-step.html)。

### AWS Glue ETL Spark
<a name="connectors-spark-glue-etl"></a>

對於 AWS Glue ETL，您可以將`.jar`檔案的 GitHub.com URL 傳遞至 `aws glue start-job-run`命令的`--extra-jars`引數。 AWS Glue 文件會將 `--extra-jars` 參數描述為採用 Amazon S3 路徑，但 參數也可以採用 HTTPS URL。如需詳細資訊，請參閱《*AWS Glue 開發人員指南*》中的[任務參數參考](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html#w5aac32c13c11)。

## 在 Spark 上查詢連接器
<a name="connectors-spark-querying-the-connector"></a>

若要在 Apache Spark 上提交您現有的 Athena 聯合查詢的等式，請使用 `spark.sql()` 函數。例如，假設您想要在 Apache Spark 上使用如下所示的 Athena 查詢。

```
SELECT somecola, somecolb, somecolc 
FROM ddb_datasource.some_schema_or_glue_database.some_ddb_or_glue_table 
WHERE somecola > 1
```

若要使用 Amazon Athena DynamoDB DSV2 連接器在 Spark 上執行相同的查詢，請使用下列程式碼：

```
dynamoDf = (spark.read 
    .option("athena.connectors.schema", "some_schema_or_glue_database") 
    .option("athena.connectors.table", "some_ddb_or_glue_table") 
    .format("com.amazonaws.athena.connectors.dsv2.dynamodb.DDBTableProvider") 
    .load()) 
 
dynamoDf.createOrReplaceTempView("ddb_spark_table") 
 
spark.sql(''' 
SELECT somecola, somecolb, somecolc 
FROM ddb_spark_table 
WHERE somecola > 1 
''')
```

## 指定參數
<a name="connectors-spark-parameters"></a>

Athena 資料來源連接器的 DSV2 版本使用的參數，與對應 Athena 資料來源連接器使用的參數相同。如需參數資訊，請參閱對應 Athena 資料來源連接器的文件。

在 PySpark 程式碼中，使用下列語法來設定您的參數。

```
spark.read.option("athena.connectors.conf.parameter", "value")
```

例如，下列程式碼會將 Amazon Athena DynamoDB 連接器 `disable_projection_and_casing` 參數設定為 `always`。

```
dynamoDf = (spark.read 
    .option("athena.connectors.schema", "some_schema_or_glue_database") 
    .option("athena.connectors.table", "some_ddb_or_glue_table") 
    .option("athena.connectors.conf.disable_projection_and_casing", "always") 
    .format("com.amazonaws.athena.connectors.dsv2.dynamodb.DDBTableProvider") 
    .load())
```

# 在 Athena 中使用 Amazon DataZone
<a name="datazone-using"></a>

您可以使用 [Amazon DataZone](https://aws.amazon.com/datazone) 來跨組織界限大規模共用、搜尋和探索資料。DataZone 可簡化 Athena AWS Glue和 等 AWS 分析服務的體驗 AWS Lake Formation。例如，如果您在不同的資料來源中有數 PB 的資料，則可以使用 Amazon DataZone 建立以商業使用案例為基礎的人員、資料和工具群組。如需詳細資訊，請參閱[什麼是 Amazon DataZone？](https://docs.aws.amazon.com/datazone/latest/userguide/what-is-datazone.html)。

在 Athena，您可以使用查詢編輯器來存取和查詢 DataZone 環境。一個 DataZone 環境指定一個 DataZone 專案和域的組合。當您從 Athena 主控台使用 DataZone 環境時，您會擔任 DataZone 環境的 IAM 角色，而且只會看到屬於該環境的資料庫和資料表。許可由您在 DataOne 中指定的角色決定。

在 Athena，您可以使用查詢編輯器頁面上的 **DataZone 環境**選擇器來選擇 DataZone 環境。

**若要在 Athena 中開啟 DataZone 環境**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在 Athena 主控台右上角的**工作群組**旁邊，選擇 **DataZone 環境**。
**注意**  
只有當您在 DataOne 中有一或多個域可用時，才會顯示 **DataZone 環境**選項。  
![\[選擇 DataZone 環境。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/datazone-using-1.png)

1. 使用 **DataZone 環境**選擇器來選擇 DataZone 環境。  
![\[選擇 DataZone 環境\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/datazone-using-2.png)

1. 在**切換至 DataZone 環境**對話方塊中，確認該環境是您想要的環境，然後選擇**切換至 DataZone 環境**。  
![\[確認對 DataZone 環境的變更。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/datazone-using-3.png)

如需開始使用 DataZone 和 Athena 的相關詳細資訊，請參閱**《Amazon DataZone 使用者指南》中的[入門](https://docs.aws.amazon.com/datazone/latest/userguide/getting-started.html)教學課程。

# 使用外部 Hive 中繼存放區
<a name="connect-to-data-source-hive"></a>

您可以使用適用於外部 Hive 中繼存放區的 Amazon Athena 資料連接器，來查詢在 Simple Storage Service (Amazon S3) 中使用 Apache Hive 中繼存放區的資料集。 AWS Glue Data Catalog 不需要將中繼資料遷移至 。在 Athena 管理主控台中，您可以設定 Lambda 函數來與私有 VPC 中的 Hive 中繼存放區通訊，然後將其連接到該中繼存放區。Lambda 與您的 Hive 中繼存放區間的連線受到私有 Amazon VPC 頻道的保護，且不會使用公有網際網路。您可以提供自己的 Lambda 函數程式碼，也可以使用適用於外部 Hive 中繼存放區的 Athena 資料連接器預設實作。

**Topics**
+ [功能概觀](#connect-to-a-data-source-hive-features)
+ [工作流程](#connect-to-data-source-hive-workflow)
+ [考量和限制](#connect-to-a-data-source-hive-considerations)
+ [將 Athena 連接至 Apache Hive 中繼存放區](connect-to-data-source-hive-connecting-athena-to-an-apache-hive-metastore.md)
+ [使用 AWS Serverless Application Repository 部署 Hive 資料來源連接器](connect-data-source-sar-hive.md)
+ [使用現有 IAM 執行角色將 Athena 連接到 Hive 中繼存放區](connect-data-source-hive-existing-iam-role.md)
+ [將 Athena 設定為使用已部署的 Hive 中繼存放區連接器](connect-data-source-hive-existing-lambda.md)
+ [在外部 Hive 中繼存放區查詢中，省略目錄名稱](datastores-hive-default-catalog.md)
+ [使用 Hive 檢視](hive-views.md)
+ [AWS CLI 搭配 Hive 中繼存放區使用](datastores-hive-cli.md)
+ [修改 Athena 外部 Hive 中繼存放區連接器](datastores-hive-reference-implementation.md)

## 功能概觀
<a name="connect-to-a-data-source-hive-features"></a>

您可以使用適用於外部 Hive 中繼存放區的 Athena 資料連接器執行下列任務：
+ 使用 Athena 主控台註冊自訂目錄並使用它們執行查詢。
+ 為不同的外部 Hive 中繼存放區定義 Lambda 函數，並在 Athena 查詢中加以聯結。
+ 在相同的 Athena 查詢中使用 AWS Glue Data Catalog 和外部 Hive 中繼存放區。
+ 在查詢執行內容中將目錄指定為目前預設目錄。如此就無需在查詢中將目錄名稱做為資料庫名稱的前綴。您可以使用 `database.table`，而不是用語法 `catalog.database.table`。
+ 使用各種工具來執行參考外部 Hive 中繼存放區的查詢。您可以使用 Athena 主控台、 AWS CLI、 AWS SDK、Athena APIs 和更新的 Athena JDBC 和 ODBC 驅動程式。更新的驅動程式具有自訂目錄的支援。

### API 支援
<a name="connect-to-a-data-source-hive-features-api"></a>

適用於外部 Hive 中繼存放區的 Athena 資料連接器，提供對目錄註冊 API 操作和中繼資料 API 操作的支援。
+ **目錄註冊** – 註冊適用於外部 Hive 中繼存放區和[聯合資料來源](federated-queries.md)的自訂目錄。
+ **中繼資料** – 使用中繼資料 APIs 為 和您向 Athena 註冊的任何目錄提供資料庫 AWS Glue 和資料表資訊。
+ **Athena JAVA 軟體開發套件用戶端** – 在更新的 Athena Java 軟體開發套件用戶端中使用目錄註冊 API、中繼資料 API 以及支援 `StartQueryExecution` 操作中的目錄。

### 參考實作
<a name="connect-to-a-data-source-hive-features-reference-implementation"></a>

Athena 提供 Lambda 函數的參考實作，該函數會連接到外部 Hive 中繼存放區。參考實作在 GitHub 上做為 [Athena Hive 中繼存放區](https://github.com/awslabs/aws-athena-hive-metastore)的開放原始碼專案提供。

參考實作可在 AWS Serverless Application Repository (SAR) 中做為下列兩個 AWS SAM 應用程式使用。您可以在 SAR 中使用任一應用程式來建立自己的 Lambda 函數。
+ `AthenaHiveMetastoreFunction` – Uber Lambda 功能 `.jar` 檔案。"uber" JAR (也稱為大量 JAR 或具有依存項目的 JAR) 是一種 `.jar` 檔案，該檔案會將 Java 程式和其依存項目包含在單一檔案中。
+ `AthenaHiveMetastoreFunctionWithLayer` – Lambda 層和薄型 Lambda 函數 `.jar` 檔案。

## 工作流程
<a name="connect-to-data-source-hive-workflow"></a>

下列圖表說明 Athena 如何與您的外部 Hive 中繼存放區互動。

![\[Athena 如何與您的外部 Hive 中繼存放區互動。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connect-to-data-source-hive-workflow.png)


在此工作流程中，您連接資料庫的 Hive 中繼存放區位於 VPC 內。您使用 Hive Server2 透過 Hive CLI 來管理 Hive 中繼存放區。

從 Athena 使用外部 Hive 中繼存放區的工作流程包含下列步驟。

1. 您需要建立一個 Lambda 函數，以將 Athena 連接到 VPC 內部的 Hive 中繼存放區。

1. 您可以為 Hive 中繼存放區註冊唯一的目錄名稱，並在您的帳戶中註冊相對應的函數名稱。

1. 當您執行使用目錄名稱的 Athena DML 或 DDL 查詢時，Athena 查詢引擎會呼叫您與目錄名稱相關聯的 Lambda 函數名稱。

1. 使用 時 AWS PrivateLink，Lambda 函數會與 VPC 中的外部 Hive 中繼存放區通訊，並接收中繼資料請求的回應。Athena 會使用來自外部 Hive 中繼存放區的中繼資料，就像它使用預設 AWS Glue Data Catalog的中繼資料一樣。

## 考量和限制
<a name="connect-to-a-data-source-hive-considerations"></a>

當您使用適用於外部 Hive 中繼存放區的 Athena 資料連接器時，請考慮下列幾點：
+ 您可以使用 CTAS 在外部 Hive 中繼存放區上建立資料表。
+ 您可以使用 INSERT INTO 將資料插入外部 Hive 中繼存放區。
+ 適用於外部 Hive 中繼存放區的 DDL 支援僅限於下列陳述式。
  + ALTER DATABASE SET DBPROPERTIES
  + ALTER TABLE ADD COLUMNS
  + ALTER TABLE ADD PARTITION
  + ALTER TABLE DROP PARTITION
  + ALTER TABLE RENAME PARTITION
  + 更改資料表的替換資料欄
  + ALTER TABLE SET LOCATION
  + ALTER TABLE SET TBLPROPERTIES
  + CREATE DATABASE
  + CREATE TABLE
  + CREATE TABLE AS
  + DESCRIBE TABLE
  + DROP DATABASE
  + DROP TABLE
  + SHOW COLUMNS
  + SHOW CREATE TABLE
  + SHOW PARTITIONS
  + SHOW SCHEMAS
  + SHOW TABLES
  + SHOW TBLPROPERTIES
+ 您可以擁有的已註冊目錄數目上限為 1,000。
+ Hive 中繼存放區不支援 Kerberos 身分驗證。
+ 若要將 JDBC 驅動程式與外部 Hive 中繼存放區或[聯合查詢](federated-queries.md)搭配使用，請將 `MetadataRetrievalMethod=ProxyAPI` 包含在您的 JDBC 連接字串中。如需有關 JDBC 驅動程式的資訊，請參閱[使用 JDBC 連接到 Amazon Athena](connect-with-jdbc.md)。
+ Hive 隱藏資料欄 `$path`、`$bucket`、`$file_size`、`$file_modified_time`、`$partition`、`$row_id` 不能用於精細存取控制篩選。
+ Hive 隱藏的系統資料表，例如 `example_table$properties` 或 `example_table$partitions` 不受精細存取控制支援。

### 許可
<a name="connect-to-a-data-source-hive-considerations-permissions"></a>

預先建置和自訂的資料連接器可能需要存取下列資源，才能正常運作。檢查您使用的連接器的資訊，以確保您已正確設定 VPC。如需有關在 Athena 中執行查詢和建立資料來源連接器所需 IAM 許可的資訊，請參閱[允許存取外部 Hive 中繼存放區的 Athena 資料連接器](hive-metastore-iam-access.md)和[允許 Lambda 函數存取外部 Hive 中繼存放區](hive-metastore-iam-access-lambda.md)。
+ **Simple Storage Service (Amazon S3)** – 除了將查詢結果寫入 Simple Storage Service (Amazon S3) 中的 Athena 查詢結果位置外，資料連接器也會寫入 Simple Storage Service (Amazon S3) 中的溢出儲存貯體。對此 Simple Storage Service (Amazon S3) 位置，需有連線能力和許可。如需詳細資訊，請參閱本主題後面部分的 [Amazon S3 中的溢出位置](#connect-to-data-source-hive-spill-location)。
+ **Athena** – 需要存取權才能檢查查詢狀態，並防止溢出掃描。
+ **AWS Glue** – 如果您的連接器使用 AWS Glue 作為補充或主要中繼資料，則需要存取。
+ **AWS Key Management Service**
+ **政策** – Hive 中繼存放區、Athena Query Federation 和 UDF 還需要 [AWS 受管政策：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 以外的政策。如需詳細資訊，請參閱[Athena 中的 Identity and Access Management](security-iam-athena.md)。

### Amazon S3 中的溢出位置
<a name="connect-to-data-source-hive-spill-location"></a>

由於針對 Lambda 函數回應大小的[限制](https://docs.aws.amazon.com/lambda/latest/dg/limits.html)，大於閾值的回應會溢入您在建立 Lambda 函數時指定的 Simple Storage Service (Amazon S3) 位置。Athena 會直接從 Simple Storage Service (Amazon S3) 讀取這些回應。

**注意**  
Athena 不會移除 Simple Storage Service (Amazon S3) 上的回應檔案。建議您設定保留原則，以自動刪除回應檔案。

# 將 Athena 連接至 Apache Hive 中繼存放區
<a name="connect-to-data-source-hive-connecting-athena-to-an-apache-hive-metastore"></a>

若要將 Athena 連接到 Apache Hive 中繼存放區，您必須建立和設定 Lambda 函數。關於基本實作，您可以從 Athena 管理主控台開始執行所有必要的步驟。

**注意**  
下列程序要求您具有為 Lambda 函數建立自訂 IAM 角色的許可。如果您沒有建立自訂角色的許可，您可以使用 Athena [參考實作](connect-to-data-source-hive.md#connect-to-a-data-source-hive-features-reference-implementation)分別建立 Lambda 函數，然後使用 AWS Lambda 主控台為函數選擇現有的 IAM 角色。如需詳細資訊，請參閱[使用現有 IAM 執行角色將 Athena 連接到 Hive 中繼存放區](connect-data-source-hive-existing-iam-role.md)。

**若要將 Athena 連接到 Hive 中繼存放區**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 選擇**資料來源和目錄**。

1. 在主控台的右上角，選擇 **Create data source** (建立資料來源)。

1. 在 **Choose a data source** (選擇資料來源) 頁面上，針對 **Data source** (資料來源) 選擇 **S3 - Apache Hive metastore** (S3 - Apache Hive 中繼存放區)。

1. 選擇**下一步**。

1. 在 **Data source details** (資料來源詳細資訊) 區段中，當您從 Athena 查詢資料來源，請於 **Data Source Name** (資料來源名稱) 輸入要在 SQL 陳述式中使用的名稱。名稱最多可包含 127 個字元，且在您的帳戶中必須是唯一的。建立後便無法變更。有效字元包括 a-z、A-Z、0-9、\$1 (底線)、@ (at 符號) 和 - (連字號)。Athena 已保留名稱 `awsdatacatalog`、`hive`、`jmx` 和 `system`，這些名稱不能用於資料來源名稱。

1. 對於 **Lambda 函數**，選擇**建立 Lambda 函數**，然後選擇**在 中建立新的 Lambda 函數 AWS Lambda**

   **AthenaHiveMetastoreFunction** 頁面會在 AWS Lambda 主控台中開啟。此頁面包含連接器的詳細資訊。  
![\[AWS Lambda 主控台中的 AthenaHiveMetastoreFunction 頁面。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connect-to-data-source-hive-4.png)

1. 在 **Application settings** (應用程式設定) 下，輸入您的 Lambda 函數的參數。
   + **LambdaFuncName** – 提供函數名稱。例如，**myHiveMetastore**。
   + **SpillLocation** – 指定此帳戶中的 Amazon S3 位置，如果 Lambda 函數回應大小超過 4 MB，此位置會保留溢出中繼資料。
   + **HMSUris** – 輸入在連接埠 9083 上使用 Thrift 通訊協定的 Hive 中繼存放區主機的 URI。使用語法 `thrift://<host_name>:9083`。
   + **LambdaMemory** – 指定介於 128 MB 到 3008 MB 之間的值。Lambda 函數分配到的 CPU 週期與您設定的記憶體數量成比例。預設值為 1024。
   + **LambdaTimeout** – 指定允許的 Lambda 叫用執行時間上限 (以秒為單位)，從 1 到 900 (900 秒為 15 分鐘)。預設值為 300 秒 (5 分鐘)。
   + **VPCSecurityGroupIds** – 為 Hive 中繼存放區輸入以逗號分隔的 VPC 安全群組 ID 清單。
   + **VPCSubnetIds** – 為 Hive 中繼存放區輸入以逗號分隔的 VPC 子網路 ID 清單。

1. 選擇 **I acknowledge that this app creates custom IAM roles** (我認可此應用程式建立自訂的 IAM 角色)，然後選擇 **Deploy** (部署)。  
![\[從 AWS Lambda 主控台部署 Lambda 函數應用程式。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connect-to-data-source-hive-4a.png)

   部署完成時，您的函數會顯示在 Lambda 應用程式清單中。現在 Hive 中繼存放區函數已部署到您的帳戶，您可以設定 Athena 以使用它。

1. 返回 Athena 主控台的 **Enter data source details** (輸入資料來源) 頁面。

1. 在 **Lambda function** (Lambda 函數) 區段中，選擇 Lambda 函數搜尋方塊旁的重新整理圖示。重新整理可用函數的清單可以使您新建立的函數出現在清單中。

1. 選擇您剛才在 Lambda 主控台中建立的函數名稱。隨即顯示 Lambda 函數的 ARN。

1. (選用) 在 **Tags** (標籤) 中，新增要與此資料來源相關聯的鍵值對。如需標籤的詳細資訊，請參閱[標記 Athena 資源](tags.md)。

1. 選擇**下一步**。

1. 在 **Review and create** (檢閱並建立) 頁面上，檢閱資料來源詳細資訊，然後選擇 **Create data source** (建立資料來源)。

1. 該頁面的 **Data source details** (資料來源詳細資訊) 區段顯示了有關新連接器的資訊。

   您現在可以使用您指定的 **Data source name** (資料來源名稱)，在 Athena 的 SQL 查詢中指定參考 Hive 中繼存放區。在 SQL 查詢中，使用下列範例中的語法，將 `hms-catalog-1` 取代為您先前指定的目錄名稱。

   ```
   SELECT * FROM hms-catalog-1.CustomerData.customers 
   ```

1. 如需有關查看、編輯或刪除您建立的資料來源的資訊，請參閱 [管理資料來源](data-sources-managing.md)。

# 使用 AWS Serverless Application Repository 部署 Hive 資料來源連接器
<a name="connect-data-source-sar-hive"></a>

若要部署 Hive 的 Athena 資料來源連接器，您可以使用 [AWS Serverless Application Repository](https://aws.amazon.com/serverless/serverlessrepo/)，而無需從 Athena 主控台開始。使用 AWS Serverless Application Repository 尋找您要使用的連接器，提供連接器所需的參數，然後將連接器部署到您的帳戶。然後，部署連接器後，可以使用 Athena 主控台讓資料來源可供 Athena 使用。

**使用 AWS Serverless Application Repository 將 Hive 的資料來源連接器部署到您的帳戶**

1. 登入 AWS 管理主控台 並開啟**無伺服器應用程式儲存庫**。

1. 選擇在導覽窗格中的 **Available applications** (可用的應用程式)。

1. 選取選項 **Show apps that create custom IAM roles or resource policies** (顯示建立自訂 IAM 角色或資源政策的應用程式)。

1. 在搜尋方塊中，輸入 **Hive**。出現的連接器包括以下兩個：
   + **AthenaHiveMetastoreFunction** – Uber Lambda 函數 `.jar` 檔案。
   + **AthenaHiveMetastoreFunctionWithLayer** – Lambda 層和薄型 Lambda 函數 `.jar` 檔案。

    這兩個應用程式具有相同的功能，唯一不同之處在其實作方式。您可以使用上述任一個應用程式來建立 Lambda 函數，將 Athena 連接到您的 Hive 中繼存放區。

1. 選擇您要使用的連接器名稱。本教學使用 **AthenaHiveMetastoreFunction**。  
![\[選擇適用於 Hive 的 Athena 資料來源連接器名稱。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connect-data-source-sar-hive-1.png)

1. 在 **Application settings** (應用程式設定) 下，輸入您的 Lambda 函數的參數。
   + **LambdaFuncName** – 提供函數名稱。例如，**myHiveMetastore**。
   + **SpillLocation** – 指定此帳戶中的 Amazon S3 位置，如果 Lambda 函數回應大小超過 4 MB，此位置會保留溢出中繼資料。
   + **HMSUris** – 輸入在連接埠 9083 上使用 Thrift 通訊協定的 Hive 中繼存放區主機的 URI。使用語法 `thrift://<host_name>:9083`。
   + **LambdaMemory** – 指定介於 128 MB 到 3008 MB 之間的值。Lambda 函數分配到的 CPU 週期與您設定的記憶體數量成比例。預設值為 1024。
   + **LambdaTimeout** – 指定允許的 Lambda 叫用執行時間上限 (以秒為單位)，從 1 到 900 (900 秒為 15 分鐘)。預設值為 300 秒 (5 分鐘)。
   + **VPCSecurityGroupIds** – 為 Hive 中繼存放區輸入以逗號分隔的 VPC 安全群組 ID 清單。
   + **VPCSubnetIds** – 為 Hive 中繼存放區輸入以逗號分隔的 VPC 子網路 ID 清單。

1. 在 **Application details** (應用程式詳細資訊) 頁面的右下方，選取 **I acknowledge that this app creates custom IAM roles** (我確認要以此應用程式建立自訂的 IAM 角色)，然後選擇 **Deploy** (部署)。

此時，您可以將 Athena 設定為使用 Lambda 函數連接到您的 Hive 中繼存放區。如需這些步驟，請參閱 [將 Athena 設定為使用已部署的 Hive 中繼存放區連接器](connect-data-source-hive-existing-lambda.md)。

# 使用現有 IAM 執行角色將 Athena 連接到 Hive 中繼存放區
<a name="connect-data-source-hive-existing-iam-role"></a>

若要透過使用現有 IAM 角色的 Lambda 函數將您的外部 Hive 中繼存放區連接到 Athena，您可以使用適用於外部 Hive 中繼存放區的 Athena 連接器參考實作。

三個主要步驟如下：

1. **[複製與建置](#connect-data-source-hive-existing-iam-role-clone-and-build-the-lambda-function)** – 複製 Athena 參考實作，並建置包含 Lambda 函數程式碼的 JAR 檔案。

1. **[AWS Lambda 主控台](#connect-data-source-hive-existing-iam-role-aws-lambda-console)** – 在 AWS Lambda 主控台中，建立 Lambda 函數、為其指派現有的 IAM 執行角色，以及上傳您產生的函數程式碼。

1. **[Amazon Athena 主控台](connect-data-source-hive-existing-lambda.md)** – 在 Amazon Athena 主控台中建立資料來源名稱，您可以使用此名稱來參考 Athena 查詢中的外部 Hive 中繼存放區。

如果您已有建立自訂 IAM 角色的許可，您可以使用更簡單的工作流程，使用 Athena 主控台和 AWS Serverless Application Repository 來建立和設定 Lambda 函數。如需詳細資訊，請參閱[將 Athena 連接至 Apache Hive 中繼存放區](connect-to-data-source-hive-connecting-athena-to-an-apache-hive-metastore.md)。

## 先決條件
<a name="connect-data-source-hive-existing-iam-role-prerequisites"></a>
+ Git 必須安裝在您的系統上。
+ 您必須已安裝 [Apache Maven](https://maven.apache.org/)。
+ 您擁有可以指派給 Lambda 函數的 IAM 執行角色。如需詳細資訊，請參閱[允許 Lambda 函數存取外部 Hive 中繼存放區](hive-metastore-iam-access-lambda.md)。

## 複製並建置 Lambda 函數
<a name="connect-data-source-hive-existing-iam-role-clone-and-build-the-lambda-function"></a>

Athena 參考實作的函數程式碼是位於 GitHub 上 [awslabs/aws-athena-hive-metastore](https://github.com/awslabs/aws-athena-hive-metastore) 的 Maven 專案 如需有關此專案的詳細資訊，請參閱 GitHub 上對應的 README 檔案或本文件中的 [修改 Athena 外部 Hive 中繼存放區連接器](datastores-hive-reference-implementation.md) 主題。

**若要複製並建置 Lambda 函數程式碼**

1. 請輸入下列命令來複製 Athena 參考實作：

   ```
   git clone https://github.com/awslabs/aws-athena-hive-metastore
   ```

1. 執行下列命令來建置適用於 Lambda 函數的 `.jar` 檔案：

   ```
   mvn clean install
   ```

   專案成功建置後，會將下列 `.jar` 檔案建立在您專案的目標資料夾中：

   `hms-lambda-func-1.0-SNAPSHOT-withdep.jar`

   在下一節中，您可以使用 AWS Lambda 主控台將此檔案上傳至您的 Amazon Web Services 帳戶。

## 在 AWS Lambda 主控台中建立和設定 Lambda 函數
<a name="connect-data-source-hive-existing-iam-role-aws-lambda-console"></a>

在本節中，您可以使用 AWS Lambda 主控台來建立使用現有 IAM 執行角色的函數。設定函數的 VPC 後，您可以上傳函數程式碼並設定函數的環境變數。

### 建立 Lambda 函式
<a name="connect-data-source-hive-existing-iam-role-create-the-lambda-function"></a>

在此步驟中，您會在 AWS Lambda 主控台中建立使用現有 IAM 角色的 函數。

**若要建立使用現有 IAM 角色的 Lambda 函數**

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

1. 在導覽視窗中，選擇**函數**。

1. 選擇 **Create function (建立函數)**。

1. 選擇**從頭開始撰寫**。

1. 在 **Function name** (函數名稱) 中，輸入您的 Lambda 函數名稱 (例如 **EHMSBasedLambda**)。

1. 在 **Runtime** (執行時間) 中，選擇 **Java 8**。

1. 在 **Permissions** (許可) 下，展開 **Change default execution role** (變更預設執行角色)。

1. 針對 **Execution role (執行角色)**，選擇 **Use an existing role (使用現有的角色)**。

1. 針對 **Existing role** (現有角色)，選擇您的 Lambda 函數將用於 Athena 的 IAM 執行角色 (此範例使用名為 `AthenaLambdaExecutionRole` 的角色)。

1. 展開 **Advanced settings** (進階設定)。

1. 選取 **Enable Network** (啟用網路)。

1. 對於 **VPC**，選擇您的函數可以存取的 VPC。

1. 對於 **Subnets** (子網路)，選擇 Lambda 要使用的 VPC 子網路。

1. 對於 **Security groups** (安全群組)，選擇 Lambda 要使用的 VPC 安全群組。

1. 選擇**建立函數**。 AWS Lambda 主控台 和 會開啟函數的組態頁面，並開始建立函數。

### 上傳程式碼並設定 Lambda 函數
<a name="connect-data-source-hive-existing-iam-role-upload-and-configure"></a>

當主控台通知您已成功建立函數時，您便可以上傳函數程式碼並設定其環境變數。

**若要上傳您的 Lambda 函數程式碼並設定其環境變數**

1. 在 Lambda 主控台中，請確認您在指定功能之頁面的 **Code** (程式碼) 索引標籤上。

1. **Code source** (程式碼來源)：選擇 **Upload from** (上傳來源)，然後選擇 **.zip or .jar file** (.zip 或 .jar 檔案)。

1. 上傳您先前產生的 `hms-lambda-func-1.0-SNAPSHOT-withdep.jar` 檔案。

1. 在 Lambda 函數頁面上，選擇 **Configuration** (組態) 標籤。

1. 從左側的窗格中選擇 **Environment variables** (環境變數)。

1. 在 **Environment variables** (環境變數) 區段中，選擇 **Edit** (編輯)。  
![\[選擇 Edit (編輯) 來編輯 Lambda 函數的環境變數。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connect-data-source-hive-existing-iam-role-5.png)

1. 在 **Edit environment variables** (編輯環境變數) 的頁面上，使用 **Add environment variable** (新增環境變數) 的選項新增下列環境變數索引鍵和值：
   + **HMS\$1URIS** – 以下列語法在連接埠 9083 上輸入使用 Thrift 通訊協定的 Hive 中繼存放區主機的 URI。

     ```
     thrift://<host_name>:9083
     ```
   + **SPILL\$1LOCATION** – 指定您的 Amazon Web Services 帳戶中的 Amazon S3 位置，如果 Lambda 函數回應大小超過 4 MB，此位置會保留溢出的中繼資料。  
![\[指定 Lambda 函數環境變數的值。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connect-data-source-hive-existing-iam-role-6.png)

1. 選擇**儲存**。

此時，您可以將 Athena 設定為使用 Lambda 函數連接到您的 Hive 中繼存放區。如需這些步驟，請參閱 [將 Athena 設定為使用已部署的 Hive 中繼存放區連接器](connect-data-source-hive-existing-lambda.md)。

# 將 Athena 設定為使用已部署的 Hive 中繼存放區連接器
<a name="connect-data-source-hive-existing-lambda"></a>

將 Lambda 資料來源連接器 (例如 `AthenaHiveMetastoreFunction`) 部署到您的帳戶之後，您即可設定 Athena 以使用它。在這個步驟中，您需建立資料來源名稱，以便在參考外部 Hive 中繼存放區的 Athena 查詢中使用。

**使用現有 Lambda 函數，將 Athena 連接至您的 Hive 中繼存放區**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 選擇**資料來源和目錄**。

1. 在**資料來源和目錄**頁面上，選擇**建立資料來源**。

1. 在 **Choose a data source** (選擇資料來源) 頁面上，針對 **Data source** (資料來源) 選擇 **S3 - Apache Hive metastore** (S3 - Apache Hive 中繼存放區)。

1. 選擇**下一步**。

1. 在 **Data source details** (資料來源詳細資訊) 區段中，當您從 Athena 查詢資料來源 (例如 `MyHiveMetastore`)，請於 **Data Source Name** (資料來源名稱) 輸入要在 SQL 陳述式中使用的名稱。名稱最多可包含 127 個字元，且在您的帳戶中必須是唯一的。建立後便無法變更。有效字元包括 a-z、A-Z、0-9、\$1 (底線)、@ (at 符號) 和 - (連字號)。Athena 已保留名稱 `awsdatacatalog`、`hive`、`jmx` 和 `system`，這些名稱不能用於資料來源名稱。

1. 在 **Connection details** (連線詳細資訊) 區段中，使用 **Select or enter a Lambda function** (選取或輸入 Lambda 函數) 方塊，以選擇您剛才建立的函數名稱。隨即顯示 Lambda 函數的 ARN。

1. (選用) 在 **Tags** (標籤) 中，新增要與此資料來源相關聯的鍵值對。如需標籤的詳細資訊，請參閱[標記 Athena 資源](tags.md)。

1. 選擇**下一步**。

1. 在 **Review and create** (檢閱並建立) 頁面上，檢閱資料來源詳細資訊，然後選擇 **Create data source** (建立資料來源)。

1. 該頁面的 **Data source details** (資料來源詳細資訊) 區段顯示了有關新連接器的資訊。

   您現在可以使用您指定的 **Data source name** (資料來源名稱)，在 Athena 的 SQL 查詢中指定參考 Hive 中繼存放區。

   在您的 SQL 查詢中使用下列範例中的語法，將 `ehms-catalog` 取代為您先前指定的資料來源名稱。

   ```
   SELECT * FROM ehms-catalog.CustomerData.customers 
   ```

1. 若要檢視、編輯或刪除您建立的資料來源，請參閱[管理資料來源](data-sources-managing.md)。

# 在外部 Hive 中繼存放區查詢中，省略目錄名稱
<a name="datastores-hive-default-catalog"></a>

當您在外部 Hive 中繼存放區上執行 DML 和 DDL 查詢時，可以藉由省略目錄名稱 (如果查詢編輯器中已選取該名稱) 來簡化查詢語法。此功能有某些限制。

## DML 陳述式
<a name="datastores-hive-default-catalog-dml-statements"></a>

**使用已註冊的目錄執行查詢**

1. 您可以在資料庫使用語法 `[[data_source_name].database_name].table_name` 之前放置資料來源，如下列範例所示。

   ```
   select * from  "hms-catalog-1".hms_tpch.customer limit 10;
   ```

1. 如果您想要使用的資料來源已在查詢編輯器中選取，則可以省略查詢中的名稱，如下列範例所示。

   ```
   select * from hms_tpch.customer limit 10:
   ```  
![\[使用預設資料來源的 DML 查詢。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/datastores-hive-default-catalog-2.png)

1. 當您在查詢中使用多個資料來源時，只能省略預設資料來源名稱，並且必須為任何非預設資料來源指定完整名稱。

   例如，假設已在查詢編輯器中選取 `AwsDataCatalog` 作為預設資料來源。下列查詢摘錄中的 `FROM`陳述式完全符合前兩個資料來源名稱的資格，但會省略第三個資料來源的名稱，因為它位於 AWS Glue 資料目錄中。

   ```
   ...
   FROM ehms01.hms_tpch.customer,
            "hms-catalog-1".hms_tpch.orders,
            hms_tpch.lineitem
   ...
   ```

## DDL 陳述式
<a name="datastores-hive-default-catalog-ddl-statements"></a>

下列 Athena DDL 陳述式支援目錄名稱字首。其他 DDL 陳述式中的目錄名稱字首會導致語法錯誤。

```
SHOW TABLES [IN [catalog_name.]database_name] ['regular_expression']

SHOW TBLPROPERTIES [[catalog_name.]database_name.]table_name [('property_name')]

SHOW COLUMNS IN [[catalog_name.]database_name.]table_name

SHOW PARTITIONS [[catalog_name.]database_name.]table_name

SHOW CREATE TABLE [[catalog_name.][database_name.]table_name

DESCRIBE [EXTENDED | FORMATTED] [[catalog_name.][database_name.]table_name [PARTITION partition_spec] [col_name ( [.field_name] | [.'$elem$'] | [.'$key$'] | [.'$value$'] )]
```

如同 DML 陳述式，若已在查詢編輯器中選取資料來源和資料庫，則可以在查詢編輯器中省略資料來源和資料庫字首。

於下圖可見，已在查詢編輯器中選取 `hms-catalog-1` 資料來源和 `hms_tpch` 資料庫。`show create table customer` 陳述式成立，即便查詢本身省略了 `hms-catalog-1` 字首和 `hms_tpch` 資料庫名稱。

![\[使用預設目錄的 DDL 陳述式。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/datastores-hive-default-catalog-4.png)


## 在 JDBC 連接字串中指定預設資料來源
<a name="datastores-hive-default-catalog-jdbc"></a>

當使用 Athena JDBC 驅動程式將 Athena 連接到外部 Hive 中繼存放區時，您可以使用 `Catalog` 參數在 SQL 編輯器 (例如 [SQL Workbench](https://www.sql-workbench.eu/index.html)) 中的連接字串中指定預設資料來源名稱。

**注意**  
如需下載最新的 Athena JDBC 驅動程式，請參閱[透過 JDBC 驅動程式使用 Athena](https://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html)。

下列連接字串指定預設資料來源 *hms-catalog-name*。

```
    jdbc:awsathena://AwsRegion=us-east-1;S3OutputLocation=s3://amzn-s3-demo-bucket/lambda/results/;Workgroup=AmazonAthenaPreviewFunctionality;Catalog=hms-catalog-name;
```

下圖即為在 SQL Workbench 中設定的 JDBC 連接 URL 範例。

![\[在 SQL Workbench 中設定 JDBC 連接 URL。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/datastores-hive-default-catalog-jdbc-1.jpg)


# 使用 Hive 檢視
<a name="hive-views"></a>

您可以使用 Athena 來查詢在外部 Apache Hive 中繼存放區中的現有檢視。Athena 在執行時間即時翻譯您的檢視，而無需變更原始檢視或存放翻譯。

例如，假設您有一個 Hive 檢視 (如以下所示)，其使用了 Athena 不支援的語法，如 `LATERAL VIEW explode()`：

```
CREATE VIEW team_view AS 
SELECT team, score 
FROM matches 
LATERAL VIEW explode(scores) m AS score
```

Athena 將 Hive 檢視查詢字串翻譯為 Athena 可以執行的以下陳述式：

```
SELECT team, score
FROM matches
CROSS JOIN UNNEST(scores) AS m (score)
```

如需將外部 Hive 中繼存放區連線到 Athena 的相關資訊，請參閱[使用外部 Hive 中繼存放區](connect-to-data-source-hive.md)。

## 考量和限制
<a name="hive-views-considerations-and-limitations"></a>

當從 Athena 查詢 Hive 檢視時，請考慮下列幾點：
+ Athena 不支援建立 Hive 檢視。您可以在外部 Hive 中繼存放區中建立 Hive 檢視，然後您可以從 Athena 查詢該檢視。
+ Athena 不支援 Hive 檢視的自訂 UDF。
+ 由於 Athena 主控台中存在已知問題，Hive 檢視顯示在資料表清單下，而不是檢視清單下。
+ 雖然翻譯過程是自動的，但某些 Hive 函數在 Hive 檢視中不受支援或需要特殊處理。如需詳細資訊，請參閱下一節。

## Hive 函數支援限制
<a name="hive-views-function-limitations"></a>

本節重點介紹了 Athena 不支援 Hive 檢視或需要特殊處理的 Hive 函數。目前，由於 Athena 主要支援 Hive 2.2.0 中的函數，因此無法使用僅在更高版本 (如 Hive 4.0.0) 中可用的函數。如需 Hive 函數的完整清單，請參閱 [Hive language manual UDF](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf) (Hive 語言手冊 UDF)。

### 彙總函數
<a name="hive-views-aggregate-functions"></a>

#### 需要特殊處理的彙總函數
<a name="hive-views-aggregate-functions-special-handling"></a>

Hive 檢視的以下彙總函數需要特殊處理。
+ **Avg** – 使用 `avg(CAST(i AS DOUBLE))` 而不是 `avg(INT i)`。

#### 不支援彙總函數
<a name="hive-views-aggregate-functions-not-supported"></a>

在 Athena 中，Hive 檢視不支援以下 Hive 彙總函數。

```
covar_pop
histogram_numeric
ntile
percentile
percentile_approx
```

在 Athena 中，Hive 檢視不支援迴歸函數，例如 `regr_count`、`regr_r2` 和 `regr_sxx`。

### 不支援日期函數
<a name="hive-views-date-functions-not-supported"></a>

在 Athena 中，Hive 檢視不支援以下 Hive 日期函數。

```
date_format(date/timestamp/string ts, string fmt)
day(string date)
dayofmonth(date)
extract(field FROM source)
hour(string date)
minute(string date)
month(string date)
quarter(date/timestamp/string)
second(string date)
weekofyear(string date)
year(string date)
```

### 不支援遮罩函數
<a name="hive-views-masking-functions-not-supported"></a>

在 Athena 中，Hive 檢視不支援 Hive 遮罩函數，例如 `mask()` 和 `mask_first_n()`。

### 其他函數
<a name="hive-views-miscellaneous-functions"></a>

#### 需要特殊處理的其他函數
<a name="hive-views-supported-miscellaneous-functions-special-handling"></a>

Hive 檢視的以下其他函數需要特殊處理。
+ **md5** – Athena 支援 `md5(binary)` 而非 `md5(varchar)`。
+ **Explode** – 在以下語法中使用時，Athena 支援 `explode`：

  ```
  LATERAL VIEW [OUTER] EXPLODE(<argument>)
  ```
+ **Posexplode** – 在以下語法中使用時，Athena 支援 `posexplode`：

  ```
  LATERAL VIEW [OUTER] POSEXPLODE(<argument>)           
  ```

  在 `(pos, val)` 輸出中，Athena 將 `pos` 資料欄視為 `BIGINT`。因此，您可能需要將 `pos` 資料欄轉換為 `BIGINT`，以避免檢視過時。以下範例說明此技術。

  ```
  SELECT CAST(c AS BIGINT) AS c_bigint, d 
  FROM table LATERAL VIEW POSEXPLODE(<argument>) t AS c, d
  ```

#### 不支援的其他函數
<a name="hive-views-unsupported-miscellaneous-functions-not-supported"></a>

在 Athena 中，Hive 檢視不支援以下 Hive 函數。

```
aes_decrypt
aes_encrypt
current_database
current_user
inline
java_method
logged_in_user
reflect
sha/sha1/sha2
stack
version
```

### 運算子
<a name="hive-views-operators"></a>

#### 需要特殊處理的運算子
<a name="hive-views-operators-special-handling"></a>

Hive 檢視的以下運算子需要特殊處理。
+ **求餘運算子 (%)** – 因為 `DOUBLE` 類型隱含地轉換為 `DECIMAL(x,y)`，以下語法可能會導致 View is stale (檢視過時) 錯誤訊息：

  ```
  a_double % 1.0 AS column
  ```

  若要解決此問題，請使用 `CAST`，如下列範例所示。

  ```
  CAST(a_double % 1.0 as DOUBLE) AS column
  ```
+ **除法運算子 (/)** – 在 Hive 中，`int` 除以 `int` 等於 `double`。在 Athena 中，相同的運算會產生一個遭截斷的 `int`。

#### 不支援的運算子
<a name="hive-views-operators-not-supported"></a>

Athena 不支援 Hive 檢視的以下運算子。

**\$1A** – 位元 `NOT`

**A ^ b** – 位元 `XOR`

**A & b** – 位元 `AND`

**A \$1 b** – 位元 `OR`

**A <=> b** – 對於非 null 運算元，會傳回與等於 (`=`) 運算子相同的結果。如果兩個皆為 `NULL`，則會傳回 `TRUE`；如果其中一個是 `NULL`，則會傳回 `FALSE`。

### 字串函數
<a name="hive-views-string-functions"></a>

#### 需要特殊處理的字串函數
<a name="hive-views-string-functions-special-handling"></a>

Hive 檢視的以下 Hive 字串函數需要特殊處理。
+ **chr(bigint\$1double a)** – Hive 允許負值引數；Athena 則不允許。
+ **instr(string str, string substr)** – 因為 `instr` 函數的 Athena 映射會傳回 `BIGINT` 而不是 `INT`，請使用以下語法：

  ```
  CAST(instr(string str, string substr) as INT)         
  ```

  如果沒有這個步驟，檢視將被視為過時。
+ **length(string a)** – 因為 `length` 函數的 Athena 映射會傳回 `BIGINT` 而不是 `INT`，請使用以下語法，以使檢視不會被視為過時：

  ```
  CAST(length(string str) as INT)
  ```

#### 不支援字串函數
<a name="hive-views-string-functions-not-supported"></a>

在 Athena 中，Hive 檢視不支援以下 Hive 字串函數。

```
ascii(string str)
character_length(string str)
decode(binary bin, string charset)
encode(string src, string charset)
elt(N int,str1 string,str2 string,str3 string,...)
field(val T,val1 T,val2 T,val3 T,...)
find_in_set(string str, string strList)
initcap(string A)
levenshtein(string A, string B)
locate(string substr, string str[, int pos])
octet_length(string str)
parse_url(string urlString, string partToExtract [, string keyToExtract])
printf(String format, Obj... args)
quote(String text)
regexp_extract(string subject, string pattern, int index)
repeat(string str, int n)
sentences(string str, string lang, string locale)
soundex(string A)
space(int n)
str_to_map(text[, delimiter1, delimiter2])
substring_index(string A, string delim, int count)
```

### 不支援 XPath 函數
<a name="hive-views-xpath-functions-not-supported"></a>

在 Athena 中，Hive 檢視不支援 Hive XPath 函數，例如 `xpath`、`xpath_short` 和 `xpath_int`。

## 疑難排解
<a name="hive-views-troubleshooting"></a>

當您在 Athena 中使用 Hive 檢視時，您可能會遇到以下問題：
+ **檢視 *<檢視名稱>* 已過時** – 此訊息通常表示 Hive 和 Athena 中的檢視類型不符。如果 [Hive LanguageManual UDF](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf) (Hive 語言手冊 UDF) 和 [Presto functions and operators](https://prestodb.io/docs/current/functions.html) (Presto 函數和運算子) 文件中的相同函數具有不同的簽章，請嘗試轉換不符的資料類型。
+ **未註冊函數** – Athena 目前不支援此函數。如需詳細資訊，請參閱本文件的前述資訊。

# AWS CLI 搭配 Hive 中繼存放區使用
<a name="datastores-hive-cli"></a>

您可以使用 `aws athena` CLI 命令來管理您搭配 Athena 使用的 Hive 中繼存放區資料目錄。定義一或多個搭配 Athena 使用的目錄之後，您可以在 `aws athena` DDL 和 DML 命令中參考這些目錄。

## 使用 AWS CLI 管理 Hive 中繼存放區目錄
<a name="datastores-hive-cli-manage-hive-catalogs"></a>

### 註冊目錄：Create-data-catalog
<a name="datastores-hive-cli-registering-a-catalog"></a>

若要註冊資料目錄，請使用 `create-data-catalog` 命令。使用 `name` 參數指定要用於目錄的名稱。將 Lambda 函數的 ARN 傳遞給 `parameters` 引數的 `metadata-function` 選項。若要為新目錄建立標籤，請將 `tags` 參數與一或多個以空格分隔的 `Key=key,Value=value` 引數組搭配使用。

以下為註冊名為 `hms-catalog-1` 的 Hive 中繼存放區的範例。為了方便閱讀，命令已經過格式化處理。

```
$ aws athena create-data-catalog 
 --name "hms-catalog-1" 
 --type "HIVE"
 --description "Hive Catalog 1"
 --parameters "metadata-function=arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-v3,sdk-version=1.0" 
 --tags Key=MyKey,Value=MyValue
 --region us-east-1
```

### 顯示目錄詳細資訊：Get-data-catalog
<a name="datastores-hive-cli-showing-details-of-a-catalog"></a>

若要顯示目錄的詳細資訊，請將目錄的名稱傳遞給 `get-data-catalog` 命令，如下列範例所示。

```
$ aws athena get-data-catalog --name "hms-catalog-1" --region us-east-1
```

以下樣本結果為 JSON 格式。

```
{
    "DataCatalog": {
        "Name": "hms-catalog-1",
        "Description": "Hive Catalog 1",
        "Type": "HIVE",
        "Parameters": {
            "metadata-function": "arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-v3",
            "sdk-version": "1.0"
        }
    }
}
```

### 列出已註冊的目錄：List-data-catalogs
<a name="datastores-hive-cli-listing-registered-catalogs"></a>

若要列示已註冊的目錄，請使用 `list-data-catalogs` 命令並選擇性地指定區域，如下列範例所示。列示的目錄永遠包括 AWS Glue在內。

```
$ aws athena list-data-catalogs --region us-east-1
```

以下樣本結果為 JSON 格式。

```
{
    "DataCatalogs": [
        {
            "CatalogName": "AwsDataCatalog",
            "Type": "GLUE"
        },
        {
            "CatalogName": "hms-catalog-1",
            "Type": "HIVE",
            "Parameters": {
                "metadata-function": "arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-v3",
                "sdk-version": "1.0"
            }
        }
    ]
}
```

### 更新目錄：Update-data-catalog
<a name="datastores-hive-cli-updating-a-catalog"></a>

若要更新資料目錄，請使用 `update-data-catalog` 命令，如下列範例所示。為了方便閱讀，命令已經過格式化處理。

```
$ aws athena update-data-catalog 
 --name "hms-catalog-1" 
 --type "HIVE"
 --description "My New Hive Catalog Description" 
 --parameters "metadata-function=arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new,sdk-version=1.0" 
 --region us-east-1
```

### 刪除目錄：Delete-data-catalog
<a name="datastores-hive-cli-deleting-a-catalog"></a>

若要刪除資料目錄，請使用 `delete-data-catalog` 命令，如下列範例所示。

```
$ aws athena delete-data-catalog --name "hms-catalog-1" --region us-east-1
```

### 顯示資料庫詳細資訊：Get-database
<a name="datastores-hive-cli-showing-details-of-a-database"></a>

若要顯示資料庫的詳細資訊，請將目錄和資料庫的名稱傳遞給 `get-database` 命令，如下列範例所示。

```
$ aws athena get-database --catalog-name hms-catalog-1 --database-name mydb
```

以下樣本結果為 JSON 格式。

```
{
    "Database": {
        "Name": "mydb",
        "Description": "My database",
        "Parameters": {
            "CreatedBy": "Athena",
            "EXTERNAL": "TRUE"
        }
    }
}
```

### 列出目錄中的資料庫：List-databases
<a name="datastores-hive-cli-listing-databases"></a>

若要列出目錄中的資料庫，請使用 `list-databases` 命令並選擇性地指定區域，如下列範例所示。

```
$ aws athena list-databases --catalog-name AwsDataCatalog --region us-west-2
```

以下樣本結果為 JSON 格式。

```
{
    "DatabaseList": [
        {
            "Name": "default"
        },
        {
            "Name": "mycrawlerdatabase"
        },
        {
            "Name": "mydatabase"
        },
        {
            "Name": "sampledb",
            "Description": "Sample database",
            "Parameters": {
                "CreatedBy": "Athena",
                "EXTERNAL": "TRUE"
            }
        },
        {
            "Name": "tpch100"
        }
    ]
}
```

### 顯示資料表詳細資訊：Get-table-metadata
<a name="datastores-hive-cli-showing-details-of-a-table"></a>

若要顯示資料表的中繼資料，包括資料行名稱和資料類型，請將目錄、資料庫的名稱和資料表名稱傳遞給 `get-table-metadata` 命令，如下列範例所示。

```
$ aws athena get-table-metadata --catalog-name AwsDataCatalog --database-name mydb --table-name cityuseragent
```

以下樣本結果為 JSON 格式。

```
{
    "TableMetadata": {
        "Name": "cityuseragent",
            "CreateTime": 1586451276.0,
            "LastAccessTime": 0.0,
            "TableType": "EXTERNAL_TABLE",
            "Columns": [
                {
                    "Name": "city",
                    "Type": "string"
                },
                {
                    "Name": "useragent1",
                    "Type": "string"
                }
            ],
            "PartitionKeys": [],
            "Parameters": {
                "COLUMN_STATS_ACCURATE": "false",
                "EXTERNAL": "TRUE",
                "inputformat": "org.apache.hadoop.mapred.TextInputFormat",
                "last_modified_by": "hadoop",
                "last_modified_time": "1586454879",
                "location": "s3://amzn-s3-demo-bucket/",
                "numFiles": "1",
                "numRows": "-1",
                "outputformat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
                "rawDataSize": "-1",
                "serde.param.serialization.format": "1",
                "serde.serialization.lib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
                "totalSize": "61"
            }
        }
}
```

### 顯示資料庫中所有資料表的中繼資料：List-table-metadata
<a name="datastores-hive-cli-showing-all-table-metadata"></a>

若要顯示資料庫中所有資料表的中繼資料，請將目錄的名稱和資料庫名稱傳遞給 `list-table-metadata` 命令。`list-table-metadata` 命令與 `get-table-metadata` 命令類似，但是您不指定資料表名稱。若要限制結果的數目，您可以使用 `--max-results` 選項，如下列範例所示。

```
$ aws athena list-table-metadata --catalog-name AwsDataCatalog --database-name sampledb --region us-east-1 --max-results 2
```

以下樣本結果為 JSON 格式。

```
{
    "TableMetadataList": [
        {
            "Name": "cityuseragent",
            "CreateTime": 1586451276.0,
            "LastAccessTime": 0.0,
            "TableType": "EXTERNAL_TABLE",
            "Columns": [
                {
                    "Name": "city",
                    "Type": "string"
                },
                {
                    "Name": "useragent1",
                    "Type": "string"
                }
            ],
            "PartitionKeys": [],
            "Parameters": {
                "COLUMN_STATS_ACCURATE": "false",
                "EXTERNAL": "TRUE",
                "inputformat": "org.apache.hadoop.mapred.TextInputFormat",
                "last_modified_by": "hadoop",
                "last_modified_time": "1586454879",
                "location": "s3://amzn-s3-demo-bucket/",
                "numFiles": "1",
                "numRows": "-1",
                "outputformat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
                "rawDataSize": "-1",
                "serde.param.serialization.format": "1",
                "serde.serialization.lib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
                "totalSize": "61"
            }
        },
        {
            "Name": "clearinghouse_data",
            "CreateTime": 1589255544.0,
            "LastAccessTime": 0.0,
            "TableType": "EXTERNAL_TABLE",
            "Columns": [
                {
                    "Name": "location",
                    "Type": "string"
                },
                {
                    "Name": "stock_count",
                    "Type": "int"
                },
                {
                    "Name": "quantity_shipped",
                    "Type": "int"
                }
            ],
            "PartitionKeys": [],
            "Parameters": {
                "EXTERNAL": "TRUE",
                "inputformat": "org.apache.hadoop.mapred.TextInputFormat",
                "location": "s3://amzn-s3-demo-bucket/",
                "outputformat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
                "serde.param.serialization.format": "1",
                "serde.serialization.lib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
                "transient_lastDdlTime": "1589255544"
            }
        }
    ],
    "NextToken": "eyJsYXN0RXZhbHVhdGVkS2V5Ijp7IkhBU0hfS0VZIjp7InMiOiJ0Ljk0YWZjYjk1MjJjNTQ1YmU4Y2I5OWE5NTg0MjFjYTYzIn0sIlJBTkdFX0tFWSI6eyJzIjoiY2xlYXJpbmdob3VzZV9kYXRhIn19LCJleHBpcmF0aW9uIjp7InNlY29uZHMiOjE1ODkzNDIwMjIsIm5hbm9zIjo2NTUwMDAwMDB9fQ=="
}
```

## 執行 DDL 和 DML 陳述式
<a name="datastores-hive-cli-running-ddl-and-dml"></a>

當您使用 AWS CLI 執行 DDL 和 DML 陳述式時，您可以透過下列兩種方式之一傳遞 Hive 中繼存放區目錄的名稱：
+ 直接傳入支援它的陳述式。
+ 傳遞給 `--query-execution-context` `Catalog` 參數。

### DDL 陳述式
<a name="datastores-hive-cli-ddl-statements"></a>

下列範例會直接做為 `show create table` DDL 陳述式的一部分傳入目錄名稱。為了方便閱讀，命令已經過格式化處理。

```
$ aws athena start-query-execution 
 --query-string "show create table hms-catalog-1.hms_tpch_partitioned.lineitem" 
 --result-configuration "OutputLocation=s3://amzn-s3-demo-bucket/lambda/results"
```

下面的範例 DDL `show create table` 陳述式使用 `--query-execution-context` 的 `Catalog` 參數來傳遞 Hive 中繼存放區錄名稱 `hms-catalog-1`。為了方便閱讀，命令已經過格式化處理。

```
$ aws athena start-query-execution 
 --query-string "show create table lineitem" 
 --query-execution-context "Catalog=hms-catalog-1,Database=hms_tpch_partitioned" 
 --result-configuration "OutputLocation=s3://amzn-s3-demo-bucket/lambda/results"
```

### DML 陳述式
<a name="datastores-hive-cli-dml-statements"></a>

下列範例 DML `select` 陳述式將目錄名稱直接傳遞到查詢中。為了方便閱讀，命令已經過格式化處理。

```
$ aws athena start-query-execution
 --query-string "select * from hms-catalog-1.hms_tpch_partitioned.customer limit 100" 
 --result-configuration "OutputLocation=s3://amzn-s3-demo-bucket/lambda/results"
```

下列範例 DML `select` 陳述式使用 `--query-execution-context` 的 `Catalog` 參數傳入 Hive 中繼存放區目錄名稱 `hms-catalog-1`。為了方便閱讀，命令已經過格式化處理。

```
$ aws athena start-query-execution 
 --query-string "select * from customer limit 100" 
 --query-execution-context "Catalog=hms-catalog-1,Database=hms_tpch_partitioned" 
 --result-configuration "OutputLocation=s3://amzn-s3-demo-bucket/lambda/results"
```

# 修改 Athena 外部 Hive 中繼存放區連接器
<a name="datastores-hive-reference-implementation"></a>

如果您有特殊要求，您可以修改外部 Hive 中繼存放區的 Athena 連接器，以供您自己使用。Athena 在 GitHub.com 上提供了連接器的參考實作，網址為 [https://github.com/awslabs/aws-athena-hive-metastore](https://github.com/awslabs/aws-athena-hive-metastore)。大多數使用案例並不需要修改參考實作。不過，如有必要，您可以修改原始程式碼，並自行建置成品。

參考實作是具有以下模組的 [Apache Maven](https://maven.apache.org/) 專案：
+ `hms-service-api` – 包含 Lambda 函數和 Athena 服務用戶端之間的 API 操作。這些 API 操作定義於 `HiveMetaStoreService` 界面中。因為這是服務合約，所以您不應該變更此模組中的任何內容。
+ `hms-lambda-handler` – 一組預設 Lambda 處理常式，用於處理所有 Hive 中繼存放區 API 呼叫。類別 `MetadataHandler` 是所有 API 呼叫的發送器。您不需要變更此套件。
+ `hms-lambda-func` – 具有下列元件的範例 Lambda 函數。
  + `HiveMetaStoreLambdaFunc` – Lambda 函數擴展 `MetadataHandler` 的範例。
  + `ThriftHiveMetaStoreClient` – 與 Hive 中繼存放區通訊的 Thrift 用戶端。此用戶端是為 Hive 2.3.0 編寫的。如果您使用不同的 Hive 版本，可能需要更新這個類別，以確保回應物件是相容的。
  + `ThriftHiveMetaStoreClientFactory` – 控制 Lambda 函數的行為。例如，您可以透過覆寫 `getHandlerProvider()` 方法來提供自己的一組處理常式提供者。
  + `hms.properties` – 設定 Lambda 函數。大多數情況下只需要更新下列兩個屬性。
    + `hive.metastore.uris` – Hive 中繼存放區的 URI，格式為 `thrift://<host_name>:9083`。
    + `hive.metastore.response.spill.location`：當回應物件的大小超過指定的閾值 (例如 4 MB) 時，儲存回應物件的 Amazon S3 位置。閾值定義於 `hive.metastore.response.spill.threshold` 屬性中。不建議變更預設值。
**注意**  
這兩個屬性可由 [Lambda 環境變數](https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html) `HMS_URIS` 和 `SPILL_LOCATION` 覆寫。當您想要使用具有不同 Hive 中繼存放區或溢出位置的函數時，請使用這些變數，而不要重新編譯 Lambda 函數的來源程式碼。
+ `hms-lambda-layer` – 將 `hms-service-api`、`hms-lambda-handler` 和其依存項目放入 `.zip` 檔案中的 Maven 組合專案。`.zip` 檔案會註冊為 Lambda 層，以供多個 Lambda 函數使用。
+ `hms-lambda-rnp` – 記錄來自 Lambda 函數的回應，然後使用其重播回應。您可以使用此模型來模擬 Lambda 回應以進行測試。

## 自行建置成品
<a name="datastores-hive-reference-implementation-building-the-artifacts-yourself"></a>

修改原始程式碼之後，您可以自行建置成品，然後將它們上傳到 Amazon S3 位置。

在建置成品之前，請先更新 `hms-lambda-func` 模組中 `hive.metastore.response.spill.location` 檔案內的屬性 `hive.metastore.uris` 和 `hms.properties`。

要建置成品，您必須安裝 Apache Maven 並執行命令 `mvn install`。如此會在模組 `hms-lambda-layer` 中名為 `target` 的輸出資料夾中產生層 `.zip` 檔案，以及在 `hms-lambd-func` 模組中產生 Lambda 函數 `.jar` 檔案。

# 管理資料來源
<a name="data-sources-managing"></a>

您可以使用 Athena 主控台的**資料來源和目錄**頁面來管理您建立的資料來源。

**檢視資料來源**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 在導覽窗格中，選擇**資料來源和目錄**。

1. 從資料來源清單中選擇您想要檢視的資料來源的名稱。
**注意**  
**Data source name** (資料來源名稱) 資料欄中的項目對應至 [ListDataCatalogs](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListDataCatalogs.html) API 動作和 [list-data-catalogs](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/list-data-catalogs.html) CLI 命令的輸出。

**編輯資料來源**

1. 在**資料來源和目錄**頁面上，執行下列其中一項動作：
   + 選擇目錄名稱旁邊的按鈕，然後選擇 **Actions** (動作)、**Edit** (編輯)。
   + 選擇資料來源的名稱。然後在詳細資訊頁面上，選擇 **Actions** (動作)、**Edit** (編輯)。

1. 在 **Edit** (編輯) 頁面上，您可以為資料來源選擇不同的 Lambda 函數，變更其描述或新增自訂標籤。如需標籤的詳細資訊，請參閱[標記 Athena 資源](tags.md)。

1. 選擇**儲存**。

1. 如需編輯 **AwsDataCatalog** 資料來源，請選擇 **AwsDataCatalog** 連結以開啟其詳細資訊頁面。然後，在詳細資訊頁面上，選擇您可以編輯目錄的 AWS Glue 主控台連結。

**共用資料來源**  
如需有關共用資料來源的資訊，請造訪下列連結。
+ 如需瞭解非 Hive Lambda 型資料來源，請參閱 [啟用跨帳戶聯合查詢](xacct-fed-query-enable.md)。
+ 如需 AWS Glue Data Catalog，請參閱 [設定 AWS Glue 資料目錄的跨帳戶存取](security-iam-cross-account-glue-catalog-access.md)。

**刪除資料來源**

1. 在**資料來源和目錄**頁面上，執行下列其中一項動作：
   + 選取目錄名稱旁的按鈕，然後選擇 **Actions** (動作)、**Delete** (刪除)。
   + 選擇資料來源的名稱，然後在詳細資訊頁面上，依序選擇 **Actions** (動作)、**Delete** (刪除)。
**注意**  
**AwsDataCatalog** 是帳戶中的預設資料來源且無法刪除。

   當您刪除資料來源時，會收到系統的警告，其對應的資料目錄、資料表和檢視會從查詢編輯器中移除。使用資料來源的已儲存查詢不再於 Athena 中執行。

1. 如需確認刪除，請輸入資料來源的名稱，然後選擇 **Delete** (刪除)。

# 使用 ODBC 和 JDBC 驅動器連接至 Amazon Athena
<a name="athena-bi-tools-jdbc-odbc"></a>

為了使用商業智慧工具探索您的資料並加以和視覺化，請下載、安裝並設定 ODBC (開放資料庫連線) 或 JDBC (Java 資料庫連線) 驅動程式。

**Topics**
+ [使用 JDBC 連接到 Athena](connect-with-jdbc.md)
+ [使用 ODBC 連接到 Athena](connect-with-odbc.md)
+ [搭配使用可信身分傳播與驅動器](using-trusted-identity-propagation.md)

另請參閱下列 AWS 知識中心和 AWS 大數據部落格主題：
+ [使用 JDBC 驅動程式連接至 Athena 時，如何使用 IAM 角色憑證或切換至其他 IAM 角色？](https://aws.amazon.com/premiumsupport/knowledge-center/athena-iam-jdbc-driver/) 
+ [設定 ADFS 與 之間的信任 AWS ，以及使用 Active Directory 登入資料透過 ODBC 驅動程式連線至 Amazon Athena ](https://aws.amazon.com/blogs/big-data/setting-up-trust-between-adfs-and-aws-and-using-active-directory-credentials-to-connect-to-amazon-athena-with-odbc-driver/) 

# 使用 JDBC 連接到 Amazon Athena
<a name="connect-with-jdbc"></a>

Amazon Athena 提供兩個 JDBC 驅動程式：版本 2.x 和 3.x。Athena JDBC 3.x 驅動器是新一代的驅動器，可提供更好的效能和相容性。JDBC 3.x 驅動器支援直接從 Amazon S3 讀取查詢結果，從而可提升應用程式的效能，其中這些應用程式會耗用大量查詢結果。新的驅動器降低了第三方相依性，因此可以更輕鬆地整合 BI 工具與自訂應用程式。在大多數情況下，您可以使用新的驅動器，無需變更現有組態或只需進行最少的變更。
+ 若要下載 JDBC 3.x 驅動程式，請參閱 [Athena JDBC 3.x 驅動程式](jdbc-v3-driver.md)。
+ 若要下載 JDBC 2.x 驅動程式，請參閱 [Athena JDBC 2.x 驅動程式](jdbc-v2.md)。

**Topics**
+ [Athena JDBC 3.x 驅動程式](jdbc-v3-driver.md)
+ [Athena JDBC 2.x 驅動程式](jdbc-v2.md)

# Athena JDBC 3.x 驅動程式
<a name="jdbc-v3-driver"></a>

您可以從許多第三方 SQL 用戶端工具和自訂應用程式使用 Athena ODBC 驅動程式連接至 Amazon Athena。

## 系統要求
<a name="jdbc-v3-driver-system-requirements"></a>
+ Java 8 (或更高版本) 執行期環境
+ 至少 20 MB 的可用磁碟空間

## 考量和限制
<a name="jdbc-v3-driver-considerations-and-limitations"></a>

以下是 Athena JDBC 3.x 驅動程式的一些考量與限制。
+ **記錄日誌** – 3.x 驅動程式使用 [SLF4J](https://www.slf4j.org/manual.html)，這是可在執行期啟用數個記錄日誌系統其中之一的抽象層。
+ **加密** – 搭配使用 Amazon S3 擷取程式與 `CSE_KMS` 加密選項時，Amazon S3 用戶端無法解密存放於 Amazon S3 儲存貯體中的結果。如果您需要 `CSE_KMS` 加密，則可以繼續使用串流擷取程式。已計劃支援搭配使用 `CSE_KMS` 加密與 Amazon S3 擷取程式。

## JDBC 3.x 驅動程式下載
<a name="jdbc-v3-driver-download"></a>

本節包含 JDBC 3.x 驅動程式的下載和授權資訊。

**重要**  
當您使用 JDBC 3.x 驅動程式時，務必注意以下要求：  
**打開連接埠 444** – 將 Athena 用來串流查詢結果的連接埠 444 保持開放給輸出流量。當您使用 PrivateLink 端點連接到 Athena 時，請確定連接至 PrivateLink 端點的安全群組已在連接埠 444 上開放給輸入流量。
**athena:GetQueryResultsStream 政策** – 新增針對使用 JDBC 驅動程式的 IAM 主體的 `athena:GetQueryResultsStream` 政策動作。此政策動作不會直接透過 API 公開。它僅與 ODBC 和 JDBC 驅動程式搭配使用，做為串流結果支援的一部分。如需政策範例，請參閱 [AWS 受管政策：AWSQuicksightAthenaAccess](security-iam-awsmanpol.md#awsquicksightathenaaccess-managed-policy)。

若要下載 Amazon Athena 3.x JDBC 驅動程式，請造訪以下連結。

### JDBC 驅動程式 uber jar
<a name="jdbc-v3-driver-download-uber-jar"></a>

下面的下載將驅動程式及其所有相依性包在同一個 `.jar` 檔案中。此下載通常用於第三方 SQL 用戶端。

[3.7.0 uber jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.7.0/athena-jdbc-3.7.0-with-dependencies.jar)

### JDBC 驅動程式 lean jar
<a name="jdbc-v3-driver-download-lean-jar"></a>

下面的下載是一個 `.zip` 檔案，其中包含驅動程式的 lean `.jar` 和驅動程式相依性的單獨 `.jar` 檔案。此下載通常用於可能具有相依性與驅動程式使用的相依性衝突的自訂應用程式。如果您想選擇要包含在 lean jar 中的驅動程式相依性，以及要排除的驅動程式相依性 (如果您的自訂應用程式已包含一或多個驅動程式相依性)，則此下載非常有用。

[3.7.0 lean jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.7.0/athena-jdbc-3.7.0-lean-jar-and-separate-dependencies-jars.zip)

### 授權
<a name="jdbc-v3-driver-license"></a>

下列連結包含 JDBC 3.x 驅動程式的授權合約。

[授權](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.7.0/LICENSE.txt)

## 可信身分傳播與 JDBC
<a name="jdbc-v3-driver-trusted-identity"></a>

您現在可以透過 AWS Identity and Access Management Identity Center 使用具有單一登入功能的 JDBC 驅動程式連線至 Amazon Athena。當您從 PowerBI、Tableau 或 DBeaver 等工具存取 Athena 時，您的身分和許可會透過 IAM Identity Center 自動傳播到 Athena。如需詳細資訊，請參閱[搭配使用可信身分傳播與 Amazon Athena 驅動器](using-trusted-identity-propagation.md)。

**Topics**
+ [系統要求](#jdbc-v3-driver-system-requirements)
+ [考量和限制](#jdbc-v3-driver-considerations-and-limitations)
+ [JDBC 3.x 驅動程式下載](#jdbc-v3-driver-download)
+ [可信身分傳播與 JDBC](#jdbc-v3-driver-trusted-identity)
+ [JDBC 3.x 驅動器入門](jdbc-v3-driver-getting-started.md)
+ [Amazon Athena JDBC 3.x 連線參數](jdbc-v3-driver-connection-parameters.md)
+ [其他 JDBC 3.x 組態](jdbc-v3-driver-other-configuration.md)
+ [Amazon Athena JDBC 3.x 版本備註](jdbc-v3-driver-release-notes.md)
+ [舊版 Athena JDBC 3.x 驅動器](jdbc-v3-driver-previous-versions.md)

# JDBC 3.x 驅動器入門
<a name="jdbc-v3-driver-getting-started"></a>

使用本節中的資訊，開始使用 Amazon Athena JDBC 3.x 驅動程式。

**Topics**
+ [安裝說明](#jdbc-v3-driver-installation-instructions)
+ [執行驅動程式](#jdbc-v3-driver-running-the-driver)
+ [設定驅動程式](#jdbc-v3-driver-configuring-the-driver)
+ [從 Athena JDBC v2 驅動程式升級](#jdbc-v3-driver-upgrading-from-the-athena-jdbc-v2-driver-to-v3)

## 安裝說明
<a name="jdbc-v3-driver-installation-instructions"></a>

您可以在自訂應用程式或第三方 SQL 用戶端中，使用 JDBC 3.x 驅動程式。

### 在自訂應用程式中
<a name="jdbc-v3-driver-installation-in-a-custom-application"></a>

下載包含驅動程式 jar 及其相依性的 `.zip` 檔案。每個相依性都有自己的 `.jar` 檔案。在自訂應用程式中新增驅動程式 jar 作為相依性。根據您是否已經從另一個來源新增這些相依性至應用程式中，選擇性地新增驅動程式 jar 的相依性。

### 在第三方 SQL 用戶端中
<a name="jdbc-v3-driver-installation-in-a-third-party-sql-client"></a>

下載驅動程式 uber jar 檔案，並依照該用戶端的指示將其新增至第三方 SQL 用戶端。

## 執行驅動程式
<a name="jdbc-v3-driver-running-the-driver"></a>

若要執行驅動程式，您可以使用自訂應用程式或第三方 SQL 用戶端。

### 在自訂應用程式中
<a name="jdbc-v3-driver-running-in-a-custom-application"></a>

使用 JDBC 介面與程式的 JDBC 驅動程式進行互動。下列程式碼顯示了一個自訂 Java 應用程式範例。

```
public static void main(String args[]) throws SQLException {
    Properties connectionParameters = new Properties();
    connectionParameters.setProperty("Workgroup", "primary");
    connectionParameters.setProperty("Region", "us-east-2");
    connectionParameters.setProperty("Catalog", "AwsDataCatalog");
    connectionParameters.setProperty("Database","sampledatabase");
    connectionParameters.setProperty("OutputLocation","s3://amzn-s3-demo-bucket");
    connectionParameters.setProperty("CredentialsProvider","DefaultChain");
    String url = "jdbc:athena://";
    AthenaDriver driver = new AthenaDriver();
    Connection connection = driver.connect(url, connectionParameters);
    Statement statement = connection.createStatement();
    String query = "SELECT * from sample_table LIMIT 10";
    ResultSet resultSet = statement.executeQuery(query);
    printResults(resultSet); // A custom-defined method for iterating over a
                             // result set and printing its contents
}
```

### 在第三方 SQL 用戶端中
<a name="jdbc-v3-driver-running-in-a-third-party-sql-client"></a>

遵循您所使用之 SQL 用戶端的文件。一般而言，您可以使用 SQL 用戶端的圖形化使用者介面來輸入及提交查詢，而查詢結果會顯示在相同的介面中。

## 設定驅動程式
<a name="jdbc-v3-driver-configuring-the-driver"></a>

您可以使用連線參數來設定 Amazon Athena JDBC 驅動程式。如需支援的連線參數，請參閱 [Amazon Athena JDBC 3.x 連線參數](jdbc-v3-driver-connection-parameters.md)。

### 在自訂應用程式中
<a name="jdbc-v3-driver-configuring-in-a-custom-application"></a>

若要在自訂應用程式中設定 JDBC 驅動程式的連線參數，請執行下列其中一個動作：
+ 將參數名稱及其值新增至 `Properties` 物件。當您呼叫 `Connection#connect` 時，將該物件與 URL 一起傳遞。如需範例，請參閱 [執行驅動程式](#jdbc-v3-driver-running-the-driver) 中的 Java 範例應用程式。
+ 在連線字串 (URL) 中，使用下列格式將參數名稱及其值直接新增至通訊協定字首之後。

  ```
  <parameterName>=<parameterValue>;
  ```

  在每個參數名稱/參數值配對的末尾使用分號，分號後不留空格，如下列範例所示。

  ```
  String url = "jdbc:athena://WorkGroup=primary;Region=us-east-1;...;";AthenaDriver driver = new AthenaDriver();Connection connection = driver.connect(url, null);
  ```
**注意**  
如果在連線字串和 `Properties` 物件中同時指定參數，則連線字串中的值優先。不建議在兩個位置指定相同的參數。
+ 將參數值作為引數新增至 `AthenaDataSource` 的方法，如下列範例所示。

  ```
  AthenaDataSource dataSource = new AthenaDataSource();
      dataSource.setWorkGroup("primary");
      dataSource.setRegion("us-east-2");
      ...
      Connection connection = dataSource.getConnection();
      ...
  ```

### 在第三方 SQL 用戶端中
<a name="jdbc-v3-driver-configuring-in-a-third-party-sql-client"></a>

依照您所使用之 SQL 用戶端的指示進行。通常，用戶端會提供圖形化使用者介面來輸入參數名稱及其值。

## 從 Athena JDBC v2 驅動程式升級
<a name="jdbc-v3-driver-upgrading-from-the-athena-jdbc-v2-driver-to-v3"></a>

大多數 JDBC 第 3 版驅動器連線參數都與 JDBC 驅動器第 2 版 (Simba) 回溯相容。這意味著第 2 版連線字串可以與第 3 版驅動程式重複使用。但是，某些連線參數已更改。此處會有這些變更的相關說明。如有必要，當您升級至 JDBC 驅動器第 3 版時，請更新現有的組態。

### 驅動程式類別
<a name="jdbc-v3-driver-upgrading-driver-class"></a>

有些 BI 工具會要求您從 JDBC 驅動程式 `.jar` 檔案提供驅動程式類別。大多數工具都會自動尋找這個類別。第 3 版驅動程式中完全合格的類別名稱為 `com.amazon.athena.jdbc.AthenaDriver`。在第 2 版驅動程式中，該類別為 `com.simba.athena.jdbc.Driver`。

### 連接字串
<a name="jdbc-v3-driver-upgrading-connection-string"></a>

第 3 版驅動器將 `jdbc:athena://` 用於 JDBC 連線字串 URL 開頭的通訊協定。第 3 版驅動器還支援第 2 版通訊協定 `jdbc:awsathena://`，但第 2 版通訊協定已廢除。為了避免出現未定義的行為，如果第 2 版 (或接受以 `jdbc:awsathena://` 為開頭的連線字串的任何其他驅動器) 已向 [DriverManager](https://docs.oracle.com/javase/8/docs/api/java/sql/DriverManager.html) 類別註冊，則第 3 版不接受以 `jdbc:awsathena://` 為開頭的連線字串。

### 憑證提供者
<a name="jdbc-v3-driver-upgrading-credentials-providers"></a>

第 2 版驅動程式會使用完全合格的名稱來辨識不同的憑證提供者 (例如 `com.simba.athena.amazonaws.auth.DefaultAWSCredentialsProviderChain`)。第 3 版驅動程式則使用較短的名稱 (例如 `DefaultChain`)。新名稱會在每個憑證提供者的對應章節中說明。

為第 2 版驅動程式編寫的自訂憑證提供者需要修改第 3 版驅動程式，才能從新的 實作 [AwsCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/AwsCredentialsProvider.html) 介面， 適用於 Java 的 AWS SDK 而不是從先前的 [AWSCredentialsProvider](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/AWSCredentialsProvider.html) 介面 適用於 Java 的 AWS SDK。

JDBC 3.x 驅動器不支援 `PropertiesFileCredentialsProvider`。提供者已在 JDBC 2.x 驅動程式中使用，但屬於舊版的適用於 Java 的 AWS SDK，即將終止支援。若要在 JDBC 3.x 驅動器中實現相同的功能，請改用 [AWS 組態設定檔登入資料](jdbc-v3-driver-aws-configuration-profile-credentials.md) 提供者。

### 日誌層級
<a name="jdbc-v3-driver-upgrading-log-level"></a>

下表顯示 JDBC 第 2 版和第 3 版驅動程式中的 `LogLevel` 參數差異。


****  

| JDBC 驅動程式版本 | 參數名稱 | 參數類型 | 預設值 | 可能的值 | 連線字串範例 | 
| --- | --- | --- | --- | --- | --- | 
|   v2 | LogLevel | 選用 | 0 | 0-6 | LogLevel=6; | 
| v3 | LogLevel | 選用 | TRACE | OFF、ERROR、WARN、INFO、DEBUG、TRACE | LogLevel=INFO; | 

### 查詢 ID 擷取
<a name="jdbc-v3-driver-upgrading-query-id-retrieval"></a>

在第 2 版驅動程式中，您可以將 `Statement` 執行個體取消包裝至 `com.interfaces.core.IStatementQueryInfoProvider`，一個具有兩種方法 `#getPReparedQueryId` 和 `#getQueryId` 的介面。您可以使用這些方法來取得已執行之查詢的查詢執行 ID。

在第 3 版驅動程式中，您可以將 `Statement`、`PreparedStatement` 和 `ResultSet` 執行個體取消包裝至 `com.amazon.athena.jdbc.AthenaResultSet` 介面。該介面有一種方法：`#getQueryExecutionId`。

# Amazon Athena JDBC 3.x 連線參數
<a name="jdbc-v3-driver-connection-parameters"></a>

支援的連線參數在此分為三個區段：[基本連線參數](jdbc-v3-driver-basic-connection-parameters.md)、[進階連線參數](jdbc-v3-driver-advanced-connection-parameters.md) 和 [身分驗證連線參數](jdbc-v3-driver-authentication-connection-parameters.md)。「進階」連線參數和「身分驗證」連線參數區段都有將相關參數群組在一起的子區段。

**Topics**
+ [基本連線參數](jdbc-v3-driver-basic-connection-parameters.md)
+ [進階連線參數](jdbc-v3-driver-advanced-connection-parameters.md)
+ [身分驗證連線參數](jdbc-v3-driver-authentication-connection-parameters.md)

# 基本連線參數
<a name="jdbc-v3-driver-basic-connection-parameters"></a>

下列各節說明 JDBC 3.x 驅動程式的基本連線參數。

## 區域
<a name="jdbc-v3-driver-region"></a>

將執行查詢 AWS 區域 的 。如需區域清單，請參閱 [Amazon Athena 端點和配額](https://docs.aws.amazon.com/general/latest/gr/athena.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 區域 | AwsRegion (已廢除) | 強制性 (但如果未提供，將使用 [DefaultAwsRegionProviderChain](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/regions/providers/DefaultAwsRegionProviderChain.html) 進行搜尋)  | 無 | 

## 目錄
<a name="jdbc-v3-driver-catalog"></a>

包含將透過驅動程式存取的資料庫和資料表的目錄。如需有關目錄的資訊，請參閱 [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 目錄 | 無 | 選用 | AwsDataCatalog | 

## 資料庫
<a name="jdbc-v3-driver-database"></a>

將在其中執行查詢的資料庫。未明確限定資料庫名稱的資料表將解析至此資料庫。如需有關資料庫的資訊，請參閱[資料庫](https://docs.aws.amazon.com/athena/latest/APIReference/API_Database.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 資料庫 | 結構描述 | 選用 | 預設 | 

## 工作群組
<a name="jdbc-v3-driver-workgroup"></a>

將在其中執行查詢的工作群組。如需有關工作群組的資訊，請參閱[工作群組](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroup.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| WorkGroup | 無 | 選用 | 主要 | 

## 輸出位置
<a name="jdbc-v3-driver-output-location"></a>

Amazon S3 中儲存查詢結果的位置。如需有關輸出位置的資訊，請參閱 [ResultConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_ResultConfiguration.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| OutputLocation | S3OutputLocation (已廢除) | 強制性 (除非工作群組指定了輸出位置) | 無 | 

# 進階連線參數
<a name="jdbc-v3-driver-advanced-connection-parameters"></a>

下列各節說明 JDBC 3.x 驅動程式的進階連線參數。

**Topics**
+ [結果加密參數](#jdbc-v3-driver-result-encryption-parameters)
+ [結果擷取參數](#jdbc-v3-driver-result-fetching-parameters)
+ [結果組態參數](#jdbc-v3-driver-result-config)
+ [查詢結果重複使用參數](#jdbc-v3-driver-query-result-reuse-parameters)
+ [查詢執行輪詢參數](#jdbc-v3-driver-query-execution-polling-parameters)
+ [端點覆寫參數](#jdbc-v3-driver-endpoint-override-parameters)
+ [代理組態參數](#jdbc-v3-driver-proxy-configuration-parameters)
+ [記錄日誌參數](#jdbc-v3-driver-logging-parameters)
+ [Application name (應用程式名稱)](#jdbc-v3-driver-application-name)
+ [連線測試](#jdbc-v3-driver-connection-test)
+ [重試次數](#jdbc-v3-driver-number-of-retries)
+ [網路逾時](#jdbc-v3-driver-networktimeoutmillis)

## 結果加密參數
<a name="jdbc-v3-driver-result-encryption-parameters"></a>

請注意以下重點：
+ 金鑰 AWS KMS 必須在 `EncryptionOption`為 `SSE_KMS`或 時指定`CSE_KMS`。
+ `EncryptionOption` 若未指定 或 `EncryptionOption`為 ，則無法指定 AWS KMS 金鑰`SSE_S3`。

### 加密選項
<a name="jdbc-v3-driver-encryption-option"></a>

查詢結果存放在 Amazon S3 時所使用的加密類型。如需有關查詢結果加密的資訊，請參閱《Amazon Athena API 參考》**中的 [EncryptionConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_EncryptionConfiguration.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 可能的值 | 
| --- | --- | --- | --- | --- | 
| EncryptionOption | S3OutputEncOption (已廢除) | 選用 | 無 | SSE\$1S3、SSE\$1KMS、CSE\$1KMS | 

### KMS 金鑰
<a name="jdbc-v3-driver-kms-key"></a>

如果選擇 `SSE_KMS` 或 `CSE_KMS` 做為加密選項，則為 KMS 金鑰 ARN 或 ID。如需詳細資訊，請參閱《Amazon Athena API 參考》**中的 [EncryptionConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_EncryptionConfiguration.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| KmsKey | S3OutputEncKMSKey (已廢除) | 選用 | 無 | 

## 結果擷取參數
<a name="jdbc-v3-driver-result-fetching-parameters"></a>

### 結果擷取程式
<a name="jdbc-v3-driver-result-fetcher"></a>

將用於下載查詢結果的擷取程式。

預設的結果擷取程式 `auto` 會直接從 Amazon S3 下載查詢結果，而無需使用 Athena API。當無法直接下載 S3 時，例如使用 `CSE_KMS` 選項加密查詢結果時，其會自動回退至使用 `GetQueryResultsStream` API。

在大多數情況下，建議使用 `auto` 擷取程式。如果您的 IAM 政策或 S3 儲存貯體政策使用 [s3:CalledVia](security-iam-athena-calledvia.md) 條件來限制存取來自 Athena 的 S3 物件請求，則 `auto` 擷取程式會先嘗試從 S3 下載結果，然後回退至使用 `GetQueryResultsStream` API。在這種情況下，您可以將 ResultFetcher 設定為 `GetQueryResultsStream`，以避免額外的 API 呼叫。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 可能的值 | 
| --- | --- | --- | --- | --- | 
| ResultFetcher | 無 | 選用 | auto | auto、S3、GetQueryResults、GetQueryResultsStream | 

### 擷取大小
<a name="jdbc-v3-driver-fetch-size"></a>

這個參數的值用做內部緩衝區的最小值，以及擷取結果時的目標頁面大小。值 0 (零) 表示驅動程式應使用其預設值，如下所述。最大值為 1,000,000。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| FetchSize | RowsToFetchPerBlock (已廢除) | 選用 | 0 | 
+ `GetQueryResults` 擷取程式一律會使用 1,000 的頁面大小，這是 API 呼叫所支援的最大值。當擷取大小大於 1,000 時，會進行多次連續的 API 呼叫，以填滿高於最小值的緩衝區。
+ `GetQueryResultsStream` 擷取程式會使用設定的擷取大小做為頁面大小，或依預設使用 10,000。
+ `S3` 擷取程式會使用設定的擷取大小做為頁面大小，或依預設使用 10,000。

## 結果組態參數
<a name="jdbc-v3-driver-result-config"></a>

### Expected bucket owner (預期的儲存貯體擁有者)
<a name="jdbc-v3-driver-exp-bucket-owner"></a>

預期的 S3 儲存貯體擁有者的帳戶 ID。如果您提供的帳戶 ID 與儲存貯體的實際擁有者不相符，則請求會失敗。如需有關驗證 s3 儲存貯體擁有者的詳細資訊，請參閱[驗證儲存貯體擁有權](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-owner-condition.html#bucket-owner-condition-use)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ExpectedBucketOwner | 無 | 選用 | 無 | 

### Acl 選項
<a name="jdbc-v3-driver-acl"></a>

指出 Amazon S3 標準 ACL 應設定為控制儲存查詢結果的擁有權。如需有關 `AclOption` 的詳細資訊，請參閱 [AclConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_AclConfiguration.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 可能的值 | 
| --- | --- | --- | --- | --- | 
| AclOption | 無 | 選用 | 無 | BUCKET\$1OWNER\$1FULL\$1CONTROL | 

## 查詢結果重複使用參數
<a name="jdbc-v3-driver-query-result-reuse-parameters"></a>

### 啟用結果重複使用
<a name="jdbc-v3-driver-enable-result-reuse"></a>

指定執行查詢時是否可以重複使用同一查詢之前的結果。如需有關查詢結果重複使用的資訊，請參閱 [ResultReuseByAgeConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_ResultReuseByAgeConfiguration.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| EnableResultReuseByAge | 無 | 選用 | FALSE | 

### 結果重複使用最長期限
<a name="jdbc-v3-driver-result-reuse-max-age"></a>

Athena 應考慮重複使用的之前查詢結果的最長期限 (以分鐘為單位)。如需有關結果重複使用最長期限的資訊，請參閱 [ResultReuseByAgeConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_ResultReuseByAgeConfiguration.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| MaxResultReuseAgeInMinutes | 無 | 選用 | 60 | 

## 查詢執行輪詢參數
<a name="jdbc-v3-driver-query-execution-polling-parameters"></a>

### 最小查詢執行輪詢間隔
<a name="jdbc-v3-driver-minimum-query-execution-polling-interval"></a>

輪詢 Athena 的查詢執行狀態之前要等待的最短時間 (以毫秒為單位)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| MinQueryExecutionPollingIntervalMillis | MinQueryExecutionPollingInterval (已廢除) | 選用 | 100 | 

### 最大查詢執行輪詢間隔
<a name="jdbc-v3-driver-maximum-query-execution-polling-interval"></a>

輪詢 Athena 的查詢執行狀態之前要等待的最長時間 (以毫秒為單位)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| MaxQueryExecutionPollingIntervalMillis | MaxQueryExecutionPollingInterval (已廢除) | 選用 | 5000 | 

### 查詢執行輪詢間隔倍數
<a name="jdbc-v3-driver-query-execution-polling-interval-multiplier"></a>

增加輪詢期間的因數。依預設，輪詢會以 `MinQueryExecutionPollingIntervalMillis` 的值開始，並且每次輪詢都會加倍，直至達到 `MaxQueryExecutionPollingIntervalMillis` 的值為止。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| QueryExecutionPollingIntervalMultiplier | 無 | 選用 | 2 | 

## 端點覆寫參數
<a name="jdbc-v3-driver-endpoint-override-parameters"></a>

### Athena 端點覆寫
<a name="jdbc-v3-driver-athena-endpoint-override"></a>

驅動程式將用來對 Athena 進行 API 呼叫的端點。

請注意以下重點：
+ 如果提供的 URL 中未指定 `https://` 或 `http://` 通訊協定，則驅動程式會插入 `https://` 字首。
+ 若沒有指定此參數，則驅動程式會使用預設端點。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| AthenaEndpoint | EndpointOverride (已廢除) | 選用 | 無 | 

### Athena 串流服務端點覆寫
<a name="jdbc-v3-driver-athena-streaming-service-endpoint-override"></a>

當驅動程式使用 Athena 串流服務時，將用來下載查詢結果的端點。Athena 串流服務可在連接埠 444 上使用。

請注意以下重點：
+ 如果提供的 URL 中未指定 `https://` 或 `http://` 通訊協定，則驅動程式會插入 `https://` 字首。
+ 如果未在提供的 URL 中指定連接埠，則驅動程式會插入串流服務連接埠 444。
+ 如果未指定 `AthenaStreamingEndpoint` 參數，驅動程式會使用 `AthenaEndpoint` 覆寫。如果 `AthenaStreamingEndpoint` 或 `AthenaEndpoint` 覆寫均未指定，則驅動程式會使用預設的串流端點。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| AthenaStreamingEndpoint | StreamingEndpointOverride (已廢除) | 選用 | 無 | 

### LakeFormation 端點覆寫
<a name="jdbc-v3-driver-athena-lake-formation-endpoint-override"></a>

驅動程式使用 AWS Lake Formation [AssumeDecoratedRoleWithSAML](https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_AssumeDecoratedRoleWithSAML.html) API 擷取臨時憑證時，將用於 Lake Formation 服務的端點。若沒有指定此參數，則驅動程式會使用預設的 Lake Formation 端點。

請注意以下重點：
+ 如果提供的 URL 中未指定 `https://` 或 `http://` 通訊協定，則驅動程式會插入 `https://` 字首。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| LakeFormationEndpoint |  LfEndpointOverride (已廢除)  | 選用 | 無 | 

### S3 端點覆寫
<a name="jdbc-v3-driver-athena-s3-endpoint-override"></a>

當驅動程式使用 Amazon S3 擷取程式時，將用來下載查詢結果的端點。若沒有指定此參數，則驅動程式會使用預設的 Amazon S3 端點。

請注意以下重點：
+ 如果提供的 URL 中未指定 `https://` 或 `http://` 通訊協定，則驅動程式會插入 `https://` 字首。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| S3Endpoint | 無 | 選用 | 無 | 

### STS 端點覆寫
<a name="jdbc-v3-driver-athena-sts-endpoint-override"></a>

使用 AWS STS [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 擷取臨時憑證時，驅動程式將用於 AWS STS 服務的端點。如果未指定此參數，驅動程式會使用預設 AWS STS 端點。

請注意以下重點：
+ 如果提供的 URL 中未指定 `https://` 或 `http://` 通訊協定，則驅動程式會插入 `https://` 字首。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| StsEndpoint | StsEndpointOverride (已廢除) | 選用 | 無 | 

### SSO OIDC 端點覆寫
<a name="jdbc-v3-driver-athena-sso-oidc-endpoint-override"></a>

使用 `ClientConfiguration.endpointOverride` 覆寫 SSO OIDC 用戶端的預設 HTTP 端點時，驅動器將使用的端點。如需詳細資訊，請參閱 [ClientConfiguration](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| SSOOIDCEndpointOverride |  | 選用 | 無 | 

### SSO 管理員端點覆寫
<a name="jdbc-v3-driver-athena-sso-admin-endpoint-override"></a>

使用 `ClientConfiguration.endpointOverride` 覆寫 SSO 管理員用戶端的預設 HTTP 端點時，驅動器將使用的端點。如需詳細資訊，請參閱 [ClientConfiguration](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| SSOAdminEndpointOverride |  | 選用 | 無 | 

## 代理組態參數
<a name="jdbc-v3-driver-proxy-configuration-parameters"></a>

### 代理主機
<a name="jdbc-v3-driver-proxy-host"></a>

代理主機的 URL。如果您需要 Athena 請求透過代理傳送，請使用此參數。

**注意**  
 確定在 `ProxyHost` 的 URL 開頭包含通訊協定 `https://` 或 `http://`。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ProxyHost | 無 | 選用 | 無 | 

### 代理連接埠
<a name="jdbc-v3-driver-proxy-port"></a>

要在代理主機上使用的連接埠。如果您需要 Athena 請求透過代理傳送，請使用此參數。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ProxyPort | 無 | 選用 | 無 | 

### 代理使用者名稱
<a name="jdbc-v3-driver-proxy-username"></a>

在代理伺服器上進行身分驗證的使用者名稱。如果您需要 Athena 請求透過代理傳送，請使用此參數。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ProxyUsername | ProxyUID (已廢除) | 選用 | 無 | 

### 代理密碼
<a name="jdbc-v3-driver-proxy-password"></a>

在代理伺服器上進行身分驗證的密碼。如果您需要 Athena 請求透過代理傳送，請使用此參數。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ProxyPassword | ProxyPWD (已廢除) | 選用 | 無 | 

### 免除代理的主機
<a name="jdbc-v3-driver-proxy-exempt-hosts"></a>

啟用代理後 (也就是設定 `ProxyHost` 和 `ProxyPort` 連線參數後)，驅動程式在不使用代理的情況下連線到的一組主機名稱。主機應以縱線 (`|`) 字元分隔 (例如，`host1.com|host2.com`)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ProxyExemptHosts | NonProxyHosts | 選用 | 無 | 

### 為身分提供者啟用代理
<a name="jdbc-v3-driver-proxy-enabled-for-identity-providers"></a>

指定當驅動程式連線至身分提供者時，是否應使用代理。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ProxyEnabledForIdP | UseProxyForIdP | 選用 | FALSE | 

## 記錄日誌參數
<a name="jdbc-v3-driver-logging-parameters"></a>

本節說明與記錄日誌相關的參數。

### 日誌層級
<a name="jdbc-v3-driver-logging-parameters-log-level"></a>

指定驅動程式記錄日誌的層級。除非還設定了 `LogPath` 參數，否則不會記錄任何內容。

**注意**  
除非您有特殊需求，否則建議您僅設定 `LogPath` 參數。僅設定 `LogPath` 參數會啟用記錄日誌，並使用預設的 `TRACE` 日誌層級。`TRACE` 日誌層級會提供最詳細的記錄。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 可能的值 | 
| --- | --- | --- | --- | --- | 
| LogLevel | 無 | 選用 | TRACE | OFF、ERROR、WARN、INFO、DEBUG、TRACE | 

### 日誌路徑
<a name="jdbc-v3-driver-logging-parameters-log-path"></a>

執行驅動程式的電腦上儲存驅動程式日誌的目錄路徑。將在指定的目錄中建立具有唯一名稱的日誌檔。如果設定，則啟用驅動程式記錄日誌。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| LogPath | 無 | 選用 | 無 | 

## Application name (應用程式名稱)
<a name="jdbc-v3-driver-application-name"></a>

使用驅動程式的應用程式的名稱。如果指定此參數的值，則該值會包含在驅動程式對 Athena 進行之 API 呼叫的使用者代理字串中。

**注意**  
您也可以透過呼叫 `setApplicationName` 物件上的 `DataSource` 來設定應用程式名稱。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ApplicationName | 無 | 選用 | 無 | 

## 連線測試
<a name="jdbc-v3-driver-connection-test"></a>

如果設定為 `TRUE`，則即使未在連線上執行查詢，驅動程式也會在每次建立 JDBC 連線時進行連線測試。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ConnectionTest | 無 | 選用 | TRUE | 

**注意**  
連線測試會將 `SELECT 1` 查詢提交至 Athena，以確認連線設定正確。這表示兩個檔案將儲存在 Amazon S3 中 (結果集和中繼資料)，而且可能會根據 [Amazon Athena 定價](https://aws.amazon.com/athena/pricing)政策收取額外費用。

## 重試次數
<a name="jdbc-v3-driver-number-of-retries"></a>

驅動程式將可重試請求重新傳送至 Athena 的次數上限。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| NumRetries | MaxErrorRetry (已廢除) | 選用 | 無 | 

## 網路逾時
<a name="jdbc-v3-driver-networktimeoutmillis"></a>

網路逾時可控制驅動器等待建立網路連線的時間量。這包括傳送 API 請求所需的時間。在極少數情況下，變更網路逾時可能會非常實用。例如，您可能想要增加長時間垃圾回收暫停的逾時。設定此連線參數等同於在 `Connection` 物件上使用 `setNetworkTimeout` 方法。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
|  NetworkTimeoutMillis  | 無 | 選用 | 無 | 

# 身分驗證連線參數
<a name="jdbc-v3-driver-authentication-connection-parameters"></a>

Athena JDBC 3.x 驅動程式支援多種身分驗證方法。所需的連線參數視您使用的身分驗證方法而定。

**Topics**
+ [IAM](jdbc-v3-driver-iam-credentials.md)
+ [預設](jdbc-v3-driver-default-credentials.md)
+ [AWS 組態設定檔](jdbc-v3-driver-aws-configuration-profile-credentials.md)
+ [執行個體設定檔](jdbc-v3-driver-instance-profile-credentials.md)
+ [Custom](jdbc-v3-driver-custom-credentials.md)
+ [JWT](jdbc-v3-driver-jwt-credentials.md)
+ [JWT 可信身分傳播](jdbc-v3-driver-jwt-tip-credentials.md)
+ [瀏覽器信任的身分傳播](jdbc-v3-driver-browser-oidc-tip-credentials.md)
+ [Azure AD](jdbc-v3-driver-azure-ad-credentials.md)
+ [Okta](jdbc-v3-driver-okta-credentials.md)
+ [Ping](jdbc-v3-driver-ping-credentials.md)
+ [AD FS](jdbc-v3-driver-adfs-credentials.md)
+ [瀏覽器 Azure AD](jdbc-v3-driver-browser-azure-ad-credentials.md)
+ [瀏覽器 SAML](jdbc-v3-driver-browser-saml-credentials.md)
+ [DataZone IdC](jdbc-v3-driver-datazone-idc.md)
+ [DataZone IAM](jdbc-v3-driver-datazone-iamcp.md)

# IAM 憑證
<a name="jdbc-v3-driver-iam-credentials"></a>

您可以將 IAM 憑證與 JDBC 驅動程式配合使用，透過設定以下連線參數連線至 Amazon Athena。

## 使用者
<a name="jdbc-v3-driver-user"></a>

您的 AWS 存取金鑰 ID。如需有關存取金鑰的資訊，請參閱**《IAM 使用者指南》中的 [AWS 安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 使用者 | AccessKeyId | 必要 | 無 | 

## 密碼
<a name="jdbc-v3-driver-password"></a>

您的 AWS 私密金鑰 ID。如需有關存取金鑰的資訊，請參閱**《IAM 使用者指南》中的 [AWS 安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 密碼 | SecretAccessKey | 選用 | 無 | 

## 工作階段字符
<a name="jdbc-v3-driver-session-token"></a>

如果您使用臨時 AWS 登入資料，則必須指定工作階段字符。如需有關暫時憑證的資訊，請參閱《*IAM 使用者指南*》中的 [IAM 中的暫時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| SessionToken | 無 | 選用 | 無 | 

# 預設憑證
<a name="jdbc-v3-driver-default-credentials"></a>

您可以使用在用戶端系統上設定的預設憑證，透過設定以下連線參數連線至 Amazon Athena。如需有關使用預設憑證的資訊，請參閱《*適用於 Java 的 AWS SDK 開發人員指南*》中的[使用預設憑證提供者鏈結](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default)。

## 憑證提供者
<a name="jdbc-v3-driver-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設為 `DefaultChain`。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | DefaultChain | 

# AWS 組態設定檔登入資料
<a name="jdbc-v3-driver-aws-configuration-profile-credentials"></a>

您可以透過設定下列連線參數來使用存放在 AWS 組態設定檔中的登入資料。 AWS 組態設定檔通常存放在 `~/.aws`目錄中的檔案中）。如需 AWS 組態設定檔的相關資訊，請參閱**《適用於 Java 的 AWS SDK 開發人員指南》中的[使用設定檔](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials-profiles.html)。

## 憑證提供者
<a name="jdbc-v3-driver-aws-configuration-profile-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設為 `ProfileCredentials`。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | ProfileCredentials | 

## Profile name (設定檔名稱)
<a name="jdbc-v3-driver-profile-name"></a>

 AWS 組態設定檔的名稱，其登入資料應該用來驗證對 Athena 的請求。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ProfileName | 無 | 必要 | 無 | 

**注意**  
設定檔名稱也可以指定為 `CredentialsProviderArguments` 參數的值，雖然此用法已廢除。

# 執行個體設定檔憑證
<a name="jdbc-v3-driver-instance-profile-credentials"></a>

此身分驗證類型在 Amazon EC2 執行個體上使用。*執行個體設定檔*是連接至 Amazon EC2 執行個體的設定檔。使用執行個體描述檔登入資料提供者將 AWS 登入資料的管理委派給 Amazon EC2 執行個體中繼資料服務。如此一來，開發人員就無需在 Amazon EC2 執行個體上永久儲存憑證，也不用擔心輪換或管理臨時憑證。

## 憑證提供者
<a name="jdbc-v3-driver-instance-profile-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設為 `InstanceProfile`。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | InstanceProfile | 

# 自訂憑證
<a name="jdbc-v3-driver-custom-credentials"></a>

您可以使用此身分驗證類型，藉由使用實作 [AwsCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/AwsCredentialsProvider.html) 介面的 Java 類別來提供您自己的憑證。

## 憑證提供者
<a name="jdbc-v3-driver-custom-credentials-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設定為實作 [AwsCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/AwsCredentialsProvider.html) 介面之自訂類別的完全合格類別名稱。在執行期，該類別必須位於使用 JDBC 驅動程式之應用程式的 Java 類別路徑上。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | AwsCredentialsProvider 自訂實作的完全合格類別名稱 | 

## 憑證提供者引數
<a name="jdbc-v3-driver-credentials-provider-arguments"></a>

自訂認證提供者建構函數的逗號分隔字串引數清單。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| CredentialsProviderArguments | AwsCredentialsProviderArguments (已廢除) | 選用 | 無 | 

# JWT 憑證
<a name="jdbc-v3-driver-jwt-credentials"></a>

藉由此身分驗證類型，您可以使用從外部身分提供者獲得的 JSON Web Token (JWT) 作為連線參數，向 Athena 進行身分驗證。外部登入資料提供者必須已經與 聯合 AWS。

## 憑證提供者
<a name="jdbc-v3-driver-jwt-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設為 `JWT`。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | JWT | 

## JWT web 身分權杖
<a name="jdbc-v3-driver-jwt-web-identity-token"></a>

從外部聯合身分提供者獲得的 JWT 權杖。此權杖將用於向 Athena 進行身分驗證。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| JwtWebIdentityToken | web\$1identity\$1token (已廢除) | 必要 | 無 | 

## JWT 角色 ARN
<a name="jdbc-v3-driver-jwt-role-arn"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如需有關擔任角色的資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| JwtRoleArn | role\$1arn (已廢除) | 必要 | 無 | 

## JWT 角色工作階段名稱
<a name="jdbc-v3-driver-jwt-role-session-name"></a>

使用 JWT 憑證進行身分驗證時的工作階段名稱。該名稱可以是您選擇的任何名稱。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| JwtRoleSessionName | role\$1session\$1name (已廢除) | 必要 | 無 | 

## 角色工作階段持續時間
<a name="jdbc-v3-driver-jwt-role-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需詳細資訊，請參閱《AWS Security Token Service API 參考**》中的 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| RoleSessionDuration | Duration (已廢除) | 選用 | 3600 | 

# JWT 與身分中心整合
<a name="jdbc-v3-driver-jwt-tip-credentials"></a>

此身分驗證類型允許您使用從外部身分提供者獲得的 JSON Web Token (JWT) 作為連線參數，向 Athena 進行身分驗證。您可以使用此外掛程式，透過可信身分傳播啟用對企業身分的支援。如需有關如何搭配使用可信身分傳播與驅動器的詳細資訊，請參閱 [搭配使用可信身分傳播與 Amazon Athena 驅動器](using-trusted-identity-propagation.md)。您也可以[使用 CloudFormation 設定和部署資源](using-trusted-identity-propagation-cloudformation.md)。

透過信任的身分傳播，身分內容會新增至 IAM 角色，以識別請求存取 AWS 資源的使用者。如需有關啟用和使用可信身分傳播的資訊，請參閱[什麼是可信身分傳播？](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation.html)。

## 憑證提供者
<a name="jdbc-v3-driver-jwt-tip-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設為 `JWT_TIP`。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | JWT\$1TIP | 

## JWT web 身分權杖
<a name="jdbc-v3-driver-jwt-tip-web-identity-token"></a>

從外部聯合身分提供者獲得的 JWT 權杖。此權杖將用於向 Athena 進行身分驗證。權杖快取預設為啟用，並允許在不同的驅動器連線之間使用相同的 Identity Center 存取權杖。建議在「測試連線」時提供新的 JWT 權杖，因為交換的權杖僅在驅動器執行個體處於作用中狀態時才會存在。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| JwtWebIdentityToken | web\$1identity\$1token (已廢除) | 必要 | 無 | 

## WorkgroupArn
<a name="jdbc-v3-driver-jwt-tip-workgroup-arn"></a>

Amazon Athena 工作群組的 Amazon Resource Name (ARN)。如需有關工作群組的詳細資訊，請參閱[工作群組](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroup.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| WorkGroupArn | 無 | 必要 | 主要 | 

## JWT 應用程式角色 ARN
<a name="jdbc-v3-driver-jwt-tip-application-role-arn"></a>

要擔任的角色 ARN。此角色可用於 JWT 交換、透過工作群組標籤取得 IAM Identity Center 客戶自管應用程式 ARN，以及取得存取角色 ARN。如需有關擔任角色的詳細資訊，請參閱 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ApplicationRoleArn | 無 | 必要 | 無 | 

## JWT 角色工作階段名稱
<a name="jdbc-v3-driver-jwt-tip-role-session-name"></a>

使用 JWT 憑證進行身分驗證時的工作階段名稱。其可以是您選擇的任何名稱。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| JwtRoleSessionName | role\$1session\$1name (已廢除) | 必要 | 無 | 

## 角色工作階段持續時間
<a name="jdbc-v3-driver-jwt-tip-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需詳細資訊，請參閱 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| RoleSessionDuration | Duration (已廢除) | 選用 | 3600 | 

## JWT 存取角色 ARN
<a name="jdbc-v3-driver-jwt-tip-access-role-arn"></a>

要擔任的角色 ARN。這是 Athena 服務所擔任的角色，可代表您進行呼叫。如需有關擔任角色的詳細資訊，請參閱《AWS Security Token Service API 參考**》中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| AccessRoleArn | 無 | 選用 | 無 | 

## IAM Identity Center 客戶自管應用程式 ARN
<a name="jdbc-v3-driver-jwt-tip-customer-idc-application-arn"></a>

IAM Identity Center 客戶自管應用程式的 ARN。如需詳細資訊，請參閱[客戶自管應用程式](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| CustomerIdcApplicationArn | 無 | 選用 | 無 | 

# 以身分中心整合為基礎的瀏覽器
<a name="jdbc-v3-driver-browser-oidc-tip-credentials"></a>

此身分驗證類型可讓您從外部身分提供者擷取新的 JSON Web 字符 (JWT)，並使用 Athena 進行身分驗證。您可以使用此外掛程式，透過可信身分傳播啟用對企業身分的支援。如需有關如何搭配使用可信身分傳播與驅動器的詳細資訊，請參閱 [搭配使用可信身分傳播與 Amazon Athena 驅動器](using-trusted-identity-propagation.md)。您也可以[使用 CloudFormation 設定和部署資源](using-trusted-identity-propagation-cloudformation.md)。

透過信任的身分傳播，身分內容會新增至 IAM 角色，以識別請求存取 AWS 資源的使用者。如需有關啟用和使用可信身分傳播的資訊，請參閱[什麼是可信身分傳播？](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation.html)。

**注意**  
外掛程式專為單一使用者桌面環境而設計。在 Windows Server 等共用環境中，系統管理員負責建立和維護使用者之間的安全界限。

## 憑證提供者
<a name="jdbc-v3-driver-browser-oidc-tip-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設為 `BrowserOidcTip`。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | BrowserOidcTip | 

## Idp 已知組態 URL
<a name="jdbc-v3-driver-browser-oidc-tip-idp-well-known-config"></a>

IDP Well Known 組態 URL 是為您的身分提供者提供 OpenID Connect 組態詳細資訊的端點。此 URL 通常會以 結尾，`.well-known/openid-configuration`並包含有關身分驗證端點、支援的功能和字符簽署金鑰的基本中繼資料。例如，如果您使用的是 *Okta*，URL 可能看起來像 `https://your-domain.okta.com/.well-known/openid-configuration`。

針對疑難排解：如果您收到連線錯誤，請確認此 URL 可從您的網路存取，並傳回有效的 *OpenID Connect* 組態 JSON。此 URL 必須由安裝驅動程式的用戶端連線，且應由您的身分提供者管理員提供。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| IdpWellKnownConfigurationUrl | 無 | 必要 | 無 | 

## 用戶端識別符
<a name="jdbc-v3-driver-browser-oidc-tip-client-id"></a>

OpenID Connect 提供者向應用程式發出的用戶端識別符。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| OidcClientId | 無 | 必要 | 無 | 

## WorkgroupArn
<a name="jdbc-v3-driver-browser-oidc-tip-workgroup-arn"></a>

Amazon Athena 工作群組的 Amazon Resource Name (ARN)，其中包含信任的身分傳播組態標籤。如需有關工作群組的詳細資訊，請參閱[工作群組](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroup.html)。

**注意**  
此參數與指定查詢執行位置的 `Workgroup` 參數不同。您必須設定這兩個參數：  
`WorkgroupArn` - 指向工作群組，其中包含信任的身分傳播組態標籤
`Workgroup` - 指定執行查詢的工作群組
雖然這些參數通常會參考相同的工作群組，但必須明確設定這兩個參數才能正常運作。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| WorkGroupArn | 無 | 必要 | 主要 | 

## JWT 應用程式角色 ARN
<a name="jdbc-v3-driver-browser-oidc-tip-application-role-arn"></a>

將在 JWT 交換中擔任的角色 ARN。此角色可用於 JWT 交換、透過工作群組標籤取得 IAM Identity Center 客戶自管應用程式 ARN，以及取得存取角色 ARN。如需有關擔任角色的詳細資訊，請參閱 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ApplicationRoleArn | 無 | 必要 | 無 | 

## JWT 角色工作階段名稱
<a name="jdbc-v3-driver-browser-oidc-tip-role-session-name"></a>

IAM 工作階段的名稱。名稱可隨意指定，但是一般來說，您會傳遞與應用程式使用者相關聯的名稱或識別碼。這樣一來，應用程式使用的臨時安全憑證會與該使用者相關聯。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| JwtRoleSessionName | role\$1session\$1name (已廢除) | 必要 | 無 | 

## Client secret (用戶端密碼)
<a name="jdbc-v3-driver-browser-oidc-tip-client-secret"></a>

clientSecret 是由您的身分提供者發行的機密金鑰，用於驗證您的應用程式 （用戶端）。雖然此參數是選用的，而且可能不是所有身分驗證流程的必要項目，但在使用時提供額外的安全層。如果您的 IDP 組態需要用戶端秘密，您必須將此參數包含身分提供者管理員提供的值。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| OidcClientSecret | 無 | 選用 | 無 | 

## Scope (範圍)
<a name="jdbc-v3-driver-browser-oidc-tip-scope"></a>

範圍會指定應用程式向身分提供者請求的存取層級。您必須在 `openid` 範圍內包含 ，才能接收包含基本使用者身分宣告的 ID 字符。您的範圍可能需要包含其他許可，例如 `email`或 `profile`，取決於哪些使用者宣告您的身分提供者 （例如 *Microsoft Entra ID*) 已設定為包含在 ID 字符中。這些宣告對於適當的*受信任身分傳播*映射至關重要。如果使用者身分映射失敗，請確認您的範圍包含所有必要的許可，且您的身分提供者已設定為在 ID 字符中包含必要的宣告。這些宣告必須符合 IAM Identity Center 中的*受信任權杖發行者*映射組態。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| Scope (範圍) | 無 | 選用 | openid email offline\$1access | 

## 角色工作階段持續時間
<a name="jdbc-v3-driver-browser-oidc-tip-role-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需詳細資訊，請參閱 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| RoleSessionDuration | Duration (已廢除) | 選用 | 3600 | 

## JWT 存取角色 ARN
<a name="jdbc-v3-driver-browser-oidc-tip-access-role-arn"></a>

Athena 代您呼叫所擔任角色的 ARN。如需有關擔任角色的詳細資訊，請參閱《AWS Security Token Service API 參考**》中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| AccessRoleArn | 無 | 選用 | 無 | 

## IAM Identity Center 客戶自管應用程式 ARN
<a name="jdbc-v3-driver-browser-oidc-tip-customer-idc-application-arn"></a>

IAM Identity Center 客戶自管應用程式的 ARN。如需詳細資訊，請參閱[客戶自管應用程式](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| CustomerIdcApplicationArn | 無 | 選用 | 無 | 

## 身分提供者連接埠號碼
<a name="jdbc-v3-driver-browser-oidc-tip-idp-port-number"></a>

用於 OAuth 2.0 回呼伺服器的本機連接埠號碼。這用作 redirect\$1uri，您需要允許在 IDP 應用程式中將其列出。預設產生的 redirect\$1uri 為：http：//localhost：7890/athena

**警告**  
在共用環境中，例如 Windows Terminal Server 或遠端桌面服務，循環連接埠 （預設值：7890) 會在相同機器上的所有使用者之間共用。系統管理員可以透過下列方式降低潛在的連接埠劫持風險：  
為不同的使用者群組設定不同的連接埠號碼
使用 Windows 安全政策來限制連接埠存取
在使用者工作階段之間實作網路隔離
如果無法實作這些安全控制，建議您改用 [JWT 信任的身分傳播](jdbc-v3-driver-jwt-tip-credentials.md)外掛程式，這不需要迴路連接埠。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| IdpPortNumber | 無 | 選用 | 7890 | 

## 識別提供者回應逾時
<a name="jdbc-v3-driver-browser-oidc-tip-idp-response-timeout"></a>

等待 OAuth 2.0 回呼回應的逾時，以秒為單位。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| IdpResponseTimeout | 無 | 選用 | 120 | 

## 啟用權杖快取
<a name="jdbc-v3-driver-browser-oidc-tip-enable-token-caching"></a>

EnableTokenCaching 參數會判斷驅動程式是否在連接之間快取身分驗證字符。將 EnableTokenCaching 設為 true 可減少身分驗證提示並改善使用者體驗，但應謹慎使用。此設定最適合單一使用者桌面環境。在 Windows Server 等共用環境中，建議將其停用，以防止具有類似連線字串的使用者之間進行潛在的字符共用。

對於使用 Tableau Server 等工具的企業部署，我們建議您使用 [JWT 信任的身分傳播](jdbc-v3-driver-jwt-tip-credentials.md)外掛程式，而不是此身分驗證方法。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| EnableTokenCaching | 無 | 選用 | FALSE | 

# Azure AD 憑證
<a name="jdbc-v3-driver-azure-ad-credentials"></a>

SAML 型身分驗證機制，可讓您使用 Azure AD 身分提供者向 Athena 進行身分驗證。此方法假設已經在 Athena 和 Azure AD 之間建立了聯合。

**注意**  
本節中的某些參數名稱具有別名。別名是參數名稱的功能對等項目，並已提供與 JDBC 2.x 驅動程式的向後相容性。由於參數名稱已經過改進，以遵循更清晰、更一致的命名慣例，因此我們建議您使用參數名稱，而不是已被取代的別名。

## 憑證提供者
<a name="jdbc-v3-driver-azure-ad-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設為 `AzureAD`。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | AzureAD | 

## 使用者
<a name="jdbc-v3-driver-azure-ad-user"></a>

Azure AD 使用者的電子郵件地址，用來透過 Azure AD 進行身分驗證。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 使用者 | UID (已廢除) | 必要 | 無 | 

## 密碼
<a name="jdbc-v3-driver-azure-ad-password"></a>

Azure AD 使用者的密碼。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 密碼 | PWD (已廢除) | 必要 | 無 | 

## Azure AD 租用戶 ID
<a name="jdbc-v3-driver-azure-ad-tenant-id"></a>

Azure AD 應用程式的租用戶 ID。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| AzureAdTenantId | tenant\$1id (已廢除) | 必要 | 無 | 

## Azure AD 用戶端 ID
<a name="jdbc-v3-driver-azure-ad-client-id"></a>

Azure AD 應用程式的用戶端 ID。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| AzureAdClientId | client\$1id (已廢除) | 必要 | 無 | 

## Azure AD 用戶端秘密
<a name="jdbc-v3-driver-azure-ad-client-secret"></a>

Azure AD 應用程式的用戶端秘密。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| AzureAdClientSecret | client\$1secret (已廢除) | 必要 | 無 | 

## 偏好的角色
<a name="jdbc-v3-driver-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如需有關 ARN 角色的資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| PreferredRole | preferred\$1role (已廢除) | 選用 | 無 | 

## 角色工作階段持續時間
<a name="jdbc-v3-driver-role-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| RoleSessionDuration | Duration (已廢除) | 選用 | 3600 | 

## Lake Formation 啟用
<a name="jdbc-v3-driver-lake-formation-enabled"></a>

指定是否使用 [AssumeDecoratedRoleWithSAML](https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_AssumeDecoratedRoleWithSAML.html) Lake Formation API 動作來擷取臨時 IAM 憑證，而非 [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) AWS STS API 動作。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| LakeFormationEnabled | 無 | 選用 | FALSE | 

# Okta 憑證
<a name="jdbc-v3-driver-okta-credentials"></a>

SAML 型身分驗證機制，可讓您使用 Okta 身分提供者向 Athena 進行身分驗證。此方法假設已經在 Athena 和 Okta 之間設定了聯合。

## 憑證提供者
<a name="jdbc-v3-driver-okta-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設為 `Okta`。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | Okta | 

## 使用者
<a name="jdbc-v3-driver-okta-user"></a>

Okta 使用者的電子郵件地址，用來透過 Okta 進行身分驗證。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 使用者 | UID (已廢除) | 必要 | 無 | 

## 密碼
<a name="jdbc-v3-driver-okta-password"></a>

Okta 使用者的密碼。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 密碼 | PWD (已廢除) | 必要 | 無 | 

## Okta 主機名稱
<a name="jdbc-v3-driver-okta-host-name"></a>

您的 Okta 組織的 URL。您可以從 Okta 應用程式中的**內嵌連結** URL 擷取 `idp_host` 參數。如需這些步驟，請參閱 [從 Okta 擷取 ODBC 組態資訊](odbc-okta-plugin.md#odbc-okta-plugin-retrieve-odbc-configuration-information-from-okta)。`https://` 後的第一個區段、直到並包括 `okta.com`，即為您的 IdP 主機 (例如，以 `https://trial-1234567.okta.com` 開頭的 URL 為 `trial-1234567.okta.com`)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| OktaHostName | IdP\$1Host (已廢除) | 必要 | 無 | 

## Okta 應用程式 ID
<a name="jdbc-v3-driver-okta-application-id"></a>

您應用程式的兩部分識別符。您可以從 Okta 應用程式中的**內嵌連結** URL 擷取應用程式 ID。如需這些步驟，請參閱 [從 Okta 擷取 ODBC 組態資訊](odbc-okta-plugin.md#odbc-okta-plugin-retrieve-odbc-configuration-information-from-okta)。應用程式 ID 是 URL 的最後兩個區段，包括中間的正斜線。這些區段是兩個由 20 個字元組成的字串，其中包含數字和大小寫字母的混合 (例如 `Abc1de2fghi3J45kL678/abc1defghij2klmNo3p4`)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| OktaAppId | App\$1ID (已廢除) | 必要 | 無 | 

## Okta 應用程式名稱
<a name="jdbc-v3-driver-okta-application-name"></a>

Okta 應用程式的名稱。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| OktaAppName | App\$1Name (已廢除) | 必要 | 無 | 

## Okta MFA 類型
<a name="jdbc-v3-driver-okta-mfa-type"></a>

如果您已將 Okta 設定為需要多重要素驗證 (MFA)，則需要根據您要使用的第二要素指定 Okta MFA 類型和其他參數。

Okta MFA 類型是用以透過 Okta 進行身分驗證的第二身分驗證要素類型 (在密碼之後)。支援的第二要素包括透過 Okta Verify 應用程式傳送的推送通知以及由 Okta Verify、Google Authenticator 生成的或透過簡訊發送的臨時一次性密碼 (TOTP)。個別組織安全政策會判斷使用者登入是否需要 MFA。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 可能的值 | 
| --- | --- | --- | --- | --- | 
| OktaMfaType | okta\$1mfa\$1type (已廢除) | 如果將 Okta 設定為需要 MFA，則為必要 | 無 | oktaverifywithpush, oktaverifywithtotp, googleauthenticator, smsauthentication | 

## Okta 電話號碼
<a name="jdbc-v3-driver-okta-phone-number"></a>

選擇 `smsauthentication` MFA 類型時，Okta 將使用簡訊將臨時一次性密碼傳送到的電話號碼。該電話號碼必須是美國或加拿大的電話號碼。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| OktaPhoneNumber | okta\$1phone\$1number (已廢除) | 如果 OktaMfaType 為 smsauthentication，則為必要 | 無 | 

## Okta MFA 等待時間
<a name="jdbc-v3-driver-okta-mfa-wait-time"></a>

在驅動程式擲出逾時例外狀況之前，等待使用者確認來自 Okta 的推送通知的持續時間 (以秒為單位)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| OktaMfaWaitTime | okta\$1mfa\$1wait\$1time (已廢除) | 選用 | 60 | 

## 偏好的角色
<a name="jdbc-v3-driver-okta-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如需有關 ARN 角色的資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| PreferredRole | preferred\$1role (已廢除) | 選用 | 無 | 

## 角色工作階段持續時間
<a name="jdbc-v3-driver-role-okta-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| RoleSessionDuration | Duration (已廢除) | 選用 | 3600 | 

## Lake Formation 啟用
<a name="jdbc-v3-driver-okta-lake-formation-enabled"></a>

指定是否使用 [AssumeDecoratedRoleWithSAML](https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_AssumeDecoratedRoleWithSAML.html) Lake Formation API 動作來擷取臨時 IAM 憑證，而非 [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) AWS STS API 動作。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| LakeFormationEnabled | 無 | 選用 | FALSE | 

# Ping 憑證
<a name="jdbc-v3-driver-ping-credentials"></a>

SAML 型身分驗證機制，可讓您使用 Ping Federate 身分提供者向 Athena 進行身分驗證。此方法假設已經在 Athena 和 Ping Federate 之間設定了聯合。

## 憑證提供者
<a name="jdbc-v3-driver-ping-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設為 `Ping`。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | Ping | 

## 使用者
<a name="jdbc-v3-driver-ping-user"></a>

Ping Federate 使用者的電子郵件地址，用於透過 Ping Federate 進行身分驗證。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 使用者 | UID (已廢除) | 必要 | 無 | 

## 密碼
<a name="jdbc-v3-driver-ping-password"></a>

Ping Federate 使用者的密碼。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 密碼 | PWD (已廢除) | 必要 | 無 | 

## PingHostName
<a name="jdbc-v3-driver-ping-host-name"></a>

Ping 伺服器的地址。若要尋找您的地址，請造訪下列 URL 並檢視 **SSO 應用程式端點**欄位。

```
https://your-pf-host-#:9999/pingfederate/your-pf-app#/spConnections
```


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| PingHostName | IdP\$1Host (已廢除) | 必要 | 無 | 

## PingPortNumber
<a name="jdbc-v3-driver-ping-port-number"></a>

用於連線至 IdP 主機的連接埠號碼。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| PingPortNumber | IdP\$1Port (已廢除) | 必要 | 無 | 

## PingPartnerSpId
<a name="jdbc-v3-driver-ping-partner-spid"></a>

服務提供者地址。若要尋找服務提供者地址，請造訪下列 URL 並檢視 **SSO 應用程式端點**欄位。

```
https://your-pf-host-#:9999/pingfederate/your-pf-app#/spConnections
```


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
|  PingPartnerSpId  | Partner\$1SPID (已廢除) | 必要 | 無 | 

## 偏好的角色
<a name="jdbc-v3-driver-ping-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如需有關 ARN 角色的資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| PreferredRole | preferred\$1role (已廢除) | 選用 | 無 | 

## 角色工作階段持續時間
<a name="jdbc-v3-driver-role-ping-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| RoleSessionDuration | Duration (已廢除) | 選用 | 3600 | 

## Lake Formation 啟用
<a name="jdbc-v3-driver-ping-lake-formation-enabled"></a>

指定是否使用 [AssumeDecoratedRoleWithSAML](https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_AssumeDecoratedRoleWithSAML.html) Lake Formation API 動作來擷取臨時 IAM 憑證，而非 [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) AWS STS API 動作。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| LakeFormationEnabled | 無 | 選用 | FALSE | 

# AD FS 憑證
<a name="jdbc-v3-driver-adfs-credentials"></a>

SAML 型身分驗證機制，可讓您使用 Microsoft Active Directory Federation Services (AD FS) 向 Athena 進行身分驗證。此方法假設使用者已經在 Athena 和 AD FS 之間設定了聯合。

## 憑證提供者
<a name="jdbc-v3-driver-adfs-credentials-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設為 `ADFS`。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | ADFS | 

## 使用者
<a name="jdbc-v3-driver-adfs-credentials-user"></a>

AD FS 使用者的電子郵件地址，用來透過 AD FS 進行身分驗證。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 使用者 | UID (已廢除) | 表單型身分驗證的必要項目。Windows 整合式身分驗證的選用項目。 | 無 | 

## 密碼
<a name="jdbc-v3-driver-adfs-credentials-password"></a>

AD FS 使用者的密碼。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 密碼 | PWD (已廢除) | 表單型身分驗證的必要項目。Windows 整合式身分驗證的選用項目。 | 無 | 

## ADFS 主機名稱
<a name="jdbc-v3-driver-adfs-credentials-adfshostname"></a>

AD FS 伺服器的地址。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| AdfsHostName | IdP\$1Host (已廢除) | 必要 | 無 | 

## ADFS 連接埠號碼
<a name="jdbc-v3-driver-adfs-credentials-adfsportnumber"></a>

用於連線至 AD FS 伺服器的連接埠號碼。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| AdfsPortNumber | IdP\$1Port (已廢除) | 必要 | 無 | 

## ADFS 依賴方
<a name="jdbc-v3-driver-adfs-credentials-adfsrelyingparty"></a>

可信依賴方。使用此參數來覆寫 AD FS 依賴方端點 URL。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| AdfsRelyingParty | LoginToRP (已廢除) | 選用 | urn:amazon:webservices | 

## ADFS WIA 啟用
<a name="jdbc-v3-driver-adfs-credentials-adfswiaenabled"></a>

布林值。使用此參數來啟用具有 AD FS 的 Windows 整合式身分驗證 (WIA)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| AdfsWiaEnabled | none | 選用 | FALSE | 

## 偏好的角色
<a name="jdbc-v3-driver-adfs-credentials-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如需有關 ARN 角色的資訊，請參閱《AWS Security Token Service API 參考**》中的 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| PreferredRole | preferred\$1role (已廢除) | 選用 | 無 | 

## 角色工作階段持續時間
<a name="jdbc-v3-driver-adfs-credentials-role-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需詳細資訊，請參閱 *AWS Security Token Service API 參考*中的 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| RoleSessionDuration | Duration (已廢除) | 選用 | 3600 | 

## Lake Formation 啟用
<a name="jdbc-v3-driver-adfs-credentials-lake-formation-enabled"></a>

指定是否使用 [https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_AssumeDecoratedRoleWithSAML.html](https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_AssumeDecoratedRoleWithSAML.html) Lake Formation API 動作來擷取臨時 IAM 登入資料，而非 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) AWS STS API 動作。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| LakeFormationEnabled | none | 選用 | FALSE | 

# 瀏覽器 Azure AD 憑證
<a name="jdbc-v3-driver-browser-azure-ad-credentials"></a>

瀏覽器 Azure AD 是 SAML 型身分驗證機制，可與 Azure AD 身分提供者搭配使用並支援多重因素認證。與標準 Azure AD 身分驗證不同，此機制不需要連線參數中的使用者名稱、密碼或用戶端密碼。如同標準 Azure AD 身分驗證機制，瀏覽器 Azure AD 也會假設使用者已經設定了 Athena 與 Azure AD 之間的聯合。

## 憑證提供者
<a name="jdbc-v3-driver-browser-azure-ad-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設為 `BrowserAzureAD`。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | BrowserAzureAD | 

## Azure AD 租用戶 ID
<a name="jdbc-v3-driver-browser-azure-ad-azure-ad-tenant-id"></a>

Azure AD 應用程式的租用戶 ID


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| AzureAdTenantId | tenant\$1id (已廢除) | 必要 | 無 | 

## Azure AD 用戶端 ID
<a name="jdbc-v3-driver-browser-azure-ad-azure-ad-client-id"></a>

Azure AD 應用程式的用戶端 ID


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| AzureAdClientId | client\$1id (已廢除) | 必要 | 無 | 

## 識別提供者回應逾時
<a name="jdbc-v3-driver-identity-provider-response-timeout"></a>

驅動程式停止等待來自 Azure AD 之 SAML 回應之前的持續時間 (以秒為單位)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| IdpResponseTimeout | idp\$1response\$1timeout (已廢除) | 選用 | 120 | 

## 偏好的角色
<a name="jdbc-v3-driver-browser-azure-ad-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如需有關 ARN 角色的資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| PreferredRole | preferred\$1role (已廢除) | 選用 | 無 | 

## 角色工作階段持續時間
<a name="jdbc-v3-driver-browser-azure-ad-role-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| RoleSessionDuration | Duration (已廢除) | 選用 | 3600 | 

## Lake Formation 啟用
<a name="jdbc-v3-driver-browser-azure-ad-lake-formation-enabled"></a>

指定是否使用 [AssumeDecoratedRoleWithSAML](https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_AssumeDecoratedRoleWithSAML.html) Lake Formation API 動作來擷取臨時 IAM 憑證，而非 [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) AWS STS API 動作。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| LakeFormationEnabled | 無 | 選用 | FALSE | 

# 瀏覽器 SAML 憑證
<a name="jdbc-v3-driver-browser-saml-credentials"></a>

瀏覽器 SAML 是一般身分驗證外掛程式，可與 SAML 型身分提供者搭配使用並支援多重因素認證。

## 憑證提供者
<a name="jdbc-v3-driver-browser-saml-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設為 `BrowserSaml`。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | BrowserSaml | 

## 單一登入登入 URL
<a name="jdbc-v3-driver-single-sign-on-login-url"></a>

您的應用程式在 SAML 型身分提供者上的單一登入 URL。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| SsoLoginUrl | login\$1url (已廢除) | 必要 | 無 | 

## 接聽連接埠
<a name="jdbc-v3-driver-listen-port"></a>

用來接聽 SAML 回應的連接埠號碼。此值應與您設定 SAML 型身分提供者所使用的 URL 相符 (例如，`http://localhost:7890/athena`)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ListenPort | listen\$1port (已廢除) | 選用 | 7890 | 

## 識別提供者回應逾時
<a name="jdbc-v3-driver-single-sign-on-login-url-identity-provider-response-timeout"></a>

驅動程式停止等待來自 Azure AD 之 SAML 回應之前的持續時間 (以秒為單位)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| IdpResponseTimeout | idp\$1response\$1timeout (已廢除) | 選用 | 120 | 

## 偏好的角色
<a name="jdbc-v3-driver-single-sign-on-login-url-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如需有關 ARN 角色的資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| PreferredRole | preferred\$1role (已廢除) | 選用 | 無 | 

## 角色工作階段持續時間
<a name="jdbc-v3-driver-single-sign-on-login-url-role-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| RoleSessionDuration | Duration (已廢除) | 選用 | 3600 | 

## Lake Formation 啟用
<a name="jdbc-v3-driver-single-sign-on-login-url-lake-formation-enabled"></a>

指定是否使用 [AssumeDecoratedRoleWithSAML](https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_AssumeDecoratedRoleWithSAML.html) Lake Formation API 動作來擷取臨時 IAM 憑證，而非 [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) AWS STS API 動作。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| LakeFormationEnabled | 無 | 選用 | FALSE | 

# DataZone IdC 憑證提供者
<a name="jdbc-v3-driver-datazone-idc"></a>

身分驗證機制，可讓您使用 IAM Identity Center 連線至 Athena 中的 DataZone 管理的資料。

## 憑證提供者
<a name="jdbc-v3-driver-datazone-idc-credentials-provider"></a>

將用來驗證對 AWS的請求的憑證提供者。將此參數的值設為 `DataZoneIdc`。請注意，`AWSCredentialsProviderClass` 別名已廢除；請改用 `CredentialsProvider` 參數名稱。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 將使用的值 | 
| --- | --- | --- | --- | --- | 
| CredentialsProvider | AWSCredentialsProviderClass (已廢除) | 必要 | 無 | DataZoneIdc | 

## DataZone 網域識別碼
<a name="jdbc-v3-driver-datazone-idc-datazone-domain-identifier"></a>

要使用的 DataZone 網域識別碼。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| DataZoneDomainId | 無 | 必要 | 無 | 

## DataZone 環境識別碼
<a name="jdbc-v3-driver-datazone-idc-datazone-environment-identifier"></a>

要使用的 DataZone 環境識別碼。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| DataZoneEnvironmentId | 無 | 必要 | 無 | 

## DataZone 網域區域
<a name="jdbc-v3-driver-datazone-idc-datazone-domain-region"></a>

佈建 DataZone 網域 AWS 區域 的 。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| DataZoneDomainRegion | 無 | 必要 | 無 | 

## 區域
<a name="jdbc-v3-driver-datazone-idc-region"></a>

佈建 DataZone 環境和 Athena 工作群組 AWS 區域 的 。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 區域 | 無 | 必要 | 無 | 

## IAM Identity Center 發行者 URL
<a name="jdbc-v3-driver-datazone-idc-iam-identity-center-issuer-url"></a>

DataZone 網域使用的 IAM Identity Center 執行個體的發行者 URL。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| IdentityCenterIssuerUrl | 無 | 必要 | 無 | 

## DataZone 端點覆寫
<a name="jdbc-v3-driver-datazone-idc-datazone-endpoint-override"></a>

要使用的 DataZone API 端點，而不是提供的 AWS 區域的預設值。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| DataZoneEndpointOverride | 無 | 選用 | 無 | 

## 啟用權杖快取
<a name="jdbc-v3-driver-datazone-idc-enable-token-caching"></a>

啟用時，允許在不同的驅動器連線之間使用相同的 IAM Identity Center 存取權杖。這可避免建立多個驅動器連線的 SQL 工具啟動多個瀏覽器視窗。如果您啟用此參數，我們建議您在使用 SQL 工具清除權杖快取後立即將其關閉，並需要重新進行身分驗證。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| EnableTokenCaching | 無 | 選用 | FALSE | 

## 接聽連接埠
<a name="jdbc-v3-driver-datazone-idc-listen-port"></a>

接聽 IAM Identity Center 回應的連接埠號碼。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| ListenPort | 無 | 選用 | 8000 | 

## 身分提供者回應逾時
<a name="jdbc-v3-driver-datazone-idc-identity-provider-response-time-out"></a>

驅動器停止等待來自 IAM Identity Center 回應之前的持續時間 (以秒為單位)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| IdpResponseTimeout | 無 | 選用 | 120 | 

# DataZone IAM 憑證提供者
<a name="jdbc-v3-driver-datazone-iamcp"></a>

身分驗證機制，可使用 IAM 憑證連線到 Athena 中的 DataZone 受管理的資料。

## DataZone 網域識別碼
<a name="jdbc-v3-driver-datazone-iamcp-datazone-domain-identifier"></a>

要使用的 DataZone 網域識別碼。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| DataZoneDomainId | 無 | 必要 | 無 | 

## DataZone 環境識別碼
<a name="jdbc-v3-driver-datazone-iamcp-datazone-environment-identifier"></a>

要使用的 DataZone 環境識別碼。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| DataZoneEnvironmentId | 無 | 必要 | 無 | 

## DataZone 網域區域
<a name="jdbc-v3-driver-datazone-iamcp-datazone-domain-region"></a>

佈建 DataZone 網域 AWS 區域 的 。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| DataZoneDomainRegion | 無 | 必要 | 無 | 

## DataZone 端點覆寫
<a name="jdbc-v3-driver-datazone-iamcp-datazone-endpoint-override"></a>

要使用的 DataZone API 端點，而不是提供的 AWS 區域的端點預設值。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| DataZoneEndpointOverride | 無 | 選用 | 無 | 

## 使用者
<a name="jdbc-v3-driver-datazone-iamcp-user"></a>

您的 AWS 存取金鑰 ID。如需有關存取金鑰的詳細資訊，請參閱《IAM 使用者指南**》中的 [AWS 安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 使用者 | AccessKeyId | 選用 | 無 | 

## 密碼
<a name="jdbc-v3-driver-datazone-iamcp-password"></a>

您的 AWS 私密金鑰 ID。如需有關存取金鑰的詳細資訊，請參閱《IAM 使用者指南**》中的 [AWS 安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html)。


****  

| 參數名稱 | Alias (別名) | 參數類型 | 預設值 | 
| --- | --- | --- | --- | 
| 密碼 | SecretAccessKey | 選用 | 無 | 

# 其他 JDBC 3.x 組態
<a name="jdbc-v3-driver-other-configuration"></a>

下列各節說明 JDBC 3.x 驅動程式的其他組態設定。

## 網路逾時
<a name="jdbc-v3-driver-network-timeout"></a>

網路逾時可控制驅動器等待建立網路連線的時間量 (以毫秒為單位)。這包括傳送 API 請求所需的時間。在此時間之後，驅動程式會擲出逾時例外狀況。在極少數情況下，變更網路逾時可能會非常實用。例如，您可能想要增加長時間垃圾回收暫停的逾時。

要進行設定，請在 JDBC `Connection` 物件上呼叫 `setNetworkTimeout` 方法。此值可以在 JDBC 連線的生命週期中變更。如需詳細資訊，請參閱 Oracle JDBC API 文件中的 [setNetworkTimeout](https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#setNetworkTimeout-java.util.concurrent.Executor-int-)。使用 `setNetworkTimeout` 方法等同於設定 [網路逾時](jdbc-v3-driver-advanced-connection-parameters.md#jdbc-v3-driver-networktimeoutmillis) 連線參數。

下列範例會將網路逾時設定為 5000 毫秒。

```
...
AthenaDriver driver = new AthenaDriver();
Connection connection = driver.connect(url, connectionParameters);
connection.setNetworkTimeout(null, 5000);
...
```

## 查詢逾時
<a name="jdbc-v3-driver-query-timeout"></a>

提交查詢之後，驅動程式會在 Athena 上等待查詢完成的時間量，以秒為單位。在此時間之後，驅動程式會嘗試取消提交的查詢並擲出逾時例外狀況。

查詢逾時無法設定為連線參數。要進行設定，請在 JDBC `Statement` 物件上呼叫 `setQueryTimeout` 方法。這個值可以在 JDBC 陳述式的生命週期中變更。此參數的預設值為 `0` (零)。值 `0` 表示查詢可以執行直到完成 (受限於 [Service Quotas](service-limits.md))。

下列範例會將查詢逾時設定為 5 秒。

```
...
AthenaDriver driver = new AthenaDriver();
Connection connection = driver.connect(url, connectionParameters);
Statement statement = connection.createStatement();
statement.setQueryTimeout(5);
...
```

# Amazon Athena JDBC 3.x 版本備註
<a name="jdbc-v3-driver-release-notes"></a>

這些版本備註詳細說明了 Amazon Athena JDBC 3.x 驅動器中改進和修正。

## 3.7.0
<a name="jdbc-v3-driver-release-notes-2025-11-21"></a>

 版 2025-11-21

### 改進
<a name="jdbc-v3-driver-release-notes-2025-11-21-improvements"></a>
+ **瀏覽器 OIDC 可信任身分傳播身分身分驗證外掛程式** – 新增了新的身分驗證外掛程式，可使用 OpenID Connect (OIDC) 身分提供者進行無縫的瀏覽器型身分驗證。此外掛程式會透過預設瀏覽器處理完整的 OAuth 2.0 流程、自動擷取 JSON Web Token (JWT)，並與信任的身分傳播整合。它專為單一使用者桌面環境而設計，相較於手動 JWT 處理，可提供更簡化的身分驗證體驗。如需受信任身分傳播的詳細資訊，請參閱[什麼是受信任身分傳播？](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation-overview.html)。

### 修正項目
<a name="jdbc-v3-driver-release-notes-2025-11-21-fixes"></a>
+ **增強型時間戳記精確度支援** – 驅動程式現在完全支援從 Athena 查詢透過 `getTimestamp()`方法傳回的時間戳記值中的毫秒和奈秒精確度。
+ **改善複雜類型處理** – 修正在 `DatabaseMetaData#getColumns`和一般中繼資料操作中剖析巢狀資料類型 （陣列、結構和映射） 的問題，確保複雜資料結構的類型資訊準確。
+ **增強型錯誤記錄** – 改善 S3 中繼資料擷取失敗的記錄，提供更清楚的錯誤訊息和更好的診斷資訊。

## 3.6.0
<a name="jdbc-v3-driver-release-notes-2025-09-10"></a>

 版 2025-09-10

### 改進
<a name="jdbc-v3-driver-release-notes-2025-09-10-improvements"></a>
+ **JWT 可信身分傳播身分驗證外掛程式** – 新增了新的身分驗證外掛程式，可支援 JWT 可信身分傳播與 JDBC 驅動器的整合。此身分驗證類型允許您使用從外部身分提供者獲得的 JSON Web Token (JWT) 作為連線參數，向 Athena 進行身分驗證。透過受信任的身分傳播，身分內容會新增至 IAM 角色，以識別請求存取 AWS 資源的使用者。如需有關啟用和使用可信身分傳播的資訊，請參閱[什麼是可信身分傳播？](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation-overview.html)。
+ **自訂 SSO OIDC 和 SSO 管理員端點支援** – 新增對 JDBC 驅動器中自訂 SSO OIDC 和 SSO 管理員端點的支援。此增強功能可讓您在 VPC 後方執行 JDBC 時，為 SSO 服務指定自己的端點。
+ **AWS 開發套件版本更新** – 我們已將驅動程式中使用的 AWS 開發套件版本更新至 2.32.16，並已更新 3.6.0 版的專案相依性。

## 3.5.1
<a name="jdbc-v3-driver-release-notes-2025-07-17"></a>

 版 2025-07-17

### 改進
<a name="jdbc-v3-driver-release-notes-2025-07-17-improvements"></a>
+ **記錄功能** – 將日誌層級提升為 `INFO` 並新增資料列計數、位移和物件長度的指標，進而增強 S3 擷取記錄。實作了連線生命週期追蹤，並對整體記錄效能進行了最佳化。
+ **特殊字元處理** – 改善了對結構描述和目錄名稱中 `LIKE` 模式的特殊字元的處理。
+ **連線狀態管理** – 改善了連線狀態管理，即藉由在連線關閉後防止 API 呼叫，以及在關閉期間新增查詢操作的安全檢查，進而避免潛在錯誤。

### 修正項目
<a name="jdbc-v3-driver-release-notes-2025-07-17-fixes"></a>
+ **DDL 查詢中繼資料** – 修正了 DDL 查詢中繼資料處理的 `NoSuchKeyFound` 問題。

## 3.5.0
<a name="jdbc-v3-driver-release-notes-2025-03-18"></a>

2025-03-18 發布

### 改進
<a name="jdbc-v3-driver-release-notes-2025-03-18-improvements"></a>
+ **結果組態參數** – 新增了對兩個新連線參數 `ExpectedBucketOwner` 和 `AclOption` 的支援。如需詳細資訊，請參閱[結果組態參數](jdbc-v3-driver-advanced-connection-parameters.md#jdbc-v3-driver-result-config)。
+ **AWS SDK 版本** – 驅動程式中使用的 AWS SDK 版本已更新至 2.30.22。

## 3.4.0
<a name="jdbc-v3-driver-release-notes-2025-02-18"></a>

2025-02-18 發布

### 改進
<a name="jdbc-v3-driver-release-notes-2025-02-18-improvements"></a>
+ **結果擷取程式** – 驅動器現在會自動選取下載查詢結果的最快速方法。如此一來，在大多數情況下都無需手動設定擷取程式。如需詳細資訊，請參閱[結果擷取參數](jdbc-v3-driver-advanced-connection-parameters.md#jdbc-v3-driver-result-fetching-parameters)。

### 修正項目
<a name="jdbc-v3-driver-release-notes-2025-02-18-fixes"></a>
+ **ResultSet** – 驅動器現在能夠逐一處理在 S3 上不會產生結果物件的 DDL 陳述式結果集。當 `GetQueryResultsStream` 傳回完全空白的頁面時，它也會傳回空的 `ResultSet` 物件，而不是 null。
+ **ResultsStream** – 結果串流已透過移除不必要的呼叫來進行最佳化，進而計算內部緩衝區中的資料列數。
+ **getTables** – 已根據 `ListTableMetadata` 和 `GetTableMetadata` 回應處理資料表類型，進而最佳化 `GetTables` 呼叫。

## 3.3.0
<a name="jdbc-v3-driver-release-notes-2024-10-30"></a>

 版 2024-10-30

### 改進
<a name="jdbc-v3-driver-release-notes-2024-10-30-improvements"></a>
+ **DataZone 身分驗證** – 新增了對 DataZone 身分驗證外掛程式 `DataZoneIdC` 和 `DataZoneIAM` 的支援。如需詳細資訊，請參閱[DataZone IdC 憑證提供者](jdbc-v3-driver-datazone-idc.md)及[DataZone IAM 憑證提供者](jdbc-v3-driver-datazone-iamcp.md)。
+ **網路逾時** – 現在可以使用 `NetworkTimeoutMillis` 連線參數設定網路逾時。先前，其只能在 `Connection` 物件本身上設定。如需詳細資訊，請參閱[網路逾時](jdbc-v3-driver-other-configuration.md#jdbc-v3-driver-network-timeout)。

### 修正項目
<a name="jdbc-v3-driver-release-notes-2024-10-30-fixes"></a>
+ **S3 空物件處理** – 驅動器現在能在 S3 擷取程式中處理空物件，而不是擲回 Amazon S3 Range Not Satisfiable 例外狀況。
+ **記錄** – 驅動器不會再記錄查詢執行 [...] 請求的訊息項目，但訂閱會在取用查詢結果後取消這則訊息。
+ **空的參數字串** – 驅動器現在能處理連線參數中存在的空字串，就好像參數不存在一樣。這樣一來，即可解決某些 BI 工具因不小心傳遞空字串而導致意外身分驗證嘗試時發生的問題。

## 3.2.2
<a name="jdbc-v3-driver-release-notes-2024-07-29"></a>

 版 2024-07-29

### 改進
<a name="jdbc-v3-driver-release-notes-2024-07-29-improvements"></a>
+ **資料類型映射** – 透過變更驅動器將 `tinyint`、`smallint`、`row` 和 `struct` 資料類型映射至 Java 物件的方式，提高了對 JDBC 規範的合規性。
+ **AWS SDK 版本更新** – AWS 驅動程式中使用的 SDK 版本已更新至 2.26.23。

### 修正項目
<a name="jdbc-v3-driver-release-notes-2024-07-29-fixes"></a>
+ **註解** – 修正了陳述式結尾的行註解問題。
+ **資料庫清單** – 修正了下列問題：當分頁 `ListDatabases` API 傳回的最後一頁為空白時，列出資料庫可能會進入無限迴圈。

## 3.2.1
<a name="jdbc-v3-driver-release-notes-2024-07-03"></a>

 版 2024-07-03

### 改進
<a name="jdbc-v3-driver-release-notes-2024-07-03-improvements"></a>
+ **JWT 憑證提供者** – 新增了對使用者指定的工作階段持續時間的支援。如需詳細資訊，請參閱[角色工作階段持續時間](jdbc-v3-driver-jwt-credentials.md#jdbc-v3-driver-jwt-role-session-duration)。

### 修正項目
<a name="jdbc-v3-driver-release-notes-2024-07-03-fixes"></a>
+ **執行緒集區** – 針對非同步任務，已為每個連線建立一個 `ThreadPoolExecutor`，進而避免使用 `ForkJoin` 集區。
+ **憑證提供者** – 現在會剖析代理主機，以便在為外部 IdP 設定 HTTP 用戶端時取得結構描述和主機。
+ **預設憑證提供者** – 確保用戶端程式碼無法關閉預設憑證提供者。
+ **getColumns** – 修正了 `DatabaseMetaData#getColumns` 方法中的 `ORDINAL_COLUMN` 資料欄屬性問題。
+ **ResultSet** – 新增了對 `Infinity`、`-Infinity`、`NaN` 和 `ResultSet.` 的支援，修正了目錄操作傳回的資料欄類型與已完成查詢的結果集之間的差異。

## 3.2.0
<a name="jdbc-v3-driver-release-notes-2024-02-26"></a>

2024-04-26 發布

### 改進
<a name="jdbc-v3-driver-release-notes-2024-02-26-improvements"></a>
+ **目錄操作效能** – 對於不使用萬用字元的目錄操作，其效能有所提升。
+ **輪詢間隔下限變更** – 已修改輪詢間隔下限預設值，以減少驅動器對 Athena 發出的 API 呼叫次數。仍能盡快偵測到查詢完成。
+ **BI 工具可探索性** – 商業智慧工具能更輕鬆地探索到驅動器。
+ **資料類型映射** – 已改善 Athena `binary`、`array` 和 `struct` DDL 資料類型的資料類型映射。
+ **AWS SDK 版本** – 驅動程式中使用的 AWS SDK 版本已更新至 2.25.34。

### 修正項目
<a name="jdbc-v3-driver-release-notes-2024-02-26-fixes"></a>
+ **聯合目錄資料表清單** – 修正了導致聯合目錄傳回空白資料表清單的問題。
+ **getSchemas** – 修正了導致 JDBC [DatabaseMetaData\$1getSchemas](https://docs.oracle.com/javase/8/docs/api/java/sql/DatabaseMetaData.html#getSchemas--) 方法僅從預設目錄而非所有目錄擷取資料庫的問題。
+ **getColumns** – 修正了使用 Null 目錄名稱呼叫 JDBC [DatabaseMetaData\$1getColumns](https://docs.oracle.com/javase/8/docs/api/java/sql/DatabaseMetaData.html#getColumns-java.lang.String-java.lang.String-java.lang.String-java.lang.String-) 方法時，導致傳回 Null 目錄的問題。

## 3.1.0
<a name="jdbc-v3-driver-release-notes-2024-02-15"></a>

2024-02-15 發布

### 改進
<a name="jdbc-v3-driver-release-notes-2024-02-15-improvements"></a>
+ 對 Microsoft Active Directory Federation Services (AD FS) Windows 整合式身分驗證和表單型身分驗證的支援。
+ 為了與 2.x 版保持回溯相容，現在接受 `awsathena` JDBC 子通訊協定，但會產生廢除警告。請改用 `athena` JDBC 子通訊協定。
+ `AwsDataCatalog` 現在是目錄參數的預設值，而 `default` 是資料庫參數的預設值。這些變更可確保傳回目前目錄和資料庫的正確值，而不是 Null。
+ 為了符合 JDBC 規格，`IS_AUTOINCREMENT` 和 `IS_GENERATEDCOLUMN` 現在會傳回空字串，而不是 `NO`。
+ Athena `int` 資料類型現在會映射至與 Athena 相同的 JDBC 類型 `integer`，而不是 `other`。
+ 當 Athena 的資料欄中繼資料不包含選用 `precision` 和 `scale` 欄位時，驅動器現在會針對 `ResultSet` 資料欄中的對應值傳回零。
+  AWS SDK 版本已更新至 2.21.39。

### 修正項目
<a name="jdbc-v3-driver-release-notes-2024-02-15-fixes"></a>
+ 修正了與 `GetQueryResultsStream` 相關的問題，即當 Athena 的純文字結果資料欄計數與 Athena 結果中繼資料中的資料欄計數不一致時，會發生例外狀況。

## 3.0.0
<a name="jdbc-v3-driver-release-notes-2023-11-16"></a>

 版 2023-11-16

Athena JDBC 3.x 驅動器是新一代的驅動器，可提供更好的效能和相容性。JDBC 3.x 驅動器支援直接從 Amazon S3 讀取查詢結果，從而可提升應用程式的效能，其中這些應用程式會耗用大量查詢結果。新的驅動器降低了第三方相依性，因此可以更輕鬆地整合 BI 工具與自訂應用程式。

# 舊版 Athena JDBC 3.x 驅動器
<a name="jdbc-v3-driver-previous-versions"></a>

強烈建議您使用[最新版本](jdbc-v3-driver.md)的 JDBC 3.x 驅動器。最新版本的驅動器包含最新的改善和修正。僅當您的應用程式與最新版本不相容時，才會使用較舊版本。

## JDBC 驅動程式 uber jar
<a name="jdbc-v3-driver-download-uber-jar-previous"></a>

下面的下載將驅動程式及其所有相依性包在同一個 `.jar` 檔案中。此下載通常用於第三方 SQL 用戶端。
+ [3.6.0 uber jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.6.0/athena-jdbc-3.6.0-with-dependencies.jar)
+ [3.5.1 uber jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.5.1/athena-jdbc-3.5.1-with-dependencies.jar)
+ [3.5.0 uber jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.5.0/athena-jdbc-3.5.0-with-dependencies.jar)
+ [3.4.0 uber jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.4.0/athena-jdbc-3.4.0-with-dependencies.jar)
+ [3.3.0 uber jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.3.0/athena-jdbc-3.3.0-with-dependencies.jar)
+ [3.2.2 uber jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.2.2/athena-jdbc-3.2.2-with-dependencies.jar)
+ [3.2.1 uber jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.2.1/athena-jdbc-3.2.1-with-dependencies.jar)
+ [3.2.0 uber jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.2.0/athena-jdbc-3.2.0-with-dependencies.jar)
+ [3.1.0 uber jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.1.0/athena-jdbc-3.1.0-with-dependencies.jar)
+ [3.0.0 uber jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.0.0/athena-jdbc-3.0.0-with-dependencies.jar)

## JDBC 驅動程式 lean jar
<a name="jdbc-v3-driver-download-lean-jar"></a>

下面的下載是一個 `.zip` 檔案，其中包含驅動程式的 lean `.jar` 和驅動程式相依性的單獨 `.jar` 檔案。此下載通常用於可能具有相依性與驅動程式使用的相依性衝突的自訂應用程式。如果您想選擇要包含在 lean jar 中的驅動程式相依性，以及要排除的驅動程式相依性 (如果您的自訂應用程式已包含一或多個驅動程式相依性)，則此下載非常有用。
+ [3.6.0 lean jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.6.0/athena-jdbc-3.6.0-lean-jar-and-separate-dependencies-jars.zip)
+ [3.5.1 lean jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.5.1/athena-jdbc-3.5.1-lean-jar-and-separate-dependencies-jars.zip)
+ [3.5.0 lean jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.5.0/athena-jdbc-3.5.0-lean-jar-and-separate-dependencies-jars.zip)
+ [3.4.0 lean jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.4.0/athena-jdbc-3.4.0-lean-jar-and-separate-dependencies-jars.zip)
+ [3.3.0 lean jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.3.0/athena-jdbc-3.3.0-lean-jar-and-separate-dependencies-jars.zip)
+ [3.2.2 lean jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.2.2/athena-jdbc-3.2.2-lean-jar-and-separate-dependencies-jars.zip)
+ [3.2.1 lean jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.2.1/athena-jdbc-3.2.1-lean-jar-and-separate-dependencies-jars.zip)
+ [3.2.0 lean jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.2.0/athena-jdbc-3.2.0-lean-jar-and-separate-dependencies-jars.zip)
+ [3.1.0 lean jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.1.0/athena-jdbc-3.1.0-lean-jar-and-separate-dependencies-jars.zip)
+ [3.0.0 lean jar](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/3.0.0/athena-jdbc-3.0.0-lean-jar-and-separate-dependencies-jars.zip)

# Athena JDBC 2.x 驅動程式
<a name="jdbc-v2"></a>

您可以使用 JDBC 連接來將 Athena 連接到商業智慧工具和其他應用程式，例如 [SQL Workbench](http://www.sql-workbench.eu/downloads.html)。若要這樣做，請使用此頁面上的 Amazon S3 連結，以下載、安裝和設定 Athena JDBC 2.x 驅動程式。有關建置 JDBC 連接 URL 的資訊，請參閱可下載的[JDBC 驅動程式安裝和組態指南](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/SimbaAthenaJDBC-2.2.2.1000/docs/Simba+Amazon+Athena+JDBC+Connector+Install+and+Configuration+Guide.pdf)。如需許可的相關資訊，請參閱[透過 JDBC 和 ODBC 連接控制存取](policy-actions.md)。要提交有關 JDBC 驅動程式的意見回饋，請傳送電子郵件至 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)。從 2.0.24 版開始，提供兩種版本的驅動程式：一種包含 AWS SDK，另一種則不包含。

**重要**  
當您使用 JDBC 驅動程式時，務必注意以下要求：  
**打開連接埠 444** – 將 Athena 用來串流查詢結果的連接埠 444 保持開放給輸出流量。當您使用 PrivateLink 端點連接到 Athena 時，請確定連接至 PrivateLink 端點的安全群組已在連接埠 444 上開放給輸入流量。如果連接埠 444 遭到封鎖，您可能會收到錯誤訊息 [Simba][AthenaJDBC](100123) An error has occurred. ([Simba][AthenaJDBC](100123) 發生錯誤。) 資料欄初始化期間發生例外狀況。
**athena:GetQueryResultsStream 政策** – 新增針對使用 JDBC 驅動程式的 IAM 主體的 `athena:GetQueryResultsStream` 政策動作。此政策動作不會直接透過 API 公開。它僅與 ODBC 和 JDBC 驅動程式搭配使用，做為串流結果支援的一部分。如需政策範例，請參閱 [AWS 受管政策：AWSQuicksightAthenaAccess](security-iam-awsmanpol.md#awsquicksightathenaaccess-managed-policy)。
**使用用於多個資料目錄的 JDBC 驅動程式** – 若要將用於多個資料目錄的 JDBC 驅動程式與 Athena 搭配使用 (例如，在使用[外部 Hive 中繼存放區](connect-to-data-source-hive.md)或[聯合查詢](federated-queries.md)時)，在您的 JDBC 連線字串中包含 `MetadataRetrievalMethod=ProxyAPI`。
**4.1 驅動程式** – 從 2023 年起，將停止對 JDBC 4.1 版提供驅動程式支援。將不再發布進一步更新。如果您仍在使用 JDBC 4.1 驅動程式，強烈建議您改用 4.2 驅動程式。

## 搭配 AWS SDK 的 JDBC 2.x 驅動程式
<a name="download-the-jdbc-driver"></a>

JDBC 驅動程式 2.2.2 版符合 JDBC API 4.2 資料標準，且需要 JDK 8.0 或更新版本。如需檢查您使用之 Java 執行階段環境 (JRE) 版本的相關資訊，請參閱 Java [文件](https://www.java.com/en/download/help/version_manual.html)。

使用下列連結來下載 JDBC 4.2 驅動程式 `.jar` 檔案。
+ [AthenaJDBC42-2.2.2.1000.jarAthenaJDBC](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/SimbaAthenaJDBC-2.2.2.1000/AthenaJDBC42-2.2.2.1000.jar)

下列`.zip`檔案下載包含 JDBC 4.2 `.jar` 的檔案，並包含 AWS SDK 和隨附的文件、版本備註、授權和協議。
+ [SimbaAthenaJDBC-2.2.2.1000.zipSimbaAthenaJDBC](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/SimbaAthenaJDBC-2.2.2.1000/SimbaAthenaJDBC-2.2.2.1000.zip)

## 不含 AWS SDK 的 JDBC 2.x 驅動程式
<a name="download-the-jdbc-driver-no-sdk"></a>

JDBC 驅動程式 2.2.2 版符合 JDBC API 4.2 資料標準，且需要 JDK 8.0 或更新版本。如需檢查您使用之 Java 執行階段環境 (JRE) 版本的相關資訊，請參閱 Java [文件](https://www.java.com/en/download/help/version_manual.html)。

使用以下連結下載不含 AWS SDK 的 JDBC 4.2 驅動程式`.jar`檔案。
+ [AthenaJDBC42-2.2.2.1001.jarAthenaJDBC](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/SimbaAthenaJDBC-2.2.2.1001/AthenaJDBC42-2.2.2.1001.jar)

以下 `.zip` 檔案下載包含 JDBC 4.2 `.jar` 檔案及隨附的文件、版本備註、授權和協議。它不包含 AWS SDK。
+ [SimbaAthenaJDBC-2.2.2.1001.zipSimbaAthenaJDBC](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/SimbaAthenaJDBC-2.2.2.1001/SimbaAthenaJDBC-2.2.2.1001.zip)

## JDBC 2.x 驅動程式版本備註、授權合約和聲明
<a name="atelong-jdbc-driver-license-agreement"></a>

下載您需要的版本後，請閱讀版本備註，並檢閱授權合約和聲明。
+ [版本備註](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/SimbaAthenaJDBC-2.2.2.1000/docs/release-notes.txt)
+ [授權合約](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/SimbaAthenaJDBC-2.2.2.1000/docs/LICENSE.txt)
+ [通知](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/SimbaAthenaJDBC-2.2.2.1000/docs/NOTICES.txt)
+ [第三方授權](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/SimbaAthenaJDBC-2.2.2.1000/docs/third-party-licenses.txt)

## JDBC 2.x 驅動程式文件
<a name="jdbc-v2-documentation"></a>

下載驅動程式的下列文件：
+ [JDBC 驅動程式安裝和組態指南](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/SimbaAthenaJDBC-2.2.2.1000/docs/Simba+Amazon+Athena+JDBC+Connector+Install+and+Configuration+Guide.pdf) 。使用此指南來安裝和設定驅動程式。
+ [JDBC 驅動程式遷移指南](https://downloads.athena.us-east-1.amazonaws.com/drivers/JDBC/SimbaAthenaJDBC-2.2.2.1000/docs/Simba+Amazon+Athena+JDBC+Connector+Migration+Guide.pdf) 。使用此指南從舊版遷移到目前的版本。

# 使用 ODBC 連接到 Amazon Athena
<a name="connect-with-odbc"></a>

Amazon Athena 提供兩個 ODBC 驅動程序：版本 1.x 和 2.x。Athena ODBC 2.x 驅動器是支援 Linux、macOS ARM、macOS Intel 和 Windows 64 位元系統的新替代方案。Athena 2.x 驅動程式支援 1.x ODBC 驅動程式支援的所有身分驗證外掛程式，而且幾乎所有連線參數均可回溯相容。
+ 若要下載 ODBC 2.x 驅動程式，請參閱 [Amazon Athena ODBC 2.x](odbc-v2-driver.md)。
+ 若要下載 ODBC 1.x 驅動程式，請參閱 [Athena ODBC 1.x 驅動程式](connect-with-odbc-driver-and-documentation-download-links.md)。

**Topics**
+ [Amazon Athena ODBC 2.x](odbc-v2-driver.md)
+ [Athena ODBC 1.x 驅動程式](connect-with-odbc-driver-and-documentation-download-links.md)
+ [使用 Amazon Athena Power BI 連接器](connect-with-odbc-and-power-bi.md)

# Amazon Athena ODBC 2.x
<a name="odbc-v2-driver"></a>

您可以從許多第三方 SQL 用戶端工具和應用程式使用 ODBC 連線來連接至 Amazon Athena。在您的用戶端電腦上設定 ODBC 連線。

## 考量和限制
<a name="odbc-v2-driver-considerations-limitations"></a>

如需有關從 Athena ODBC 1.x 驅動程式遷移至 Athena 2.x ODBC 驅動程式的資訊，請參閱 [移轉至 ODBC 2.x 驅動器](odbc-v2-driver-migrating.md)。

## ODBC 2.x 驅動程式下載
<a name="odbc-v2-driver-download"></a>

若要下載 Amazon Athena 2.x ODBC 驅動器，請造訪此頁面上的連結。

**重要**  
當您使用 ODBC 2.x 驅動程式時，務必注意以下要求：  
**打開連接埠 444** – 將 Athena 用來串流查詢結果的連接埠 444 保持開放給輸出流量。當您使用 PrivateLink 端點連接到 Athena 時，請確定連接至 PrivateLink 端點的安全群組已在連接埠 444 上開放給輸入流量。
**athena:GetQueryResultsStream 政策** – 新增針對使用 ODBC 驅動程式的 IAM 主體的 `athena:GetQueryResultsStream` 政策動作。此政策動作不會直接透過 API 公開。它僅與 ODBC 和 JDBC 驅動程式搭配使用，做為串流結果支援的一部分。如需政策範例，請參閱 [AWS 受管政策：AWSQuicksightAthenaAccess](security-iam-awsmanpol.md#awsquicksightathenaaccess-managed-policy)。

**重要**  
**安全更新：**2.1.0.0 版包含身分驗證、查詢處理和傳輸安全元件的安全增強功能。我們建議您升級至此版本，以從這些改進中獲益。如需詳細資訊，請參閱 [Amazon Athena ODBC 2.x 版本備註](odbc-v2-driver-release-notes.md)。

### Linux
<a name="connect-with-odbc-linux"></a>


| 驅動程式版本 | 下載連結 | 
| --- | --- | 
| 適用於 Linux 64 位元的 ODBC 2.1.0.0 |  [Linux 64 位元 ODBC 驅動程式 2.1.0.0](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/v2.1.0.0/Linux/AmazonAthenaODBC-2.1.0.0.rpm)  | 

### macOS (ARM)
<a name="connect-with-odbc-macos-arm"></a>


| 驅動程式版本 | 下載連結 | 
| --- | --- | 
| 適用於 macOS 64 位元 (ARM) 的 ODBC 2.1.0.0 |  [macOS 64 位元 ODBC 驅動程式 2.1.0.0 (ARM)](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/v2.1.0.0/Mac/arm/AmazonAthenaODBC-2.1.0.0_arm.pkg)  | 

### macOS (Intel)
<a name="connect-with-odbc-macos-intel"></a>


| 驅動程式版本 | 下載連結 | 
| --- | --- | 
| 適用於 macOS 64 位元 (Intel) 的 ODBC 2.1.0.0 |  [macOS 64 位元 ODBC 驅動程式 2.1.0.0 (Intel)](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/v2.1.0.0/Mac/Intel/AmazonAthenaODBC-2.1.0.0_x86.pkg)  | 

### Windows
<a name="connect-with-odbc-windows"></a>


| 驅動程式版本 | 下載連結 | 
| --- | --- | 
| 適用於 Windows 64 位元的 ODBC 2.1.0.0 |  [Windows 64 位元 ODBC 驅動程式 2.1.0.0](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/v2.1.0.0/Windows/AmazonAthenaODBC-2.1.0.0.msi)  | 

### 授權
<a name="connect-with-odbc-licenses"></a>
+  [AWS 授權](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/v2.1.0.0/LICENSE.txt)
+ [第三方授權](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/v2.1.0.0/THIRD_PARTY_LICENSES.txt) 

## 可信身分傳播與 ODBC
<a name="odbc-v2-driver-trusted-identity"></a>

您現在可以透過 AWS Identity and Access Management Identity Center 使用具有單一登入功能的 ODBC 驅動程式連線至 Amazon Athena。當您從 PowerBI、Tableau 或 DBeaver 等工具存取 Athena 時，您的身分和許可會透過 IAM Identity Center 自動傳播到 Athena。如需詳細資訊，請參閱[搭配使用可信身分傳播與 Amazon Athena 驅動器](using-trusted-identity-propagation.md)。

**Topics**
+ [考量和限制](#odbc-v2-driver-considerations-limitations)
+ [ODBC 2.x 驅動程式下載](#odbc-v2-driver-download)
+ [可信身分傳播與 ODBC](#odbc-v2-driver-trusted-identity)
+ [ODBC 2.x 驅動器入門](odbc-v2-driver-getting-started.md)
+ [Athena ODBC 2.x 連線參數](odbc-v2-driver-connection-parameters.md)
+ [移轉至 ODBC 2.x 驅動器](odbc-v2-driver-migrating.md)
+ [對 ODBC 2.x 驅動器進行疑難排解](odbc-v2-driver-troubleshooting.md)
+ [Amazon Athena ODBC 2.x 版本備註](odbc-v2-driver-release-notes.md)

# ODBC 2.x 驅動器入門
<a name="odbc-v2-driver-getting-started"></a>

使用本節中的資訊，開始使用 Amazon Athena ODBC 2.x 驅動程式。Windows、Linux 和 macOS 作業系統支援此驅動器。

**Topics**
+ [Windows](odbc-v2-driver-getting-started-windows.md)
+ [Linux](odbc-v2-driver-getting-started-linux.md)
+ [macOS](odbc-v2-driver-getting-started-macos.md)

# Windows
<a name="odbc-v2-driver-getting-started-windows"></a>

如果您想要使用 Windows 用戶端電腦存取 Amazon Athena，則需要 Amazon Athena ODBC 驅動器。

## Windows 系統要求
<a name="odbc-v2-driver-system-requirements-windows"></a>

在將直接存取 Amazon Athena 資料庫的用戶端電腦上安裝 Amazon Athena ODBC 驅動程式，而不是使用 Web 瀏覽器。

您使用的 Windows 系統必須符合下述要求：
+ 您擁有管理員權限
+ 下列其中一個操作系統：
  + Windows 11、10 或 8.1
  + Windows Server 2019、2016 或 2012
  + 支援的處理器架構：x86\$164 (64 位元)
+ 至少 100 MB 的可用磁碟空間
+ 已安裝 [Microsoft Visual C\$1\$1 Redistributable for Visual Studio](https://visualstudio.microsoft.com/downloads/#microsoft-visual-c-redistributable-for-visual-studio-2022)，適用於 Windows 64 位元。

## 安裝 Amazon Athena ODBC 驅動程式
<a name="odbc-v2-driver-installing"></a>

**若要下載並安裝適用於 Windows 的 Amazon Athena ODBC 驅動程式**

1. [下載](odbc-v2-driver.md#odbc-v2-driver-download) `AmazonAthenaODBC-2.x.x.x.msi` 安裝檔案。

1. 啟動安裝檔案，然後選擇**下一步**。

1. 若要接受授權協議條款，請選取核取方塊，然後選擇**下一步**。

1. 若要變更安裝位置，請選擇**瀏覽**，瀏覽至所需的資料夾，然後選擇**確定**。

1. 若要接受安裝位置，請選擇**下一步**。

1. 選擇 **Install (安裝)**。

1. 完成安裝時，請選擇**完成**。

## 設定驅動程式組態選項的方法
<a name="odbc-v2-driver-ways-to-set-options"></a>

若要控制 Windows 中 Amazon Athena ODBC 驅動程式的行為，您可以使用下列方式設定驅動程式組態選項：
+ 在 **ODBC 資料來源管理員**中設定資料來源名稱 (DSN) 時。
+ 透過在下列位置新增或變更 Windows 登錄機碼：

  ```
  HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\YOUR_DSN_NAME
  ```
+ 以程式設計方式連線時，在連線字串中設定驅動程式選項。

## 在 Windows 上設定資料來源名稱
<a name="odbc-v2-driver-configuring-dsn-on-windows"></a>

在下載並安裝 ODBC 驅動程式之後，您必須將資料來源名稱 (DSN) 項目新增至用戶端電腦或 Amazon EC2 執行個體。SQL 用戶端工具使用此資料來源以連接至並查詢 Amazon Athena。

**建立系統 DSN 項目**

1. 在 Windows 的**開始**選單中，以滑鼠右鍵按一下 **ODBC 資料來源 (64 位元)**，然後選擇**更多**，**以管理員身分執行**。

1. 在 **ODBC 資料來源管理員**中，選擇**驅動程式**索引標籤。

1. 在**名稱**資料欄中，確認是否存在 **Amazon Athena ODBC (x64)**。

1. 執行以下任意一項：
   + 若要為電腦上的所有使用者設定驅動程式，請選擇**系統 DSN** 索引標籤。由於使用不同帳戶載入資料的應用程式可能無法偵測來自其他帳戶的 DSN，因此建議您使用系統 DSN 組態選項。
**注意**  
使用**系統 DSN** 選項需要管理權限。
   + 若要僅為您的使用者帳戶設定驅動程式，請選擇**使用者 DSN** 索引標籤。

1. 選擇**新增**。**建立新資料來源**對話方塊隨即開啟。

1. 選擇 **Amazon Athena ODBC (x64)**，然後選擇**完成**。

1. 請在 **Amazon Athena ODBC 組態**對話方塊中輸入下列資訊。如需這些選項的詳細資訊，請參閱 [主要 ODBC 2.x 連線參數](odbc-v2-driver-main-connection-parameters.md)。
   + 對於**資料來源名稱**，輸入您要用來識別資料來源的名稱。
   + 對於**描述**，輸入描述，以協助您識別資料來源。
   + 對於**區域**，輸入您將在 Athena 中使用的 AWS 區域 的名稱 (例如 ** us-west-1**)。
   + 對於**目錄**，輸入 Amazon Athena 目錄的名稱。預設值為 **AwsDataCatalog**，供 使用 AWS Glue。
   + 對於**資料庫**，輸入 Amazon Athena 資料庫的名稱。預設值為**預設**。
   + 對於**工作群組**，輸入 Amazon Athena 工作群組的名稱。預設值為**主要**。
   + 對於 **S3 輸出位置**，在 Amazon S3 中輸入要存放查詢結果的位置 (例如，**s3://amzn-s3-demo-bucket/**)。
   + (選用) 對於**加密選項**，請選擇加密選項。預設值為 `NOT_SET`。
   + (選用) 對於 **KMS 金鑰**，請視需要選擇加密 KMS 金鑰。

1. 若要指定 IAM 身分驗證的組態選項，請選擇**身分驗證選項。**

1. 輸入下列資訊：
   + 對於**身分驗證類型**，選擇 **IAM 憑證**。這是預設值。如需有關可用身分驗證類型的詳細資訊，請參閱 [身分驗證選項](odbc-v2-driver-authentication-options.md)。
   + 對於**使用者名稱**，輸入使用者名稱。
   + 對於**密碼**，輸入密碼。
   + 對於**工作階段字符**，如果您想要使用臨時 AWS 登入資料，請輸入工作階段字符。如需臨時登入資料的資訊，請參閱《*IAM 使用者指南*》中的[使用臨時登入資料搭配 AWS 資源](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)。

1. 選擇**確定**。

1. 請在 **Amazon Athena ODBC 組態**對話方塊底部，選擇**測試**。如果用戶端電腦成功連線至 Amazon Athena，**連線測試**方塊會報告**連線成功**。如果沒有，方塊會報告**連線失敗**，並顯示對應的錯誤資訊。

1. 選擇**確定**以關閉連線測試。您建立的資料來源現在會顯示在資料來源清單中。

## 在 Windows 上使用無 DSN 連線
<a name="odbc-v2-driver-dsn-less-connection"></a>

您可以使用無 DSN 連線來連接至沒有資料來源名稱 (DSN) 的資料庫。下列範例顯示連線至 Amazon Athena 的 Amazon Athena ODBC (x64) ODBC 驅動程式的連線字串。

```
DRIVER={Amazon Athena ODBC (x64)};Catalog=AwsDataCatalog;AwsRegion=us-west-1;Schema=test_schema;S3OutputLocation=
s3://amzn-s3-demo-bucket/;AuthenticationType=IAM Credentials;UID=YOUR_UID;PWD=YOUR_PWD;
```

# Linux
<a name="odbc-v2-driver-getting-started-linux"></a>

如果您想要使用 Linux 用戶端電腦存取 Amazon Athena，則需要 Amazon Athena ODBC 驅動器。

## Linux 系統要求
<a name="odbc-v2-driver-getting-started-linux-linux-system-requirements"></a>

您安裝驅動器的每一台 Linux 電腦必須符合下列要求。
+ 您擁有根存取權。
+ 使用下列其中一個 Linux 發行版本：
  + Red Hat Enterprise Linux (RHEL) 7 或 8
  + CentOS 7 或 8。
+ 有 100 MB 的可用磁碟空間。
+ 使用 [unixODBC](https://www.unixodbc.org/) 版本 2.3.1 或更新版本。
+ 使用 [GNU C Library](https://www.gnu.org/software/libc/) (glibc) 版本 2.26 或更新版本。

## 在 Linux 上安裝 ODBC 資料連接器
<a name="odbc-v2-driver-getting-started-linux-installing-the-odbc-data-connector-on-linux"></a>

使用下列程序來在 Linux 作業系統上安裝的 Amazon Athena ODBC 驅動器。

**在 Linux 上安裝 Amazon Athena ODBC 驅動器**

1. 輸入下列其中一個命令：

   ```
   sudo rpm -Uvh AmazonAthenaODBC-2.X.Y.Z.rpm
   ```

   或

   ```
   sudo yum --nogpgcheck localinstall AmazonAthenaODBC-2.X.Y.Z.rpm
   ```

1. 安裝完成後，輸入下列其中一個命令，以驗證驅動器已安裝：
   + 

     ```
     yum list | grep amazon-athena-odbc-driver
     ```

     輸出：

     ```
     amazon-athena-odbc-driver.x86_64 2.0.2.1-1.amzn2int installed
     ```
   + 

     ```
     rpm -qa | grep amazon
     ```

     輸出：

     ```
     amazon-athena-odbc-driver-2.0.2.1-1.amzn2int.x86_64
     ```

## 在 Linux 上設定資料來源名稱
<a name="odbc-v2-driver-getting-started-linux-configuring-a-data-source-name-on-linux"></a>

安裝驅動器後，您可以在下列位置中找到 `.odbc.ini` 和 `.odbcinst.ini` 檔案的範例：
+ `/opt/athena/odbc/ini/`.

使用 `.ini` 檔案作為設定 Amazon Athena ODBC 驅動器和資料來源名稱 (DSN) 的範例。

**注意**  
依預設，ODBC 驅動器管理員會使用隱藏的組態檔案 `.odbc.ini` 和 `.odbcinst.ini`，這些組態檔案位於主目錄中。

若要使用 unixODBC 指定 `.odbc.ini` 和 `.odbcinst.ini` 檔案的路徑，請執行下列步驟。

**使用 unixODBC 指定 ODBC `.ini` 檔案位置**

1. 將 `ODBCINI` 設定為 `odbc.ini` 檔案的完整路徑和檔案名稱，如下列範例所示。

   ```
   export ODBCINI=/opt/athena/odbc/ini/odbc.ini
   ```

1. 將 `ODBCSYSINI` 設定為包含 `odbcinst.ini` 檔案之目錄的完整路徑，如下列範例所示。

   ```
   export ODBCSYSINI=/opt/athena/odbc/ini
   ```

1. 輸入下列命令，以驗證您使用的是 unixODBC 驅動器管理員且 `odbc*.ini` 檔案正確無誤：

   ```
   username % odbcinst -j
   ```

   範例輸出

   ```
   unixODBC 2.3.1
   DRIVERS............: /opt/athena/odbc/ini/odbcinst.ini
   SYSTEM DATA SOURCES: /opt/athena/odbc/ini/odbc.ini
   FILE DATA SOURCES..: /opt/athena/odbc/ini/ODBCDataSources
   USER DATA SOURCES..: /opt/athena/odbc/ini/odbc.ini
   SQLULEN Size.......: 8
   SQLLEN Size........: 8
   SQLSETPOSIROW Size.: 8
   ```

1. 如果您想要使用資料來源名稱 (DSN) 連線至資料存放區，請設定 `odbc.ini` 檔案來定義資料來源名稱 (DSN)。在 `odbc.ini` 檔案中設定屬性，以建立 DSN 來指定資料存放區的連線資訊，如下列範例所示。

   ```
   [ODBC Data Sources]
   athena_odbc_test=Amazon Athena ODBC (x64) 
   
   [ATHENA_WIDE_SETTINGS]  # Special DSN-name to signal driver about logging configuration.
   LogLevel=0              # To enable ODBC driver logs, set this to 1.
   UseAwsLogger=0          # To enable AWS-SDK logs, set this to 1.
   LogPath=/opt/athena/odbc/logs/ # Path to store the log files. Permissions to the location are required. 
   
   [athena_odbc_test]
   Driver=/opt/athena/odbc/lib/libathena-odbc.so
   AwsRegion=us-west-1
   Workgroup=primary
   Catalog=AwsDataCatalog
   Schema=default
   AuthenticationType=IAM Credentials
   UID=
   PWD=
   S3OutputLocation=s3://amzn-s3-demo-bucket/
   ```

1. 設定 `odbcinst.ini` 檔案，如下列範例所示。

   ```
   [ODBC Drivers]
   Amazon Athena ODBC (x64)=Installed 
   
   [Amazon Athena ODBC (x64)]
   Driver=/opt/athena/odbc/lib/libathena-odbc.so
   Setup=/opt/athena/odbc/lib/libathena-odbc.so
   ```

1. 安裝和設定 Amazon Athena ODBC 驅動器之後，請使用 unixODBC `isql` 命令列工具來驗證連線，如下列範例所示。

   ```
   username % isql -v "athena_odbc_test" 
   +---------------------------------------+
   | Connected!                            |
   |                                       |
   | sql-statement                         |
   | help [tablename]                      |
   | quit                                  |
   |                                       |
   +---------------------------------------+
   SQL>
   ```

## 驗證 ODBC 驅動器簽章
<a name="verify-odbc-linux-signature"></a>

**重要**  
我們建議您先驗證 Athena ODBC 驅動器 RPM 簽章，然後再將其安裝在您的電腦上。

依照以下步驟，驗證 Athena ODBC 驅動器 RPM 套件的簽章：

1. **準備範本**

   準備命令時，請使用適當的公有金鑰、RPM 簽章和 Amazon S3 儲存貯體中託管的 RPM 指令碼的對應存取連結。您必須將下列項目下載至您的裝置。
   +  [Athena ODBC 驅動器](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/v2.1.0.0/Linux/AmazonAthenaODBC-2.1.0.0.rpm) 
   +  [公有金鑰](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/v2.1.0.0/Linux/public_key.pem)
   +  [Athena ODBC RPM 簽章](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/v2.1.0.0/Linux/signature.bin) 

1. 將 Athena ODBC 驅動器、公有金鑰和 Athena ODBC RPM 簽章下載至您的裝置。

1. 執行下列命令，驗證 ODBC 驅動器簽章：

   ```
   openssl dgst -sha256 -verify public_key.pem -signature signature.bin AmazonAthenaODBC-2.1.0.0.rpm
   ```

   如果驗證通過，您將會看到類似 `Verified OK` 的訊息。這表示您現在可以繼續安裝 Athena ODBC 驅動器。

   如果失敗並顯示訊息 `Verification Failure`，則表示 RPM 上的簽章已遭到竄改。請確保步驟 1 中提及的所有三個檔案都存在、路徑已正確指定，而且檔案自下載後未曾修改，然後重試驗證程序。

# macOS
<a name="odbc-v2-driver-getting-started-macos"></a>

如果您想要使用 macOS 用戶端電腦存取 Amazon Athena，則需要 Amazon Athena ODBC 驅動器。

## macOS 系統要求
<a name="odbc-v2-driver-getting-started-macos-macos-system-requirements"></a>

您安裝驅動器的每一台 macOS 電腦必須符合下列要求。
+ 使用 macOS 版本 14 或更新版本。
+ 有 100 MB 的可用磁碟空間。
+ 使用 [iODBC](https://www.iodbc.org/dataspace/doc/iodbc/wiki/iodbcWiki/WelcomeVisitors) 版本 3.52.16 或更新版本。

## 在 macOS 上安裝 ODBC 資料連接器
<a name="odbc-v2-driver-getting-started-macos-installing-the-odbc-data-connector-on-macos"></a>

使用下列程序來下載並安裝適用於 macOS 作業系統的 Amazon Athena ODBC 驅動器。

**下載並安裝適用於 macOS 的 Amazon Athena ODBC 驅動器**

1. 下載 `.pkg` 套件檔案。

1. 按兩下 `.pkg` 檔案。

1. 請遵循精靈中的步驟安裝驅動器。

1. 在**授權合約**頁面上，按下**繼續**，然後選擇**同意**。

1. 選擇 **Install (安裝)**。

1. 完成安裝時，請選擇**完成**。

1. 輸入下列命令，以驗證已安裝驅動器：

   ```
   > pkgutil --pkgs | grep athenaodbc
   ```

   根據您的系統，輸出如下列其中之一所示。

   ```
   com.amazon.athenaodbc-x86_64.Config
   com.amazon.athenaodbc-x86_64.Driver
   ```

   或

   ```
   com.amazon.athenaodbc-arm64.Config
   com.amazon.athenaodbc-arm64.Driver
   ```

## 在 macOS 上設定資料來源名稱
<a name="odbc-v2-driver-getting-started-macos-configuring-a-data-source-name-on-macos"></a>

安裝驅動器後，您可以在下列位置中找到 `.odbc.ini` 和 `.odbcinst.ini` 檔案的範例：
+ Intel 處理器電腦：`/opt/athena/odbc/x86_64/ini/`
+ ARM 處理器電腦：`/opt/athena/odbc/arm64/ini/`

使用 `.ini` 檔案作為設定 Amazon Athena ODBC 驅動器和資料來源名稱 (DSN) 的範例。

**注意**  
依預設，ODBC 驅動器管理員會使用隱藏的組態檔案 `.odbc.ini` 和 `.odbcinst.ini`，這些組態檔案位於主目錄中。

若要使用 iODBC 驅動器管理員指定 `.odbc.ini` 和 `.odbcinst.ini` 檔案的路徑，請執行下列步驟。

**使用 iODBC 驅動器管理員指定 ODBC `.ini` 檔案位置**

1. 將 `ODBCINI` 設定為 `odbc.ini` 檔案的完整路徑和檔案名稱。
   + 對於具有 Intel 處理器的 macOS 電腦，請使用下列語法。

     ```
     export ODBCINI=/opt/athena/odbc/x86_64/ini/odbc.ini
     ```
   + 對於具有 ARM 處理器的 macOS 電腦，請使用下列語法。

     ```
     export ODBCINI=/opt/athena/odbc/arm64/ini/odbc.ini
     ```

1. 將 `ODBCSYSINI` 設定為 `odbcinst.ini` 檔案的完整路徑和檔案名稱。
   + 對於具有 Intel 處理器的 macOS 電腦，請使用下列語法。

     ```
     export ODBCSYSINI=/opt/athena/odbc/x86_64/ini/odbcinst.ini
     ```
   + 對於具有 ARM 處理器的 macOS 電腦，請使用下列語法。

     ```
     export ODBCSYSINI=/opt/athena/odbc/arm64/ini/odbcinst.ini
     ```

1. 如果您想要使用資料來源名稱 (DSN) 連線至資料存放區，請設定 `odbc.ini` 檔案來定義資料來源名稱 (DSN)。在 `odbc.ini` 檔案中設定屬性，以建立 DSN 來指定資料存放區的連線資訊，如下列範例所示。

   ```
   [ODBC Data Sources]
   athena_odbc_test=Amazon Athena ODBC (x64) 
   
   [ATHENA_WIDE_SETTINGS] # Special DSN-name to signal driver about logging configuration.
   LogLevel=0             # set to 1 to enable ODBC driver logs
   UseAwsLogger=0         # set to 1 to enable AWS-SDK logs
   LogPath=/opt/athena/odbc/logs/ # Path to store the log files. Permissions to the location are required. 
   
   [athena_odbc_test]
   Description=Amazon Athena ODBC (x64)
   # For ARM:
   Driver=/opt/athena/odbc/arm64/lib/libathena-odbc-arm64.dylib
   # For Intel:
   # Driver=/opt/athena/odbc/x86_64/lib/libathena-odbc-x86_64.dylib
   AwsRegion=us-west-1
   Workgroup=primary
   Catalog=AwsDataCatalog
   Schema=default
   AuthenticationType=IAM Credentials
   UID=
   PWD=
   S3OutputLocation=s3://amzn-s3-demo-bucket/
   ```

1. 設定 `odbcinst.ini` 檔案，如下列範例所示。

   ```
   [ODBC Drivers]
   Amazon Athena ODBC (x64)=Installed 
   
   [Amazon Athena ODBC (x64)]
   # For ARM:
   Driver=/opt/athena/odbc/arm64/lib/libathena-odbc-arm64.dylib
   Setup=/opt/athena/odbc/arm64/lib/libathena-odbc-arm64.dylib
   # For Intel:
   # Driver=/opt/athena/odbc/x86_64/lib/libathena-odbc-x86_64.dylib
   # Setup=/opt/athena/odbc/x86_64/lib/libathena-odbc-x86_64.dylib
   ```

1. 安裝和設定 Amazon Athena ODBC 驅動器之後，請使用 `iodbctest` 命令列工具來驗證連線，如下列範例所示。

   ```
   username@ % iodbctest
   iODBC Demonstration program
   This program shows an interactive SQL processor
   Driver Manager: 03.52.1623.0502 
   
   Enter ODBC connect string (? shows list): ? 
   
   DSN                              | Driver
   ------------------------------------------------------------------------------
   athena_odbc_test                 | Amazon Athena ODBC (x64) 
   
   Enter ODBC connect string (? shows list): DSN=athena_odbc_test;
   Driver: 2.0.2.1 (Amazon Athena ODBC Driver) 
   
   SQL>
   ```

# Athena ODBC 2.x 連線參數
<a name="odbc-v2-driver-connection-parameters"></a>

**Amazon Athena ODBC 組態**對話訪客選項包括**身分驗證選項**、**進階選項**、**記錄選項**、**端點覆寫**和**代理選項**。如需有關各項內容的詳細資訊，請造訪相應的連結。
+ [主要 ODBC 2.x 連線參數](odbc-v2-driver-main-connection-parameters.md)
+  [身分驗證選項](odbc-v2-driver-authentication-options.md)
+ [進階選項](odbc-v2-driver-advanced-options.md)
+ [記錄選項](odbc-v2-driver-logging-options.md)
+ [端點覆寫](odbc-v2-driver-endpoint-overrides.md)
+ [代理選項](odbc-v2-driver-proxy-options.md)

# 主要 ODBC 2.x 連線參數
<a name="odbc-v2-driver-main-connection-parameters"></a>

下列各節會描述每個主要連線參數。

## 資料來源名稱
<a name="odbc-v2-driver-main-connection-parameters-data-source-name"></a>

指定資料來源的名稱。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| DSN | 無 DSN 連線類型的選用項目 | none | DSN=AmazonAthenaOdbcUsWest1; | 

## Description
<a name="odbc-v2-driver-main-connection-parameters-description"></a>

包含資料來源的描述。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| Description | 選用 | none | Description=Connection to Amazon Athena us-west-1; | 

## 目錄
<a name="odbc-v2-driver-main-connection-parameters-catalog"></a>

指定資料目錄名稱。如需有關目錄的詳細資訊，請參閱《Amazon Athena API 參考》中的 [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| 目錄 | 選用 | AwsDataCatalog | Catalog=AwsDataCatalog; | 

## 區域
<a name="odbc-v2-driver-region"></a>

指定 AWS 區域。如需 的詳細資訊 AWS 區域，請參閱 [區域和可用區域](https://aws.amazon.com/about-aws/global-infrastructure/regions_az/)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AwsRegion | 強制性 | none | AwsRegion=us-west-1; | 

## 資料庫
<a name="odbc-v2-driver-database"></a>

指定資料庫名稱。如需有關資料庫的詳細資訊，請參閱《Amazon Athena API 參考》**中的[資料庫](https://docs.aws.amazon.com/athena/latest/APIReference/API_Database.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| 結構描述 | 選用 | default | Schema=default; | 

## 工作群組
<a name="odbc-v2-driver-workgroup"></a>

指定工作群組名稱。如需有關工作群組的詳細資訊，請參閱《Amazon Athena API 參考》**中的 [WorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroup.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| 工作群組 | 選用 | primary | Workgroup=primary; | 

## 輸出位置
<a name="odbc-v2-driver-output-location"></a>

指定 Amazon S3 中儲存查詢結果的位置。如需有關輸出位置的詳細資訊，請參閱《Amazon Athena API 參考》**中的 [ResultConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_ResultConfiguration.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| S3OutputLocation | 強制性 | none | S3OutputLocation=s3://amzn-s3-demo-bucket/; | 

## 加密選項
<a name="odbc-v2-driver-encryption-options"></a>

**對話方塊參數名稱**：加密選項

指定加密選項。如需有關加密選項的詳細資訊，請參閱《Amazon Athena API 參考》**中的 [EncryptionConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_EncryptionConfiguration.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **可能的值** | **連線字串範例** | 
| --- | --- | --- | --- | --- | 
| S3OutputEncOption | 選用 | none | NOT\$1SET, SSE\$1S3, SSE\$1KMS, CSE\$1KMS | S3OutputEncOption=SSE\$1S3; | 

## KMS 金鑰
<a name="odbc-v2-driver-kms-key"></a>

指定要加密的 KMS 金鑰。如需有關 KMS 金鑰的加密組態的詳細資訊，請參閱《Amazon Athena API 參考》**中的加密 [EncryptionConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_EncryptionConfiguration.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| S3OutputEncKMSKey | 選用 | none | S3OutputEncKMSKey=your\$1key; | 

## 連線測試
<a name="odbc-v2-driver-connection-test"></a>

ODBC 資料來源管理員提供**測試**選項，您可以用來測試 ODBC 2.x 與 Amazon Athena 的連線。如需這些步驟，請參閱 [在 Windows 上設定資料來源名稱](odbc-v2-driver-getting-started-windows.md#odbc-v2-driver-configuring-dsn-on-windows)。當您測試連線時，ODBC 驅動程式會呼叫 [GetWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetWorkGroup.html) Athena API 動作。呼叫會使用您指定的身分驗證類型和對應的憑證提供者來擷取憑證。使用 ODBC 2.x 驅動程式時，可免費使用連線測試。測試不會在您的 Amazon S3 儲存貯體中產生查詢結果。

# 身分驗證選項
<a name="odbc-v2-driver-authentication-options"></a>

您可以使用下列身分驗證類型連線至 Amazon Athena。對於所有類型，連線字串名稱為 `AuthenticationType`，參數類型為 `Required`，預設值為 `IAM Credentials`。如需有關每種身分驗證類型的參數的資訊，請造訪對應的連結。如需常用身分驗證參數，請參閱 [常用身分驗證參數](odbc-v2-driver-common-authentication-parameters.md)。


****  

| 身分驗證類型 | 連線字串範例 | 
| --- | --- | 
| [IAM 憑證](odbc-v2-driver-iam-credentials.md) | AuthenticationType=IAM Credentials; | 
| [IAM 設定檔](odbc-v2-driver-iam-profile.md) | AuthenticationType=IAM Profile; | 
| [AD FS](odbc-v2-driver-ad-fs.md) | AuthenticationType=ADFS; | 
| [Azure AD](odbc-v2-driver-azure-ad.md) | AuthenticationType=AzureAD; | 
| [瀏覽器 Azure AD](odbc-v2-driver-browser-azure-ad.md) | AuthenticationType=BrowserAzureAD; | 
| [瀏覽器 SAML](odbc-v2-driver-browser-saml.md) | AuthenticationType=BrowserSAML; | 
| [瀏覽器 SSO OIDC](odbc-v2-driver-browser-sso-oidc.md) | AuthenticationType=BrowserSSOOIDC; | 
| [預設憑證](odbc-v2-driver-default-credentials.md) | AuthenticationType=Default Credentials; | 
| [外部憑證](odbc-v2-driver-external-credentials.md) | AuthenticationType=External Credentials; | 
| [執行個體設定檔](odbc-v2-driver-instance-profile.md) | AuthenticationType=Instance Profile; | 
| [JWT](odbc-v2-driver-jwt.md) | AuthenticationType=JWT; | 
| [JWT 可信身分傳播憑證提供者](odbc-v2-driver-jwt-tip.md) | AuthenticationType=JWT\$1TIP; | 
| [瀏覽器信任的身分傳播憑證](odbc-v2-driver-browser-oidc-tip.md) | AuthenticationType=BrowserOidcTip; | 
| [Okta](odbc-v2-driver-okta.md) | AuthenticationType=Okta; | 
| [Ping](odbc-v2-driver-ping.md) | AuthenticationType=Ping; | 

# IAM 憑證
<a name="odbc-v2-driver-iam-credentials"></a>

您可以使用 IAM 憑證，以使用本節所述的連線字串參數，透過 ODBC 驅動程式連線至 Amazon Athena。

## 身分驗證類型
<a name="odbc-v2-driver-iam-credentials-authentication-type"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=IAM Credentials; | 

## 使用者 ID
<a name="odbc-v2-driver-iam-credentials-user-id"></a>

您的 AWS 存取金鑰 ID。如需有關存取金鑰的詳細資訊，請參閱《*IAM 使用者指南*》中的 [AWS 安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| UID | 必要 | none | UID=AKIAIOSFODNN7EXAMPLE; | 

## 密碼
<a name="odbc-v2-driver-iam-credentials-password"></a>

您的 AWS 私密金鑰 ID。如需有關存取金鑰的詳細資訊，請參閱《*IAM 使用者指南*》中的 [AWS 安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| PWD | 必要 | none | PWD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKE; | 

## 工作階段字符
<a name="odbc-v2-driver-iam-credentials-session-token"></a>

如果您使用臨時 AWS 登入資料，則必須指定工作階段字符。如需有關暫時憑證的資訊，請參閱《*IAM 使用者指南*》中的 [IAM 中的暫時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| SessionToken | 選用 | none | SessionToken=AQoDYXdzEJr...<remainder of session token>; | 

# IAM 設定檔
<a name="odbc-v2-driver-iam-profile"></a>

您可以將具名設定檔設定為使用 ODBC 驅動程式連線到 Amazon Athena。您可以使用具名設定檔搭配下列其中一個登入資料來源：
+ `Ec2InstanceMetadata` – 從 Amazon EC2 執行個體中繼資料服務 (IMDS) 擷取憑證。在 Amazon EC2 執行個體上執行時使用此值。
+ `EcsContainer` – 從 Amazon ECS 任務角色端點擷取登入資料。在 Amazon ECS 容器中執行時使用此值。
+ `Environment` – 從環境變數 (`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY`、) 擷取登入資料`AWS_SESSION_TOKEN`。

將 AWS 設定檔組態中的 `credential_source` 參數設定為適合您環境的值。如果您要在具名設定檔中使用自訂憑證提供者，請在設定檔組態中指定 `plugin_name` 參數的值。

## 身分驗證類型
<a name="odbc-v2-driver-iam-profile-authentication-type"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=IAM Profile; | 

## AWS 設定檔
<a name="odbc-v2-driver-iam-profile-aws-profile"></a>

用於 ODBC 連線的設定檔名稱。如需有關描述檔的詳細資訊，請參閱《 *AWS Command Line Interface 使用者指南》*中的[使用具名描述檔](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-using-profiles)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AWS設定檔 | 必要 | none | AWSProfile=default; | 

## 偏好的角色
<a name="odbc-v2-driver-iam-profile-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。當設定檔組態中的 `plugin_name` 參數指定自訂憑證提供者時，將使用偏好角色參數。如需有關 ARN 角色的詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| preferred\$1role | 選用 | none | preferred\$1role=arn:aws:IAM::123456789012:id/user1; | 

## 工作階段持續時間
<a name="odbc-v2-driver-iam-profile-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需有關工作階段持續時間的詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。當設定檔組態中的 `plugin_name` 參數指定自訂憑證提供者時，將使用工作階段持續時間參數。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| 持續時間 | 選用 | 900 | duration=900; | 

## 外掛程式名稱
<a name="odbc-v2-driver-iam-profile-plugin-name"></a>

指定在具名設定檔中使用的自訂憑證提供者名稱。此參數可以採用與「ODBC 資料來源管理員」的「**驗證類型**」欄位中的值相同，但僅供 `AWSProfile` 組態使用。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| plugin\$1name | 選用 | none | plugin\$1name=AzureAD; | 

# AD FS
<a name="odbc-v2-driver-ad-fs"></a>

AD FS 是 SAML 型身分驗證外掛程式，可與 Active Directory Federation Service (AD FS) 身分提供者搭配使用。該外掛程式支援[整合式 Windows 身分驗證](https://learn.microsoft.com/en-us/aspnet/web-api/overview/security/integrated-windows-authentication)和表單型身分驗證。如果您使用整合式 Windows 身分驗證，則可以省略使用者名稱和密碼。如需有關設定 AD FS 和 Athena 的資訊，請參閱 [使用 ODBC 用戶端為 Microsoft AD FS 使用者設定對 Amazon Athena 的聯合存取權](odbc-adfs-saml.md)。

## 身分驗證類型
<a name="odbc-v2-driver-authentication-type-8"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=ADFS; | 

## 使用者 ID
<a name="odbc-v2-driver-ad-fs-username"></a>

連線至 AD FS 伺服器的使用者名稱。對於整合式 Windows 身分驗證，您可以省略使用者名稱。如果您的 AD FS 設定需要使用者名稱，您必須在連線參數中予以提供。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| UID | 對 Windows 整合式身分驗證為選用 | none | UID=domain\$1username; | 

## 密碼
<a name="odbc-v2-driver-ad-fs-password"></a>

連線至 AD FS 伺服器的密碼。如同使用者名稱欄位，如果您使用整合式 Windows 身分驗證，您可以省略使用者名稱。如果您的 AD FS 設定需要密碼，您必須在連線參數中予以提供。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| PWD | 對 Windows 整合式身分驗證為選用 | none | PWD=password\$13EXAMPLE; | 

## 偏好的角色
<a name="odbc-v2-driver-ad-fs-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如果您的 SAML 聲明具有多個角色，您可以指定此參數來選擇要擔任的角色。此角色應出現在 SAML 聲明中。如需有關 ARN 角色的詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| preferred\$1role | 選用 | none | preferred\$1role=arn:aws:IAM::123456789012:id/user1; | 

## 工作階段持續時間
<a name="odbc-v2-driver-ad-fs-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需有關工作階段持續時間的詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| 持續時間 | 選用 | 900 | duration=900; | 

## IdP 主機
<a name="odbc-v2-driver-ad-fs-idp-host"></a>

AD FS 服務主機的名稱。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| idp\$1host | 必要 | none | idp\$1host=<server-name>.<company.com>; | 

## IdP 連接埠
<a name="odbc-v2-driver-ad-fs-idp-port"></a>

用於連線至 AD FS 主機的連接埠。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| idp\$1port | 必要 | none | idp\$1port=443; | 

## LoginToRP
<a name="odbc-v2-driver-ad-fs-logintorp"></a>

可信依賴方。使用此參數來覆寫 AD FS 依賴方端點 URL。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| LoginToRP | 選用 | urn:amazon:webservices | LoginToRP=trustedparty; | 

# Azure AD
<a name="odbc-v2-driver-azure-ad"></a>

Azure AD 是 SAML 型身分驗證外掛程式，可與 Azure AD 身分提供者搭配使用。本外掛程式不支援多重要素驗證 (MFA)。如果您需要 MFA 支援，請考慮改用 `BrowserAzureAD` 外掛程式。

## 身分驗證類型
<a name="odbc-v2-driver-azure-ad-authentication-type"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=AzureAD; | 

## 使用者 ID
<a name="odbc-v2-driver-azure-ad-username"></a>

連線至 Azure AD 的使用者名稱。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| UID | 必要 | none | UID=jane.doe@example.com; | 

## 密碼
<a name="odbc-v2-driver-azure-ad-password"></a>

連線至 Azure AD 的密碼。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| PWD | 必要 | none | PWD=password\$13EXAMPLE; | 

## 偏好的角色
<a name="odbc-v2-driver-azure-ad-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如需有關 ARN 角色的資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| preferred\$1role | 選用 | none | preferred\$1role=arn:aws:iam::123456789012:id/user1; | 

## 工作階段持續時間
<a name="odbc-v2-driver-azure-ad-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| 持續時間 | 選用 | 900 | duration=900; | 

## 租用戶 ID
<a name="odbc-v2-driver-azure-ad-tenent-id"></a>

指定您的應用程式租用戶 ID。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| idp\$1tenant | 必要 | none | idp\$1tenant=123zz112z-z12d-1z1f-11zz-f111aa111234; | 

## 用戶端 ID
<a name="odbc-v2-driver-azure-ad-client-id"></a>

指定您的應用程式用戶端 ID。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| client\$1id | 必要 | none | client\$1id=9178ac27-a1bc-1a2b-1a2b-a123abcd1234; | 

## Client secret (用戶端密碼)
<a name="odbc-v2-driver-azure-ad-client-secret"></a>

指定您的用戶端密碼。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| client\$1secret | 必要 | none | client\$1secret=zG12q\$1.xzG1xxxZ1wX1.\$1ZzXXX1XxkHZizeT1zzZ; | 

# 瀏覽器 Azure AD
<a name="odbc-v2-driver-browser-azure-ad"></a>

瀏覽器 Azure AD 是 SAML 型身分驗證外掛程式，可與 Azure AD 身分提供者搭配使用並支援多重因素認證。與標準 Azure AD 外掛程式不同，此外掛程式不需要連線參數中的使用者名稱、密碼或用戶端密碼。

**注意**  
**v2.1.0.0 安全更新：**從 v2.1.0.0 開始，BrowserAzureAD 外掛程式在 OAuth 2.0 授權流程中包含 PKCE （程式碼交換的驗證金鑰）。這可防止授權碼攔截對共用系統的攻擊。不需要變更組態。

## 身分驗證類型
<a name="odbc-v2-driver-browser-azure-ad-authentication-type"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=BrowserAzureAD; | 

## 偏好的角色
<a name="odbc-v2-driver-browser-azure-ad-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如果您的 SAML 聲明具有多個角色，您可以指定此參數來選擇要擔任的角色。指定的角色應出現在 SAML 聲明中。如需有關 ARN 角色的詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。

 


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| preferred\$1role | 選用 | none | preferred\$1role=arn:aws:IAM::123456789012:id/user1; | 

## 工作階段持續時間
<a name="odbc-v2-driver-browser-azure-ad-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需有關工作階段持續時間的詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| 持續時間 | 選用 | 900 | duration=900; | 

## 租用戶 ID
<a name="odbc-v2-driver-browser-azure-ad-tenant-id"></a>

指定您的應用程式租用戶 ID。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| idp\$1tenant | 必要 | none | idp\$1tenant=123zz112z-z12d-1z1f-11zz-f111aa111234; | 

## 用戶端 ID
<a name="odbc-v2-driver-browser-azure-ad-client-id"></a>

指定您的應用程式用戶端 ID。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| client\$1id | 必要 | none | client\$1id=9178ac27-a1bc-1a2b-1a2b-a123abcd1234; | 

## Timeout (逾時)
<a name="odbc-v2-driver-browser-azure-ad-timeout"></a>

外掛程式停止等待來自 Azure AD 之 SAML 回應之前的持續時間 (以秒為單位)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| timeout | 選用 | 120 | timeout=90; | 

## 啟用 Azure 檔案快取
<a name="odbc-v2-driver-browser-azure-ad-file-cache"></a>

啟用臨時憑證快取。此連線參數可讓您在多個程序之間快取，及重複使用臨時憑證。使用此選項可減少當您使用 BI 工具 (如 Microsoft Power BI) 時，開啟瀏覽器視窗的數目。

**注意**  
從 v2.1.0.0 開始，快取的憑證會以純文字 JSON 形式存放在 `user-profile/.athena-odbc/`目錄中，檔案許可僅限於擁有的使用者，與 AWS CLI 保護本機儲存憑證的方式一致。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| browser\$1azure\$1cache | 選用 | 1 | browser\$1azure\$1cache=0; | 

# 瀏覽器 SAML
<a name="odbc-v2-driver-browser-saml"></a>

瀏覽器 SAML 是一般身分驗證外掛程式，可與 SAML 型身分提供者搭配使用並支援多重因素認證。如需詳細的組態資訊，請參閱 [使用 ODBC、SAML 2.0 和 Okta 身分提供者設定單一登入](okta-saml-sso.md)。

**注意**  
**v2.1.0.0 安全性更新：**從 v2.1.0.0 開始，BrowserSAML 外掛程式會透過 RelayState 驗證包含 CSRF 保護。驅動程式會產生隨機狀態字符，將其做為 RelayState 參數包含在登入 URL 中，並在接受 SAML 聲明之前針對收到的回應進行驗證。

## 身分驗證類型
<a name="odbc-v2-driver-browser-saml-authentication-type"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=BrowserSAML; | 

## 偏好的角色
<a name="odbc-v2-driver-browser-saml-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如果您的 SAML 聲明具有多個角色，您可以指定此參數來選擇要擔任的角色。此角色應出現在 SAML 聲明中。如需有關 ARN 角色的詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| preferred\$1role | 選用 | none | preferred\$1role=arn:aws:IAM::123456789012:id/user1; | 

## 工作階段持續時間
<a name="odbc-v2-driver-browser-saml-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| 持續時間 | 選用 | 900 | duration=900; | 

## 登入 URL
<a name="odbc-v2-driver-browser-saml-login-url"></a>

為您的應用程式顯示的單一登入 URL。

**重要**  
從 v2.1.0.0 開始，登入 URL 必須使用具有有效授權的 HTTP 或 HTTPS 通訊協定。驅動程式會在啟動身分驗證流程之前驗證 URL 格式。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| login\$1url | 必要 | none | login\$1url=https://trial-1234567.okta.com/app/trial-1234567\$1oktabrowsersaml\$11/zzz4izzzAzDFBzZz1234/sso/saml; | 

## 接聽連接埠
<a name="odbc-v2-driver-browser-saml-listen-port"></a>

用來接聽 SAML 回應的連接埠號碼。此值應與您設定 IdP 時使用的 IAM Identity Center URL 相符 (例如，`http://localhost:7890/athena`)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| listen\$1port | 選用 | 7890 | listen\$1port=7890; | 

## Timeout (逾時)
<a name="odbc-v2-driver-browser-saml-timeout"></a>

外掛程式停止等待來自身分提供者的 SAML 回應之前的持續時間 (以秒為單位)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| timeout | 選用 | 120 | timeout=90; | 

# 瀏覽器 SSO OIDC
<a name="odbc-v2-driver-browser-sso-oidc"></a>

瀏覽器 SSO OIDC 是可與 搭配使用的身分驗證外掛程式 AWS IAM Identity Center。如需有關啟用和使用 IAM Identity Center 的資訊，請參閱《*AWS IAM Identity Center 使用者指南*》中的[步驟 1：啟用 IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/get-started-enable-identity-center.html)

**注意**  
**v2.1.0.0 安全更新：**從 2.1.0.0 版開始，BrowserSSOOIDC 外掛程式使用授權碼搭配 PKCE 而非裝置碼授權，以提高安全性。此變更會消除裝置程式碼顯示步驟，並提供更快速的身分驗證。OAuth 2.0 回呼伺服器會使用新`listen_port`參數 （預設 7890)。您可能需要允許列出您網路上的此連接埠。預設範圍已變更為 `sso:account:access`。

## 身分驗證類型
<a name="odbc-v2-driver-browser-sso-oidc-authentication-type"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=BrowserSSOOIDC; | 

## IAM Identity Center 啟動 URL
<a name="odbc-v2-driver-browser-sso-oidc-sso-start-url"></a>

 AWS 存取入口網站的 URL。IAM Identity Center [RegisterClient](https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_RegisterClient.html) API 動作會將此值用於 `issuerUrl` 參數。

**複製 AWS 存取入口網站 URL**

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

1. 在導覽窗格中，選擇**設定**。

1. 在**設定**頁面的**身分來源**下，選擇 **AWS 存取入口網站 URL** 的剪貼簿圖示。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| sso\$1oidc\$1start\$1url | 必要 | none | sso\$1oidc\$1start\$1url=https://app\$1id.awsapps.com/start; | 

## IAM Identity Center 區域
<a name="odbc-v2-driver-browser-sso-oidc-sso-region"></a>

設定 SSO AWS 區域 的 。`SSOOIDCClient` 和 `SSOClient` AWS SDK 用戶端會針對 `region` 參數使用此值。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| sso\$1oidc\$1region | 必要 | none | sso\$1oidc\$1region=us-east-1; | 

## 範圍
<a name="odbc-v2-driver-browser-sso-oidc-scopes"></a>

用戶端所定義的範圍清單。授權後，此清單會在授予存取字符時限制許可。IAM Identity Center [RegisterClient](https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_RegisterClient.html) API 動作會將此值用於 `scopes` 參數。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| sso\$1oidc\$1scopes | 選用 | sso:account:access | sso\$1oidc\$1scopes=sso:account:access; | 

## 帳戶 ID
<a name="odbc-v2-driver-browser-sso-oidc-account-id"></a>

 AWS 帳戶 指派給使用者的 識別符。IAM Identity Center [GetRoleCredentials](https://docs.aws.amazon.com/singlesignon/latest/PortalAPIReference/API_GetRoleCredentials.html) API 使用此值做為 `accountId` 參數。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| sso\$1oidc\$1account\$1id | 必要 | none | sso\$1oidc\$1account\$1id=123456789123; | 

## 角色名稱
<a name="odbc-v2-driver-browser-sso-oidc-role-name"></a>

指派給使用者的角色的易記名稱。您為此許可集指定的名稱會在 AWS 存取入口網站中顯示為可用角色。IAM Identity Center [GetRoleCredentials](https://docs.aws.amazon.com/singlesignon/latest/PortalAPIReference/API_GetRoleCredentials.html) API 使用此值做為 `roleName` 參數。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| sso\$1oidc\$1role\$1name | 必要 | none | sso\$1oidc\$1role\$1name=AthenaReadAccess; | 

## Timeout (逾時)
<a name="odbc-v2-driver-browser-sso-oidc-timeout"></a>

輪詢 SSO API 應檢查存取字符的秒數。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| sso\$1oidc\$1timeout | 選用 | 120 | sso\$1oidc\$1timeout=60; | 

## 接聽連接埠
<a name="odbc-v2-driver-browser-sso-oidc-listen-port"></a>

用於 OAuth 2.0 回呼伺服器的本機連接埠號碼。這用作重新導向 URI，您可能需要允許列出網路上的此連接埠。預設產生的重新導向 URI 為：`http://localhost:7890/athena`。此參數已在 v2.1.0.0 中新增，做為從 Device Code 遷移至 Authorization Code with PKCE 的一部分。

**警告**  
在 Windows Terminal Server 或遠端桌面服務等共用環境中，循環連接埠 （預設值：7890) 會在相同機器上的所有使用者之間共用。系統管理員可以透過下列方式降低潛在的連接埠劫持風險：  
為不同的使用者群組設定不同的連接埠號碼
使用 Windows 安全政策來限制連接埠存取
在使用者工作階段之間實作網路隔離


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| listen\$1port | 選用 | 7890 | listen\$1port=8080; | 

## 啟用檔案快取
<a name="odbc-v2-driver-browser-sso-oidc-file-cache"></a>

啟用臨時憑證快取。此連線參數可讓您在多個程序之間快取，及重複使用臨時憑證。使用此選項可減少當您使用 BI 工具 (如 Microsoft Power BI) 時，開啟瀏覽器視窗的數目。

**注意**  
從 v2.1.0.0 開始，快取的憑證會以純文字 JSON 形式存放在 `user-profile/.athena-odbc/`目錄中，檔案許可僅限於擁有的使用者，與 AWS CLI 保護本機儲存憑證的方式一致。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| sso\$1oidc\$1cache | 選用 | 1 | sso\$1oidc\$1cache=0; | 

# 預設憑證
<a name="odbc-v2-driver-default-credentials"></a>

您可以使用在用戶端系統上設定的預設憑證連線至 Amazon Athena。如需有關使用預設憑證的資訊，請參閱《*適用於 Java 的 AWS SDK 開發人員指南*》中的[使用預設憑證提供者鏈結](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default)。

## 身分驗證類型
<a name="odbc-v2-driver-default-credentials-authentication"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=Default Credentials; | 

# 外部憑證
<a name="odbc-v2-driver-external-credentials"></a>

外部憑證的一般身分驗證外掛程式，可用來連線至任何外部 SAML 型身分提供者的外掛程式。若要使用外掛程式，您可以傳遞可傳回 SAML 回應的可執行檔。

## 身分驗證類型
<a name="odbc-v2-driver-driver-external-credentials-authentication-type"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=External Credentials; | 

## 可執行路徑
<a name="odbc-v2-driver-driver-external-credentials-executable-path"></a>

包含自訂 SAML 型憑證提供者的邏輯的可執行檔路徑。可執行檔的輸出必須是身分提供者所解析的 SAML 回應。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| ExecutablePath | 必要 | none | ExecutablePath=C:\$1Users\$1user\$1name\$1external\$1credential.exe | 

## 引數清單
<a name="odbc-v2-driver-driver-external-credentials-argument-list"></a>

您要傳遞至可執行檔的引數清單。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| ArgumentList | 選用 | none | ArgumentList=arg1 arg2 arg3 | 

# 執行個體設定檔
<a name="odbc-v2-driver-instance-profile"></a>

此身份驗證類型用於 EC2 執行個體，並透過 Amazon EC2 中繼資料服務傳遞。

## 身分驗證類型
<a name="odbc-v2-driver-instance-profile-authentication-type"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=Instance Profile; | 

# JWT
<a name="odbc-v2-driver-jwt"></a>

JWT (JSON Web Token) 外掛程式提供了一個介面，該介面使用 JSON Web Token 來擔任 Amazon IAM 角色。組態取決於身分提供者。如需設定 Google Cloud 聯合的相關資訊 AWS，請參閱 Google Cloud 文件中的[使用 AWS 或 Azure 設定工作負載聯合身分](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds)。

## 身分驗證類型
<a name="odbc-v2-driver-jwt-authentication-type"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=JWT; | 

## 偏好的角色
<a name="odbc-v2-driver-jwt-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如需有關 ARN 角色的詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| preferred\$1role | 選用 | none | preferred\$1role=arn:aws:IAM::123456789012:id/user1; | 

## 工作階段持續時間
<a name="odbc-v2-driver-jwt-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需有關工作階段持續時間的詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| 持續時間 | 選用 | 900 | duration=900; | 

## JSON Web Token
<a name="odbc-v2-driver-jwt-json-web-token"></a>

用於使用 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) AWS STS API 動作擷取 IAM 臨時登入資料的 JSON Web 字符。如需有關為 Google Cloud Platform (GCP) 使用者產生 JSON Web Token 的資訊，請參閱 Google Cloud 文件中的[使用 JWT OAuth 字符](https://cloud.google.com/apigee/docs/api-platform/security/oauth/using-jwt-oauth)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| web\$1identity\$1token | 必要 | none | web\$1identity\$1token=eyJhbGc...<remainder of token>; | 

## 角色工作階段名稱
<a name="odbc-v2-driver-jwt-role-session-name"></a>

工作階段的名稱。一種常見技術是將應用程式使用者的名稱或識別符用作角色工作階段名稱。這可方便地將您應用程式使用的暫時安全憑證與對應的使用者建立關聯。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| role\$1session\$1name | 必要 | none | role\$1session\$1name=familiarname; | 

# JWT 可信身分傳播憑證提供者
<a name="odbc-v2-driver-jwt-tip"></a>

此身分驗證類型允許您使用從外部身分提供者獲得的 JSON Web Token (JWT) 作為連線參數，向 Athena 進行身分驗證。您可以使用此外掛程式，透過可信身分傳播啟用對企業身分的支援。

透過信任的身分傳播，身分內容會新增至 IAM 角色，以識別請求存取 AWS 資源的使用者。如需有關啟用和使用可信身分傳播的資訊，請參閱[什麼是可信身分傳播？](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation.html)。

## 身分驗證類型
<a name="odbc-v2-driver-jwt-tip-authentication-type"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=JWT\$1TIP; | 

## JWT web 身分權杖
<a name="odbc-v2-driver-jwt-tip-web-identity-token"></a>

從外部聯合身分提供者獲得的 JWT 權杖。此權杖將用於向 Athena 進行身分驗證。權杖快取預設為啟用，並允許在不同的驅動器連線之間使用相同的 Identity Center 存取權杖。我們建議在「測試連線」時提供新的 JWT 權杖，因為交換的權杖僅在驅動器執行個體處於作用中狀態期間才會存在。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| web\$1identity\$1token | 必要 | none | web\$1identity\$1token=eyJhbGc...<remainder of token>; | 

## 工作群組 Arn
<a name="odbc-v2-driver-jwt-tip-workgroup-arn"></a>

Amazon Athena 工作群組的 Amazon Resource Name (ARN)。如需有關工作群組的詳細資訊，請參閱[工作群組](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroup.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| WorkGroupArn | 必要 | none | WorkgroupArn=arn:aws:athena:us-west-2:111122223333:workgroup/primary | 

## JWT 應用程式角色 ARN
<a name="odbc-v2-driver-jwt-tip-application-role-arn"></a>

要擔任的角色 ARN。此角色可用於 JWT 交換、透過工作群組標籤取得 IAM Identity Center 客戶自管應用程式 ARN，以及取得存取角色 ARN。如需有關擔任角色的詳細資訊，請參閱 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| ApplicationRoleArn | 必要 | none | ApplicationRoleArn=arn:aws:iam::111122223333:role/applicationRole; | 

## 角色工作階段名稱
<a name="odbc-v2-driver-jwt-tip-role-session-name"></a>

工作階段的名稱。名稱可隨意指定，但是一般來說，您會傳遞與應用程式使用者相關聯的名稱或識別碼。這樣一來，應用程式使用的臨時安全憑證會與該使用者相關聯。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| role\$1session\$1name | 必要 | none | role\$1session\$1name=familiarname; | 

## 工作階段持續時間
<a name="odbc-v2-driver-jwt-tip-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需有關工作階段持續時間的詳細資訊，請參閱 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| 持續時間 | 選用 | 3600 | duration=900; | 

## JWT 存取角色 ARN
<a name="odbc-v2-driver-jwt-tip-access-role-arn"></a>

要擔任的角色 ARN。此為 Athena 擔任的角色，可代表您進行呼叫。如需有關擔任角色的詳細資訊，請參閱 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AccessRoleArn | 選用 | none | AccessRoleArn=arn:aws:iam::111122223333:role/accessRole; | 

## IAM Identity Center 客戶自管應用程式 ARN
<a name="odbc-v2-driver-jwt-tip-customer-idc-application-arn"></a>

IAM Identity Center 客戶自管 IDC 應用程式的 ARN。如需有關客戶受管應用程式的詳細資訊，請參閱[客戶自管應用程式](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| CustomerIdcApplicationArn | 選用 | none | CustomerIdcApplicationArn=arn:aws:sso::111122223333:application/ssoins-111122223333/apl-111122223333 | 

## 啟用檔案快取
<a name="odbc-v2-driver-jwt-tip-file-cache"></a>

啟用臨時憑證快取。此連線參數可讓您在多個程序之間快取並重複使用臨時憑證。使用此選項可減少當您使用 BI 工具 (如 Microsoft Power BI) 時，Web 身分權杖的數目。依預設，驅動器會在 Windows 中使用 `%USERPROFILE%` 和 `HOME` 路徑來寫入檔案快取。請確保您為這兩個環境變數中存在的路徑提供讀取和寫入存取權，以獲得更好的體驗。

**注意**  
從 v2.1.0.0 開始，快取的登入資料會以純文字 JSON 形式存放在 `user-profile/.athena-odbc/`目錄中，檔案許可僅限於擁有的使用者，與 AWS CLI 保護本機儲存的登入資料的方式一致。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| JwtTipFileCache | 選用 | 0 | JwtTipFileCache=1; | 

# 瀏覽器信任的身分傳播憑證
<a name="odbc-v2-driver-browser-oidc-tip"></a>

此身分驗證類型可讓您從外部身分提供者擷取新的 JSON Web 字符 (JWT)，並使用 Athena 進行身分驗證。您可以使用此外掛程式，透過可信身分傳播啟用對企業身分的支援。如需有關如何搭配使用可信身分傳播與驅動器的詳細資訊，請參閱 [搭配使用可信身分傳播與 Amazon Athena 驅動器](using-trusted-identity-propagation.md)。您也可以[使用 CloudFormation 設定和部署資源](using-trusted-identity-propagation-cloudformation.md)。

透過信任的身分傳播，身分內容會新增至 IAM 角色，以識別請求存取 AWS 資源的使用者。如需有關啟用和使用可信身分傳播的資訊，請參閱[什麼是可信身分傳播？](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation.html)。

**注意**  
外掛程式專為單一使用者桌面環境而設計。在 Windows Server 等共用環境中，系統管理員負責建立和維護使用者之間的安全界限。

## 身分驗證類型
<a name="odbc-v2-driver-browser-oidc-tip-authentication-type"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | none | AuthenticationType=BrowserOidcTip; | 

## IDP 已知組態 URL
<a name="odbc-v2-driver-browser-oidc-tip-idp-well-known-config"></a>

IDP Well Known 組態 URL 是為您的身分提供者提供 OpenID Connect 組態詳細資訊的端點。此 URL 通常會以 結尾，`.well-known/openid-configuration`並包含有關身分驗證端點、支援的功能和字符簽署金鑰的基本中繼資料。例如，如果您使用的是 *Okta*，URL 可能看起來像 `https://your-domain.okta.com/.well-known/openid-configuration`。

針對疑難排解：如果您收到連線錯誤，請確認此 URL 可從您的網路存取，並傳回有效的 *OpenID Connect* 組態 JSON。此 URL 必須由安裝驅動程式的用戶端連線，且應由您的身分提供者管理員提供。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| IdpWellKnownConfigurationUrl | 必要 | none | IdpWellKnownConfigurationUrl=https://<your-domain>/.well-known/openid-configuration; | 

## 用戶端識別符
<a name="odbc-v2-driver-browser-oidc-tip-client-id"></a>

OpenID Connect 提供者向應用程式發出的用戶端識別符。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| client\$1id | 必要 | none | client\$1id=00001111-aaaa-2222-bbbb-3333cccc4444; | 

## 工作群組 ARN
<a name="odbc-v2-driver-browser-oidc-tip-workgroup-arn"></a>

Amazon Athena 工作群組的 Amazon Resource Name (ARN)，其中包含信任的身分傳播組態標籤。如需有關工作群組的詳細資訊，請參閱[工作群組](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroup.html)。

**注意**  
此參數與指定查詢執行位置的 `Workgroup` 參數不同。您必須設定這兩個參數：  
`WorkgroupArn` - 指向包含信任身分傳播組態標籤的工作群組
`Workgroup` - 指定要執行查詢的工作群組
雖然這些參數通常會參考相同的工作群組，但必須明確設定這兩個參數才能正常運作。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| WorkGroupArn | 必要 | none | WorkgroupArn=arn:aws:athena:us-west-2:111122223333:workgroup/primary | 

## JWT 應用程式角色 ARN
<a name="odbc-v2-driver-browser-oidc-tip-application-role-arn"></a>

將在 JWT 交換中擔任的角色 ARN。此角色可用於 JWT 交換、透過工作群組標籤取得 IAM Identity Center 客戶自管應用程式 ARN，以及取得存取角色 ARN。如需有關擔任角色的詳細資訊，請參閱 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| ApplicationRoleArn | 必要 | none | ApplicationRoleArn=arn:aws:iam::111122223333:role/applicationRole; | 

## 角色工作階段名稱
<a name="odbc-v2-driver-browser-oidc-tip-role-session-name"></a>

IAM 工作階段的名稱。名稱可隨意指定，但是一般來說，您會傳遞與應用程式使用者相關聯的名稱或識別碼。這樣一來，應用程式使用的臨時安全憑證會與該使用者相關聯。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| role\$1session\$1name | 必要 | none | role\$1session\$1name=familiarname; | 

## Client secret (用戶端密碼)
<a name="odbc-v2-driver-browser-oidc-tip-client-secret"></a>

用戶端秘密是由您的身分提供者發行的機密金鑰，用於驗證您的應用程式。雖然此參數是選用的，而且可能不是所有身分驗證流程的必要項目，但在使用時提供額外的安全層。如果您的 IDP 組態需要用戶端秘密，您必須將此參數包含身分提供者管理員提供的值。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| client\$1secret | 選用 | none | client\$1secret=s0m3R@nd0mS3cr3tV@lu3Th@tS3cur3lyPr0t3ct5Th3Cl13nt;\$1 | 

## Scope (範圍)
<a name="odbc-v2-driver-browser-oidc-tip-scope"></a>

範圍會指定應用程式向身分提供者請求的存取層級。您必須在 `openid` 範圍內包含 ，才能接收包含基本使用者身分宣告的 ID 字符。您的範圍可能需要包含其他許可，例如 `email`或 `profile`，取決於哪些使用者宣告您的身分提供者 （例如 *Microsoft Entra ID*) 已設定為包含在 ID 字符中。這些宣告對於適當的*受信任身分傳播*映射至關重要。如果使用者身分映射失敗，請確認您的範圍包含所有必要的許可，且您的身分提供者已設定為在 ID 字符中包含必要的宣告。這些宣告必須符合 IAM Identity Center 中的*受信任權杖發行者*映射組態。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| Scope (範圍) | 選用 | openid email offline\$1access | Scope=openid email; | 

## 工作階段持續時間
<a name="odbc-v2-driver-browser-oidc-tip-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需詳細資訊，請參閱 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| 持續時間 | 選用 | 3600 | duration=900; | 

## JWT 存取角色 ARN
<a name="odbc-v2-driver-browser-oidc-tip-access-role-arn"></a>

Athena 代您呼叫所擔任角色的 ARN。如需有關擔任角色的詳細資訊，請參閱《AWS Security Token Service API 參考**》中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AccessRoleArn | 選用 | none | AccessRoleArn=arn:aws:iam::111122223333:role/accessRole; | 

## IAM Identity Center 客戶自管應用程式 ARN
<a name="odbc-v2-driver-browser-oidc-tip-customer-idc-application-arn"></a>

IAM Identity Center 客戶自管 IDC 應用程式的 ARN。如需有關客戶受管應用程式的詳細資訊，請參閱[客戶自管應用程式](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| CustomerIdcApplicationArn | 選用 | none | CustomerIdcApplicationArn=arn:aws:sso::111122223333:application/ssoins-111122223333/apl-111122223333; | 

## 身分提供者連接埠號碼
<a name="odbc-v2-driver-browser-oidc-tip-port-number"></a>

用於 OAuth 2.0 回呼伺服器的本機連接埠號碼。這用作 redirect\$1uri，您需要允許在 IDP 應用程式中將其列出。預設產生的 redirect\$1uri 為：http：//localhost：7890/athena

**警告**  
在共用環境中，例如 Windows Terminal Server 或遠端桌面服務，循環連接埠 （預設值：7890) 會在相同機器上的所有使用者之間共用。系統管理員可以透過下列方式降低潛在的連接埠劫持風險：  
為不同的使用者群組設定不同的連接埠號碼
使用 Windows 安全政策來限制連接埠存取
在使用者工作階段之間實作網路隔離
如果無法實作這些安全控制，建議您改用 [JWT 信任的身分傳播](odbc-v2-driver-jwt-tip.md)外掛程式，這不需要迴路連接埠。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| listen\$1port | 選用 | 7890 | listen\$1port=8080; | 

## 識別提供者回應逾時
<a name="odbc-v2-driver-browser-oidc-tip-response-timeout"></a>

等待 OAuth 2.0 回呼回應的逾時，以秒為單位。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| IdpResponseTimeout | 選用 | 120 | IdpResponseTimeout=140; | 

## 啟用檔案快取
<a name="odbc-v2-driver-browser-oidc-tip-enable-token-caching"></a>

JwtTipFileCache 參數會判斷驅動程式是否在連線之間快取身分驗證字符。將 JwtTipFileCache 設為 true 可減少身分驗證提示並改善使用者體驗，但應謹慎使用。此設定最適合單一使用者桌面環境。在 Windows Server 等共用環境中，建議將其停用，以防止具有類似連線字串的使用者之間進行潛在的字符共用。

對於使用 PowerBI Server 等工具的企業部署，我們建議您使用 [JWT 信任的身分傳播](odbc-v2-driver-jwt-tip.md)外掛程式，而不是此身分驗證方法。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| JwtTipFileCache | 選用 | 0 | JwtTipFileCache=1; | 

# Okta
<a name="odbc-v2-driver-okta"></a>

Okta 是 SAML 型身分驗證外掛程式，可與 Okta 身分提供者搭配使用。如需有關設定 Okta 和 Amazon Athena 的聯合的資訊，請參閱 [使用 Okta 外掛程式和 Okta 身分提供者設定 ODBC 的 SSO](odbc-okta-plugin.md)。

## 身分驗證類型
<a name="odbc-v2-driver-okta-authentication-type"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=Okta; | 

## 使用者 ID
<a name="odbc-v2-driver-okta-user-id"></a>

您的 Okta 使用者名稱。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| UID | 必要 | none | UID=jane.doe@org.com; | 

## 密碼
<a name="odbc-v2-driver-okta-password"></a>

您的 Okta 使用者密碼。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| PWD | 必要 | none | PWD=oktauserpasswordexample; | 

## 偏好的角色
<a name="odbc-v2-driver-okta-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如需有關 ARN 角色的詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| preferred\$1role | 選用 | none | preferred\$1role=arn:aws:IAM::123456789012:id/user1; | 

## 工作階段持續時間
<a name="odbc-v2-driver-okta-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| 持續時間 | 選用 | 900 | duration=900; | 

## IdP 主機
<a name="odbc-v2-driver-okta-idp-host"></a>

您的 Okta 組織的 URL。您可以從 Okta 應用程式中的**內嵌連結** URL 擷取 `idp_host` 參數。如需這些步驟，請參閱 [從 Okta 擷取 ODBC 組態資訊](odbc-okta-plugin.md#odbc-okta-plugin-retrieve-odbc-configuration-information-from-okta)。`https://` 後的第一個區段、直到並包括 `okta.com` 即為您的 IdP 主機 (例如 `http://trial-1234567.okta.com`)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| idp\$1host | 必要 | None | idp\$1host=dev-99999999.okta.com; | 

## IdP 連接埠
<a name="odbc-v2-driver-okta-idp-port"></a>

用於連線至 IdP 主機的連接埠號碼。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| idp\$1port | 必要 | None | idp\$1port=443; | 

## Okta 應用程式 ID
<a name="odbc-v2-driver-okta-app-id"></a>

您應用程式的兩部分識別符。您可以從 Okta 應用程式中的**內嵌連結** URL 擷取 `app_id` 參數。如需這些步驟，請參閱 [從 Okta 擷取 ODBC 組態資訊](odbc-okta-plugin.md#odbc-okta-plugin-retrieve-odbc-configuration-information-from-okta)。應用程式 ID 是 URL 的最後兩個區段，包括中間的正斜線。這些區段是兩個由 20 個字元組成的字串，其中包含數字和大小寫字母的混合 (例如 `Abc1de2fghi3J45kL678/abc1defghij2klmNo3p4`)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| app\$1id | 必要 | None | app\$1id=0oa25kx8ze9A3example/alnexamplea0piaWa0g7; | 

## Okta 應用程式名稱
<a name="odbc-v2-driver-okta-app-name"></a>

Okta 應用程式的名稱。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| app\$1name | 必要 | None | app\$1name=amazon\$1aws\$1redshift; | 

## Okta 等待時間
<a name="odbc-v2-driver-okta-wait-time"></a>

指定等待多重要素驗證 (MFA) 程式碼的持續時間 (以秒為單位)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| okta\$1mfa\$1wait\$1time | 選用 | 10 | okta\$1mfa\$1wait\$1time=20; | 

## Okta MFA 類型
<a name="odbc-v2-driver-okta-mfa-type"></a>

MFA 因素類型。支援的類型包括 Google Authenticator、SMS (Okta)、Okta Verify with Push 和 Okta Verify with TOTP。個別組織安全政策會判斷使用者登入是否需要 MFA。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **可能的值** | **連線字串範例** | 
| --- | --- | --- | --- | --- | 
| okta\$1mfa\$1type | Optional | None | googleauthenticator, smsauthentication, oktaverifywithpush, oktaverifywithtotp | okta\$1mfa\$1type=oktaverifywithpush; | 

## Okta 電話號碼
<a name="odbc-v2-driver-okta-phone-number"></a>

要與 AWS SMS 身分驗證搭配使用的電話號碼。僅多重要素註冊需要此參數。如果您的手機號碼已經註冊，或者安全政策未使用 AWS SMS 身分驗證，則可以忽略此欄位。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| okta\$1mfa\$1phone\$1number | 需要 MFA 註冊，否則為選用 | None | okta\$1mfa\$1phone\$1number=19991234567; | 

## 啟用 Okta 檔案快取
<a name="odbc-v2-driver-okta-file-cache"></a>

啟用臨時憑證快取。此連線參數可讓您在 BI 應用程式開啟的多個程序之間快取及重複使用臨時憑證。使用此選項可避免 Okta API 限流限制。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| okta\$1cache | 選用 | 0 | okta\$1cache=1; | 

# Ping
<a name="odbc-v2-driver-ping"></a>

Ping 是 SAML 型外掛程式，可與 [PingFederate](https://www.pingidentity.com/en/platform/capabilities/authentication-authority/pingfederate.html) 身分提供者搭配使用。

## 身分驗證類型
<a name="odbc-v2-driver-ping-authentication-type"></a>


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| AuthenticationType | 必要 | IAM Credentials | AuthenticationType=Ping; | 

## 使用者 ID
<a name="odbc-v2-driver-ping-user-id"></a>

PingFederate 伺服器的使用者名稱。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| UID | 必要 | none | UID=pingusername@domain.com; | 

## 密碼
<a name="odbc-v2-driver-ping-password"></a>

PingFederate 伺服器的密碼。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| PWD | 必要 | none | PWD=pingpassword; | 

## 偏好的角色
<a name="odbc-v2-driver-ping-preferred-role"></a>

要擔任之角色的 Amazon Resource Name (ARN)。如果您的 SAML 聲明具有多個角色，您可以指定此參數來選擇要擔任的角色。此角色應出現在 SAML 聲明中。如需有關 ARN 角色的詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| preferred\$1role | 選用 | none | preferred\$1role=arn:aws:iam::123456789012:id/user1; | 

## 工作階段持續時間
<a name="odbc-v2-driver-ping-session-duration"></a>

角色工作階段的持續時間 (以秒為單位)。如需有關工作階段持續時間的詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| 持續時間 | 選用 | 900 | duration=900; | 

## IdP 主機
<a name="odbc-v2-driver-ping-idp-host"></a>

Ping 伺服器的地址。若要尋找您的地址，請造訪下列 URL 並檢視 **SSO 應用程式端點**欄位。

```
https://your-pf-host-#:9999/pingfederate/your-pf-app#/spConnections         
```


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| idp\$1host | 必要 | none | idp\$1host=ec2-1-83-65-12.compute-1.amazonaws.com; | 

## IdP 連接埠
<a name="odbc-v2-driver-ping-idp-port"></a>

用於連線至 IdP 主機的連接埠號碼。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| idp\$1port | 必要 | None | idp\$1port=443; | 

## 合作夥伴 SPID
<a name="odbc-v2-driver-ping-partner-spid"></a>

服務提供者地址。若要尋找服務提供者地址，請造訪下列 URL 並檢視 **SSO 應用程式端點**欄位。

```
https://your-pf-host-#:9999/pingfederate/your-pf-app#/spConnections         
```


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| partner\$1spid | 必要 | None | partner\$1spid=https://us-east-1.signin.aws.amazon.com/platform/saml/<...>; | 

## Ping URI 參數
<a name="odbc-v2-driver-ping-uri-param"></a>

將身分驗證請求的 URI 引數傳遞給 Ping。使用此參數可繞過 Lake Formation 的單一角色限制。設定 Ping 以識別傳遞的參數，並驗證傳遞的角色存在於分配給使用者的角色清單中。然後，在 SAML 聲明中傳送單個角色。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| ping\$1uri\$1param | 選用 | None | ping\$1uri\$1param=role=my\$1iam\$1role; | 

# 常用身分驗證參數
<a name="odbc-v2-driver-common-authentication-parameters"></a>

如上所述，本節中的參數對於驗證類型而言非常常見。

## 將代理用於 IdP
<a name="odbc-v2-driver-common-authentication-parameters-use-proxy-for-idp"></a>

透過代理 Proxy 啟用驅動程式與 IdP 之間的通訊。此選項適用於下列身分驗證外掛程式：
+ AD FS
+ Azure AD
+ 瀏覽器 Azure AD
+ 瀏覽器 SSO OIDC
+ JWT 可信身分傳播
+ JWT
+ JWT 可信身分傳播
+ 瀏覽器信任的身分傳播
+ Okta
+ Ping


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| UseProxyForIdP | 選用 | 0 | UseProxyForIdP=1; | 

## 使用 Lake Formation
<a name="odbc-v2-driver-common-authentication-parameters-use-lake-formation"></a>

使用 [AssumeDecoratedRoleWithSAML](https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_AssumeDecoratedRoleWithSAML.html) Lake Formation API 動作來擷取臨時 IAM 登入資料，而不是 [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) AWS STS API 動作。此選項適用於 Azure AD、瀏覽器 Azure AD、瀏覽器 SAML、Okta、Ping 和 AD FS 身分驗證外掛程式。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| LakeformationEnabled | 選用 | 0 | LakeformationEnabled=1; | 

## SSL 不安全 (IdP)
<a name="odbc-v2-driver-common-authentication-parameters-ssl-insecure-idp"></a>

與 IdP 通訊時停用 SSL。此選項適用於 Azure AD、瀏覽器 Azure AD、Okta、Ping 和 AD FS 身分驗證外掛程式。

**重要**  
v**2.1.0.0 中的重大變更：**連線至身分提供者時 SSL 憑證驗證的預設行為已變更。在 2.1.0.0 之前的版本中，預設為停用 SSL 驗證。從 v2.1.0.0 開始，所有 IdP 連線預設都會啟用 SSL 驗證。驅動程式也會強制執行 TLS 1.2 作為最低 TLS 版本。如果您使用沒有有效 SSL 憑證的本機身分提供者 （僅用於測試），請在連線字串`SSL_Insecure=1`中設定 。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| SSL\$1Insecure | 選用 | 0 | SSL\$1Insecure=1; | 

# 端點覆寫
<a name="odbc-v2-driver-endpoint-overrides"></a>

## Athena 端點覆寫
<a name="odbc-v2-driver-endpoint-overrides-athena"></a>

`endpointOverride ClientConfiguration` 類別會使用此值覆寫 Amazon Athena 用戶端的預設 HTTP 端點。如需詳細資訊，請參閱《適用於 C\$1\$1 的 AWS SDK 開發人員指南》**中的 [AWS 用戶端組態](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| EndpointOverride | 選用 | none | EndpointOverride=athena.us-west-2.amazonaws.com; | 

## Athena 串流端點覆寫
<a name="odbc-v2-driver-endpoint-overrides-athena-streaming"></a>

`ClientConfiguration.endpointOverride` 方法會使用此值覆寫 Amazon Athena 串流用戶端的預設 HTTP 端點。如需詳細資訊，請參閱《*適用於 C\$1\$1 的 AWS SDK 開發人員指南*》中的 [AWS 用戶端組態](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。Athena 串流服務可透過連接埠 444 使用。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| StreamingEndpointOverride | 選用 | none | StreamingEndpointOverride=athena.us-west-1.amazonaws.com:444; | 

## AWS STS 端點覆寫
<a name="odbc-v2-driver-endpoint-overrides-sts"></a>

`ClientConfiguration.endpointOverride` 方法使用此值來覆寫 AWS STS 用戶端的預設 HTTP 端點。如需詳細資訊，請參閱《適用於 C\$1\$1 的 AWS SDK 開發人員指南》**中的 [AWS 用戶端組態](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| StsEndpointOverride | 選用 | none | StsEndpointOverride=sts.us-west-1.amazonaws.com; | 

## Lake Formation 端點覆寫
<a name="odbc-v2-driver-endpoint-overrides-lake-formation"></a>

`ClientConfiguration.endpointOverride` 方法會使用此值覆寫 Lake Formation 用戶端的預設 HTTP 端點。如需詳細資訊，請參閱《適用於 C\$1\$1 的 AWS SDK 開發人員指南》**中的 [AWS 用戶端組態](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| LakeFormationEndpointOverride | 選用 | none | LakeFormationEndpointOverride=lakeformation.us-west-1.amazonaws.com; | 

## SSO 端點覆寫
<a name="odbc-v2-driver-endpoint-overrides-sso"></a>

`ClientConfiguration.endpointOverride` 方法會使用此值覆寫 SSO 用戶端的預設 HTTP 端點。如需詳細資訊，請參閱《適用於 C\$1\$1 的 AWS SDK 開發人員指南》**中的 [AWS 用戶端組態](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
|  SSOEndpointOverride  | 選用 | none | SSOEndpointOverride=portal.sso.us-east-2.amazonaws.com; | 

## SSO OIDC 端點覆寫
<a name="odbc-v2-driver-endpoint-overrides-sso-oidc"></a>

`ClientConfiguration.endpointOverride` 方法會使用此值覆寫 SSO OIDC 用戶端的預設 HTTP 端點。如需詳細資訊，請參閱《適用於 C\$1\$1 的 AWS SDK 開發人員指南》**中的 [AWS 用戶端組態](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
|  SSOOIDCEndpointOverride  | 選用 | none | SSOOIDCEndpointOverride=oidc.us-east-2.amazonaws.com | 

## SSO 管理員端點覆寫
<a name="odbc-v2-driver-endpoint-overrides-sso-admin"></a>

`ClientConfiguration.endpointOverride` 方法會使用此值覆寫 SSO 管理員用戶端的預設 HTTP 端點。如需詳細資訊，請參閱 [ClientConfiguration](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| SSOAdminEndpointOverride | 選用 | 無 | SSOAdminEndpointOverride=sso.us-east-2.amazonaws.com | 

## S3 端點覆寫
<a name="odbc-v2-driver-endpoint-overrides-s3"></a>

`ClientConfiguration.endpointOverride` 方法會使用此值覆寫 S3 用戶端的預設 HTTP 端點。當驅動程式使用 Amazon S3 擷取程式時，將用來下載查詢結果的端點。若沒有指定此參數，則驅動程式會使用預設的 Amazon S3 端點。如需詳細資訊，請參閱 [ClientConfiguration](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| S3EndpointOverride | 選用 | 無 | S3EndpointOverride=s3.us-east-2.amazonaws.com | 

# 進階選項
<a name="odbc-v2-driver-advanced-options"></a>

## 擷取大小
<a name="odbc-v2-driver-advanced-options-fetch-size"></a>

本次請求傳回結果 (列) 的最大數量。如需參數資訊，請參閱 [GetQuery MaxResults](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryResults.html#athena-GetQueryResults-request-MaxResults)。對於串流 API，最大值為 10000000。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| RowsToFetchPerBlock | 選用 |  非串流為 `1000` 串流為 `20000`  | RowsToFetchPerBlock=20000; | 

## 結果擷取程式
<a name="odbc-v2-driver-advanced-options-result-fetcher"></a>

預設的結果擷取程式會直接從 Amazon S3 下載查詢結果，而無需透過 Athena API 操作。當其偵測到無法直接下載 S3 的情況時，即會自動回退至使用 `GetQueryResultsStream` API 操作。例如，當使用 `CSE_KMS` 選項加密查詢結果時，就會發生這種情況。

在大多數情況下，建議使用 `auto` 擷取程式。不過，如果您的 IAM 政策或 S3 儲存貯體政策使用 `s3:CalledVia` 條件來限制存取來自 Athena 的 S3 物件請求，則自動擷取程式會先嘗試從 S3 下載結果，然後回退至使用 `GetQueryResultsStream`。在這種情況下，您可以想要將 `ResultFetcher` 設定為 `GetQueryResultsStream`，以避免額外的 API 呼叫。

**注意**  
驅動器仍會識別啟用串流 API (`UseResultsetStreaming=1;`) 和啟用 S3 擷取程式 (`EnableS3Fetcher=1;`) 參數。不過，我們建議您使用 `ResultFetcher` 參數，以獲得更好的體驗。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **可能的值** | **連線字串範例** | 
| --- | --- | --- | --- | --- | 
|  ResultFetcher  | 選用 | auto | auto, S3, GetQueryResults, GetQueryResultsStream | ResultFetcher=auto | 

## 啟用結果重複使用
<a name="odbc-v2-driver-advanced-options-enable-result-reuse"></a>

指定執行查詢時是否可以重複使用之前的查詢結果。如需參數資訊，請參閱 ResultReuseByAgeConfiguration。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| EnableResultReuse | 選用 | 0 | EnableResultReuse=1; | 

## 結果重複使用最長期限
<a name="odbc-v2-driver-advanced-options-result-reuse-max-age"></a>

指定 Athena 應考慮重複使用的之前查詢結果的最長期限 (以分鐘為單位)。如需參數資訊，請參閱 [ResultReuseByAgeConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_ResultReuseByAgeConfiguration.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| ReusedResultMaxAgeInMinutes | 選用 | 60 | ReusedResultMaxAgeInMinutes=90; | 

## 使用多個 S3 執行緒
<a name="odbc-v2-driver-advanced-options-use-multiple-s3-threads"></a>

使用多個執行緒從 Amazon S3 擷取資料。啟用此選項時，會使用多個執行緒平行擷取存放在 Amazon S3 儲存貯體中的結果檔案。

只有在網路頻寬良好時，才會啟用此選項。例如，在我們對 EC2 [c5.2xlarge](https://aws.amazon.com/ec2/instance-types/c5/) 執行個體的測量中，單一執行緒 S3 用戶端達到 1 Gbps，而多執行緒 S3 用戶端則達到 4 Gbps 的網路輸送量。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
|  UseMultipleS3Threads  | 選用 | 0 | UseMultipleS3Threads=1; | 

## 使用單一目錄和結構描述
<a name="odbc-v2-driver-advanced-options-use-single-catalog-and-schema"></a>

依預設，ODBC 驅動程式會查詢 Athena，以取得可用目錄和結構描述的清單。此選項會強制驅動程式使用「ODBC 資料來源管理員組態」對話方塊或連線參數指定的目錄和結構描述。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| UseSingleCatalogAndSchema | 選用 | 0 | UseSingleCatalogAndSchema=1; | 

## 使用查詢列出資料表
<a name="odbc-v2-driver-advanced-options-use-query-to-list-tables"></a>

對於 `LAMBDA` 目錄類型，ODBC 驅動器可以提交 [SHOW TABLES](show-tables.md) 查詢，進而取得可用資料表的清單。此設定是預設值。如果此參數設定為 0，ODBC 驅動器會使用 Athena [ListTableMetadata](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListTableMetadata.html) API 來取得可用資料表的清單。請注意，對於 `LAMBDA` 目錄類型，使用 `ListTableMetadata` 會導致效能迴歸。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| UseQueryToListTables | 選用 | 1 | UseQueryToListTables=1; | 

## 針對字串類型使用 WCHAR
<a name="odbc-v2-driver-advanced-options-use-wchar-for-string-types"></a>

依預設，ODBC 驅動器對 Athena 使用 `SQL_CHAR` 和 `SQL_VARCHAR`，其中字串資料類型包括 `char`、`varchar`、`string`、`array`、`map<>`、`struct<>` 和 `row`。將此參數設定為 `1` 會強制驅動器針對字串資料類型使用 `SQL_WCHAR` 和 `SQL_WVARCHAR`。寬字元和寬變數字元類型可用於確保來自不同語言的字元可以正確儲存和擷取。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| UseWCharForStringTypes | 選用 | 0 | UseWCharForStringTypes=1; | 

## 查詢外部目錄
<a name="odbc-v2-driver-query-advanced-options-external-catalogs"></a>

指定驅動程式是否需要從 Athena 查詢外部目錄。如需詳細資訊，請參閱[移轉至 ODBC 2.x 驅動器](odbc-v2-driver-migrating.md)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| QueryExternalCatalogs | 選用 | 0 | QueryExternalCatalogs=1; | 

## 驗證 SSL
<a name="odbc-v2-driver-advanced-options-verify-ssl"></a>

控制是否在使用 AWS SDK 時驗證 SSL 憑證。這個值會傳遞給 `ClientConfiguration.verifySSL` 參數。如需詳細資訊，請參閱《適用於 C\$1\$1 的 AWS SDK 開發人員指南》**中的 [AWS 用戶端組態](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| VerifySSL | 選用 | 1 | VerifySSL=0; | 

## S3 結果區塊大小
<a name="odbc-v2-driver-advanced-options-s3-result-block-size"></a>

指定單一 Amazon S3 [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) API 請求下載的區塊大小 (以位元組為單位)。預設值為 67108864 (64 MB)。允許的最小值和最大值為 10485760 (10 MB) 和 2146435072 (約 2 GB)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| S3ResultBlockSize | 選用 | 67108864 | S3ResultBlockSize=268435456; | 

## 字串資料欄長度
<a name="odbc-v2-driver-advanced-options-string-column-length"></a>

為具有 `string` 資料類型的資料欄指定資料欄長度。由於 Athena 使用沒有定義精確度的 [Apache Hive 字串資料類型](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-StringsstringStrings)，因此 Athena 報告的預設長度為 2147483647 (`INT_MAX`)。由於 BI 工具通常會為資料欄預先配置記憶體，這可能會導致記憶體耗用量過高。若要避免這種情況，Athena ODBC 驅動器會限制報告的 `string` 資料類型的資料欄精確度，並公開 `StringColumnLength` 連線參數，以便可以變更預設值。


****  

| 連線字串名稱 | 參數類型 | 預設值 | 連線字串範例 | 
| --- | --- | --- | --- | 
| StringColumnLength | 選用 | 255 | StringColumnLength=65535; | 

## 複雜類型資料欄長度
<a name="odbc-v2-driver-advanced-options-complex-type-column-length"></a>

為具有複雜資料類型 (例如 `map`、`struct` 和 `array`) 的資料欄指定資料欄長度。與 [StringColumnLength](#odbc-v2-driver-advanced-options-string-column-length) 類似，Athena 會針對具有複雜資料類型的資料欄報告 0 精確度。Athena ODBC 驅動器會設定複雜資料類型的資料欄預設精確度，並公開 `ComplexTypeColumnLength` 連線參數，以便可以變更預設值。


****  

| 連線字串名稱 | 參數類型 | 預設值 | 連線字串範例 | 
| --- | --- | --- | --- | 
| ComplexTypeColumnLength | 選用 | 65535 | ComplexTypeColumnLength=123456; | 

## 可信 CA 憑證
<a name="odbc-v2-driver-advanced-options-trusted-ca-certificate"></a>

指示 HTTP 用戶端在何處找到您的 SSL 憑證信任存放區。這個值會傳遞給 `ClientConfiguration.caFile` 參數。如需詳細資訊，請參閱《適用於 C\$1\$1 的 AWS SDK 開發人員指南》**中的 [AWS 用戶端組態](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| TrustedCerts | 選用 | %INSTALL\$1PATH%/bin | TrustedCerts=C:\$1\$1Program Files\$1\$1Amazon Athena ODBC Driver\$1\$1bin\$1\$1cacert.pem; | 

## 最短輪詢期間
<a name="odbc-v2-driver-advanced-options-min-poll-period"></a>

指定輪詢 Athena 查詢執行狀態之前要等待的最小值 (以毫秒為單位)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| MinQueryExecutionPollingInterval | 選用 | 100 | MinQueryExecutionPollingInterval=200; | 

## 最長輪詢期間
<a name="odbc-v2-driver-advanced-options-max-poll-period"></a>

指定輪詢 Athena 查詢執行狀態之前要等待的最大值 (以毫秒為單位)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| MaxQueryExecutionPollingInterval | 選用 | 60000 | MaxQueryExecutionPollingInterval=1000; | 

## 輪詢乘數
<a name="odbc-v2-driver-advanced-options-poll-multiplier"></a>

指定增加輪詢期間的因數。依預設，輪詢會以最短輪詢期間的值開始，並且每次輪詢都會加倍，直到達到最長輪詢期間的值為止。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| QueryExecutionPollingIntervalMultiplier | 選用 | 2 | QueryExecutionPollingIntervalMultiplier=2; | 

## 最長輪詢持續時間
<a name="odbc-v2-driver-advanced-options-max-poll-duration"></a>

指定驅動程式可輪詢 Athena 查詢執行狀態的最大值 (以毫秒為單位)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| MaxPollDuration | 選用 | 1800000 | MaxPollDuration=1800000; | 

## 連線逾時
<a name="odbc-v2-driver-advanced-options-connection-timeout"></a>

HTTP 連線等待建立連線的時間量 (以毫秒為單位)。此值是針對 `ClientConfiguration.connectTimeoutMs` Athena 用戶端設定的。若未指定，則使用 curl 預設值。如需有關連線參數的資訊，請參閱《適用於 Java 的 AWS SDK 開發人員指南》**中的[用戶端組態](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/section-client-configuration.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| ConnectionTimeout | 選用 | 0 | ConnectionTimeout=2000; | 

## 請求逾時
<a name="odbc-v2-driver-advanced-options-request-timeout"></a>

指定 HTTP 用戶端的通訊端讀取逾時。此值是為 Athena 用戶端的 `ClientConfiguration.requestTimeoutMs` 參數設定的。如需參數資訊，請參閱《適用於 Java 的 AWS SDK 開發人員指南》**中的[用戶端組態](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/section-client-configuration.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| RequestTimeout | 選用 | 10000 | RequestTimeout=30000; | 

# 代理選項
<a name="odbc-v2-driver-proxy-options"></a>

## 代理主機
<a name="odbc-v2-driver-proxy-options-proxy-host"></a>

若您要求使用者通過代理，請使用此參數來設定代理主機。此參數對應至 AWS SDK 中的 `ClientConfiguration.proxyHost` 參數。如需詳細資訊，請參閱《適用於 C\$1\$1 的 AWS SDK 開發人員指南》**中的 [AWS 用戶端組態](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| ProxyHost | 選用 | none | ProxyHost=127.0.0.1; | 

## 代理連接埠
<a name="odbc-v2-driver-proxy-options-proxy-port"></a>

使用此參數來設定代理連接埠。此參數對應至 AWS SDK 中的 `ClientConfiguration.proxyPort` 參數。如需詳細資訊，請參閱《適用於 C\$1\$1 的 AWS SDK 開發人員指南》**中的 [AWS 用戶端組態](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| ProxyPort | 選用 | none | ProxyPort=8888; | 

## 代理使用者名稱
<a name="odbc-v2-driver-proxy-options-proxy-username"></a>

使用此參數來設定代理使用者名稱。此參數對應至 AWS SDK 中的 `ClientConfiguration.proxyUserName` 參數。如需詳細資訊，請參閱《適用於 C\$1\$1 的 AWS SDK 開發人員指南》**中的 [AWS 用戶端組態](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| ProxyUID | 選用 | none | ProxyUID=username; | 

## 代理密碼
<a name="odbc-v2-driver-proxy-options-proxy-password"></a>

使用此參數來設定代理密碼。此參數對應至 AWS SDK 中的 `ClientConfiguration.proxyPassword` 參數。如需詳細資訊，請參閱《適用於 C\$1\$1 的 AWS SDK 開發人員指南》**中的 [AWS 用戶端組態](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| ProxyPWD | 選用 | none | ProxyPWD=password; | 

## 非代理主機
<a name="odbc-v2-driver-proxy-options-non-proxy-host"></a>

使用此選用參數，指定驅動程式在不使用代理的情況下連線至的主機。此參數對應至 AWS SDK 中的 `ClientConfiguration.nonProxyHosts` 參數。如需詳細資訊，請參閱《適用於 C\$1\$1 的 AWS SDK 開發人員指南》**中的 [AWS 用戶端組態](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html)。

該 `NonProxyHost` 連線參數會傳遞給 `CURLOPT_NOPROXY` curl 選項。如需 `CURLOPT_NOPROXY` 格式的相關資訊，請參閱 curl 文件中的 [CURLOPT\$1NOPROXY](https://curl.se/libcurl/c/CURLOPT_NOPROXY.html)。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| NonProxyHost | 選用 | none | NonProxyHost=.amazonaws.com,localhost,.example.net,.example.com; | 

## 使用代理
<a name="odbc-v2-driver-proxy-options-use-proxy"></a>

啟用通過指定代理的使用者流量。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| UseProxy | 選用 | none | UseProxy=1; | 

# 記錄選項
<a name="odbc-v2-driver-logging-options"></a>

**警告**  
**安全性：**在詳細層級 (DEBUG 或 TRACE) 啟用記錄時，驅動程式使用的 AWS SDK 可能會以純文字記錄敏感資訊，例如身分驗證字符和登入資料。僅使用詳細記錄進行故障診斷，並確保日誌檔案安全存放，並在使用後刪除。請勿在生產環境中啟用詳細記錄。

需要管理員權限才能修改此處所述的設定。若要進行變更，您可以使用 ODBC 資料來源管理員**記錄選項**對話方塊或直接修改 Windows 登錄檔。

## 日誌層級
<a name="odbc-v2-driver-logging-options-log-level"></a>

此選項會啟用不同細節層級的 ODBC 驅動程式日誌。在 Windows 中，您可以使用登錄檔或對話方塊來設定記錄。此選項位於以下登錄檔路徑：

```
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Amazon Athena\ODBC\Driver
```

可用的日誌層級如下：
+ `OFF` - 已停用記錄
+ `ERROR` - 只會記錄錯誤訊息
+ `WARN` - 記錄警告訊息和錯誤
+ `INFO` - 記錄資訊性訊息、警告和錯誤
+ `DEBUG` - 記錄詳細的偵錯資訊以及所有較低層級的訊息
+ `TRACE` - 記錄的最詳細層級，包括所有訊息

**注意**  
每個日誌層級都包含來自其下方層級的所有訊息。較高的日誌層級可能會影響效能並產生更大的日誌檔案。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| LogLevel | 選用 | OFF | LogLevel=INFO; | 

## 日誌路徑
<a name="odbc-v2-driver-logging-options-log-path"></a>

指定儲存 ODBC 驅動程式日誌的檔案路徑。您可以使用登錄檔或對話方塊來設定此值。此選項位於以下登錄檔路徑：

```
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Amazon Athena\ODBC\Driver
```


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| LogPath | 選用 | none | LogPath=C:\$1Users\$1username\$1projects\$1internal\$1trunk\$1; | 

## 使用 AWS 記錄器
<a name="odbc-v2-driver-logging-options-use-aws-logger"></a>

指定是否啟用 AWS SDK 記錄。指定 1 表示啟用，0 表示停用。


****  

| **連線字串名稱** | **參數類型** | **預設值** | **連線字串範例** | 
| --- | --- | --- | --- | 
| UseAwsLogger | 選用 | 0 | UseAwsLogger=1; | 

# 移轉至 ODBC 2.x 驅動器
<a name="odbc-v2-driver-migrating"></a>

由於大多數的 Athena ODBC 2.x 連線參數都與 ODBC 1.x 驅動程式向後相容，因此您可以搭配 Athena ODBC 2.x 驅動程式重複使用大多數現有的連線字串。但是，下列連線參數需要修改。

## 日誌層級
<a name="odbc-v2-driver-migrating-log-level"></a>

雖然目前的 ODBC 驅動程式提供了一系列可用的記錄選項，但從 `LOG_OFF (0)`到 `LOG_TRACE (6)`，Amazon Athena ODBC 2.x 驅動程式最初只有兩個值：0 （停用） 和 1 （啟用）。從 2.0.6.0 版開始，驅動程式現在支援更精細的記錄層級與增強的記錄功能：
+ `OFF` - 已停用記錄
+ `ERROR` - 只會記錄錯誤訊息
+ `WARN` - 記錄警告訊息和錯誤
+ `INFO` - 記錄資訊性訊息、警告和錯誤
+ `DEBUG` - 記錄詳細的偵錯資訊以及所有較低層級的訊息
+ `TRACE` - 記錄的最詳細層級，包括所有訊息

如需有關記錄 ODBC 2.x 驅動程式的詳細資訊，請參閱 [記錄選項](odbc-v2-driver-logging-options.md)。


****  

|  | ODBC 1.x 驅動程式 | ODBC 2.x 驅動程式 | 
| --- | --- | --- | 
| 連線字串名稱 | LogLevel | LogLevel | 
| 參數類型 | 選用 | 選用 | 
| 預設值 | 0 | OFF | 
| 可能的值 | 0-6 | 對於 2.0.6.0 之前的版本： `0,1` 對於 2.0.6.0 `WARN`版和更新版本：`OFF`、`ERROR`、`INFO`、`DEBUG`、 `TRACE` | 
| 連線字串範例 | LogLevel=6; | LogLevel=INFO; | 

**注意**  
在 2.0.6.0 版及更新版本中，日誌架構已經過最佳化，可減少操作延遲和產生過多日誌檔案，同時透過這些精細日誌層級提供更詳細的診斷資訊。每個關卡都包含其下方關卡的所有訊息。

## MetadataRetrievalMethod
<a name="odbc-v2-driver-migrating-metadataretrievalmethod"></a>

目前的 ODBC 驅動程式提供數個選項，以便從 Athena 擷取中繼資料。Amazon Athena ODBC 驅動程序取代了 `MetadataRetrievalMethod`，並始終使用 Amazon Athena API 來擷取中繼資料。

Athena 推出旗標 `QueryExternalCatalogs`，用於查詢外部目錄。若要使用目前的 ODBC 驅動程式查詢外部目錄，請將 `MetadataRetrievalMethod` 設定為 `ProxyAPI`。若要使用 Athena ODBC 驅動程式查詢外部目錄，請將 `QueryExternalCatalogs` 設定為 `1`。


****  

|  | ODBC 1.x 驅動程式 | ODBC 2.x 驅動程式 | 
| --- | --- | --- | 
| 連線字串名稱 | MetadataRetrievalMethod | QueryExternalCatalogs | 
| 參數類型 | 選用 | 選用 | 
| 預設值 | Auto | 0 | 
| 可能的值 | Auto, AWS Glue, ProxyAPI, Query | 0,1 | 
| 連線字串範例 | MetadataRetrievalMethod=ProxyAPI; | QueryExternalCatalogs=1; | 

## 連線測試
<a name="odbc-v2-driver-migrating-connection-test"></a>

當您測試 ODBC 1.x 驅動程式連線時，驅動程式會執行 `SELECT 1` 查詢，在 Amazon S3 儲存貯體中產生兩個檔案：一個用於結果集，另一個用於中繼資料。測試連線是根據 [Amazon Athena 定價](https://aws.amazon.com/athena/pricing/)政策收費。

當您測試 ODBC 2.x 驅動程式連線時，驅動程式會呼叫 [GetWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetWorkGroup.html) Athena API 動作。呼叫會使用您指定的身分驗證類型和對應的憑證提供者來擷取憑證。使用 ODBC 2.x 驅動程式時，可免費使用連線測試，且測試不會在您的 Amazon S3 儲存貯體中產生查詢結果。

# 對 ODBC 2.x 驅動器進行疑難排解
<a name="odbc-v2-driver-troubleshooting"></a>

如果您遇到 Amazon Athena ODBC 驅動程式的問題，您可以聯絡 支援 （在 中 AWS 管理主控台，選擇**支援**、**支援中心**)。

請確保包含下列資訊，並提供將協助支援團隊了解您的使用案例的任何其他詳細資訊。
+ **描述** – (必要) 包含以下詳細資訊的描述：您的使用案例以及預期行為和觀察到的行為之間的差異。包括任何可幫助支援工程師輕鬆解決問題的資訊。如果問題是間歇性出現，則指定發生問題的日期、時間戳記或間隔點。
+ **版本資訊** – (必要) 驅動程式版本、作業系統以及您使用的應用程式的相關資訊。例如，「ODBC 驅動程序 1.2.3 版、Windows 10 (x64)、Power BI。」
+ **日誌檔案** – (必要) 了解問題所需的 ODBC 驅動程式日誌檔案的數目下限。如需有關 ODBC 2.x 驅動程式的記錄選項的資訊，請參閱 [記錄選項](odbc-v2-driver-logging-options.md)。
+ **連線字串** – (必要) ODBC 連線字串或顯示您使用的連線參數的對話方塊的螢幕擷取畫面。如需有關連線參數的資訊，請參閱 [Athena ODBC 2.x 連線參數](odbc-v2-driver-connection-parameters.md)。
+ **問題步驟** – (選用) 如有可能，請包含可協助重現問題的步驟或獨立程式。
+ **查詢錯誤資訊** – (選用) 如果出現涉及 DML 或 DDL 查詢的錯誤，請包含以下資訊：
  + 失敗的 DML 或 DDL 查詢的完整版本或簡化版本。
  +  AWS 區域 使用的帳戶 ID 和 ，以及查詢執行 ID。
+ **SAML 錯誤** – (選用) 如果您遇到有關使用 SAML 聲明進行身分驗證的問題，請包含以下資訊：
  + 使用的身分提供者和身分驗證外掛程式。
  + 使用 SAML 字符的範例。

# Amazon Athena ODBC 2.x 版本備註
<a name="odbc-v2-driver-release-notes"></a>

這些版本備註提供了 Amazon Athena ODBC 2.x 驅動程式中的增強功能、功能、已知問題和工作流程變更的詳細資訊。

## 2.1.0.0
<a name="odbc-v2-driver-release-notes-2026-03-20"></a>

 版 2026-03-20

Amazon Athena Amazon Athena ODBC 2.1.0.0 版驅動程式包含安全性改善。此版本可增強身分驗證流程、查詢處理和傳輸安全性。建議您盡快升級至此版本。

### 突破性變更
<a name="odbc-v2-driver-release-notes-2026-03-20-breaking-changes"></a>
+ **預設啟用 SSL 憑證驗證** – 驅動程式現在會在連線至身分提供者時強制執行 SSL 憑證驗證。如果您使用沒有有效 SSL 憑證的本機身分提供者，您必須在連線字串`SSL_Insecure=1`中明確設定 。如需詳細資訊，請參閱[SSL 不安全 (IdP)](odbc-v2-driver-common-authentication-parameters.md#odbc-v2-driver-common-authentication-parameters-ssl-insecure-idp)。
+ **至少強制執行 TLS 1.2** – 驅動程式不再接受與身分提供者的 TLS 1.0 或 TLS 1.1 連線。所有 IdP 連線現在都需要 TLS 1.2 或更新版本。
+ **BrowserSSOOIDC 身分驗證流程已更新** – BrowserSSOOIDC 外掛程式現在使用授權碼搭配 PKCE，而非裝置碼授權。OAuth 2.0 回呼伺服器可使用新的選用參數 `listen_port`（預設 7890)。您可能需要允許列出您網路上的此連接埠。預設範圍已變更為 `sso:account:access`。如需詳細資訊，請參閱[瀏覽器 SSO OIDC](odbc-v2-driver-browser-sso-oidc.md)。

### 改進
<a name="odbc-v2-driver-release-notes-2026-03-20-improvements"></a>
+ **BrowserSSOOIDC** – 使用 PKCE 從裝置程式碼流程遷移至授權碼，以提高安全性。
+ **BrowserAzureAD** – 已將 PKCE （程式碼交換的驗證金鑰） 新增至 OAuth 2.0 授權流程，以防止授權碼攔截攻擊。
+ **BrowserSAML** – 新增 RelayState CSRF 保護，以防止 SAML 字符注入攻擊。
+ **登入資料快取** – 從 v2.1.0.0 開始，快取的登入資料會以純文字 JSON 形式存放在 `user-profile/.athena-odbc/`目錄中，檔案許可僅限於擁有的使用者，與 AWS CLI 保護本機儲存的登入資料的方式一致。
+ **IAM 設定檔** – 除了現有 之外，還新增對 `EcsContainer`和 `Environment`憑證來源的支援`Ec2InstanceMetadata`。
+ **連線字串剖析器** – 實作適當的 ODBC `}}`逸出處理。
+ **目錄查詢** – 新增結構描述名稱和資料表模式的 SQL 識別符逸出。
+ **ODBC 模式比對** – 以直接 ODBC LIKE 萬用字元比對程式取代以 regex 為基礎的比對。
+ **XML 剖析** – 新增 SAML 權杖的遞迴深度限制 (100 個層級） 和大小限制 (1MB)。
+ **ADFS 身分驗證** – 新增 ADFS 伺服器回應的回應大小限制 (200KB)。

### 修正項目
<a name="odbc-v2-driver-release-notes-2026-03-20-fixes"></a>
+ 已修正身分驗證元件中特殊元素的不當中和，這些元素可透過製作的連線參數允許程式碼執行或身分驗證流程重新導向。影響 BrowserSSOOIDC、 BrowserAzureAD 和 BrowserSAML 外掛程式。
+ 已修正查詢處理元件中特殊元素的不當中和，這些元素可能允許透過製作的資料表中繼資料拒絕服務或 SQL Injection。
+ 修正連線至身分提供者時的不當憑證驗證。
+ 修正瀏覽器型身分驗證流程中缺少的身分驗證安全控制，包括 OAuth 的 PKCE、SAML 的 CSRF 保護、安全登入資料快取，以及獨佔回呼連接埠繫結。
+ 已修正剖析元件中不受控制的資源耗用量，這些元件可透過製作的輸入模式、無限制的伺服器回應或深度巢狀 XML 承載來允許拒絕服務。
+ 修正在 Power BI Import 模式下`UseSingleCatalogAndSchema=1`搭配跨帳戶聯合目錄使用 時， `SQLColumns`和 未`SQLTables`傳回結果的問題。

若要下載新的 ODBC v2 驅動程式，請參閱 [ODBC 2.x 驅動程式下載](odbc-v2-driver.md#odbc-v2-driver-download)。如需連線資訊，請參閱 [Amazon Athena ODBC 2.x](odbc-v2-driver.md)。

## 2.0.6.0
<a name="odbc-v2-driver-release-notes-2025-11-21"></a>

 版 2025-11-21

### 改進
<a name="odbc-v2-driver-release-notes-2025-11-21-improvements"></a>
+ **瀏覽器可信任身分傳播身分驗證外掛程式** – 新增了新的身分驗證外掛程式，以支援具有可信任身分傳播的瀏覽器型 OpenID Connect (OIDC) 身分驗證。此外掛程式透過預設瀏覽器處理完整的 OAuth 2.0 流程、自動擷取 JSON Web Token (JWT)，以及與信任的身分傳播整合，以提供無縫的身分驗證體驗。外掛程式專為單一使用者桌面環境而設計。如需有關啟用和使用可信身分傳播的資訊，請參閱[什麼是可信身分傳播？](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation-overview.html)。
+ **增強型記錄架構** – 透過下列方式大幅改善驅動程式的記錄機制：
  + 推出比基本 0/1 選項更精細的日誌層級
  + 移除備援日誌陳述式
  + 最佳化記錄架構以包含診斷相關資訊
  + 解決造成操作延遲的效能問題
  + 減少啟用記錄時產生過多的日誌檔案

### 修正項目
<a name="odbc-v2-driver-release-notes-2025-11-21-fixes"></a>
+ **結果擷取器最佳化 – **修正擷取大小參數限制錯誤套用至串流和非串流結果擷取器的問題。限制現在僅正確套用至非串流結果擷取器。

若要下載新的 ODBC v2 驅動程式，請參閱 [ODBC 2.x 驅動程式下載](odbc-v2-driver.md#odbc-v2-driver-download)。如需連線資訊，請參閱 [Amazon Athena ODBC 2.x](odbc-v2-driver.md)。

## 2.0.5.1
<a name="odbc-v2-driver-release-notes-2025-10-13"></a>

 版 2025-10-13

### 修正項目
<a name="odbc-v2-driver-release-notes-2025-10-13-fixes"></a>

Amazon Athena ODBC v2.0.5.1 驅動器包含下列針對瀏覽器型身分驗證外掛程式的修正。
+ 已實作登入 URL 驗證和結構描述檢查。
+ 改善了 Linux 上的瀏覽器啟動機制，可利用系統 API，進而提升穩定性和安全性。

若要下載新的 ODBC v2 驅動程式，請參閱 [ODBC 2.x 驅動程式下載](odbc-v2-driver.md#odbc-v2-driver-download)。如需連線資訊，請參閱 [Amazon Athena ODBC 2.x](odbc-v2-driver.md)。

## 2.0.5.0
<a name="odbc-v2-driver-release-notes-2025-09-10"></a>

 版 2025-09-10

### 改進
<a name="odbc-v2-driver-release-notes-2025-09-10-improvements"></a>
+ **JWT 可信身分提供者 (TIP) 身分驗證外掛程式** – 新增了新的身分驗證外掛程式，可支援 JWT 可信身分提供者 (TIP) 與 ODBC 驅動器的整合。此身分驗證類型允許您使用從外部身分提供者獲得的 JSON Web Token (JWT) 作為連線參數，向 Athena 進行身分驗證。使用 TIP，身分內容會新增至 IAM 角色，以識別請求存取 AWS 資源的使用者。如需有關啟用和使用 TIP 的資訊，請參閱[什麼是可信身分傳播？](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation-overview.html)。
+ **自訂 SSO 管理員端點支援** – 新增對 ODBC 驅動器中自訂 SSO 管理員端點的支援。此增強功能可讓您在 VPC 後方執行 ODBC 時，為 SSO 服務指定自己的端點。
+ **AWS 開發套件版本更新** – 我們已將驅動程式中使用的 AWS 開發套件版本更新至 2.32.16，並已更新 2.0.5.0 版的專案相依性。

## 2.0.4.0
<a name="odbc-v2-driver-release-notes-2025-06-17"></a>

 版 2025-06-17

Amazon Athena ODBC 2.0.4.0 版驅動程式包含下列改進和修正。

### 改進
<a name="odbc-v2-driver-release-notes-2025-06-17-improvements"></a>
+ **結果擷取程式** – 驅動器現在會自動選取下載查詢結果的方法。如此一來，在大多數情況下都無需手動設定擷取程式。如需詳細資訊，請參閱[結果擷取程式](odbc-v2-driver-advanced-options.md#odbc-v2-driver-advanced-options-result-fetcher)。
+ Curl Library 已更新至 8.12.1。

### 修正項目
<a name="odbc-v2-driver-release-notes-2025-06-17-fixes"></a>
+ 修正了連線至 STS 時 IAM 設定檔的代理組態的問題。該修正可讓 IAM 設定檔用於成功的身分驗證。
+ 使用身分驗證外掛程式讀取 IAM 設定檔的所有其他組態選項。這包括 `UseProxyForIdP`、`SSL_Insecure`、`LakeformationEnabled` 和 `LoginToRP`，以解決受影響外掛程式的錯誤組態。
+ 修正了 round 函式，即允許其採用選用的第二個參數。它成功處理了包含逸出語法的查詢。
+ 修正了 `TIME WITH TIME ZONE` 和 `TIMESTAMP WITH TIME ZONE` 資料類型的資料欄大小。具有時間戳記和時區資料類型的值不會被截斷。

若要下載新的 ODBC v2 驅動程式，請參閱 [ODBC 2.x 驅動程式下載](odbc-v2-driver.md#odbc-v2-driver-download)。如需連線資訊，請參閱 [Amazon Athena ODBC 2.x](odbc-v2-driver.md)。

## 2.0.3.0
<a name="odbc-v2-driver-release-notes-2024-04-08"></a>

 版 2024-04-08

Amazon Athena ODBC 2.0.3.0 版驅動程式包含下列改進和修正。

### 改進
<a name="odbc-v2-driver-release-notes-2024-04-08-improvements"></a>
+ 新增了對 Linux 和 Mac 平台上 Okta 身分驗證外掛程式的 MFA 支援。
+ 現在，`athena-odbc.dll` 程式庫和適用於 Windows 的 `AmazonAthenaODBC-2.x.x.x.msi` 安裝程式均已簽章。
+ 更新了與驅動器一起安裝的 CA 憑證 `cacert.pem` 檔案。
+ 改善了在 Lambda 目錄下列出資料表所需的時間。對於 `LAMBDA` 目錄類型，ODBC 驅動器現在可以提交 [SHOW TABLES](show-tables.md) 查詢，進而取得可用資料表的清單。如需詳細資訊，請參閱[使用查詢列出資料表](odbc-v2-driver-advanced-options.md#odbc-v2-driver-advanced-options-use-query-to-list-tables)。
+ 引入了使用 `SQL_WCHAR` 和 `SQL_WVARCHAR` 報告字串資料類型的 `UseWCharForStringTypes` 連線參數。如需詳細資訊，請參閱[針對字串類型使用 WCHAR](odbc-v2-driver-advanced-options.md#odbc-v2-driver-advanced-options-use-wchar-for-string-types)。

### 修正項目
<a name="odbc-v2-driver-release-notes-2024-04-08-fixes"></a>
+ 修正了使用 Get-OdbcDsn PowerShell 工具時發生的登錄檔損毀警告。
+ 更新了剖析邏輯，可處理查詢字串開頭的註解。
+ 現在，日期和時間戳記資料類型允許年份欄位中為零。

若要下載新的 ODBC v2 驅動程式，請參閱 [ODBC 2.x 驅動程式下載](odbc-v2-driver.md#odbc-v2-driver-download)。如需連線資訊，請參閱 [Amazon Athena ODBC 2.x](odbc-v2-driver.md)。

## 2.0.2.2
<a name="odbc-v2-driver-release-notes-2024-02-13"></a>

2024-02-13 發布

Amazon Athena ODBC 2.0.2.2 版驅動程式包含下列改進和修正。

### 改進
<a name="odbc-v2-driver-release-notes-2024-02-13-improvements"></a>
+ 新增了兩個連線參數 `StringColumnLength` 和 `ComplexTypeColumnLength`，可用來變更字串和複雜資料類型的預設資料欄長度。如需詳細資訊，請參閱[字串資料欄長度](odbc-v2-driver-advanced-options.md#odbc-v2-driver-advanced-options-string-column-length)及[複雜類型資料欄長度](odbc-v2-driver-advanced-options.md#odbc-v2-driver-advanced-options-complex-type-column-length)。
+ 新增了對 Linux 和 macOS (Intel 和 ARM) 作業系統的支援。如需詳細資訊，請參閱[Linux](odbc-v2-driver-getting-started-linux.md)及[macOS](odbc-v2-driver-getting-started-macos.md)。
+ AWS-SDK-CPP 已更新至 1.11.245 標籤版本。
+ curl 程式庫已更新至 8.6.0 版。

### 修正項目
<a name="odbc-v2-driver-release-notes-2024-02-09-fixes"></a>
+ 解決了在精確度資料欄中，針對類字串資料類型的結果集中繼資料中報告不正確值的問題。

若要下載 ODBC v2 驅動程式，請參閱 [ODBC 2.x 驅動程式下載](odbc-v2-driver.md#odbc-v2-driver-download)。如需連線資訊，請參閱 [Amazon Athena ODBC 2.x](odbc-v2-driver.md)。

## 2.0.2.1
<a name="odbc-v2-driver-release-notes-2023-12-07"></a>

2023-12-07 發布

Amazon Athena ODBC v2.0.2.1 驅動程式包含下列改善和修正。

### 改進
<a name="odbc-v2-driver-release-notes-2023-12-07-improvements"></a>
+ 改進了所有介面的 ODBC 驅動程式執行緒安全性。
+ 啟用日誌記錄時，現在會以毫秒級精確度記錄日期時間值。
+ 在使用 [瀏覽器 SSO OIDC](odbc-v2-driver-browser-sso-oidc.md) 外掛程式進行身分驗證期間，現在會開啟終端以向使用者顯示裝置代碼。

### 修正項目
<a name="odbc-v2-driver-release-notes-2023-12-07-fixes"></a>
+ 解決了剖析串流 API 結果時發生的記憶體釋放問題。
+ 介面 `SQLTablePrivileges()`、`SQLSpecialColumns()`、`SQLProcedureColumns()` 和 `SQLProcedures()` 的請求現在會傳回空白結果集。

若要下載 ODBC v2 驅動程式，請參閱 [ODBC 2.x 驅動程式下載](odbc-v2-driver.md#odbc-v2-driver-download)。如需連線資訊，請參閱 [Amazon Athena ODBC 2.x](odbc-v2-driver.md)。

## 2.0.2.0
<a name="odbc-v2-driver-release-notes-2023-10-17"></a>

2023-10-17 發布

Amazon Athena ODBC v2.0.2.0 驅動程式包含下列改善和修正。

### 改進
<a name="odbc-v2-driver-release-notes-2023-10-17-improvements"></a>
+ 為瀏覽器 Azure AD、瀏覽器 SSO OIDC 和 Okta 基於瀏覽器的身分驗證外掛程式新增了檔案快取功能。

  BI 工具 (如 Power BI) 和基於瀏覽器的外掛程式使用多個瀏覽器視窗。新的檔案快取連線參數可讓您在 BI 應用程式開啟的多個程序之間快取及重複使用臨時憑證。
+ 應用程式現在可以在陳述式準備好後查詢結果集的相關資訊。
+ 預設連線和請求逾時已增加，以便用於速度較慢的用戶端網路。如需詳細資訊，請參閱[連線逾時](odbc-v2-driver-advanced-options.md#odbc-v2-driver-advanced-options-connection-timeout)及[請求逾時](odbc-v2-driver-advanced-options.md#odbc-v2-driver-advanced-options-request-timeout)。
+ 已針對 SSO 和 SSO OIDC 新增端點覆寫。如需詳細資訊，請參閱[端點覆寫](odbc-v2-driver-endpoint-overrides.md)。
+ 已新增連線參數，將身分驗證請求的 URI 引數傳遞至 Ping。您可以使用此參數繞過 Lake Formation 的單一角色限制。如需詳細資訊，請參閱[Ping URI 參數](odbc-v2-driver-ping.md#odbc-v2-driver-ping-uri-param)。

### 修正項目
<a name="odbc-v2-driver-release-notes-2023-10-17-fixes"></a>
+ 已修正使用資料列型繫結機制時發生的整數溢位問題。
+ 已從瀏覽器 SSO OIDC 身分驗證外掛程式的必要連線參數清單中移除逾時。
+ 為 `SQLStatistics()`、`SQLPrimaryKeys()`、`SQLForeignKeys()` 和 `SQLColumnPrivileges()` 新增了缺少的介面，並新增了依請求傳回空白結果集的功能。

若要下載新的 ODBC v2 驅動程式，請參閱 [ODBC 2.x 驅動程式下載](odbc-v2-driver.md#odbc-v2-driver-download)。如需連線資訊，請參閱 [Amazon Athena ODBC 2.x](odbc-v2-driver.md)。

## 2.0.1.1
<a name="odbc-v2-driver-release-notes-2023-08-10"></a>

2023-08-10 發布

Amazon Athena ODBC v2.0.1.1 驅動程式包含下列改進和修正。

### 改進
<a name="odbc-v2-driver-release-notes-2023-08-10-improvements"></a>
+ 新增 URI 記錄至 Okta 身分驗證外掛程式。
+ 新增偏好的角色參數至外部憑證提供者外掛程式
+ 在 AWS 組態檔案的描述檔名稱中新增對描述當字首的處理。

### 修正項目
<a name="odbc-v2-driver-release-notes-2023-08-10-fixes"></a>
+ 更正使用 Lake Formation 和 AWS STS 用戶端時發生 AWS 區域 的使用問題。
+ 將缺少的分割區索引鍵還原至資料表欄清單中。
+ 新增缺少的 `BrowserSSOOIDC` 身分驗證類型至 AWS 描述檔。

若要下載新的 ODBC v2 驅動程式，請參閱 [ODBC 2.x 驅動程式下載](odbc-v2-driver.md#odbc-v2-driver-download)。

## 2.0.1.0
<a name="odbc-v2-driver-release-notes-2023-06-29"></a>

2023-06-29 發布

Amazon Athena 發布 ODBC v2.0.1.0 驅動程式。

Athena 發布了新的 ODBC 驅動程式，可改善從相容 SQL 開發和商業智慧應用程式連線、查詢和視覺化資料的體驗。Athena ODBC 驅動程式最新版本支援現有驅動程式的功能，且可輕鬆升級。最新版本包含透過 [AWS IAM Identity Center](https://aws.amazon.com/iam/identity-center/) 對使用者進行身分驗證的支援。它還提供了讀取來自 Amazon S3 的查詢結果的選項，可讓您更快取得查詢結果。

如需詳細資訊，請參閱[Amazon Athena ODBC 2.x](odbc-v2-driver.md)。

# Athena ODBC 1.x 驅動程式
<a name="connect-with-odbc-driver-and-documentation-download-links"></a>

您可以從第三方 SQL 用戶端工具和應用程式使用 ODBC 連線來連接至 Athena。使用本頁面中的連結下載 Amazon Athena 1.x ODBC 驅動程式授權合約、ODBC 驅動程式和 ODBC 文件。有關 ODBC 連接字串的相關資訊，請參閱《ODBC 驅動程式安裝和組態指南》PDF 檔案，可從本頁面下載該檔案。如需許可的相關資訊，請參閱[透過 JDBC 和 ODBC 連接控制存取](policy-actions.md)。

**重要**  
當您使用 ODBC 1.x 驅動程式時，務必注意以下要求：  
**打開連接埠 444** – 將 Athena 用來串流查詢結果的連接埠 444 保持開放給輸出流量。當您使用 PrivateLink 端點連接到 Athena 時，請確定連接至 PrivateLink 端點的安全群組已在連接埠 444 上開放給輸入流量。
**athena:GetQueryResultsStream 政策** – 新增針對使用 ODBC 驅動程式的 IAM 主體的 `athena:GetQueryResultsStream` 政策動作。此政策動作不會直接透過 API 公開。它僅與 ODBC 和 JDBC 驅動程式搭配使用，做為串流結果支援的一部分。如需政策範例，請參閱 [AWS 受管政策：AWSQuicksightAthenaAccess](security-iam-awsmanpol.md#awsquicksightathenaaccess-managed-policy)。

## Windows
<a name="connect-with-odbc-windows"></a>


| 驅動程式版本 | 下載連結 | 
| --- | --- | 
| 適用於 Windows 32 位元的 ODBC 1.2.3.1000 | [Windows 32 位元 ODBC 驅動程式 1.2.3.1000](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/SimbaAthenaODBC_1.2.3.1000/Windows/SimbaAthena_1.2.3.1000_32-bit.msi) | 
| 適用於 Windows 64 位元的 ODBC 1.2.3.1000 | [Windows 64 位元 ODBC 驅動程式 1.2.3.1000](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/SimbaAthenaODBC_1.2.3.1000/Windows/SimbaAthena_1.2.3.1000_64-bit.msi) | 

## Linux
<a name="connect-with-odbc-linux"></a>


| 驅動程式版本 | 下載連結 | 
| --- | --- | 
| 適用於 Linux 32 位元的 ODBC 1.2.3.1000 | [Linux 32 位元 ODBC 驅動程式 1.2.3.1000](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/SimbaAthenaODBC_1.2.3.1000/Linux/simbaathena-1.2.3.1000-1.el7.i686.rpm) | 
| 適用於 Linux 64 位元的 ODBC 1.2.3.1000 | [Linux 64 位元 ODBC 驅動程式 1.2.3.1000](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/SimbaAthenaODBC_1.2.3.1000/Linux/simbaathena-1.2.3.1000-1.el7.x86_64.rpm) | 

## OSX
<a name="connect-with-odbc-osx"></a>


| 驅動程式版本 | 下載連結 | 
| --- | --- | 
| 適用於 OSX 的 ODBC 1.2.3.1000 | [OSX ODBC 驅動程式 1.2.3.1000](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/SimbaAthenaODBC_1.2.3.1000/OSX/SimbaAthena_1.2.3.1000.dmg) | 

## 文件
<a name="connect-with-odbc-driver-documentation"></a>


| 內容 | 文件連結 | 
| --- | --- | 
| Amazon Athena ODBC 驅動程式授權合約 |  [授權合約](https://downloads.athena.us-east-1.amazonaws.com/agreement/ODBC/Amazon+Athena+ODBC+Driver+License+Agreement.pdf)  | 
| ODBC 1.2.3.1000 的文件 | [ODBC 驅動程式安裝和組態指南 1.2.3.1000](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/SimbaAthenaODBC_1.2.3.1000/docs/Simba+Amazon+Athena+ODBC+Connector+Install+and+Configuration+Guide.pdf) | 
| ODBC 1.2.3.1000 的版本備註 | [ODBC 驅動程式版本備註 1.2.3.1000](https://downloads.athena.us-east-1.amazonaws.com/drivers/ODBC/SimbaAthenaODBC_1.2.3.1000/docs/release-notes.txt) | 

## ODBC 驅動程式備註
<a name="connect-with-odbc-configuration"></a>

**不使用 Proxy 之連線**  
如果您要指定驅動程式在不使用 Proxy 的情況下連線的特定主機，您可以使用 ODBC 連線字串中的選用 `NonProxyHost` 屬性。

該 `NonProxyHost` 屬性會指定一份以逗號分隔的主機清單，讓連接器可以在啟用 Proxy 連接時，無需經過代理伺服器即可存取，如下列範例所示：

```
.amazonaws.com,localhost,.example.net,.example.com
```

該 `NonProxyHost` 連線參數會傳遞給 `CURLOPT_NOPROXY` curl 選項。如需 `CURLOPT_NOPROXY` 格式的相關資訊，請參閱 curl 文件中的 [CURLOPT\$1NOPROXY](https://curl.se/libcurl/c/CURLOPT_NOPROXY.html)。

# 使用 ODBC 用戶端為 Microsoft AD FS 使用者設定對 Amazon Athena 的聯合存取權
<a name="odbc-adfs-saml"></a>

若要使用 ODBC 用戶端為 Microsoft Active Directory Federation Services (AD FS) 使用者設定 Amazon Athena 的聯合存取權，您必須先在 AD FS 和您的 AWS 帳戶之間建立信任。有了此信任，您的 AD 使用者可以 AWS 使用其 AD 登入資料[聯合](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html#CreatingSAML-configuring-IdP)到 ，並擔任 [AWS Identity and Access Management](https://aws.amazon.com/iam/)(IAM) 角色的許可，以存取 AWS Athena API 等資源。

若要建立此信任，請將 AD FS 做為 SAML 提供者新增至 ， AWS 帳戶 並建立聯合身分使用者可以擔任的 IAM 角色。在 AD FS 方面，您可以將 新增 AWS 為依賴方，並撰寫 SAML 宣告規則，將正確的使用者屬性傳送至 AWS 以進行授權 （特別是 Athena 和 Amazon S3)。

設定 AD FS 存取 Athena，主要步驟如下所示：

[1. 設定 IAM SAML 提供者和角色](#odbc-adfs-saml-setting-up-an-iam-saml-provider-and-role)

[2. 設定 AD FS](#odbc-adfs-saml-configuring-ad-fs)

[3. 建立 Active Directory 使用者和群組](#odbc-adfs-saml-creating-active-directory-users-and-groups)

[4. 設定 AD FS ODBC 與 Athena 之間的連線](#odbc-adfs-saml-configuring-the-ad-fs-odbc-connection-to-athena)

## 1. 設定 IAM SAML 提供者和角色
<a name="odbc-adfs-saml-setting-up-an-iam-saml-provider-and-role"></a>

在本節中，您將 AD FS 作為 SAML 提供者新增至 AWS 您的帳戶，並建立聯合身分使用者可擔任的 IAM 角色。

**若要設定 SAML 提供者**

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

1. 在導覽窗格中，請選擇 **Identity providers** (身分提供者)。

1. 選擇 **Add provider** (新增提供者)。

1. 在 **Provider type** (提供者類型) 選擇 **SAML**。  
![\[選擇 SAML。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-1.png)

1. 對於 **Provider name** (供應商名稱)，輸入 **adfs-saml-provider**。

1. 在瀏覽器中，輸入下列位址，以下載 AD FS 伺服器的聯合 XML 檔案。若要執行此步驟，您的瀏覽器必須能夠存取 AD FS 伺服器。

   ```
   https://adfs-server-name/federationmetadata/2007-06/federationmetadata.xml       
   ```

1. 在 IAM 主控台中，針對**中繼資料文件**，選擇**選擇選擇檔案**，然後將聯合中繼資料檔案上傳至其中 AWS。

1. 若要完成，請選擇 **Add provider** (新增提供者)。

接著，建立聯合身分使用者可擔任的 IAM 角色。

**若要為聯合身分使用者建立 IAM 角色**

1. 在 IAM 主控台導覽窗格中，選擇 **Roles** (角色)。

1. 選擇建**立角色**。

1. 在 **Trusted entity type** (可信實體類型) 中，選擇 **SAML 2.0 federation** (SAML 2.0 聯合)。

1. 對於 **SAML 2.0-based provider** (以 SAML 2.0 為基礎的提供者)，請選擇您建立的 **adfs-saml-provider** 提供者。

1. 選擇**允許程式設計 AWS 和管理主控台存取**，然後選擇**下一步**。  
![\[選擇 SAML 作為可信實體類型。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-2.png)

1. 在 **Add permissions** (新增許可) 頁面上，篩選此角色所需的 IAM 許可政策，然後選取對應的核取方塊。本教學課程會連接 `AmazonAthenaFullAccess` 和 `AmazonS3FullAccess` 政策。  
![\[將 Athena 完整存取政策連接到角色。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-3.png)  
![\[將 Amazon S3 完整存取政策連接到角色。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-4.png)

1. 選擇**下一步**。

1. 在 **Name, review, and create** (名稱、檢閱和建立) 頁面的 **Role name** (角色名稱) 中，輸入角色的名稱。本教學課程使用名稱 **adfs-data-access**。

   在 **Step 1: Select trusted entities** (步驟 1：選取可信實體) 中，應使用 `"Federated:" "arn:aws:iam::account_id:saml-provider/adfs-saml-provider"` 自動填入 **Principal** (主體) 欄位。`Condition` 欄位應包含 `"SAML:aud"` 和 `"https://signin.aws.amazon.com/saml"`。  
![\[可信實體 JSON。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-5.png)

   **Step 2: Add permissions** (步驟 2：新增許可) 會說明您已連接至角色的政策。  
![\[連接至角色的政策清單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-6.png)

1. 選擇建**立角色**。橫幅訊息會確認角色的建立。

1. 請在 **Roles** (角色) 頁面上，選擇您剛剛建立的角色名稱。角色的摘要頁面會說明已連接的政策。  
![\[角色的摘要頁面。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-7.png)

## 2. 設定 AD FS
<a name="odbc-adfs-saml-configuring-ad-fs"></a>

現在，您可以新增 AWS 做為依賴方並撰寫 SAML 宣告規則，以便將正確的使用者屬性傳送至 AWS 以進行授權。

以 SAML 為基礎的聯合有兩個參與者：IdP (Active Directory) 和依存方 (AWS)，這是使用 IdP 身分驗證的服務或應用程式。

若要設定 AD FS，請先新增依存方信任，然後為依存方設定 SAML 宣告規則。AD FS 使用宣告規則來形成傳送給依存方的 SAML 聲明。SAML 聲明指出 AD 使用者的相關資訊為 true，並且已對使用者進行身分驗證。

### 新增依存方信任
<a name="odbc-adfs-saml-adding-a-relying-party-trust"></a>

若要在 AD FS 中新增依存方信任，您可以使用 AD FS 伺服器管理員。

**若要在 AD FS 中新增依存方信任**

1. 登入 AD FS 伺服器。

1. 在 **Start** (開始) 選單上，開啟 **Server Manager** (服器管理員)。

1. 選擇 **Tools** (工具)，然後選擇 **AD FS Management** (AD FS 管理)。  
![\[選擇 Tools (工具)、AD FS Management (AD FS 管理)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-8.png)

1. 在導覽窗格的 **Trust Relationships** (信任關係) 下，選擇 **Relying Party Trusts** (依存方信任)。

1. 在 **Actions** (動作) 下，選擇 **Add Relying Party Trust** (新增依存方信任)。  
![\[選擇 Add Relying Party Trust (新增依存方信任)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-9.png)

1. 在 **Add Relying Party Trust Wizard (新增信賴方信任精靈)** 頁面上，選擇 **Start (開始)**。  
![\[選擇 開始使用。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-10.png)

1. 在 **Select Data Source** (選取資料來源) 頁面上，選取 **Import data about the relying party published online or on a local network** (匯入關於在線上或本機網路上發佈依存方的資料) 選項。

1. 針對 **Federation metadata address (host name or URL)** (聯合中繼資料地址 (主機名稱或 URL))，輸入 URL ** https://signin.aws.amazon.com/static/saml-metadata.xml**

1. 選擇**下一步**。  
![\[設定資料來源\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-11.png)

1. 在 **Specify Display Name** (指定顯示名稱) 頁面上，對於 **Display name** (顯示名稱)，輸入您的依存方的顯示名稱，然後選擇 **Next** (下一步)。  
![\[輸入依存方的顯示名稱。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-12.png)

1. 在 **Configure Multi-factor Authentication Now** (現在設定多重要素驗證) 頁面上，此教學課程會選取 **I do not want to configure multi-factor authentication for this relying party trust at this time** (我不想此時針對該依存方設定多重要素驗證)。

   為了提高安全性，我們建議您設定多重驗證，以協助保護您的 AWS 資源。因為使用範例資料集，因此本教學課程不會啟用多重要素驗證。  
![\[設定多重要素驗證。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-13.png)

1. 選擇**下一步**。

1. 在 **Choose Issuance Authorization Rules** (選擇發行授權規則) 頁面上，選取 **Permit all users to access this relying party** (允許所有使用者存取此依存方)。

   此選項允許 Active Directory 中的所有使用者搭配使用 AD FS 和 AWS 作為依存方。您應該考量您的安全要求，並適當地對此組態進行調整。  
![\[設定使用者對依存方的存取權。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-14.png)

1. 選擇**下一步**。

1. 在 **Ready to Add Trust** (準備新增信任) 頁面上，選擇 **Next** (下一步) 以將依存方信任新增至 AD FS 組態資料庫。  
![\[選擇下一步。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-15.png)

1. 在 **Finish** (完成) 頁面上，選擇 **Close** (關閉)。  
![\[選擇關閉。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-16.png)

### 設定依存方的 SAML 宣告規則
<a name="odbc-adfs-saml-configuring-saml-claim-rules-for-the-relying-party"></a>

在此任務中，您會建立兩組宣告規則。

第一組規則 1–4,包含基於 AD 群組成員資格擔任 IAM 角色所需的 AD FS 宣告規則。如果您想要建立 [AWS 管理主控台](https://aws.amazon.com/console) 的聯合存取權，這些規則與您建立的規則相同。

第二組規則 5–6 是 Athena 存取控制所需的宣告規則。

**若要建立 AD FS 宣告規則**

1. 在 AD FS 管理主控台導覽窗格中，選擇 **Trust Relationships** (信任關係)、**Relying Party Trusts** (依存方信任)。

1. 尋找您在上一節建立的依存方。

1. 在依存方上按一下滑鼠右鍵，選擇 **Edit Claim Rules** (編輯宣告規則)，或從 **Actions** (動作) 選單中選擇 **Edit Claim Rules** (編輯宣告規則)。  
![\[選擇 Edit Claim Rules (編輯宣告規則)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-17.png)

1. 選擇 **Add Rule** (新增規則)。

1. 在 Add Transform Claim Rule Wizard (新增轉換宣告規則精靈) 的 **Configure Rule** (設定規則) 頁面上，輸入下列資訊以建立宣告規則 1，然後選擇 **Finish** (完成)。
   + 針對 **Claim Rule name** (宣告規則名稱)，輸入 **NameID**。
   + 針對 **Rule template** (規則範本)，使用 **Transform an Incoming Claim** (轉換傳入宣告)。
   + 針對 **Incoming claim type** (傳入宣告類型)，選擇 **Windows account name** (Windows 帳戶名稱)。
   + 針對 **Outgoing claim type** (傳出宣告類型)，選擇 **Name ID** (名稱 ID)。
   + 針對 **Outgoing name ID format (傳出名稱 ID 格式)**，選擇 **Persistent Identifier (持久性標識符)**。
   + 選取 **Pass through all claim values** (傳遞所有宣告值)。  
![\[建立第一個宣告規則。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-18.png)

1. 選擇 **Add Rule** (新增規則)，然後輸入下列資訊以建立宣告規則 2，然後選擇 **Finish** (完成)。
   + 針對 **Claim rule name** (宣告規則名稱)，輸入 **RoleSessionName**。
   + 針對 **Rule template** (規則範本)，使用 **Send LDAP Attribute as Claims** (將 LDAP 屬性傳送為宣告)。
   + 針對 **Attribute store (屬性存放區)**，選擇 **Active Directory**。
   + 針對 **Mapping of LDAP attributes to outgoing claim types** (將 LDAP 屬性映射至傳出宣告類型)，新增屬性 **E-Mail-Addresses**。針對 **Outgoing Claim Type** (傳出宣告類型)，輸入 ** https://aws.amazon.com/SAML/Attributes/RoleSessionName**。  
![\[建立第二個宣告規則。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-19.png)

1. 選擇 **Add Rule** (新增規則)，然後輸入下列資訊以建立宣告規則 3，然後選擇 **Finish** (完成)。
   + 針對 **Claim rule name** (宣告規則名稱)，輸入 **Get AD Groups**。
   + 針對 **Rule template** (規則範本)，使用 **Send Claims Using a Custom Rule** (使用自訂規則傳送宣告)。
   + 針對 **Custom rule** (自訂規則)，輸入下列程式碼。

     ```
     c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", 
      Issuer == "AD AUTHORITY"]=> add(store = "Active Directory", types = ("http://temp/variable"),  
      query = ";tokenGroups;{0}", param = c.Value);
     ```  
![\[建立第三個宣告規則。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-20.png)

1. 選擇 **Add Rule** (新增規則)。輸入下列資訊以建立宣告規則 4，然後選擇 **Finish** (完成)。
   + 針對 **Claim rule name** (宣告規則名稱)，輸入 **Role**。
   + 針對 **Rule template** (規則範本)，使用 **Send Claims Using a Custom Rule** (使用自訂規則傳送宣告)。
   + 針對 **Custom rule** (自訂規則)，輸入下列含有您先前建立的帳戶號碼和 SAML 提供者的名稱的程式碼：

     ```
     c:[Type == "http://temp/variable", Value =~ "(?i)^aws-"]=> issue(Type = "https://aws.amazon.com/SAML/Attributes/Role",  
     Value = RegExReplace(c.Value, "aws-", "arn:aws:iam::AWS_ACCOUNT_NUMBER:saml-provider/adfs-saml-provider,arn:aws:iam:: AWS_ACCOUNT_NUMBER:role/"));
     ```  
![\[建立第四個宣告規則。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-21.png)

## 3. 建立 Active Directory 使用者和群組
<a name="odbc-adfs-saml-creating-active-directory-users-and-groups"></a>

現在，您已準備好建立可存取 Athena 的 AD 使用者，以及可將其放入的 AD 群組，以便您可以依群組控制存取層級。建立可分類資料存取模式的 AD 群組之後，您可以將使用者新增至這些群組。

**若要建立 AD 使用者以存取 Athena**

1. 在 Server Manager Dashboard (伺服器管理員儀表板) 上，選擇 **Tools** (工具)，然後選擇 **Active Directory Users and Computers** (Active Directory 使用者和電腦)。  
![\[選擇 Tools (工具)、Active Directory Users and Computers (Active Directory 使用者和電腦)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-22.png)

1. 在導覽窗格中，選擇**使用者** 。

1. 在 **Active Directory Users and Computers** (Active Directory 使用者和電腦) 工具列上，選擇 **Create user** (建立使用者) 選項。  
![\[選擇 Create user (建立使用者)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-23.png)

1. 在 **New Object – User** (新建 – 使用者) 對話方塊中，對於 **First name** (名字)、**Last name** (姓氏) 和 **Full name** (全名)，輸入名稱。本教學課程使用的是 **Jane Doe**。  
![\[輸入使用者名稱。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-24.png)

1. 選擇**下一步**。

1. 對於 **Password** (密碼)，輸入密碼，然後再次輸入以確認。

   為了簡單起見，本教學課程取消選取 **User must change password at next sign on** (使用者必須在下次登入時變更密碼)。在真實世界的案例中，您應該要求新建立的使用者變更其密碼。  
![\[輸入密碼。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-25.png)

1. 選擇**下一步**。

1. 選擇**完成**。  
![\[選擇完成。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-26.png)

1. 在 **Active Directory Users and Computers** (Active Directory 使用者和電腦) 上，選擇使用者名稱。

1. 在使用者的 **Properties** (屬性) 對話方塊中，對於 **E-mail** (電子郵件)，輸入電子郵件地址。本教學課程使用的是 **jane@example.com**。  
![\[輸入電子郵件地址。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-27.png)

1. 選擇**確定**。

### 建立 AD 群組，以代表資料存取模式
<a name="odbc-adfs-saml-create-ad-groups-to-represent-data-access-patterns"></a>

您可以建立 AD 群組，其成員在登入時擔任 IAM `adfs-data-access` 角色 AWS。下列範例會建立一個名為 aws-adfs-data-access 的 AD 群組。

**若要建立 AD 群組**

1. 在 Server Manager Dashboard (伺服器管理員儀表板) 上，從 **Tools** (工具) 選單上，選擇 **Active Directory Users and Computers** (Active Directory 使用者和電腦)。

1. 在工具列上，選擇 **Create new group** (建立新的群組) 選項。  
![\[選擇 Create new group (建立新群組)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-28.png)

1. 在 **New Object - Group** (新增物件 - 群組) 對話方塊中，輸入下列資訊：
   + 針對 **Group name** (群組名稱)，輸入 **aws-adfs-data-access**。
   + 針對 **Group scope** (群組範圍)，選取 **Global** (全域)。
   + 針對 **Group type** (群組類型)，選取 **Security** (安全)。  
![\[在 AD 中建立全域安全群組。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-29.png)

1. 選擇**確定**。

### 將 AD 使用者新增至相應群組
<a name="odbc-adfs-saml-add-ad-users-to-appropriate-groups"></a>

既然您已建立 AD 使用者和 AD 群組，您可以將使用者新增至群組。

**若要將 AD 使用者新增至 AD 群組**

1. 在 Server Manager Dashboard (伺服器管理員儀表板) 上的 **Tools** (工具) 選單上，選擇 **Active Directory Users and Computers** (Active Directory 使用者和電腦)。

1. 針對 **First name** (名字) 和 **Last name** (姓氏)，選擇使用者 (例如，**Jane Doe**)。

1. 在使用者的 **Properties** (屬性) 對話框中的 **Member Of** (成員群組) 標籤上，選擇 **Add** (新增)。  
![\[選擇新增。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-30.png)

1. 根據您的需求新增一或多個 AD FS 群組。本教學課程新增了 **aws-adfs-data-access** 群組。

1. 在 **Select Groups** (選取群組) 對話方塊中，針對 **Enter the object names to select** (輸入要選取的物件名稱)，輸入您建立的 AD FS 群組的名稱 (例如，**aws-adfs-data-access**)，然後選擇 **Check Names** (檢查名稱)。  
![\[選擇 Check Names (檢查名稱)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-31.png)

1. 選擇**確定**。

   在使用者的 **Properties** (屬性) 對話方塊中，AD 群組的名稱會顯示在 **Member of** (成員群組) 清單中。  
![\[AD 群組已新增至使用者屬性。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-32.png)

1. 選擇 **Apply** (套用)，然後選擇 **OK** (確定)。

## 4. 設定 AD FS ODBC 與 Athena 之間的連線
<a name="odbc-adfs-saml-configuring-the-ad-fs-odbc-connection-to-athena"></a>

建立 AD 使用者和群組之後，您便準備好使用 Windows 中的 ODBC 資料來源程式來設定 Athena ODBC 與 AD FS 的連線。

**若要設定 AD FS ODBC 與 Athena 之間的連線**

1. 安裝適用於 Athena 的 ODBC 驅動程式。如需下載連結，請參閱[使用 ODBC 連接到 Amazon Athena](connect-with-odbc.md)。

1. 在 Windows 中，選擇 **Start** (開始)，**ODBC Data Sources** (ODBC 資料來源)。

1. 在 **ODBC Data Source Administrator** (ODBC 資料來源管理員) 程式中，選擇 **Add** (新增)。  
![\[選擇 Add (新增) 以新增 ODBC 資料來源。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-33.png)

1. 在 **Create New Data Source** (建立新的資料來源) 對話方塊中，選擇 **Simba Athena ODBC Driver** (Simba Athena ODBC 驅動程式)，然後選擇 **Finish** (完成)。  
![\[選擇 Simba Athena ODBC Driver (Simba Athena ODBC 驅動程式)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-34.png)

1. 在 **Simba Athena ODBC Driver DSN Setup** (Simba Athena ODBC 驅動程式 DSN 設定) 對話方塊中，輸入以下值：
   + 在 **Data Source Name** (資料來源名稱)，為您的資料來源輸入名稱，例如 ** Athena-odbc-test**。
   + 在 **Description** (描述) 輸入對資料來源的描述。
   + 針對 **AWS 區域**，輸入 AWS 區域 您正在使用的 （例如 ** us-west-1**)。
   + 在 **S3 Output Location** (S3 輸出位置) 輸入您要存放輸出內容的 Amazon S3 路徑。  
![\[輸入 Simba Athena ODBC Driver DSN Setup (Simba Athena ODBC 驅動程式 DSN 設定) 的值。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-35.png)

1. 選擇 **Authentication Options** (身分驗證選項)。

1. 在 **Authentication Options** (身分驗證選項) 對話方塊中，指定以下值：
   + 在 **Authentication Type** (身分驗證類型) 中，選擇 **ADFS**。
   + 在 **User** (使用者) 中，輸入使用者的電子郵件地址 (例如，**jane@example.com**)。
   + 在 **Password** (密碼) 中，輸入使用者的 ADFS 密碼。
   + 在 **IdP Host** (IdP 主機) 中，輸入 AD FS 伺服器名稱 (例如，**adfs.example.com**)。
   + 在 **IdP Port** (IdP 主機) 中，使用預設值 **443**。
   + 選取 **SSL Insecure** (SSL 不安全) 選項。  
![\[設定身分驗證選項。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-adfs-saml-37.png)

1. 選擇 **OK** (確定)，以關閉 **Authentication Options** (身分驗證選項)。

1. 選擇 **Test** (測試) 以測試連接，或 **OK** (確定) 以完成操作。

# 使用 Okta 外掛程式和 Okta 身分提供者設定 ODBC 的 SSO
<a name="odbc-okta-plugin"></a>

本頁面說明如何設定 Amazon Athena ODBC 驅動程式和 Okta 外掛程式，以使用 Okta 身分提供者新增單一登入 (SSO) 功能。

## 先決條件
<a name="odbc-okta-plugin-prerequisites"></a>

完成本教學課程中的步驟需要以下項目：
+ Amazon Athena ODBC 驅動程式。如需下載連結，請查看[使用 ODBC 連接到 Amazon Athena](connect-with-odbc.md)。
+ 您要搭配 SAML 使用的 IAM 角色。如需詳細資訊，請參閱*《IAM 使用者指南》*中的[為 SAML 2.0 聯合身分建立角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html)。
+ Okta 帳戶。如需詳細資訊，請前往 [Okta.com](https://www.okta.com/)。

## 在 Okta 中建立應用程式整合作業
<a name="odbc-okta-plugin-creating-an-app-integration-in-okta"></a>

首先，使用 Okta 儀表板建立及設定 SAML 2.0 應用程式，以透過單一登入機制存取 Athena。您可以使用 Okta 中現有的 Redshift 應用程式，設定對 Athena 的存取權。

**在 Okta 中建立應用程式整合作業**

1. 在 [Okta.com](https://www.okta.com/) 上登入您帳戶的管理頁面。

1. 在導覽窗格中，依序選擇 **Applications** (應用程式) 和 **Applications** (應用程式)。

1. 在 **Applications** (應用程式) 頁面上，選擇 **Browse App Catalog** (瀏覽應用程式目錄)。

1. 在 **Browse App Integration Catalog** (瀏覽應用程式整合目錄) 頁面的 **Use Case** (使用案例) 區段中，選擇 **All Integrations** (所有整合)。

1. 在搜尋方塊中輸入 **Amazon Web Services Redshift**，然後選擇 **Amazon Web Services Redshift SAML**。

1. 選擇 **Add Integration** (新增整合作業)。  
![\[選擇 Add Integration (新增整合作業)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-1.png)

1. 在 **General Settings Required** (必要的一般設定) 區段中，針對 **Application ** (應用程式) 標籤輸入應用程式的名稱。本教學課程使用的名稱為 **Athena-ODBC-Okta**。  
![\[輸入 Okta 應用程式的名稱。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-2.png)

1. 選擇 **Done** (完成)。

1. 在 Okta 應用程式的頁面上 (例如 **Athena-ODBC-Okta**)，選擇 **Sign On** (登入)。  
![\[選擇 Sign On (登入) 標籤。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-3.png)

1. 在 **Settings** (設定) 區段中，選擇 **Edit** (編輯)。  
![\[選擇 Edit (編輯)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-4.png)

1. 在 **Advanced Sign-on Settings** (進階登入設定) 區段設定下列值。
   + 對於 **IdP ARN 和角色 ARN**，請以逗號分隔值輸入您的 AWS IDP ARN 和角色 ARN。如需 IAM 角色格式的相關資訊，請參閱[《IAM 使用者指南》](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_assertions.html)的*為身分驗證回應設定 SAML 聲明*。
   + 在 **Session Duration** (工作階段持續時間) 輸入 900 秒到 43200 秒之間的值。本教學課程使用預設值 3600 (亦即 1 小時)。  
![\[輸入進階登入設定。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-5.png)

   Athena 不需使用 **DbUser Format** (DbUser 格式)、**AutoCreate** 和 **Allowed DBGroups** (允許的 DBGroups) 設定，因此您不必設定這些欄位。

1. 選擇**儲存**。

## 從 Okta 擷取 ODBC 組態資訊
<a name="odbc-okta-plugin-retrieve-odbc-configuration-information-from-okta"></a>

既然您已建立 Okta 應用程式，您可以準備擷取應用程式的 ID 和 IdP 主機 URL。稍後設定 ODBC 以連線至 Athena 時，您會需要這些資訊。

**從 Okta 擷取 ODBC 組態資訊**

1. 選擇 Okta 應用程式的 **General** (一般) 標籤，接著向下捲動至 **App Embed Link** (應用程式內嵌連結) 區段。  
![\[Okta 應用程式的內嵌連結 URL。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-6.png)

   **Embed Link** (內嵌連結) URL 的格式如下：

   ```
   https://trial-1234567.okta.com/home/amazon_aws_redshift/Abc1de2fghi3J45kL678/abc1defghij2klmNo3p4
   ```

1. 從您的 **Embed Link** (內嵌連結) URL 擷取及儲存以下部分：
   + 第一個區段中 `https://` 之後到 `okta.com` (含) 的內容 (例如 **trial-1234567.okta.com**)。這是您的 IdP 主機。
   + URL 的最後兩小段，包括中間的正斜線。這些區段是兩個由 20 個字元組成的字串，其中包含數字和大小寫字母的混合 (例如 **Abc1de2fghi3J45kL678/abc1defghij2klmNo3p4**)。這是您的應用程式 ID。

## 將使用者新增至 Okta 應用程式
<a name="odbc-okta-plugin-add-a-user-to-the-okta-application"></a>

現在您可以準備將使用者新增至 Okta 應用程式。

**將使用者新增至 Okta 應用程式**

1. 在左側導覽窗格中，選擇 **Directory** (目錄)，然後選擇 **People** (人員)。

1. 選擇 **Add Person** (新增人員)。  
![\[選擇 Add Person (新增人員)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-7.png)

1. 在 **Add Person** (新增人員) 對話方塊中輸入下列資訊。
   + 輸入 **First name** (名字) 和 **Last name** (姓氏) 的值。本教學課程使用的是 **test user**。
   + 輸入 **Username** (使用者名稱) 和 **Primary email** (主要電子郵件) 的值。對於這兩個欄位，本教學課程皆使用 **test@amazon.com**。您對密碼的安全要求可能不盡相同。  
![\[輸入使用者憑證。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-8.png)

1. 選擇**儲存**。

現在，您可以準備將所建立的使用者指派給您的應用程式。

**將使用者指派給應用程式**

1. 在導覽窗格中，依序選擇 **Applications** (應用程式) 和 **Applications** (應用程式)，然後選擇您應用程式的名稱 (例如 **Athena-ODBC-Okta**)。

1. 選擇 **Assign** (指派)，然後選擇 **Assign to People** (指派給人員)。  
![\[選擇 Assign to People (指派給人員)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-9.png)

1. 為您的使用者選擇 **Assign** (指派) 選項，然後選擇 **Done** (完成)。  
![\[選擇 Assign (指派)，然後選擇 Done (完成)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-10.png)

1. 畫面出現提示時，選擇 **Save and Go Back** (儲存並返回)。對話方塊會顯示使用者的狀態為 **Assigned** (已指派)。

1. 選擇**完成**。

1. 選擇 **Sign On** (登入) 標籤。

1. 向下捲動至 **SAML Signing Certificates** (SAML 簽署憑證) 區段。

1. 選擇 **Actions** (動作)。

1. 開啟內容功能表 (按一下滑鼠右鍵)，選擇 **View IdP metadata** (檢視 IdP 中繼資料)，然後選擇瀏覽器選項以儲存檔案。

1. 以 `.xml` 為副檔名儲存檔案。  
![\[將 IdP 中繼資料儲存至本機 XML 檔案。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-11.png)

## 建立 AWS SAML 身分提供者和角色
<a name="odbc-okta-plugin-create-an-aws-saml-identity-provider-and-role"></a>

現在您已準備好將中繼資料 XML 檔案上傳至其中的 IAM 主控台 AWS。您將使用此檔案來建立 AWS SAML 身分提供者和角色。請使用 AWS 服務管理員帳戶執行這些步驟。

**在 中建立 SAML 身分提供者和角色 AWS**

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

1. 在導覽窗格中，選擇 **Identity providers** (身分提供者)，然後選擇 **Add provider** (新增提供者)。  
![\[選擇 Add provider (新增提供者)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-12.png)

1. 在 **Add an Identity provider** (新增身分提供者) 頁面的 **Configure provider** (設定提供者) 位置，輸入下列資訊。
   + 在 **Provider type** (提供者類型) 選擇 **SAML**。
   + 在 **Provider name** (提供者名稱) 輸入提供者的名稱，例如 ** AthenaODBCOkta**。
   + 在 **Metadata document** (中繼資料文件) 使用 **Choose file** (選擇檔案) 選項，上傳您所下載的身分提供者 (IdP) 中繼資料 XML 檔案。  
![\[輸入身分提供者的名稱。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-13.png)

1. 選擇 **Add provider** (新增提供者)。

### 為 Athena 和 Amazon S3 存取作業建立 IAM 角色
<a name="odbc-okta-plugin-creating-an-iam-role-for-athena-and-amazon-s3-access"></a>

現在，您可以準備為 Athena 和 Amazon S3 存取作業建立 IAM 角色。您會將這個角色指派給您的使用者，如此一來，該使用者就能透過單一登入機制存取 Athena。

**為使用者建立 IAM 角色**

1. 在 IAM 主控台導覽窗格中，選擇 **Roles** (角色)，然後選擇 **Create role** (建立角色)。  
![\[選擇建立角色。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-14.png)

1. 在 **Create role** (建立角色) 頁面上選擇下列選項：
   + 在 **Select type of trusted entity** (選取信任的實體類型) 選擇 **SAML 2.0 Federation** (SAML 2.0 聯合)。
   + 在 **SAML 2.0-based provider** (SAML 2.0 提供者) 選擇您所建立的 SAML 身分提供者，例如 **AthenaODBCOkta**。
   + 選取**允許程式設計和 AWS 管理主控台 存取**。  
![\[選擇 Create role (建立角色) 頁面上的選項。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-15.png)

1. 選擇**下一步**。

1. 在 **Add Permissions** (新增許可) 頁面上的 **Filter policies** (篩選政策) 位置，輸入 **AthenaFull**，然後按 Enter 鍵。

1. 選取 `AmazonAthenaFullAccess` 受管政策，然後選擇 **Next** (下一步)。  
![\[選擇 AmazonAthenaFullAccess 受管政策。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-16.png)

1. 在 **Name, review, and create** (命名、檢閱及建立) 頁面上的 **Role name** (角色名稱) 位置，輸入角色的名稱 (例如 **Athena-ODBC-OktaRole**)，然後選擇 **Create role (建立角色)**。

## 設定 Okta ODBC 與 Athena 之間的連線
<a name="odbc-okta-plugin-configuring-the-okta-odbc-connection-to-athena"></a>

現在，您可以準備使用 Windows 的 ODBC 資料來源程式，設定 Okta ODBC 與 Athena 的連線。

**設定 Okta ODBC 與 Athena 的連線**

1. 啟動 Windows 的 **ODBC 資料來源**程式。

1. 在 **ODBC Data Source Administrator** (ODBC 資料來源管理員) 程式中，選擇 **Add** (新增)。  
![\[選擇新增。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-17.png)

1. 選擇 **Simba Athena ODBC Driver** (Simba Athena ODBC 驅動程式)，然後選擇 **Finish** (完成)。  
![\[選擇 Athena ODBC 驅動程式。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-18.png)

1. 在 **Simba Athena ODBC Driver DSN Setup** (Simba Athena ODBC 驅動程式 DSN 設定) 對話方塊中，輸入所述的值。
   + 在 **Data Source Name** (資料來源名稱)，為您的資料來源輸入名稱，例如 **Athena ODBC 64**。
   + 在 **Description** (描述) 輸入對資料來源的描述。
   + 針對 **AWS 區域**，輸入 AWS 區域 您正在使用的 （例如 **us-west-1**)。
   + 在 **S3 Output Location** (S3 輸出位置) 輸入您要存放輸出內容的 Amazon S3 路徑。  
![\[輸入您為資料來源名稱設定的值。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-19.png)

1. 選擇 **Authentication Options** (身分驗證選項)。

1. 在 **Authentication Options** (身分驗證選項) 對話方塊中，選擇或輸入以下值。
   + 在 **Authentication Type** (身分驗證類型) 選擇 **Okta**。
   + 在 **User** (使用者) 輸入您的 Okta 使用者名稱。
   + 在 **Password** (密碼) 輸入您的 Okta 密碼。
   + 在 **IdP Host** (IdP 主機) 輸入您先前記下的值，例如 **trial-1234567.okta.com**。
   + 在 **IdP Port** (IdP 連接埠) 輸入 **443**。
   + 在 **App ID** (應用程式 ID) 輸入您先前記下的值 (Okta 內嵌連結的最後兩個區段)。
   + 在 **Okta App Name** (Okta 應用程式名稱) 輸入 **amazon\$1aws\$1redshift**。  
![\[輸入身分驗證選項。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/odbc-okta-plugin-20.png)

1. 選擇 **OK** (確定)。

1. 選擇 **Test** (測試) 來測試連線，或選擇 **OK** (確定) 完成操作。

# 使用 ODBC、SAML 2.0 和 Okta 身分提供者設定單一登入
<a name="okta-saml-sso"></a>

若要連接到資料來源，您可以將 Amazon Athena 與 PingOne、Okta、OneLogin 等身分提供者 (IdP) 一起使用。從 Athena ODBC 驅動程式 1.1.13 版和 Athena JDBC 驅動程式 2.0.25 版開始，包含瀏覽器 SAML 外掛程式，您可以將其設定為與任何 SAML 2.0 提供者一起使用。此主題說明如何設定 Amazon Athena ODBC 驅動程式和以瀏覽器為基礎的 SAML 外掛程式，以使用 Okta 身分提供者新增單一登入 (SSO) 功能。

## 先決條件
<a name="okta-saml-sso-prerequisites"></a>

完成本教學課程中的步驟需要以下內容：
+ Athena ODBC 驅動程式 1.1.13 版或更高版本。1.1.13 版及更新版本包括瀏覽器 SAML 支援。如需下載連結，請參閱[使用 ODBC 連接到 Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/connect-with-odbc.html)。
+ 您要搭配 SAML 使用的 IAM 角色。如需詳細資訊，請參閱*《IAM 使用者指南》*中的[為 SAML 2.0 聯合身分建立角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html)。
+ Okta 帳戶。如需詳細資訊，請造訪 [okta.com](https://www.okta.com/)。

## 在 Okta 中建立應用程式整合作業
<a name="okta-saml-sso-creating-an-app-integration-in-okta"></a>

首先，使用 Okta 儀表板建立和設定 SAML 2.0 應用程式，以進行單一登入至 Athena。

**使用 Okta 儀表板設定 Athena 的單一登入**

1. 登入 Okta 管理頁面，網址為 `okta.com`。

1. 在導覽窗格中，選擇 **Applications** (應用程式)、**Applications** (應用程式)。

1. 在 **Applications** (應用程式) 頁面，選擇 **Create App Integration** (建立應用程式整合)。  
![\[選擇 Create App Integration (建立應用程式整合)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/okta-saml-sso-1.png)

1. 在 **Create a new app integration** (建立新的應用程式整合) 對話方塊中，為 **Sign-in method** (登入方法) 選取 **SAML 2.0**，然後選擇 **Next** (下一步)。  
![\[選擇 SAML 2.0\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/okta-saml-sso-2.png)

1. 在 **Create SAML Integration** (建立 SAML 整合) 頁面的 **General Settings** (一般設定) 區段中，輸入應用程式的名稱。本教學課程使用名稱 **Athena SSO**。  
![\[輸入 Okta 應用程式的名稱。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/okta-saml-sso-3.png)

1. 選擇 **Next** (下一步)。

1. 在 **Configure SAML** (設定 SAML) 頁面的 **SAML Settings** (SAML 設定) 區段中，輸入以下值：
   + **Single sign on URL** (URL 上的單一登入)：輸入 **http://localhost:7890/athena**
   + **Audience URI** (對象 URI)：輸入 **urn:amazon:webservices**  
![\[輸入 SAML 設定。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/okta-saml-sso-4.png)

1. **Attribute Statements (optional)** (屬性陳述式 (選用))：輸入以下兩個名稱/值對。這些是必要的映射屬性。
   + 於 **Name** (名稱) 輸入下列 URL：

     **https://aws.amazon.com/SAML/Attributes/Role**

     **Value** (值)：輸入 IAM 角色名稱。如需 IAM 角色格式的相關資訊，請參閱《*IAM 使用者指南*》的[為身分驗證回應設定 SAML 聲明](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_assertions.html)。
   + 於 **NAME** (名稱) 輸入下列 URL：

     **https://aws.amazon.com/SAML/Attributes/RoleSessionName**

     於 **Value** (數值) 輸入 **user.email**。  
![\[為 Athena 輸入 SAML 屬性。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/okta-saml-sso-5.png)

1. 選擇 **Next** (下一步)，然後選擇 **Finish** (完成)。

   Okta 建立應用程式時還會建立您的登入 URL；接下來會擷取該 URL。

## 從 Okta 儀表板取得登入 URL
<a name="okta-saml-sso-getting-the-login-url-from-the-okta-dashboard"></a>

現在您的應用程式已建立完畢，您可以從 Okta 儀表板取得其登入 URL 和其他中繼資料。

**從 Okta 儀表板取得登入 URL**

1. 在 Okta 導覽窗格中，選擇 **Applications** (應用程式)、**Applications** (應用程式)。

1. 選擇您要尋找登入 URL 的應用程式，(例如 **AthenaSSO**)。

1. 在您應用程式的頁面中，選擇 **Sign On** (登入)。  
![\[選擇 Sign On (登入)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/okta-saml-sso-6.png)

1. 選擇 **View Setup Instructions** (檢視設定指示)。  
![\[選擇 View Setup Instructions (檢視設定指示)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/okta-saml-sso-7.png)

1. 在 **How to Configure SAML 2.0 for Athena SSO** (如何為 Athena SSO 設定 SAML 2.0) 頁面上，尋找身分提供者**身分提供者發行者**的 URL。Okta 儀表板中的某些位置會將此 URL 視為 **SAML 發行者 ID**。  
![\[身分提供者發行者的值為您的登入 URL。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/okta-saml-sso-8.png)

1. 複製或存放身分提供者**身分提供者單一登入 URL** 的值。

   在下一區段中，當您設定 ODBC 連接時，您將提供這個值作為瀏覽器 SAML 外掛程式的**登入 URL** 連接參數。

## 設定瀏覽器 SAML ODBC 連接至 Athena
<a name="okta-saml-sso-configuring-the-browser-saml-odbc-connection-to-athena"></a>

現在，您已經準備好在 Windows 中使用 ODBC 資料來源程式來設定瀏覽器 SAML 與 Athena 的連接。

**設定瀏覽器 SAML ODBC 連接至 Athena**

1. 在 Windows 中，啟動 **ODBC 資料來源**程式。

1. 在 **ODBC Data Source Administrator** (ODBC 資料來源管理員) 程式中，選擇 **Add** (新增)。  
![\[選擇新增。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/okta-saml-sso-9.png)

1. 選擇 **Simba Athena ODBC Driver** (Simba Athena ODBC 驅動程式)，然後選擇 **Finish** (完成)。  
![\[選擇 Simba Athena Driver (Simba Athena 驅動程式)\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/okta-saml-sso-10.png)

1. 在 **Simba Athena ODBC Driver DSN Setup** (Simba Athena ODBC 驅動程式 DSN 設定) 對話方塊中，輸入描述的值。  
![\[輸入 DSN 設定值。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/okta-saml-sso-11.png)
   + **Data Source Name** (資料來源名稱)：輸入您的資料來源名稱 (例如 **Athena ODBC 64**)。
   + 於 **Description** (描述) 輸入您資料來源的描述。
   + 針對 **AWS 區域**，輸入 AWS 區域 您正在使用的 （例如，**us-west-1**)。
   + 在 **S3 Output Location** (S3 輸出位置) 輸入您要存放輸出內容的 Amazon S3 路徑。

1. 選擇 **Authentication Options** (身分驗證選項)。

1. 在 **Authentication Options** (身分驗證選項) 對話方塊中，選擇或輸入以下值。  
![\[輸入身分驗證選項。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/okta-saml-sso-12.png)
   + **Authentication Type** (身分驗證類型)：選擇 **BrowserSAML**。
   + 對於**登入 URL**，輸入您從 Okta 儀表板取得的身分提供者**身分提供者單一登入 URL**。
   + 於 **Listen Port** (接聽連接埠) 輸入 **7890**。
   + **Timeout (sec)** (逾時 (秒))：輸入連接逾時值 (以秒為單位)。

1. 選擇 **OK** (確定)，以關閉 **Authentication Options** (身分驗證選項)。

1. 選擇 **Test** (測試) 以測試連接，或 **OK** (確定) 以完成操作。

# 使用 Amazon Athena Power BI 連接器
<a name="connect-with-odbc-and-power-bi"></a>

您可以在 Windows 作業系統上，使用 Amazon Athena 的 Microsoft Power BI 連接器，以在 Microsoft Power BI 桌面版中分析 Amazon Athena 的資料。如需 Power BI 的相關資訊，請參閱 [Microsoft Power BI](https://powerbi.microsoft.com/)。在您將內容發佈至 Power BI 服務後，便可使用 2021 年 7 月或更新版本的 [Power BI 閘道](https://powerbi.microsoft.com/gateway/)，透過隨需或排程的重新整理，讓內容保持在最新狀態。

## 先決條件
<a name="connect-with-odbc-and-power-bi-prerequisites"></a>

在您開始前，請確定您的環境符合下列要求。需使用 Amazon Athena ODBC 驅動程式。
+ [AWS 帳戶](https://aws.amazon.com/)
+ [使用 Athena 的許可](policy-actions.md)
+ [Amazon Athena ODBC 驅動程式](connect-with-odbc.md)
+ [Power BI 桌面版](https://powerbi.microsoft.com/en-us/desktop/)

## 支援的功能
<a name="connect-with-odbc-and-power-bi-capabilities-supported"></a>
+ **匯入** - 將選取的資料表和資料欄匯入 Power BI 桌面版，以進行查詢。
+ **DirectQuery** - 不會將任何資料匯入或複製至 Power BI 桌面版。Power BI 桌面版會直接查詢基礎資料來源。
+ **Power BI 閘道** – 您 中的內部部署資料閘道 AWS 帳戶 ，運作方式類似 Microsoft Power BI Service 和 Athena 之間的橋樑。需要有閘道才能查看您在 Microsoft Power BI 服務上的資料。

## 連接至 Amazon Athena
<a name="connect-with-odbc-and-power-bi-connect-to-amazon-athena"></a>

若要將 Power BI 桌面版連接至您的 Amazon Athena 資料，請執行下列步驟。

**從 Power BI 桌面版連接至 Athena 資料**

1. 啟動 Power BI 桌面版。

1. 執行以下任意一項：
   + 選擇 **File** (檔案)，然後選取 **Get Data** (取得資料)
   + 從 **Home** (首頁) 功能區中，選擇 **Get Data** (取得資料)。

1. 在搜尋方塊中，輸入 **Athena**。

1. 選取 **Amazon Athena**，然後選擇 **Connect** (連接)。  
![\[選擇 Amazon Athena 連接器\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connect-with-odbc-and-power-bi-1.png)

1. 在 **Amazon Athena** 連接頁面上，輸入以下資訊。
   + 若為 **DSN**，請輸入您要使用的 ODBC DSN 名稱。如需有關設定 DSN 的指示，請參閱 [ODBC 驅動程式文件](connect-with-odbc-driver-and-documentation-download-links.md#connect-with-odbc-driver-documentation)。
   + 若為**資料連線模式**，請依照以下一般準則選擇一個適合您使用案例的模式：
     + 若為較小的資料集，請選擇 **Import** (匯入)。在使用匯入模式時，Power BI 會與 Athena 搭配運作，以匯入整個資料集的內容，以便在視覺效果中使用。
     + 若為較大的資料集，請選擇 **DirectQuery**。在 DirectQuery 模式中，系統不會下載任何資料至您的工作站。在您建立視覺效果或與其互動時，Microsoft Power BI 會與 Athena 搭配運作，動態查詢基礎資料來源，讓您隨時都能檢視目前資料。如需 DirectQuery 的詳細資訊，請參閱 Microsoft 文件中的[在 Power BI 桌面版中使用 DirectQuery](https://docs.microsoft.com/power-bi/connect-data/desktop-use-directquery)。  
![\[輸入您的資料連接資訊\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connect-with-odbc-and-power-bi-2.png)

1. 選擇**確定**。

1. 在設定資料來源身分驗證的提示中，選擇 **Use Data Source Configuration** (使用資料來源組態) 或**AAD Authentication** (AAD 身分驗證)，然後選擇 **Connect** (連接)。  
![\[選擇一個資料來源身分驗證方法\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connect-with-odbc-and-power-bi-3.png)

   您的資料目錄、資料庫和資料表會顯示在 **Navigator** (導覽器) 對話方塊中。  
![\[導覽器會顯示您的資料\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connect-with-odbc-and-power-bi-4.png)

1. 在 **Display Options** (顯示選項) 窗格中，選取您要使用之資料集的核取方塊。

1. 如果您要在匯入資料集之前轉換資料集，請前往對話方塊底部，並選擇 **Transform Data** (轉換資料)。這會開啟 Power Query 編輯器，以便您篩選和精簡要使用的資料集。

1. 選擇**載入**。載入完成後，您便可以建立視覺效果 (如下圖所示)。如果您選取 **DirectQuery** 作為匯入模式，Power BI 會就您要求的視覺效果向 Athena 發出查詢。  
![\[範例資料視覺效果\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/connect-with-odbc-and-power-bi-5.png)

## 設定內部部署閘道
<a name="connect-with-odbc-and-power-bi-gateway-setup"></a>

您可以將儀表板和資料集發佈至 Power BI 服務，讓其他使用者可以透過 Web、行動裝置和內嵌應用程式與其互動。若要在 Microsoft Power BI 服務中查看您的資料，請在 AWS 帳戶中安裝 Microsoft Power BI 內部部署資料閘道。閘道會如同 Microsoft Power BI 服務和 Athena 之間的橋樑般運作。

**下載、安裝及測試內部部署資料閘道**

1. 請前往 [Microsoft Power BI gateway download](https://powerbi.microsoft.com/en-us/gateway/) (Microsoft Power BI 閘道下載)頁面，然後選擇個人模式或標準模式。個人模式適用於在本機測試 Athena 連接器。標準模式適用於多名使用者生產設定。

1. 若要安裝內部部署閘道 (個人或標準模式)，請參閱 Microsoft 文件中的[安裝內部部署資料閘道](https://docs.microsoft.com/en-us/data-integration/gateway/service-gateway-install)。

1. 若要測試閘道，請依照 Microsoft 文件中的[搭配使用自訂資料連接器和內部部署資料閘道](https://docs.microsoft.com/en-us/power-bi/connect-data/service-gateway-custom-connectors)。

如需內部部署資料閘道的詳細資訊，請參閱以下 Microsoft 資源。
+ [什麼是內部部署資料閘道？](https://docs.microsoft.com/en-us/power-bi/connect-data/service-gateway-onprem)
+ [部署 Power BI 資料閘道的指引](https://docs.microsoft.com/en-us/power-bi/connect-data/service-gateway-deployment-guidance)

如需設定 Power BI Gateway 與 Athena 搭配使用的範例，請參閱 AWS 大數據部落格文章[使用 amazon Athena 在 Microsoft power BI 上快速建立儀表板](https://aws.amazon.com/blogs/big-data/creating-dashboards-quickly-on-microsoft-power-bi-using-amazon-athena/)。

# 搭配使用可信身分傳播與 Amazon Athena 驅動器
<a name="using-trusted-identity-propagation"></a>

可信身分傳播為希望集中管理資料許可並根據其 IdP 身分跨服務界限授權請求的組織提供了新的身分驗證選項。使用 IAM Identity Center，您可以設定現有的 IdP 來管理使用者和群組，並使用 AWS Lake Formation 為這些 IdP 身分定義目錄資源的精細存取控制許可。Athena 支援在查詢資料時進行身分傳播，以稽核透過 IdP 身分的資料存取，進而協助您的組織滿足其法規和合規要求。

您現在可以使用 Java 資料庫連線 (JDBC) 或開放式資料庫連線 (ODBC) 驅動器，透過 IAM Identity Center 使用單一登入功能連線至 Athena。當您從 PowerBI、Tableau 或 DBeaver 等工具存取 Athena 時，您的身分和許可會透過 IAM Identity Center 自動傳播到 Athena。這表示在查詢資料時，會直接強制執行您的個別資料存取許可，而不需要單獨的身分驗證步驟或憑證管理。

對於管理員，此功能會透過 IAM Identity Center 和 Lake Formation 集中存取控制，進而確保在連接到 Athena 的所有支援分析工具中強制執行一致的許可。若要開始使用，請確保您的組織已將 IAM Identity Center 設定為您的身分來源，並為使用者設定適當的資料存取許可。

**Topics**
+ [關鍵定義](#using-trusted-identity-propagation-key-definitions)
+ [考量事項](#using-trusted-identity-propagation-considerations)
+ [先決條件](#using-trusted-identity-propagation-prerequisites)
+ [將 Athena 連線至 IAM Identity Center](using-trusted-identity-propagation-setup.md)
+ [使用 設定和部署資源 AWS CloudFormation](using-trusted-identity-propagation-cloudformation.md)

## 關鍵定義
<a name="using-trusted-identity-propagation-key-definitions"></a>

1. **應用程式角色** – 交換字符、擷取工作群組和客戶受管 AWS IAM Identity Center 應用程式 ARN 的角色。

1. **存取角色** – 搭配 Athena 驅動器使用的角色，以便透過身分增強憑證執行客戶工作流程。這表示需要此角色才能存取下游服務。

1. **客戶自管應用程式** – AWS IAM Identity Center 應用程式。如需詳細資訊，請參閱[客戶自管應用程式](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps.html)。

## 考量事項
<a name="using-trusted-identity-propagation-considerations"></a>

1. 此功能僅適用於已全面推出具有可信身分傳播的 Athena 的區域。如需有關可用性的詳細資訊，請參閱[考量事項和限制](https://docs.aws.amazon.com/athena/latest/ug/workgroups-identity-center.html)。

1. JDBC 和 ODBC 驅動程式支援啟用 IAM 的工作群組的受信任身分傳播。

1. 您可以使用 JDBC 和 ODBC 作為獨立驅動器，或搭配任何具有信任身分傳播的 BI 或 SQL 工具使用此身分驗證外掛程式。

## 先決條件
<a name="using-trusted-identity-propagation-prerequisites"></a>

1. 您必須啟用 AWS IAM Identity Center 執行個體。如需詳細資訊，請參閱[什麼是 IAM Identity Center？](https://docs.aws.amazon.com/singlesignon/latest/userguide/identity-center-instances.html)。

1. 您必須有運作中的外部身分提供者，且使用者或群組必須存在於 AWS IAM Identity Center 中。您可以自動佈建使用者或群組，或是手動或透過 SCIM 佈建。如需詳細資訊，請參閱[使用 SCIM 將外部身分提供者佈建至 IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/provision-automatically.html)。

1. 您必須將 Lake Formation 許可授予目錄、資料庫和資料表的使用者或群組。如需詳細資訊，請參閱[使用 Athena 透過 Lake Formation 查詢資料](https://docs.aws.amazon.com/athena/latest/ug/security-athena-lake-formation.html)。

1. 您必須擁有正常運作中的 BI 工具或 SQL 用戶端，才能使用 JDBC 或 ODBC 驅動器執行 Athena 查詢。

# 將 Athena 連線至 IAM Identity Center
<a name="using-trusted-identity-propagation-setup"></a>

下節列出將 Athena 連線至 IAM Identity Center 的程序。

## 設定可信權杖發行者
<a name="using-trusted-identity-propagation-step1"></a>

遵循[設定可信權杖發行者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html)指南，以便設定可信權杖發行者。這將建立 AWS IAM Identity Center。

**注意**  
對於**提供者問題**，選擇 **OpenID Connect**。在**提供者 URL** 中，輸入身分提供者的發行者 URL。對於**對象**，指定您應用程式身分提供者發出的用戶端 ID。  
 

複製 IAM Identity Provider 的應用程式資源名稱 AWS (ARN)。如需相關資訊，請參閱《[身分提供者和聯合](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html)》。

## 設定 IAM 角色
<a name="using-trusted-identity-propagation-step2"></a>

### 設定 IAM 應用程式角色
<a name="using-trusted-identity-propagation-step2-application-role"></a>

1. 前往 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在左側導覽窗格中，選擇**角色**，然後選擇**建立角色**。

1. 對於**信任的實體類型**，選擇**自訂信任政策**：

   1. 對於**聯合主體**，新增您在可信權杖發行者設定期間複製的 AWS IAM 身分提供者的 ARN。

   1. 對於政策條件，從外部聯合身分提供者新增對象。

1. 新增下列內嵌政策，以授予使用者對 [CreateTokenWithIAM](https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateTokenWithIAM.html)、[ListTagsForResource](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListTagsForResource.html) 和 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) 許可的存取權。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "athena:ListTags*",
                   "sso:ListTags*"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------
**注意**  
`CreateTokenWithIam` 許可會在客戶自管的 IAM Identity Center 應用程式中授予。

1. 複製應用程式角色的 ARN。

### 設定 IAM 存取角色
<a name="using-trusted-identity-propagation-step2-access-role"></a>

1. 前往 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在左側導覽窗格中，選擇**角色**，然後選擇**建立角色**。

1. 對於**信任的實體類型**，選擇**自訂信任政策**：

   1. 對於**聯合主體**，新增您在可信權杖發行者設定期間複製的 AWS IAM Identity Center 的 ARN。

   1. 對於 **AWS 主體**，新增在 IAM 應用程式角色設定期間複製的 AWS IAM 應用程式角色 ARN。

1. 新增下列**內嵌政策**，以授予驅動器工作流程的存取權：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "athena:StartQueryExecution",
                   "athena:GetQueryExecution",
                   "athena:GetQueryResults",
                   "athena:ListWorkGroups",
                   "athena:ListDataCatalogs",
                   "athena:ListDatabases",
                   "athena:ListTableMetadata"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket",
                   "s3:GetObject",
                   "s3:PutObject"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "glue:GetDatabase",
                   "glue:GetDatabases",
                   "glue:CreateTable",
                   "glue:GetTable",
                   "glue:GetTables",
                   "glue:UpdateTable",
                   "glue:DeleteTable",
                   "glue:BatchDeleteTable",
                   "glue:GetTableVersion",
                   "glue:GetTableVersions",
                   "glue:DeleteTableVersion",
                   "glue:BatchDeleteTableVersion",
                   "glue:CreatePartition",
                   "glue:BatchCreatePartition",
                   "glue:GetPartition",
                   "glue:GetPartitions",
                   "glue:BatchGetPartition",
                   "glue:UpdatePartition",
                   "glue:DeletePartition",
                   "glue:BatchDeletePartition"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "lakeformation:GetDataAccess"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 複製存取角色的 ARN。

## 設定 AWS IAM Identity Center 客戶受管應用程式
<a name="using-trusted-identity-propagation-step3"></a>

若要設定客戶受管應用程式，請遵循[設定客戶受管 OAuth 2.0 應用程式以取得受信任身分傳播中的步驟](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-trusted-identity-propagation-set-up-your-own-app-OAuth2.html)，並考量 Athena 的下列事項。
+ 對於**標籤**，新增下列鍵值對：
  + **索引鍵** – **AthenaDriverOidcAppArn**
  + **值** – 在 IAM 存取角色設定期間複製的 **AccessRoleARN**。
+ [指定應用程式登入](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-trusted-identity-propagation-set-up-your-own-app-OAuth2.html#customermanagedapps-trusted-identity-propagation-set-up-your-own-app-OAuth2-specify-application-credentials)資料時，請新增您在 AWS IAM 應用程式角色設定期間複製的 IAM 應用程式角色 ARN。
+ 對於**可接收請求的應用程式**，選擇 **AWS-Lake-Formation-AWS-Glue-Data-Catalog-<account-id>**。
+ 針對**要套用的存取範圍**，選取啟用 IAM 的工作群組的 **lakeformation：query**，或選取啟用 Identity Center 的工作群組的 **lakeformation：query**、**athena：workgroup：read\$1write** 和 **s3：access\$1grants：read\$1write**。

## 設定工作群組關聯
<a name="using-trusted-identity-propagation-step4"></a>

1. 在 Athena 主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 從清單中選擇工作群組，然後開啟**標籤**索引標籤。

1. 選擇**管理標籤**，然後輸入下列內容：

   1. **索引鍵**：`AthenaDriverOidcAppArn`

   1. **值** – AWS IAM Identity Center 應用程式的 ARN。

1. 選擇**儲存**。

管理員完成一次性設定後，他們可以將基本連線詳細資訊分發給使用者。使用者需要這五個強制性參數才能執行 SQL 工作負載：

1. **ApplicationRoleARN** – 應用程式角色的 ARN

1. **JwtWebIdentityToken** – 用於身分驗證的 JWT 權杖

1. **WorkgroupARN** – Athena 工作群組的 ARN

1. **JwtRoleSessionName** – JWT 角色的工作階段名稱

1. **CredentialsProvider** – 憑證提供者組態

**注意**  
我們已透過策略標記簡化連線字串組態。透過正確標記 Athena 工作群組和 AWS IAM Identity Center 客戶受管應用程式，管理員無需使用者提供 `AccessRoleArn`和 `CustomerIdcApplicationArn`。外掛程式會使用應用程式角色來尋找必要的標籤，並擷取其工作流程的對應 ARN 值，進而自動處理此問題。  
管理員仍然可以視需要調整應用程式角色許可，從而讓使用者在連線字串中提供 `AccessRoleArn` 或 `CustomerIdcApplicationArn`。

## 使用已啟用可信身分傳播的 Athena 驅動器執行查詢
<a name="using-trusted-identity-propagation-step5"></a>

下載要使用的最新版本驅動器。如需有關 JDBC 安裝的詳細資訊，請參閱 [JDBC 3.x 驅動器入門](jdbc-v3-driver-getting-started.md)。您可以根據支援的平台選擇安裝 ODBC 驅動器。如需詳細資訊，請參閱[ODBC 2.x 驅動器入門](odbc-v2-driver-getting-started.md)。根據您要使用的驅動器，提供下文列出的參數：
+ [JDBC 身分驗證外掛程式連線參數](jdbc-v3-driver-jwt-tip-credentials.md)
+ [ODBC 身分驗證外掛程式連線參數](odbc-v2-driver-jwt-tip.md)

**注意**  
具有驅動器的可信身分傳播僅適用於 JDBC 3.6.0 版或更高版本和 ODBC 2.0.5.0 版或更高版本。

## 搭配使用 Athena 驅動器與具有 DBeaver 的可信身分傳播
<a name="using-trusted-identity-propagation-step6"></a>

1. 從 Athena 下載具有相依性的最新 JDBC jar。如需詳細資訊，請參閱[Athena JDBC 3.x 驅動程式](jdbc-v3-driver.md)。

1. 在電腦上開啟 DBeaver 應用程式。

1. 導覽至螢幕頂端的**資料庫**選單，然後選擇**驅動器管理員**。

1. 選擇**新增**，然後選擇**程式庫**。

1. 新增最新的驅動器，然後選擇**尋找類別**。這將為您提供類似 `com.amazon.athena.jdbc.AthenaDriver` 的檔案路徑。

1. 開啟**設定**索引標籤並提供下列欄位

   1. **驅動器名稱** – Athena JDBC 可信身分傳播

   1. **類別名稱**– `com.amazon.athena.jdbc.AthenaDriver`

   1. 選取選項**無身分驗證**。

1. 選擇**連接至資料庫**並尋找 Athena JDBC 可信身分傳播。這會將您導向至 JDBC URL。如需詳細資訊，請參閱[設定驅動程式](jdbc-v3-driver-getting-started.md#jdbc-v3-driver-configuring-the-driver)。

1. 提供下列詳細資訊

   1. **工作群組** – 您要在其中執行查詢的工作群組。如需有關工作群組的資訊，請參閱[工作群組](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroup.html)。

   1. **區域** – 將執行查詢 AWS 區域 的 。如需區域清單，請參閱 [Amazon Athena 端點和配額](https://docs.aws.amazon.com/general/latest/gr/athena.html)。

   1. **OutputLocation** – Amazon S3 中您要存放查詢結果的位置。如需有關輸出位置的資訊，請參閱 [ResultConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_ResultConfiguration.html)。

   1. **CredentialsProvider** – 輸入 `JWT_TIP`。

   1. **ApplicationRoleArn** – 要啟用 `AssumeRoleWithWebIdentity` 的角色的 ARN。如需 ARN 角色的詳細資訊，請參閱 AWS Security Token Service API 參考中的 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。

   1. **WorkgroupArn** – 將執行查詢的工作群組的 ARN。其必須與**工作群組**欄位中提供的工作群組相同。如需有關工作群組的資訊，請參閱[工作群組](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroup.html)。

   1. **JwtRoleSessionName** – 使用 JWT 憑證進行身分驗證時的工作階段名稱。其可以是您選擇的任何名稱。

   1. **JwtWebIdentityToken** – 從外部聯合身分提供者獲得的 JWT 權杖。此權杖可用於向 Athena 進行身分驗證。

      ```
      jdbc:athena://Workgroup=<value>;Region=<region>;OutputLocation=<location>;CredentialsProvider=JWT_TIP;ApplicationRoleArn=<arn>;WorkgroupArn=<arn>;JwtRoleSessionName=JDBC_TIP_SESSION;JwtWebIdentityToken=<token>;
      ```

1. 選擇**確定**並關閉視窗。完成此步驟後，DBeaver 會開始載入中繼資料，而您應該會開始看到您的目錄、資料庫和資料表逐漸被填入。
**注意**  
如果權杖中存在 JTI 宣告，並且您在選擇**確定**之前選擇**測試連線**，則可防止重複使用相同的 JTI 進行權杖交換。如需詳細資訊，請參閱[可信權杖發行者的先決條件和考量事項](https://docs.aws.amazon.com/singlesignon/latest/userguide/using-apps-with-trusted-token-issuer.html#trusted-token-issuer-prerequisites)。為了處理此問題，JDBC 會實作記憶體快取，而其生命週期取決於主要驅動器執行個體。對於 ODBC，[檔案快取](odbc-v2-driver-jwt-tip.md#odbc-v2-driver-jwt-tip-file-cache)是選擇性存在的，可快取和重複使用臨時憑證，以減少工作階段生命週期期間使用的 Web 身分權杖數量。

1. 開啟 **SQL 查詢編輯器**，然後開始執行查詢。請參閱 [Cloudtrail 日誌](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)，驗證使用者的傳播身分。

# 使用 設定和部署資源 AWS CloudFormation
<a name="using-trusted-identity-propagation-cloudformation"></a>

您可以使用 CloudFormation 範本來設定和部署資源，以開始使用受信任身分傳播搭配 Athena 驅動程式，如下所示。

1. 下載 CloudFormation 範本以設定 IAM Identity Center 客戶受管應用程式和存取角色，以及工作群組和 IAM Identity Center 應用程式標籤。您可以從此[CloudFormation 範本連結](https://downloads.athena.us-east-1.amazonaws.com/drivers/CFNTemplate/AthenaDriversTrustedIdentityPropagationCFNTemplate.yaml)下載。

1. 執行 `create-stack` AWS CLI 命令來部署將佈建已設定資源的 CloudFormation 堆疊，如下所示。

   ```
   aws cloudformation create-stack \
       --stack-name my-stack \
       --template-url URL_of_the_file_that_contains_the_template_body \
       --parameters file://params.json
   ```

1. 若要檢視資源佈建的狀態，請導覽至 CloudFormation 主控台。叢集建立完成後，請在 Identity Center 主控台中檢視新的 IAM Identity Center 應用程式。您可以在 IAM 主控台中檢視 IAM 角色。

   這些標籤會在工作群組以及 IAM Identity Center 應用程式中建立關聯。

1. 利用建立的角色和應用程式，您即可立即使用 Athena 驅動器。若要使用 JDBC 驅動器，請參閱 [JDBC 身分驗證外掛程式連線參數](jdbc-v3-driver-jwt-tip-credentials.md)。若要使用 ODBC 驅動器，請參閱 [ODBC 身分驗證外掛程式連線參數](odbc-v2-driver-jwt-tip.md)。

# 建立資料庫和資料表
<a name="work-with-data"></a>

Amazon Athena 支援一部分的資料定義語言 (DDL) 陳述式及 ANSI SQL 函數和運算子，以定義和查詢 Amazon Simple Storage Service 中資料所在的外部資料表。

在 Athena 中建立資料庫和資料表時，您需要描述資料的結構描述和位置，才能讓資料表中的資料可供即時查詢。

為改善查詢效能並降低成本，建議您分割資料，並使用開放原始碼單欄格式以儲存於 Amazon S3 中，例如 [Apache Parquet](https://parquet.apache.org) 或 [ORC](https://orc.apache.org/)。

**Topics**
+ [建立資料庫](creating-databases.md)
+ [建立資料表](creating-tables.md)
+ [為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)
+ [逸出預留關鍵字](reserved-words.md)

# 在 Athena 中建立資料庫
<a name="creating-databases"></a>

Athena 中的資料庫是您在其中建立的資料表的邏輯群組。建立資料庫之前，請先建立查詢輸出位置。

**Topics**
+ [建立查詢輸出位置](creating-databases-prerequisites.md)
+ [建立 資料庫](creating-databases-query-editor.md)

# 建立查詢輸出位置
<a name="creating-databases-prerequisites"></a>

如果您尚未在 Amazon S3 中設定查詢輸出位置，請執行下列先決條件步驟。

**若要建立查詢輸出位置**

1. 使用您用於 Athena 的相同 AWS 區域 和 帳戶，依照步驟 （例如，使用 Amazon S3 主控台） 在 [Amazon S3 中建立儲存貯](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html)體，以保留您的 Athena 查詢結果。您可將此儲存貯體設定為您的查詢輸出位置。

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果這是您第一次造訪 Athena 主控台 AWS 區域，請選擇**探索查詢編輯器**以開啟查詢編輯器。此外，Athena 會於查詢編輯器中開啟。

1. 選擇 **Edit Settings** (編輯設定) 以在 Amazon S3 中設定查詢結果位置。  
![\[選擇編輯設定。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-choose-view-settings.png)

1. 對於 **Manage settings** (管理設定)，請執行下列其中一項動作：
   + 在 **Location of query result** (查詢結果的位置) 方塊中，輸入您在 Amazon S3 中為查詢結果建立的儲存貯體路徑。在路徑中加上 `s3://` 作為字首。
   + 選擇 **Browse S3** (瀏覽 S3)，選擇您在目前區域建立的 Amazon S3 儲存貯體，然後選擇 **Choose** (選擇)。  
![\[在 Amazon S3 中指定要從 Athena 接收查詢結果的位置。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-setting-results-location.png)

1. 選擇**儲存**。

1. 選擇 **Editor** (編輯器) 以切換至查詢編輯器。  
![\[選擇 Editor (編輯器)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-choose-editor.png)

# 建立 資料庫
<a name="creating-databases-query-editor"></a>

在您設定查詢結果位置之後，在 Athena 主控台查詢編輯器中建立資料庫輕鬆簡單。

**若要使用 Athena 查詢編輯器建立資料庫**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在**編輯器**索引標籤上，輸入 Hive 資料定義語言 (DDL) 命令 `CREATE DATABASE myDataBase`。以您想要的資料庫名稱取代 *myDatabase*。有關資料庫名稱的限制，請參閱 [為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)。

1. 選擇 **Run** (執行) 或按 **Ctrl\$1ENTER**。

1. 如需使您的資料庫訂為目前的資料庫，請從查詢編輯器左側的 **Database** (資料庫) 選單中選取它。

如需 Athena 資料庫控制許可的相關資訊，請參閱[在 中設定資料庫和資料表的存取權 AWS Glue Data Catalog](fine-grained-access-to-glue-resources.md)。

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

若要建立資料表，您可以使用 Athena [**建立資料表**表單](creating-tables-how-to.md#to-create-a-table-using-the-wizard)，或使用 JDBC 或 ODBC 驅動器，在 Athena 主控台中執行 DDL 陳述式。Athena 使用 Apache Hive 來定義資料表和建立資料庫，這本質上是資料表的邏輯命名空間。Athena 支援各種不同的序列化程式-還原序列化程式 (SerDe) 程式庫，從而可針對特定資料格式建立資料表。如需支援的 SerDe 程式庫清單，請參閱[為您的資料選擇 SerDe](supported-serdes.md)。

在 Athena 中建立資料庫和資料表時，您只需描述結構描述，以及位於 Amazon S3 中供讀取時間查詢的資料表資料所在的位置。Athena 不會修改 Amazon S3 中的資料。因此，資料庫和資料表會有與傳統關聯式資料庫系統稍微不同的意義，因為資料不會隨著資料庫和資料表的結構描述定義存放。

Athena 會將結構描述存放在 中， AWS Glue Data Catalog 並在您使用 SQL 查詢資料表時用它來讀取資料。此*讀時模式*方法可在您執行查詢時將結構描述投影到資料上，因此無需載入或轉換資料。

## 考量和限制
<a name="creating-tables-considerations-and-limitations"></a>

以下是 Athena 中針對資料表的一些重要限制和注意事項。

### Amazon S3 考量事項
<a name="s3-considerations"></a>

建立資料表時，您需使用 `LOCATION` 子句來指定基礎資料的 Amazon S3 儲存貯體位置。考慮下列各項：
+ Athena 只能查詢版本控制的 Amazon S3 儲存貯體上最新版本的資料，無法查詢之前版本的資料。
+ 您必須擁有使用 Amazon S3 位置中資料的許可。如需詳細資訊，請參閱[透過 Athena 控制 Amazon S3 的存取權](s3-permissions.md)。
+ Athena 支援查詢的物件可以與多個儲存類別一起存放在 `LOCATION` 子句指定的相同儲存貯體中。例如，您可以在存放於 Amazon S3 中不同儲存類別 (標準、標準 – IA 和智慧型分層) 的物件中查詢資料。
+ Athena 支援[申請者付款儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RequesterPaysBuckets.html)。如需有關如何對含有您要在 Athena 中查詢之來源資料的儲存貯體啟用申請者付款的資訊，請參閱[建立工作群組](creating-workgroups.md)。
+ 您可以使用 Athena 查詢從 Amazon Glacier Flexible Retrieval (舊稱 Glacier) 和 Amazon Glacier Deep Archive [Amazon S3 儲存類別](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html#sc-glacier)中還原的物件，您必須基於每個資料表啟用該功能。如果您在執行查詢之前未在資料表上啟用此功能，Athena 會在查詢執行期略過資料表的所有 Amazon Glacier Flexible Retrieval 和 Amazon Glacier Deep Archive 物件。如需詳細資訊，請參閱[查詢還原的 Amazon Glacier 物件](querying-glacier.md)。

  如需有關儲存類別的資訊，請參閱[儲存類別](https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html)、[在 Amazon S3 中變更物件的儲存類別](https://docs.aws.amazon.com/AmazonS3/latest/dev/ChgStoClsOfObj.html)、[轉換為 GLACIER 儲存類別 (物件封存)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html#before-deciding-to-archive-objects)，以及《Amazon Simple Storage Service 使用者指南**》中的[請求者支付儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html)。
+ 如果您對具有大量物件的 Amazon S3 儲存貯體發出查詢，並且未將資料分割，這類查詢可能會影響 Amazon S3 中的 Get 請求率限制，並導致 Amazon S3 例外狀況。若要避免錯誤，請分割您的資料。此外，請考慮調校您的 Amazon S3 請求率。如需詳細資訊，請參閱[請求率和效能考量](https://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html)。

如需有關在 Amazon S3 中指定資料位置的詳細資訊，請參閱 [在 Amazon S3 中指定資料表位置](tables-location-format.md)。

### 其他考量
<a name="creating-tables-other-considerations"></a>
+ **不支援交易資料轉換** – Athena 不支援對資料表資料進行以交易為基礎的操作 (例如可在 Hive 或 Presto 中找到的操作)。如需不支援的關鍵字完整清單，請參閱[不支援的 DDL](unsupported-ddl.md)。
+ **資料表上的操作為 ACID** – 當您建立、更新或刪除資料表時，這些操作保證與 ACID 相容。例如，如果多個使用者或用戶端同時嘗試建立或修改現有的資料表，只有其中一個會成功。
+ **資料表為 EXTERNAL** – 除了在建立 [Iceberg](querying-iceberg-creating-tables.md) 資料表時，請始終使用 `EXTERNAL` 關鍵字。如果您在非 Iceberg 資料表上使用 `CREATE TABLE` 卻沒有帶 `EXTERNAL` 關鍵字，則 Athena 會發出錯誤。當您在 Athena 中捨棄資料表時，只會移除資料表中繼資料，資料會保留在 Amazon S3 中。
+ **查詢字串長度上限** – 查詢字串長度上限為 256 KB。
+ 如果您使用 AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) API 操作或 CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html) 範本建立資料表以在 Athena 中使用，而不指定 `TableType` 屬性，然後執行 DDL 查詢，例如 `SHOW CREATE TABLE`或 `MSCK REPAIR TABLE`，您可以收到錯誤訊息 FAILED：NullPointerException Name 為 null。

  若要解決錯誤，請在 API 呼叫或[CloudFormation 範本](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)中 AWS Glue `CreateTable`指定 [TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 屬性的值。`TableType` 可能的值包括 `EXTERNAL_TABLE` 或 `VIRTUAL_VIEW`。

  此要求僅適用於使用 `CreateTable` API AWS Glue 操作或 `AWS::Glue::Table` 範本建立資料表時。如果您使用 DDL 陳述式或 AWS Glue 爬蟲程式建立 Athena 資料表，則系統會為您自動定義 `TableType` 屬性。

**Topics**
+ [考量和限制](#creating-tables-considerations-and-limitations)
+ [使用 AWS Glue 或 Athena 主控台建立資料表](creating-tables-how-to.md)
+ [在 Amazon S3 中指定資料表位置](tables-location-format.md)
+ [建立資料表後即會顯示資料表資訊](creating-tables-showing-table-information.md)

# 使用 AWS Glue 或 Athena 主控台建立資料表
<a name="creating-tables-how-to"></a>

您可以使用 新增資料表表單 AWS Glue或在 Athena 查詢編輯器中執行 DDL 陳述式，在 Athena 中建立資料表。

## 使用 AWS Glue 爬蟲程式建立資料表
<a name="to-create-a-table-using-the-aws-glue-data-catalog"></a>

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在查詢編輯器中，選擇位於**資料表和檢視**旁的**建立**，然後選擇 **AWS Glue 爬蟲程式**。

1. 請依照 AWS Glue 主控台 **Add crawler** (新增爬蟲程式) 頁面上的步驟新增爬蟲程式。

   如需詳細資訊，請參閱[使用編目程式新增資料表](schema-crawlers.md)。

## 使用 Athena 新增資料表表單來建立資料表
<a name="to-create-a-table-using-the-wizard"></a>

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在查詢編輯器中，選擇位在 **Tables and views** (資料表和檢視) 旁的 **Create** (建立)，然後選擇 **S3 bucket data** (S3 儲存貯體資料)。

1. 在 **Create Table From S3 bucket data** (從 S3 儲存貯體資料建立資料表) 表單中，輸入用於建立資料表的資訊，然後選擇 **Create table** (建立資料表)。如需表單欄位的詳細資訊，請參閱[使用 Athena 主控台中的表單來新增 AWS Glue 資料表](data-sources-glue-manual-table.md)。

## 在 Athena 查詢編輯器中，使用 CREATE TABLE 陳述式建立資料表
<a name="to-create-a-table-using-hive-ddl"></a>

1. 從 **Database (資料庫)** 選單中，選擇要為其建立資料表的資料庫。如果您未在 `CREATE TABLE` 陳述式中指定資料庫，則會在查詢編輯器中目前選取的資料庫中建立資料表。

1. 在查詢編輯器中，輸入下列範例所示的陳述式，然後選擇**執行**。

   ```
   CREATE EXTERNAL TABLE myopencsvtable (
      firstname string,
      lastname string,
      job string,
      country string
   )
   ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
   WITH SERDEPROPERTIES (
      'separatorChar' = ',',
      'quoteChar' = '"',
      'escapeChar' = '\\'
      )
   STORED AS TEXTFILE
   LOCATION 's3://amzn-s3-demo-bucket/mycsv/';
   ```

# 在 Amazon S3 中指定資料表位置
<a name="tables-location-format"></a>

當您在 Athena 中執行`CREATE TABLE`查詢時，Athena 會向 AWS Glue Data Catalog 註冊資料表，這是 Athena 存放中繼資料的位置。

若要在 Amazon S3 中指定資料的路徑，請在 `CREATE TABLE` 陳述式中使用 `LOCATION` 屬性，如下列範例所示：

```
CREATE EXTERNAL TABLE `test_table`(
...
)
ROW FORMAT ...
STORED AS INPUTFORMAT ...
OUTPUTFORMAT ...
LOCATION s3://amzn-s3-demo-bucket/folder/
```
+ 如需有關命名儲存貯體的詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[儲存貯體限制](https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html)。
+ 如需有關在 Amazon S3 中使用資料夾的詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[使用資料夾](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-folders.html)。

Amazon S3 中的 `LOCATION` 會指定代表您資料表的*所有*檔案。

**重要**  
Athena 會讀取在您指定的 Amazon S3 資料夾中存放的*所有*資料。如果您有*不*希望 Athena 讀取的資料，請勿使用與您希望 Athena 讀取之資料相同的 Amazon S3 資料夾存放該資料。

當您在 `CREATE TABLE` 陳述式中指定 `LOCATION` 時，請使用下列指導方針：
+ 使用後置斜線。
+ 您可以使用 Amazon S3 資料夾的路徑或 Amazon S3 存取點別名。如需有關 Amazon S3 存取點別名的資訊，請參閱《Amazon S3 使用者指南》**中的[為存取點使用儲存貯體型別名](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-alias.html)。

 **使用**：

```
s3://amzn-s3-demo-bucket/folder/
```

```
s3://amzn-s3-demo-bucket-metadata-s3alias/folder/
```

請勿使用以下任何項目指定您資料的 `LOCATION`。
+ 請勿使用檔案名稱、底線、萬用字元或 glob 模式來指定檔案位置。
+ 請勿將完整 HTTP 標記法 (例如 `s3.amazon.com`) 新增至 Amazon S3 儲存貯體路徑。
+ 請勿在路徑中使用 `//` 等使用空的資料夾，如下所示：`S3://amzn-s3-demo-bucket/folder//folder/`。
+ 請勿使用如下路徑：

  ```
  s3://amzn-s3-demo-bucket
  s3://amzn-s3-demo-bucket/*
  s3://amzn-s3-demo-bucket/mySpecialFile.dat
  s3://amzn-s3-demo-bucket/prefix/filename.csv
  s3://amzn-s3-demo-bucket.s3.amazon.com
  S3://amzn-s3-demo-bucket/prefix//prefix/
  arn:aws:s3:::amzn-s3-demo-bucket/prefix
  s3://arn:aws:s3:<region>:<account_id>:accesspoint/<accesspointname>
  https://<accesspointname>-<number>.s3-accesspoint.<region>.amazonaws.com
  ```

# 建立資料表後即會顯示資料表資訊
<a name="creating-tables-showing-table-information"></a>

在 Athena 中建立資料表之後，其名稱會顯示在 Athena 主控台左側的**資料表**清單中。如需顯示有關資料表的資訊並進行管理，可以選擇 Athena 主控台中資料表名稱旁邊的三個垂直點。
+ **預覽資料表** – 透過執行 Athena 查詢編輯器中的 `SELECT * FROM "database_name"."table_name" LIMIT 10` 陳述式，顯示所有資料欄的前 10 列。
+ **產生建立資料表 DDL** – 您可以透過執行 Athena 查詢編輯器中的 `SHOW CREATE TABLE` *table\$1name* 陳述式，產生可用來重新建立資料表的 DDL 陳述式。
+ **載入分割區** – 執行 Athena 查詢編輯器中的 `MSCK REPAIR TABLE table_name` 陳述式。僅當資料表有分割區時，才可使用此選項。
+ **插入編輯器中** - 在目前編輯位置將資料表的名稱插入查詢編輯器中。
+ **Delete table** (刪除資料表) – 顯示確認對話方塊，詢問您是否要刪除資料表。如果您同意，請執行 Athena 查詢編輯器中的 `DROP TABLE table_name` 陳述式。
+ **Table properties** (資料表屬性) – 顯示資料表名稱、資料庫名稱、建立時間，以及資料表是否有加密資料。

# 為資料庫、資料表和資料欄命名
<a name="tables-databases-columns-names"></a>

使用這些準則來為 Athena 中的資料庫、資料表和資料欄命名。

## 資料庫、資料表和資料欄名稱要求
<a name="tables-databases-columns-names-requirements"></a>
+  AWS Glue 中的資料庫名稱、資料表名稱和資料欄名稱的可接受字元必須是 UTF-8 字串且應為小寫。請注意，在建立資料庫、資料表或資料欄時，Athena 會自動將 DDL 查詢中的任何大寫名稱轉換為小寫。該字串的長度不得小於 1 個位元組，也不得超過 255 個位元組。
+ 目前，名稱開頭可能會有前導空格。由於這些前導空格可能難以偵測，且可能會在建立後造成可用性問題，因此請務必小心，避免不慎建立具有前導空格的物件名稱。
+ 如果您使用 [AWS::Glue::Database](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-database.html) CloudFormation 範本來建立 AWS Glue 資料庫，但未指定資料庫名稱， 會以與 Athena 不相容的 *resource\$1name–random\$1string* 格式 AWS Glue 自動產生資料庫名稱。
+ 您可以使用 AWS Glue Catalog Manager 重新命名資料欄，但不能重新命名資料表名稱或資料庫名稱。若要解決此限制，您必須使用舊資料庫的定義，建立具有新名稱的資料庫。然後，您可以使用舊資料庫中資料表的定義，重新建立新資料庫中的資料表。若要這樣做，您可以使用 AWS CLI 或 AWS Glue SDK。如需這些步驟，請參閱 [使用 AWS CLI 重新建立 AWS Glue 資料庫及其資料表](glue-recreate-db-and-tables-cli.md)。

## 對 Athena 中的資料表名稱和資料表資料欄名稱使用小寫
<a name="table-names-and-table-column-names-in-ate-must-be-lowercase"></a>

Athena 接受在 DDL 和 DML 查詢中混合使用大小寫，但是當其執行查詢時名稱須為小寫。出於這個原因，請避免對資料表或資料欄名稱混合使用大小寫，並且不要在 Athena 中僅依賴大小寫來區分這些名稱。例如，如果您使用 DDL 陳述式來建立名為 `Castle` 的資料欄，則建立的資料欄將會是小寫的 `castle`。如果您接著在 DML 查詢中將資料欄名稱指定為 `Castle` 或 `CASTLE`，則 Athena 會將您要執行查詢的名稱變成小寫，但會使用您在查詢中選擇的大小寫來顯示資料欄標題。

資料庫、資料表和資料欄名稱必須小於或等於 255 個字元的長度。

## 以底線開頭的名稱
<a name="names-that-begin-with-an-underscore"></a>

建立資料表時，使用反引號括住以底線開頭的資料表、檢視或資料欄名稱。例如：

```
CREATE EXTERNAL TABLE IF NOT EXISTS `_myunderscoretable`(
  `_id` string, `_index` string)
LOCATION 's3://amzn-s3-demo-bucket/'
```

## 以數字開頭的資料表、檢視或資料行名稱
<a name="table-names-that-include-numbers"></a>

在執行 `SELECT`、`CTAS` 或 `VIEW` 查詢時，在以數字開頭的識別碼 (例如資料表、檢視或資料欄名稱) 周圍加上引號。例如：

```
CREATE OR REPLACE VIEW "123view" AS
SELECT "123columnone", "123columntwo"
FROM "234table"
```

## 資料欄名稱和複雜類型
<a name="tables-databases-columns-names-complex-types"></a>

對於複雜類型，資料欄名稱中僅允許英數字元、底線 (`_`) 和句點 (`.`)。若要為具有限制字元的索引鍵建立資料表和映射，您可以使用自訂 DDL 陳述式。如需詳細資訊，請參閱AWS 大數據部落格**中的[使用 JSONSerDe，透過巢狀 JSON 和映射，在 Amazon Athena 中建立資料表](https://aws.amazon.com/blogs/big-data/create-tables-in-amazon-athena-from-nested-json-and-mappings-using-jsonserde/)一文。

## 保留字
<a name="tables-databases-columns-names-reserved-words"></a>

Athena 中的某些保留字必須逸出。若要逸出 DDL 陳述式中的預留關鍵字，請以反引號 (`) 括住它們。若要逸出[檢視](views.md)上的 SQL `SELECT` 陳述式和查詢中的預留關鍵字，請以雙引號 ('') 將其括住。

如需詳細資訊，請參閱[在查詢中逸出預留關鍵字](reserved-words.md)。

## 其他資源
<a name="tables-databases-columns-names-additional-resources"></a>

如需完整的資料庫和資料表建立語法，請參閱下列頁面。
+ [CREATE DATABASE](create-database.md)
+ [CREATE TABLE](create-table.md)

如需 中資料庫和資料表的詳細資訊 AWS Glue，請參閱《 *AWS Glue 開發人員指南*》中的[資料庫](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-databases.html)和[資料表](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html)。

# 在查詢中逸出預留關鍵字
<a name="reserved-words"></a>

在 Athena 中執行包含預留關鍵字的查詢時，必須以特殊字元括住關鍵字以將它們逸出。請使用此主題中的清單來檢查 Athena 中的預留關鍵字。

若要逸出 DDL 陳述式中的預留關鍵字，請以反引號 (`) 括住它們。若要逸出[檢視](views.md)上的 SQL `SELECT` 陳述式和查詢中的預留關鍵字，請以雙引號 ('') 將其括住。
+  [DDL 陳述式中要逸出的預留關鍵字](#list-of-ddl-reserved-words) 
+  [SQL SELECT 陳述式中要逸出的預留關鍵字](#list-of-reserved-words-sql-select) 
+  [含有預留關鍵字的查詢範例](#examples-reserved-words) 

## DDL 陳述式中要逸出的預留關鍵字
<a name="list-of-ddl-reserved-words"></a>

Athena 在其 DDL 陳述式中使用下列預留關鍵字清單。如果您使用它們時沒有逸出，Athena 會發出錯誤。若要逸出它們，請以反引號 (`) 括住。

您在 DDL 陳述式中使用 DDL 預留關鍵字作為識別符名稱時，必須以反引號 (`) 括住。

```
ALL, ALTER, AND, ARRAY, AS, AUTHORIZATION, BETWEEN, BIGINT, 
BINARY, BOOLEAN, BOTH, BY, CASE, CASHE, CAST, CHAR, COLUMN, 
CONF, CONSTRAINT, COMMIT, CREATE, CROSS, CUBE, CURRENT, 
CURRENT_DATE, CURRENT_TIMESTAMP, CURSOR, DATABASE, DATE, 
DAYOFWEEK, DECIMAL, DELETE, DESCRIBE, DISTINCT, DIV, DOUBLE, 
DROP, ELSE, END, EXCHANGE, EXISTS, EXTENDED, EXTERNAL, EXTRACT, 
FALSE, FETCH, FLOAT, FLOOR, FOLLOWING, FOR, FOREIGN, FROM, 
FULL, FUNCTION, GRANT, GROUP, GROUPING, HAVING, IF, IMPORT, 
IN, INNER, INSERT, INT, INTEGER, INTERSECT, INTERVAL, INTO, 
IS, JOIN, LATERAL, LEFT, LESS, LIKE, LOCAL, MACRO, MAP, MORE, 
NONE, NOT, NULL, NUMERIC, OF, ON, ONLY, OR, ORDER, OUT, 
OUTER, OVER, PARTIALSCAN, PARTITION, PERCENT, PRECEDING, 
PRECISION, PRESERVE, PRIMARY, PROCEDURE, RANGE, READS, 
REDUCE, REGEXP, REFERENCES, REVOKE, RIGHT, RLIKE, ROLLBACK, 
ROLLUP, ROW, ROWS, SELECT, SET, SMALLINT, START,TABLE, 
TABLESAMPLE, THEN, TIME, TIMESTAMP, TO, TRANSFORM, TRIGGER, 
TRUE, TRUNCATE, UNBOUNDED,UNION, UNIQUEJOIN, UPDATE, USER, 
USING, UTC_TIMESTAMP, VALUES, VARCHAR, VIEWS, WHEN, WHERE, 
WINDOW, WITH
```

## SQL SELECT 陳述式中要逸出的預留關鍵字
<a name="list-of-reserved-words-sql-select"></a>

Athena 在檢視上的 SQL `SELECT` 陳述式和查詢中，使用下列預留關鍵字清單。

如果您使用這些關鍵字作為識別符，您必須在查詢陳述式中以雙引號 (") 括住它們。

```
ALTER, AND, AS, BETWEEN, BY, CASE, CAST, CONSTRAINT, CREATE, 
CROSS, CUBE, CURRENT_CATALOG, CURRENT_DATE, CURRENT_PATH, 
CURRENT_SCHEMA, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, 
DEALLOCATE, DELETE, DESCRIBE, DISTINCT, DROP, ELSE, END, ESCAPE, 
EXCEPT, EXECUTE, EXISTS, EXTRACT, FALSE, FIRST, FOR, FROM, 
FULL, GROUP, GROUPING, HAVING, IN, INNER, INSERT, INTERSECT, 
INTO, IS, JOIN, JSON_ARRAY, JSON_EXISTS, JSON_OBJECT, 
JSON_QUERY, JSON_TABLE, JSON_VALUE, LAST, LEFT, LIKE, 
LISTAGG, LOCALTIME, LOCALTIMESTAMP, NATURAL, NORMALIZE, 
NOT, NULL, OF, ON, OR, ORDER, OUTER, PREPARE, RECURSIVE, RIGHT, 
ROLLUP, SELECT, SKIP, TABLE, THEN, TRIM, TRUE, UESCAPE, UNION, 
UNNEST, USING, VALUES, WHEN, WHERE, WITH
```

## 含有預留關鍵字的查詢範例
<a name="examples-reserved-words"></a>

下列範例中的查詢使用反引號 (`)，以逸出作為資料表名稱和其中一個欄名稱的 DDL 相關預留關鍵字 *partition* 和 *date*：

```
CREATE EXTERNAL TABLE `partition` (
`date` INT, 
col2 STRING
)
PARTITIONED BY (year STRING)
STORED AS TEXTFILE
LOCATION 's3://amzn-s3-demo-bucket/test_examples/';
```

以下範例查詢在 `ALTER TABLE ADD PARTITION` 和 `ALTER TABLE DROP PARTITION` 陳述式中，有一個欄名稱包含 DDL 相關的預留關鍵字。這些 DDL 預留關鍵字以反引號 (`) 括住：

```
ALTER TABLE test_table 
ADD PARTITION (`date` = '2018-05-14')
```

```
ALTER TABLE test_table 
DROP PARTITION (`partition` = 'test_partition_value')
```

以下範例查詢在 `SELECT` 陳述式中包含預留關鍵字 (end) 作為識別符。此關鍵字以雙引號逸出：

```
SELECT * 
FROM TestTable
WHERE "end" != nil;
```

以下範例查詢在 `SELECT` 陳述式中包含預留關鍵字 (first)。此關鍵字以雙引號逸出：

```
SELECT "itemId"."first" 
FROM testTable 
LIMIT 10;
```

# 從查詢結果建立資料表 (CTAS)
<a name="ctas"></a>

`CREATE TABLE AS SELECT` (CTAS) 查詢會根據另一個查詢的 `SELECT` 陳述式結果，在 Athena 中建立新的資料表。Athena 會將 CTAS 陳述式建立的資料檔案存放在 Simple Storage Service (Amazon S3) 中的指定位置。如需語法，請參閱[CREATE TABLE AS](create-table-as.md)。

`CREATE TABLE AS` 結合使用 `CREATE TABLE` DDL 陳述式與 `SELECT` DML 陳述式，因此技術上同時包含 DDL 和 DML。不過請注意，針對 Service Quotas 而言，Athena 中的 CTAS 查詢會被視為 DML。如需有關 Athena 中的 Service Quotas 的相關資訊，請參閱 [Service Quotas](service-limits.md)。

使用 CTAS 查詢來：
+ 只要執行一個步驟就能從查詢結果建立資料表，而不需重複查詢原始資料集。如此更方便您使用原始資料集。
+ 轉換查詢結果並將資料表遷移為其他資料表格式，例如 Apache Iceberg。這可改善查詢效能並降低 Athena 中的查詢成本。如需相關資訊，請參閱[建立 Iceberg 資料表](querying-iceberg-creating-tables.md)。
+ 將查詢結果轉換為 Parquet 和 ORC 等儲存格式。這可改善查詢效能並降低 Athena 中的查詢成本。如需相關資訊，請參閱[使用單欄式儲存格式](columnar-storage.md)。
+ 建立僅包含您所需資料的現有資料表的副本。

**Topics**
+ [CTAS 查詢的考量事項與限制](ctas-considerations-limitations.md)
+ [建立 CTAS 查詢](ctas-console.md)
+ [CTAS 範例](ctas-examples.md)
+ [使用 CTAS 和 INSERT INTO 以進行 ETL](ctas-insert-into-etl.md)
+ [解決 100 個分割區限制](ctas-insert-into.md)

# CTAS 查詢的考量事項與限制
<a name="ctas-considerations-limitations"></a>

下列各節會描述在 Athena 中使用 `CREATE TABLE AS SELECT` (CTAS) 查詢時要記住的注意事項和限制。

## 了解 CTAS 查詢語法
<a name="ctas-considerations-limitations-query-syntax"></a>

CTAS 查詢語法與用於建立資料表的 `CREATE [EXTERNAL] TABLE` 語法不同。請參閱 [CREATE TABLE AS](create-table-as.md)。

## 檢視與 CTAS 查詢之間的差異
<a name="ctas-considerations-limitations-queries-vs-views"></a>

CTAS 查詢會將新資料寫入到 Amazon S3 中的指定位置。檢視不會寫入任何資料。

## 指定 CTAS 查詢結果的位置
<a name="ctas-considerations-limitations-location-of-query-results"></a>

如果您的工作群組為查詢結果位置[覆寫用戶端設定](workgroups-settings-override.md)，則 Athena 會在位置 `s3://amzn-s3-demo-bucket/tables/<query-id>/` 中建立資料表。若要查看為工作群組指定的查詢結果位置，請[檢視工作群組的詳細資訊](viewing-details-workgroups.md)。

如果您的工作群組未覆寫查詢結果位置，您可以在 CTAS 查詢中使用語法 `WITH (external_location ='s3://amzn-s3-demo-bucket/')` 來指定 CTAS 查詢結果的儲存位置。

**注意**  
`external_location` 屬性必須指定空白的位置。CTAS 查詢會檢查儲存貯體中的路徑位置 (前綴) 是空的，並且如果該位置中已有資料，則不會加以覆寫。若要再次使用相同的位置，請刪除儲存貯體的金鑰前綴位置中的資料。

如果您省略 `external_location` 語法而且未使用工作群組設定，則 Athena 會使用查詢結果位置的[用戶端設定](query-results-specify-location-console.md)，並在位置 `s3://amzn-s3-demo-bucket/<Unsaved-or-query-name>/<year>/<month/<date>/tables/<query-id>/` 中建立資料表。

## 尋找孤立檔案
<a name="ctas-considerations-limitations-locating-orphaned-files"></a>

如果 `CTAS` 或 `INSERT INTO` 陳述式失敗，則失敗或取消的查詢所在的目標資料位置可能遺留孤立的資料檔案。由於 Athena 在某些案例中不會從查詢的目標儲存貯體中刪除資料，因此後續查詢中可能會包含部分資料。

若要尋找孤立檔案以進行檢測或刪除，您可以使用 Athena 提供的資料資訊清單檔案來追蹤要寫入的檔案清單。在某些極少數情況下，Athena 查詢會突然失敗，此時可能不存在資訊清單檔案。您可以手動檢查目標 S3 位置，以尋找孤立的檔案。如需詳細資訊，請參閱[識別查詢輸出檔案](querying-finding-output-files.md#querying-identifying-output-files)和 [DataManifestLocation](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecutionStatistics.html#athena-Type-QueryExecutionStatistics-DataManifestLocation)。

我們強烈建議使用 Apache Iceberg 來實現資料表的原子交易。如需詳細資訊，請參閱[查詢 Apache Iceberg 資料表](querying-iceberg.md)。

## 請記住，會忽略 ORDER BY 子句
<a name="ctas-considerations-limitations-order-by-ignored"></a>

在 CTAS 查詢中，Athena 會忽略查詢 `SELECT` 部分中的 `ORDER BY` 子句。

根據 SQL 規格 (ISO 9075 第 2 部分)，只有立即包含 `ORDER BY` 子句的查詢表達式，才能保證查詢表達式所指定之資料表資料列的順序。在任何情況下，SQL 中的資料表本身是無順序的，並且在子查詢子句中實作 `ORDER BY` 都會導致查詢執行不彰，並且將會導致無序輸出。因此，在 Athena CTAS 查詢中，無法保證在寫入資料時會保留 `ORDER BY` 子句指定的順序。

## 選擇存放查詢結果的格式
<a name="ctas-considerations-limitations-formats-for-query-results"></a>

您可以將 CTAS 結果存放在 `PARQUET`、`ORC`、`AVRO`、`JSON` 和 `TEXTFILE` 中。CTAS `TEXTFILE` 格式不支援多字元分隔符號。如果您不指定資料儲存格式，則依預設，CTAS 查詢的結果會存放在 Parquet 中。

CTAS 查詢不要求指定 SerDe 來解譯格式轉換。請參閱 [Example: Writing query results to a different format](ctas-examples.md#ctas-example-format)。

## 考慮壓縮格式
<a name="ctas-considerations-limitations-compression-formats"></a>

`GZIP` 壓縮用於 JSON 和 TEXTFILE 格式的 CTAS 查詢結果。對於 Parquet，您可以使用 `GZIP` 或 `SNAPPY`，預設值為 `GZIP`。對於 ORC，您可以使用 `LZ4`、`SNAPPY`、`ZLIB` 或 `ZSTD`，預設值為 `ZLIB`。如需指定壓縮的 CTAS 範例，請參閱 [Example: Specifying data storage and compression formats](ctas-examples.md#ctas-example-compression)。如需有關 Athena 中壓縮的資訊，請參閱 [在 Athena 中使用壓縮](compression-formats.md)。

## 分割和歸納結果
<a name="ctas-considerations-limitations-partition-and-bucket-limits"></a>

您可以分割和歸納 CTAS 查詢的結果資料。若要指定目標資料表的屬性，請在 `WITH` 子句的結尾包含分割和歸納述詞。如需詳細資訊，請參閱[使用分割和歸納](ctas-partitioning-and-bucketing.md)及[Example: Creating bucketed and partitioned tables](ctas-examples.md#ctas-example-bucketed)。

當您使用 CTAS 建立分割的資料表時，Athena 的寫入限制為 100 個分割區。如需解決 100 個分割區限制的相關資訊，請參閱 [使用 CTAS 和 INSERT INTO 來解決 100 個分割區限制](ctas-insert-into.md)。

## 加密結果
<a name="ctas-considerations-limitations-encryption"></a>

您可以在 Simple Storage Service (Amazon S3) 中加密 CTAS 查詢結果，類似於您在 Athena 中加密其他查詢結果的方式。如需詳細資訊，請參閱[加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)。

## 預期的儲存貯體擁有者設定不適用於 CTAS
<a name="ctas-considerations-limitations-expected-bucket-owner"></a>

對於 CTAS 陳述式，預期的儲存貯體擁有者設定不適用於 Simple Storage Service (Amazon S3) 中的目的地資料表位置。預期的儲存貯體擁有者設定僅適用於您為 Athena 查詢結果指定的 Simple Storage Service (Amazon S3) 輸出位置。如需詳細資訊，請參閱[使用 Athena 主控台指定查詢結果位置](query-results-specify-location-console.md)。

## 保留資料欄資料類型
<a name="ctas-considerations-limitations-data-types"></a>

CTAS 查詢的資料欄資料類型與為原始查詢所指定的相同。

# 在 Athena 主控台中建立 CTAS 查詢
<a name="ctas-console"></a>

在 Athena 主控台中，您可以從另一個查詢建立一個 CTAS 查詢。<a name="ctas-create-from-query"></a>

**若要從另一個查詢建立 CTAS 查詢**

1. 在 Athena 主控台查詢編輯器中執行查詢。

1. 選擇查詢編輯器最下方的 **Create** (建立) 選項，然後選擇 **Table from query** (查詢中的資料表)。

1. 在 **Create table as select** (建立所選資料表) 表單中，按如下方式填寫欄位：

   1. 在 **Table name** (資料表名稱) 中，輸入新資料表的名稱。僅使用小寫和底線，例如 `my_select_query_parquet`。

   1. 在 **Database configuration** (資料庫組態) 中，使用選項來選擇現有資料庫或建立資料庫。

   1. (選用) 在 **Result configuration** (結果組態) 的 **Location of CTAS query results** (CTAS 查詢結果的位置) 中，如果您的工作群組查詢結果位置設定未覆寫此選項，請執行下列其中一項作業：
      + 在搜尋方塊中輸入現有 S3 位置的路徑，或選擇 **Browse S3** (瀏覽 S3) 從清單中選擇位置。
      + 選擇 **View** (檢視)，以開啟 Amazon S3 主控台的 **Buckets** (儲存貯體) 頁面，您可以在其中檢視現有儲存貯體的詳細資訊，並選擇儲存貯體，或使用自己的設定建立儲存貯體。

      您應該在 Amazon S3 中指定將進行資料輸出的空白位置。如果您指定的位置中已存有資料，則查詢失敗並出現錯誤。

      如果您的工作群組查詢結果位置設定覆寫此位置的設定，則 Athena 會在位置 `s3://amzn-s3-demo-bucket/tables/query_id/` 中建立資料表。

   1. 在 **Data format** (資料格式) 中，指定資料所使用的格式。
      + **Table type** (資料表類型) – Athena 中的預設資料表類型為 Apache Hive。
      + **File format** (檔案格式) – 選擇 CSV、TSV、JSON、Parquet 或 ORC 等選項。如需 Parquet 和 ORC 格式的相關資訊，請參閱 [使用單欄式儲存格式](columnar-storage.md)。
      + **Write compression** (寫入壓縮) – (選用) 選擇壓縮格式。Athena 支援各種壓縮格式來讀取和寫入資料，包括從使用多種壓縮格式的資料表讀取。例如，當某些 Parquet 檔案使用 Snappy 壓縮而其他 Parquet 檔案使用 GZIP 壓縮時，Athena 可以成功讀取使用 Parquet 檔案格式的資料表中的資料。相同的原則適用於 ORC、文字檔案和 JSON 儲存格式。如需詳細資訊，請參閱[在 Athena 中使用壓縮](compression-formats.md)。
      + **Partitions** (分割區) – (選用) 選取要分割的資料欄。分割您的資料會限制每個查詢所掃描的資料量，從而可以提高效能和降低成本。您可透過任何索引鍵來分割您的資料。如需詳細資訊，請參閱[分割您的資料](partitions.md)。
      + **Buckets** (儲存貯體)– (選用) 選取您要歸納的資料欄。歸納是一種依照特定資料欄將資料分組到單個分割區的技術。這些資料欄稱為*儲存貯體金鑰*。將相關資料分組至單一儲存貯體 (分割區內的檔案)，可大幅減少 Athena 掃描的資料量，進而改善查詢效能並降低成本。如需詳細資訊，請參閱[使用分割和歸納](ctas-partitioning-and-bucketing.md)。

   1. 使用 **Preview table query** (預覽資料表查詢) 可請檢閱您的查詢。如需查詢語法，請參閱[CREATE TABLE AS](create-table-as.md)。

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

Athena 主控台具備 SQL 範本，您也可使用該範本來建立 CTAS 查詢。<a name="ctas-create-new"></a>

**使用 SQL 範本建立 CTAS 查詢**

使用 `CREATE TABLE AS SELECT` 範本在查詢編輯器中建立 CTAS 查詢。

1. 在 Athena 主控台中，選擇位在 **Tables and views** (資料表和檢視) 旁的 **Create table** (建立資料表)，然後選擇 **CREATE TABLE AS SELECT** (建立資料表作為選擇)。這會使用帶有預留位置值的 CTAS 查詢填入查詢編輯器。

1. 在查詢編輯器中，視所需編輯查詢。如需查詢語法，請參閱[CREATE TABLE AS](create-table-as.md)。

1. 選擇**執行**。

如需範例，請參閱 [CTAS 查詢的範例](ctas-examples.md)。



# CTAS 查詢的範例
<a name="ctas-examples"></a>

使用下列範例來建立 CTAS 查詢。如需 CTAS 語法的相關資訊，請參閱[CREATE TABLE AS](create-table-as.md)。

在本節中：
+  [Example: Duplicating a table by selecting all columns](#ctas-example-dupe-table) 
+  [Example: Selecting specific columns from one or more tables](#ctas-example-specify-columns) 
+  [Example: Creating an empty copy of an existing table](#ctas-example-empty-table) 
+  [Example: Specifying data storage and compression formats](#ctas-example-compression) 
+  [Example: Writing query results to a different format](#ctas-example-format) 
+  [Example: Creating unpartitioned tables](#ctas-example-unpartitioned) 
+  [Example: Creating partitioned tables](#ctas-example-partitioned) 
+  [Example: Creating bucketed and partitioned tables](#ctas-example-bucketed) 
+  [Example: Creating an Iceberg table with Parquet data](#ctas-example-iceberg-parquet) 
+  [Example: Creating an Iceberg table with Avro data](#ctas-example-iceberg-avro) 
+  [Example: Creating an S3 table using CTAS](#ctas-example-s3-table) 

**Example 範例：選取所有資料欄以複製資料表**  
以下範例會透過複製資料表的所有資料欄來建立資料表：  

```
CREATE TABLE new_table AS 
SELECT * 
FROM old_table;
```
在相同範例的以下變化中，您的 `SELECT` 陳述式也包含 `WHERE` 子句。在這種情況下，查詢只會從資料表中選取滿足 `WHERE` 子句的那些資料列：  

```
CREATE TABLE new_table AS 
SELECT * 
FROM old_table 
WHERE condition;
```

**Example 範例：從一或多個資料表選取特定資料欄**  
以下範例會建立對來自另一個資料表的一組資料欄執行的新查詢：  

```
CREATE TABLE new_table AS 
SELECT column_1, column_2, ... column_n 
FROM old_table;
```
相同範例的這個變化會來自多個資料表的特定資料欄建立新的資料表：  

```
CREATE TABLE new_table AS
SELECT column_1, column_2, ... column_n 
FROM old_table_1, old_table_2, ... old_table_n;
```

**Example 範例：建立現有資料表的空白副本**  
以下範例使用 `WITH NO DATA` 來建立空白且與原始資料表具有相同結構描述的新資料表：  

```
CREATE TABLE new_table 
AS SELECT * 
FROM old_table
WITH NO DATA;
```

**Example 範例：指定資料儲存和壓縮格式**  
利用 CTAS，您可以使用一種儲存格式的來源資料表，建立不同儲存格式的另一個資料表。  
使用 `format` 屬性來指定 `ORC`、`PARQUET`、`AVRO`、`JSON` 或 `TEXTFILE` 作為新資料表的儲存格式。  
對於 `PARQUET`、`ORC`、`TEXTFILE`，和 `JSON` 儲存格式，請使用 `write_compression` 屬性指定新資料表資料的壓縮格式。如需每個檔案格式支援之壓縮格式的詳細資訊，請參閱[在 Athena 中使用壓縮](compression-formats.md)。  
下列範例指定資料表 `new_table` 中的資料以 Parquet 格式儲存並使用 Snappy 壓縮。Parquet 的預設壓縮為 `GZIP`。  

```
CREATE TABLE new_table
WITH (
      format = 'Parquet',
      write_compression = 'SNAPPY')
AS SELECT *
FROM old_table;
```
下列範例指定使用 Snappy 壓縮以 ORC 格式儲存資料表 `new_table` 中的資料。ORC 的預設壓縮為 ZLIB。  

```
CREATE TABLE new_table
WITH (format = 'ORC',
      write_compression = 'SNAPPY')
AS SELECT *
FROM old_table ;
```
下列範例指定使用 Snappy 壓縮以文字檔案格式儲存資料表 `new_table` 中的資料。Textfile 和 JSON 格式的預設壓縮皆為 GZIP。  

```
CREATE TABLE new_table
WITH (format = 'TEXTFILE',
      write_compression = 'SNAPPY')
AS SELECT *
FROM old_table ;
```

**Example 範例：將查詢結果寫入不同的格式**  
以下 CTAS 查詢會從 `old_table` 選取所有記錄 (可用 CSV 或其他格式儲存)，並使用以 ORC 格式儲存至 Simple Storage Service (Amazon S3) 的基礎資料建立新的資料表：  

```
CREATE TABLE my_orc_ctas_table
WITH (
      external_location = 's3://amzn-s3-demo-bucket/my_orc_stas_table/',
      format = 'ORC')
AS SELECT * 
FROM old_table;
```

**Example 範例：建立未分割的資料表**  
以下範例會建立未分割的資料表。資料表資料會以不同格式存放。其中的一些範例會指定外部位置。  
以下範例會建立可將結果存放為文字檔案的 CTAS 查詢：  

```
CREATE TABLE ctas_csv_unpartitioned 
WITH (
     format = 'TEXTFILE', 
     external_location = 's3://amzn-s3-demo-bucket/ctas_csv_unpartitioned/') 
AS SELECT key1, name1, address1, comment1
FROM table1;
```
在下列範例中，結果會存放在 Parquet 中，並且會使用預設結果位置：  

```
CREATE TABLE ctas_parquet_unpartitioned 
WITH (format = 'PARQUET') 
AS SELECT key1, name1, comment1
FROM table1;
```
在以下查詢中，資料表會存放在 JSON 中，並且從原始資料表的結果選取特定資料欄：  

```
CREATE TABLE ctas_json_unpartitioned 
WITH (
     format = 'JSON',  
     external_location = 's3://amzn-s3-demo-bucket/ctas_json_unpartitioned/') 
AS SELECT key1, name1, address1, comment1
FROM table1;
```
在下列範例中，格式為 ORC：  

```
CREATE TABLE ctas_orc_unpartitioned 
WITH (
     format = 'ORC') 
AS SELECT key1, name1, comment1 
FROM table1;
```
在下列範例中，格式為 Avro：  

```
CREATE TABLE ctas_avro_unpartitioned 
WITH (
     format = 'AVRO', 
     external_location = 's3://amzn-s3-demo-bucket/ctas_avro_unpartitioned/') 
AS SELECT key1, name1, comment1
FROM table1;
```

**Example 範例：建立分割的資料表**  
以下範例顯示採用不同儲存格式的分割資料表的 `CREATE TABLE AS SELECT` 查詢，使用 `partitioned_by`，以及 `WITH` 子句中的其他屬性。如需語法，請參閱[CTAS 資料表屬性](create-table-as.md#ctas-table-properties)。如需選擇用於分割的資料欄的詳細資訊，請參閱[使用分割和歸納](ctas-partitioning-and-bucketing.md)。  
在 `SELECT` 陳述式中資料欄清單結尾列出分割區資料欄。您可以依多於一個資料欄分割，且最多可以有 100 個唯一分割區和儲存貯體組合。例如，如果未指定儲存貯體，則可有 100 個分割區。

```
CREATE TABLE ctas_csv_partitioned 
WITH (
     format = 'TEXTFILE',  
     external_location = 's3://amzn-s3-demo-bucket/ctas_csv_partitioned/', 
     partitioned_by = ARRAY['key1']) 
AS SELECT name1, address1, comment1, key1
FROM tables1;
```

```
CREATE TABLE ctas_json_partitioned 
WITH (
     format = 'JSON', 
     external_location = 's3://amzn-s3-demo-bucket/ctas_json_partitioned/', 
     partitioned_by = ARRAY['key1']) 
AS select name1, address1, comment1, key1 
FROM table1;
```

**Example 範例：建立歸納和分割的資料表**  
以下範例顯示一個 `CREATE TABLE AS SELECT` 查詢，同時使用歸納和分割來在 Simple Storage Service (Amazon S3) 中存放查詢結果。資料表結果會依不同的資料欄分割和歸納。Athena 支援最多 100 個唯一儲存貯體和分割區組合。例如，如果您建立包含 5 個儲存貯體的資料表，則支援 20 個分割區 (每個都有 5 個儲存貯體)。如需語法，請參閱[CTAS 資料表屬性](create-table-as.md#ctas-table-properties)。  
如需選擇用於歸納的資料欄的詳細資訊，請參閱[使用分割和歸納](ctas-partitioning-and-bucketing.md)。  

```
CREATE TABLE ctas_avro_bucketed 
WITH (
      format = 'AVRO', 
      external_location = 's3://amzn-s3-demo-bucket/ctas_avro_bucketed/', 
      partitioned_by = ARRAY['nationkey'], 
      bucketed_by = ARRAY['mktsegment'], 
      bucket_count = 3) 
AS SELECT key1, name1, address1, phone1, acctbal, mktsegment, comment1, nationkey 
FROM table1;
```

**Example 範例：建立一個包含 Parquet 資料的 Iceberg 資料表。**  
下列範例會建立包含 Parquet 資料檔案的 Iceberg 資料表。使用 `table1` 中的 `dt` 資料欄按月份分割檔案。此範例會更新資料表上的保留屬性，以便在資料表中的每個分支上保留 10 個快照。另外，還會保留過去 7 天內的快照。如需有關 Athena 中的 Iceberg 資料表屬性的詳細資訊，請參閱 [指定資料表屬性](querying-iceberg-creating-tables.md#querying-iceberg-table-properties)。  

```
CREATE TABLE ctas_iceberg_parquet
WITH (table_type = 'ICEBERG',
      format = 'PARQUET', 
      location = 's3://amzn-s3-demo-bucket/ctas_iceberg_parquet/', 
      is_external = false,
      partitioning = ARRAY['month(dt)'],
      vacuum_min_snapshots_to_keep = 10,
      vacuum_max_snapshot_age_seconds = 604800
   ) 
AS SELECT key1, name1, dt FROM table1;
```

**Example 範例：建立一個包含 Avro 資料的 Iceberg 資料表。**  
下列範例會建立包含 Avro 資料檔案的 Iceberg 資料表，其中資料表會依 `key1` 進行分割。  

```
CREATE TABLE ctas_iceberg_avro
WITH ( format = 'AVRO', 
       location = 's3://amzn-s3-demo-bucket/ctas_iceberg_avro/', 
       is_external = false,
       table_type = 'ICEBERG',
       partitioning = ARRAY['key1']) 
AS SELECT key1, name1, date FROM table1;
```

**Example 範例：使用 CTAS 建立 S3 資料表**  
以下範例會使用 CTAS 建立 S3 資料表。請注意，位置屬性會被省略，且 `table_type` 預設為 `ICEBERG`：  

```
CREATE TABLE "s3tablescatalog/amzn-s3-demo-bucket"."namespace"."s3-table-name"
WITH (
    format = 'PARQUET'
)
AS SELECT *
FROM source_table;
```
您可以指定所有其他 Iceberg 資料表屬性，例如使用與一般 Iceberg 資料表相同的語法進行分割和歸納。

# 使用 CTAS 和 INSERT INTO 以進行 ETL 和資料分析
<a name="ctas-insert-into-etl"></a>

您可以在 Athena 中使用 Create Table as Select ([CTAS](ctas.md)) 與 [INSERT INTO](insert-into.md) 陳述式，以擷取、轉換和載入 (ETL) 資料至 Amazon S3 中進行資料處理。本主題說明如何使用這些陳述式以將資料集分割及轉換成單欄式資料格式，以最佳化資料分析。

CTAS 陳述式使用標準 [SELECT](select.md) 查詢來建立新的資料表。您可以使用 CTAS 陳述式來建立資料的子集以供分析。在一個 CTAS 陳述式中，您可以分割資料、指定壓縮，並將資料轉換成一個單欄格式，如 Apache Parquet 或 Apache ORC。當您執行 CTAS 查詢時，它所建立的資料表和分割會自動加入到 [AWS Glue Data Catalog](https://aws.amazon.com/glue)。這會讓它建立的新資料表和分割區立即可供後續查詢使用。

INSERT INTO 陳述式會根據在來源資料表上執行的 SELECT 查詢陳述式，將新的資料列插入目的地資料表。您可以使用 INSERT INTO 陳述式將 CSV 格式的來源資料表資料轉換並載入目的地資料表資料 (此資料使用 CTAS 支援的所有轉換)。

## 概觀
<a name="ctas-insert-into-etl-overview"></a>

在 Athena 中，使用 CTAS 陳述式執行資料的初始批次轉換。然後使用多個 INSERT INTO 陳述式，對 CTAS 陳述式所建立的資料表進行累加式更新。

**步驟**
+ [步驟 1：建立以原始資料集為基礎的資料表](#ctas-insert-into-etl-step-1-create-a-table-based-on-the-original-dataset)
+  [步驟 2：使用 CTAS 來分割、轉換和壓縮資料](#ctas-insert-into-etl-step-2-use-ctas-to-partition-convert-and-compress-the-data) 
+  [步驟 3：使用 INSERT INTO 以新增資料](#ctas-insert-into-etl-step-3-use-insert-into-to-add-data) 
+  [步驟 4：測量效能與成本差異](#ctas-insert-into-etl-step-4-measure-performance-and-cost-differences) 

## 步驟 1：建立以原始資料集為基礎的資料表
<a name="ctas-insert-into-etl-step-1-create-a-table-based-on-the-original-dataset"></a>

本主題中的範例使用公開提供之 [NOAA Global Historical Climatology Network Daily (GHCN-D)](https://registry.opendata.aws/noaa-ghcn/) 資料集的 Amazon S3 可讀取子集。Amazon S3 上的資料具有下列特性。

```
Location: s3://aws-bigdata-blog/artifacts/athena-ctas-insert-into-blog/
Total objects: 41727
Size of CSV dataset: 11.3 GB
Region: us-east-1
```

原始資料存放在 Amazon S3 中，無任何分割區。這些資料是 CSV 格式的文件，如下所示。

```
2019-10-31 13:06:57  413.1 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0000
2019-10-31 13:06:57  412.0 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0001
2019-10-31 13:06:57   34.4 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0002
2019-10-31 13:06:57  412.2 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0100
2019-10-31 13:06:57  412.7 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0101
```

此範例中的檔案大小相對較小。藉由將檔案合併至較大的檔案中，您可以減少檔案總數，以提高查詢效能。您可以使用 CTAS 和 INSERT INTO 陳述式來增強查詢效能。

**根據範例資料集建立資料庫和資料表**

1. 在 Athena 主控台中，選擇 **US East (N. Virginia)** (美國東部 (維吉尼亞北部)) AWS 區域。請務必在 `us-east-1` 的本教學課程中執行所有查詢。

1. 在 Athena 查詢編輯器中，執行 [CREATE DATABASE](create-database.md) 命令以建立資料庫。

   ```
   CREATE DATABASE blogdb
   ```

1. 執行下列陳述式來 [建立資料表](create-table.md)。

   ```
   CREATE EXTERNAL TABLE `blogdb`.`original_csv` (
     `id` string,
     `date` string,
     `element` string,
     `datavalue` bigint,
     `mflag` string,
     `qflag` string,
     `sflag` string,
     `obstime` bigint)
   ROW FORMAT DELIMITED
     FIELDS TERMINATED BY ','
   STORED AS INPUTFORMAT
     'org.apache.hadoop.mapred.TextInputFormat'
   OUTPUTFORMAT
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
     's3://aws-bigdata-blog/artifacts/athena-ctas-insert-into-blog/'
   ```

## 步驟 2：使用 CTAS 來分割、轉換和壓縮資料
<a name="ctas-insert-into-etl-step-2-use-ctas-to-partition-convert-and-compress-the-data"></a>

建立資料表之後，您可以使用單一 [CTAS](ctas.md) 陳述式將資料轉換為具有 Snappy 壓縮的 Parquet 格式與，並按年份分割資料。

您在步驟 1 中建立的表格有一個 `date` 欄位，其日期格式為 `YYYYMMDD` (例如，`20100104`)。因為新的資料表會在 `year` 被分割，下列程序中的範例陳述式會使用 Presto 函式 `substr("date",1,4)` 以從 `date` 欄位擷取 `year` 值。

**將資料轉換為 Snappy 壓縮的 Parquet 格式，按年份分割**
+ 執行以下 CTAS 陳述式，將 *your-bucket* 替換為您的 Amazon S3 儲存貯體位置。

  ```
  CREATE table new_parquet
  WITH (format='PARQUET',
  parquet_compression='SNAPPY',
  partitioned_by=array['year'],
  external_location = 's3://amzn-s3-demo-bucket/optimized-data/')
  AS
  SELECT id,
           date,
           element,
           datavalue,
           mflag,
           qflag,
           sflag,
           obstime,
           substr("date",1,4) AS year
  FROM original_csv
  WHERE cast(substr("date",1,4) AS bigint) >= 2015
          AND cast(substr("date",1,4) AS bigint) <= 2019
  ```
**注意**  
在本範例中，您建立的資料表會包含從 2015 年到 2019 年的資料。在步驟 3 中，您可以使用 INSERT INTO 命令將新的資料加入到此資料表。

查詢完成時，請使用下列程序來確認您在 CTAS 陳述式中指定的 Amazon S3 位置中的輸出。

**查看 CTAS 陳述式所建立的分割區和 parquet 檔案**

1. 若要顯示建立的分割區，請執行下列 AWS CLI 命令。請務必包含最後的正斜線 (/)。

   ```
   aws s3 ls s3://amzn-s3-demo-bucket/optimized-data/
   ```

   輸出會顯示分割區。

   ```
         PRE year=2015/
         PRE year=2016/
         PRE year=2017/
         PRE year=2018/
         PRE year=2019/
   ```

1. 若要查看 Parquet 檔案，請執行以下命令。請注意，在 Windows 上不可使用將輸出限制為前五個結果的 `|` *head-5* 選項。

   ```
   aws s3 ls s3://amzn-s3-demo-bucket/optimized-data/ --recursive --human-readable | head -5
   ```

   輸出結果與以下內容相似。

   ```
   2019-10-31 14:51:05    7.3 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_1be48df2-3154-438b-b61d-8fb23809679d
   2019-10-31 14:51:05    7.0 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_2a57f4e2-ffa0-4be3-9c3f-28b16d86ed5a
   2019-10-31 14:51:05    9.9 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_34381db1-00ca-4092-bd65-ab04e06dc799
   2019-10-31 14:51:05    7.5 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_354a2bc1-345f-4996-9073-096cb863308d
   2019-10-31 14:51:05    6.9 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_42da4cfd-6e21-40a1-8152-0b902da385a1
   ```

## 步驟 3：使用 INSERT INTO 以新增資料
<a name="ctas-insert-into-etl-step-3-use-insert-into-to-add-data"></a>

在步驟 2 中，您已使用 CTAS 來建立 2015 年到 2019 年的分割區資料表。不過，原始資料集也包含 2010 年至 2014 年的資料。現在您使用 [INSERT INTO](insert-into.md) 陳述式新增該資料。

**使用一或多個 INSERT INTO 陳述式將資料新增至資料表**

1. 執行下列 INSERT INTO 指令，在 WHERE 子句中指定 2015 年之前的年份。

   ```
   INSERT INTO new_parquet
   SELECT id,
            date,
            element,
            datavalue,
            mflag,
            qflag,
            sflag,
            obstime,
            substr("date",1,4) AS year
   FROM original_csv
   WHERE cast(substr("date",1,4) AS bigint) < 2015
   ```

1. 使用下列語法再次執行 `aws s3 ls` 命令。

   ```
   aws s3 ls s3://amzn-s3-demo-bucket/optimized-data/
   ```

   該輸出會顯示新的分割區。

   ```
         PRE year=2010/
         PRE year=2011/
         PRE year=2012/
         PRE year=2013/
         PRE year=2014/
         PRE year=2015/
         PRE year=2016/
         PRE year=2017/
         PRE year=2018/
         PRE year=2019/
   ```

1. 若要查看在 Parquet 格式中使用壓縮和單欄儲存所獲得的資料集大小縮減，請執行以下命令。

   ```
   aws s3 ls s3://amzn-s3-demo-bucket/optimized-data/ --recursive --human-readable --summarize
   ```

   以下結果顯示，用 Snappy 壓縮 parquet 後的資料集大小為 1.2 GB。

   ```
   ...
   2020-01-22 18:12:02 2.8 MiB optimized-data/year=2019/20200122_181132_00003_nja5r_f0182e6c-38f4-4245-afa2-9f5bfa8d6d8f
   2020-01-22 18:11:59 3.7 MiB optimized-data/year=2019/20200122_181132_00003_nja5r_fd9906b7-06cf-4055-a05b-f050e139946e
   Total Objects: 300
        Total Size: 1.2 GiB
   ```

1. 如果有更多 CSV 資料新增至原始資料表，則您可以使用 INSERT INTO 陳述式將該資料加入至 parquet 資料表。例如，如果您有 2020 年的新資料，則您可以執行下列 INSERT INTO 陳述式。該陳述式會將資料和相關的磁碟分割新增至 `new_parquet` 資料表。

   ```
   INSERT INTO new_parquet
   SELECT id,
            date,
            element,
            datavalue,
            mflag,
            qflag,
            sflag,
            obstime,
            substr("date",1,4) AS year
   FROM original_csv
   WHERE cast(substr("date",1,4) AS bigint) = 2020
   ```
**注意**  
INSERT INTO 陳述式支援最多將 100 個分割區寫入目標資料表。不過，若要新增超過 100 個分割區，您可以執行多個 INSERT INTO 陳述式。如需詳細資訊，請參閱[使用 CTAS 和 INSERT INTO 來解決 100 個分割區限制](ctas-insert-into.md)。

## 步驟 4：測量效能與成本差異
<a name="ctas-insert-into-etl-step-4-measure-performance-and-cost-differences"></a>

在您轉換資料之後，您可以在新舊資料表上執行相同的查詢，並比較結果來衡量效能提升和成本節省。

**注意**  
如需 Athena 每個查詢成本的資訊，請參閱 [Amazon Athena 定價](https://aws.amazon.com/athena/pricing)。

**衡量效能提升與成本差異**

1. 在原始資料表上執行下列查詢。該查詢會尋找一年中每個值的不同 ID 數目。

   ```
   SELECT substr("date",1,4) as year,
          COUNT(DISTINCT id)
   FROM original_csv
   GROUP BY 1 ORDER BY 1 DESC
   ```

1. 請注意查詢執行的時間，以及掃描的資料量。

1. 在新資料表上執行相同的查詢，並記下查詢執行時間和掃描的資料量。

   ```
   SELECT year,
     COUNT(DISTINCT id)
   FROM new_parquet
   GROUP BY 1 ORDER BY 1 DESC
   ```

1. 比較結果並計算效能和成本差異。下列範例結果顯示，在新資料表上的測試查詢比舊資料表上的查詢更快且更便宜。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/ctas-insert-into-etl.html)

1. 在原始資料表上執行下列範例查詢。該查詢會計算 2018 年地球的平均最高溫度 (攝氏)、平均最低溫度 (攝氏) 和平均降雨量 (mm)。

   ```
   SELECT element, round(avg(CAST(datavalue AS real)/10),2) AS value
   FROM original_csv
   WHERE element IN ('TMIN', 'TMAX', 'PRCP') AND substr("date",1,4) = '2018'
   GROUP BY 1
   ```

1. 請注意查詢執行的時間，以及掃描的資料量。

1. 在新資料表上執行相同的查詢，並記下查詢執行時間和掃描的資料量。

   ```
   SELECT element, round(avg(CAST(datavalue AS real)/10),2) AS value
   FROM new_parquet
   WHERE element IN ('TMIN', 'TMAX', 'PRCP') and year = '2018'
   GROUP BY 1
   ```

1. 比較結果並計算效能和成本差異。下列範例結果顯示，在新資料表上的測試查詢比舊資料表上的查詢更快且更便宜。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/ctas-insert-into-etl.html)

## 摘要
<a name="ctas-insert-into-etl-summary"></a>

本主題說明如何使用 Athena 中的 CTAS 和 INSERT INTO 陳述式來執行 ETL 操作。您會使用 CTAS 陳述式將資料轉換為具有 Snappy 壓縮的 Parquet 格式，以執行第一組轉換。CTAS 陳述式也會將資料集從非分割轉換為已分割。這會減少其大小並降低執行查詢的成本。當新資料可用時，您可以使用 INSERT INTO 陳述式來轉換並將資料載入您使用 CTAS 陳述式建立的資料表。

# 使用 CTAS 和 INSERT INTO 來解決 100 個分割區限制
<a name="ctas-insert-into"></a>

Athena 每個 `CREATE TABLE AS SELECT` ([CTAS](ctas.md)) 查詢的分割區限制為 100 個。同樣地，您可以使用 [INSERT INTO](https://docs.aws.amazon.com/athena/latest/ug/insert-into.html) 陳述式將最多 100 個分割區新增至目的地資料表。

如果您超出此限制，您可能會收到錯誤訊息 HIVE\$1TOO\$1MANY\$1OPEN\$1PARTITIONS: Exceeded limit of 100 open writers for partitions/buckets (HIVE\$1TOO\$1MANY\$1OPEN\$1PARTITIONS：超過分割區／儲存貯體 100 個開啟寫入器的限制)。若要避開此限制，您可以使用 CTAS 陳述式和一系列的 `INSERT INTO` 陳述式，每個陳述式可建立或插入最多 100 個分割區。

本主題中的範例使用名為 `tpch100` 的資料庫，其資料位於 Amazon S3 儲存貯體位置 s3://amzn-s3-demo-bucket/。

**使用 CTAS 和 INSERT INTO 來建立超過 100 個分割區的資料表**

1. 使用 `CREATE EXTERNAL TABLE` 陳述式在您要的欄位上建立分割的資料表。

   下列範例陳述式會依資料欄 `l_shipdate` 來分割資料。該資料表有 2525 個分割區。

   ```
   CREATE EXTERNAL TABLE `tpch100.lineitem_parq_partitioned`(
     `l_orderkey` int, 
     `l_partkey` int, 
     `l_suppkey` int, 
     `l_linenumber` int, 
     `l_quantity` double, 
     `l_extendedprice` double, 
     `l_discount` double, 
     `l_tax` double, 
     `l_returnflag` string, 
     `l_linestatus` string, 
     `l_commitdate` string, 
     `l_receiptdate` string, 
     `l_shipinstruct` string, 
     `l_comment` string)
   PARTITIONED BY ( 
     `l_shipdate` string)
   ROW FORMAT SERDE 
     'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION   's3://amzn-s3-demo-bucket/lineitem/'
   ```

1. 執行如下所示的 `SHOW PARTITIONS <table_name>` 命令以列出分割區。

   ```
   SHOW PARTITIONS lineitem_parq_partitioned
   ```

   以下是部分樣本結果。

   ```
   /*
   l_shipdate=1992-01-02
   l_shipdate=1992-01-03
   l_shipdate=1992-01-04
   l_shipdate=1992-01-05
   l_shipdate=1992-01-06
   
   ...
   
   l_shipdate=1998-11-24
   l_shipdate=1998-11-25
   l_shipdate=1998-11-26
   l_shipdate=1998-11-27
   l_shipdate=1998-11-28
   l_shipdate=1998-11-29
   l_shipdate=1998-11-30
   l_shipdate=1998-12-01
   */
   ```

1. 執行 CTAS 查詢以建立分割的資料表。

   下列範例會建立名為 `my_lineitem_parq_partitioned` 的資料表，並使用 `WHERE ` 子句來限制 `DATE` 早於 `1992-02-01`。因為範例資料集開始於 1992 年 1 月，所以只會建立 1992 年 1 月的分割區。

   ```
   CREATE table my_lineitem_parq_partitioned
   WITH (partitioned_by = ARRAY['l_shipdate']) AS
   SELECT l_orderkey,
            l_partkey,
            l_suppkey,
            l_linenumber,
            l_quantity,
            l_extendedprice,
            l_discount,
            l_tax,
            l_returnflag,
            l_linestatus,
            l_commitdate,
            l_receiptdate,
            l_shipinstruct,
            l_comment,
            l_shipdate
   FROM tpch100.lineitem_parq_partitioned
   WHERE cast(l_shipdate as timestamp) < DATE ('1992-02-01');
   ```

1. 執行 `SHOW PARTITIONS` 命令，以確認資料表包含您想要的分割區。

   ```
   SHOW PARTITIONS my_lineitem_parq_partitioned;
   ```

   範例中的分割區是從 1992 年 1 月開始。

   ```
   /*
   l_shipdate=1992-01-02
   l_shipdate=1992-01-03
   l_shipdate=1992-01-04
   l_shipdate=1992-01-05
   l_shipdate=1992-01-06
   l_shipdate=1992-01-07
   l_shipdate=1992-01-08
   l_shipdate=1992-01-09
   l_shipdate=1992-01-10
   l_shipdate=1992-01-11
   l_shipdate=1992-01-12
   l_shipdate=1992-01-13
   l_shipdate=1992-01-14
   l_shipdate=1992-01-15
   l_shipdate=1992-01-16
   l_shipdate=1992-01-17
   l_shipdate=1992-01-18
   l_shipdate=1992-01-19
   l_shipdate=1992-01-20
   l_shipdate=1992-01-21
   l_shipdate=1992-01-22
   l_shipdate=1992-01-23
   l_shipdate=1992-01-24
   l_shipdate=1992-01-25
   l_shipdate=1992-01-26
   l_shipdate=1992-01-27
   l_shipdate=1992-01-28
   l_shipdate=1992-01-29
   l_shipdate=1992-01-30
   l_shipdate=1992-01-31
   */
   ```

1. 使用 `INSERT INTO` 陳述式將分割區新增至資料表。

   下列範例會針對 1992 年 2 月份的日期新增分割區。

   ```
   INSERT INTO my_lineitem_parq_partitioned
   SELECT l_orderkey,
            l_partkey,
            l_suppkey,
            l_linenumber,
            l_quantity,
            l_extendedprice,
            l_discount,
            l_tax,
            l_returnflag,
            l_linestatus,
            l_commitdate,
            l_receiptdate,
            l_shipinstruct,
            l_comment,
            l_shipdate
   FROM tpch100.lineitem_parq_partitioned
   WHERE cast(l_shipdate as timestamp) >= DATE ('1992-02-01')
   AND cast(l_shipdate as timestamp) < DATE ('1992-03-01');
   ```

1. 再次執行 `SHOW PARTITIONS`。

   ```
   SHOW PARTITIONS my_lineitem_parq_partitioned;
   ```

   範例資料表現在有來自 1992 年 1 月和 2 月的分割區。

   ```
   /*
   l_shipdate=1992-01-02
   l_shipdate=1992-01-03
   l_shipdate=1992-01-04
   l_shipdate=1992-01-05
   l_shipdate=1992-01-06
   
   ...
   
   l_shipdate=1992-02-20
   l_shipdate=1992-02-21
   l_shipdate=1992-02-22
   l_shipdate=1992-02-23
   l_shipdate=1992-02-24
   l_shipdate=1992-02-25
   l_shipdate=1992-02-26
   l_shipdate=1992-02-27
   l_shipdate=1992-02-28
   l_shipdate=1992-02-29
   */
   ```

1. 繼續使用每個讀取和新增不超過 100 個分割區的 `INSERT INTO` 陳述式。繼續進行，直到達到您需要的分割區數目為止。
**重要**  
設定 `WHERE` 條件時，請確定查詢不會重疊。否則，某些分割區可能會有重複的資料。

# 使用 SerDes
<a name="serde-reference"></a>

Athena 支援數個 SerDe (序列化程式/還原序列化程式) 程式庫，可以剖析各種資料格式的資料。在 Athena 中建立資料表時，您可以指定與資料格式對應的 SerDe。Athena 不支援自訂 SerDes。

Athena 可以使用 SerDe 程式庫來建立 CSV、TSV、自訂分隔和 JSON 格式的資料表；Hadoop 相關格式 (ORC、Apache Avro 和 Parquet) 的資料；來自 Logstash 的日誌、 AWS CloudTrail 日誌和 Apache WebServer 日誌。每一種資料格式都有一或多個序列化程式-還原序列化程式 (SerDe) 程式庫，而 Athena 可使用這些程式庫來剖析資料。

**注意**  
本節所列的格式由 Athena 用於讀取資料。如需有關 Athena 執行 CTAS 查詢時用於寫入資料的格式的資訊，請參閱 [從查詢結果建立資料表 (CTAS)](ctas.md)。

**Topics**
+ [為您的資料選擇 SerDe](supported-serdes.md)
+ [使用 SerDe 來建立資料表](serde-create-a-table.md)
+ [Amazon Ion Hive SerDe](ion-serde.md)
+ [Avro SerDe](avro-serde.md)
+ [Grok SerDe](grok-serde.md)
+ [JSON SerDe 程式庫](json-serde.md)
+ [CSV SerDe 程式庫](serde-csv-choices.md)
+ [ORC SerDe](orc-serde.md)
+ [Parquet SerDe](parquet-serde.md)
+ [Regex SerDe](regex-serde.md)

# 為您的資料選擇 SerDe
<a name="supported-serdes"></a>

下列資料表會列出 Athena 中支援的資料格式及其對應的 SerDe 程式庫。


**支援的資料格式和 SerDes**  

| 資料格式 | Description | Athena 中支援的 SerDe 類型 | 
| --- | --- | --- | 
| Amazon Ion | Amazon Ion 是由 Amazon 開發及開放原始碼的豐富類型、自行描述的資料格式，是 JSON 的超集。 | 使用 [Amazon Ion Hive SerDe](ion-serde.md)。 | 
|  Apache Avro  |  Hadoop 中用於存放資料的格式，使用以 JSON 為基礎的結構描述來存放記錄值。  |  使用 [Avro SerDe](avro-serde.md)。  | 
|  Apache Parquet  |  Hadoop 中的資料的單欄式儲存格式。  |  使用 [Parquet SerDe](parquet-serde.md) 和 SNAPPY 壓縮。  | 
|  Apache WebServer 日誌  |  Apache WebServer 中存放日誌的格式。  |  使用 [Grok SerDe](grok-serde.md) 或 [Regex SerDe](regex-serde.md)。  | 
|  CloudTrail 日誌  |  CloudTrail 中存放日誌的格式。  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/supported-serdes.html)  | 
|  CSV (逗號分隔值)  |  對於 CSV 的資料，每一行代表一筆資料記錄，而每一筆記錄由一或多個欄位組成 (以逗號分隔)。  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/supported-serdes.html)  | 
|  自訂分隔  |  對於此格式的資料，每一行代表一筆資料記錄，而記錄以自訂單一字元分隔符號隔開。  |  使用 [適用於 CSV、TSV 和自訂分隔檔案的 Lazy Simple SerDe](lazy-simple-serde.md)，並指定自訂單一字元分隔符號。  | 
|  JSON (JavaScript 物件標記法)  |  對於 JSON 資料，每一行代表一筆資料記錄，而每一筆記錄由屬性/值對組成 (以逗號分隔)。  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/supported-serdes.html)  | 
|  Logstash 日誌  |  Logstash 中存放日誌的格式。  |  使用 [Grok SerDe](grok-serde.md)。  | 
|  ORC (Optimized Row Columnar，最佳化列單欄式)  |  Hive 資料的最佳化單欄式儲存格式。  |  使用 [ORC SerDe](orc-serde.md) 和 ZLIB 壓縮。  | 
|  TSV (定位字元分隔值)  |  對於 TSV 的資料，每一行代表一筆資料記錄，而每一筆記錄由一或多個欄位組成 (以定位字元分隔)。  |  使用 [適用於 CSV、TSV 和自訂分隔檔案的 Lazy Simple SerDe](lazy-simple-serde.md)，並將分隔符號字元指定為 `FIELDS TERMINATED BY '\t'`。  | 

# 使用 SerDe 來建立資料表
<a name="serde-create-a-table"></a>

若要在 Athena 中建立資料表時使用 SerDe，請使用下列其中一種方法：
+ 指定 `ROW FORMAT DELIMITED`，然後使用 DDL 陳述式來指定欄位分隔符號，如以下範例所示。在您指定時 `ROW FORMAT DELIMITED` 時，Athena 會預設使用 LazySimpleSerDe。

  ```
  ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ','
  ESCAPED BY '\\'
  COLLECTION ITEMS TERMINATED BY '|'
  MAP KEYS TERMINATED BY ':'
  ```

  如需 `ROW FORMAT DELIMITED` 的範例，請參閱以下主題：

  [適用於 CSV、TSV 和自訂分隔檔案的 Lazy Simple SerDe](lazy-simple-serde.md)

  [查詢 Amazon CloudFront 日誌](cloudfront-logs.md)

  [查詢 Amazon EMR 日誌](emr-logs.md)

  [查詢 Amazon VPC 流程日誌](vpc-flow-logs.md)

  [使用 CTAS 和 INSERT INTO 以進行 ETL 和資料分析](ctas-insert-into-etl.md)
+ 使用 `ROW FORMAT SERDE` 來明確指定 Athena 在資料表中讀取和寫入資料時應使用的 SerDe 類型。以下範例會指定 LazySimpleSerDe。若要指定分隔符號，請使用 `WITH SERDEPROPERTIES`。由 `WITH SERDEPROPERTIES` 指定的屬性會對應至 `ROW FORMAT DELIMITED` 範例中的單獨陳述式 (例如 `FIELDS TERMINATED BY`)。

  ```
  ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
  WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'field.delim' = ',',
  'collection.delim' = '|',
  'mapkey.delim' = ':',
  'escape.delim' = '\\'
  )
  ```

  如需 `ROW FORMAT SERDE` 的範例，請參閱以下主題：

  [Avro SerDe](avro-serde.md)

  [Grok SerDe](grok-serde.md)

  [JSON SerDe 程式庫](json-serde.md)

  [用於處理 CSV 的 Open CSV SerDe](csv-serde.md)

  [Regex SerDe](regex-serde.md)

# Amazon Ion Hive SerDe
<a name="ion-serde"></a>

您可以使用 Amazon Ion Hive SerDe 來查詢以 [Amazon Ion](https://amzn.github.io/ion-docs/guides/cookbook.html) 格式存放的資料。Amazon Ion 是一種豐富類型、自行描述、開放原始碼資料格式。Amazon Ion 格式可在開放原始碼 SQL 查詢語言 [PartiQL](https://partiql.org/) 中使用。

Amazon Ion 具有可互換的二進位格式和文字格式。此功能結合了文字的易用性和二進位編碼的效率。

要從 Athena 查詢 Amazon Ion 資料，您可以使用 [Amazon Ion Hive SerDe](https://github.com/amzn/ion-hive-serde)，且其可將 Amazon Ion 資料序列化和還原序列化。還原序列化允許您對 Amazon Ion 資料執行查詢，或讀取資料以便寫出至 Parquet 或 ORC 等不同格式。藉助序列化，您可以透過使用 `CREATE TABLE AS SELECT` (CTAS) 或 `INSERT INTO` 查詢從現有資料表中複製資料，以產生 Amazon Ion 格式的資料。

**注意**  
由於 Amazon Ion 是 JSON 的超集，因此您可以使用 Amazon Ion Hive SerDe 來查詢非 Amazon Ion JSON 資料集。與其他 [JSON SerDe 程式庫](https://docs.aws.amazon.com/athena/latest/ug/json-serde.html)不同，Amazon Ion SerDe 不期望每一資料列都位於單獨一行上。如果您想查詢使用「美化顯示」格式的 JSON 資料集，或以其他方式用新行字元分解資料列中的欄位，則此功能非常有用。

如需使用 Athena 查詢 Amazon Ion 的其他資訊和範例，請參閱[使用 Amazon Athena 分析 Amazon Ion 資料集](https://aws.amazon.com/blogs/big-data/analyze-amazon-ion-datasets-using-amazon-athena/)。

## 序列化程式庫名稱
<a name="library-name"></a>

Amazon Ion SerDe 的序列化程式庫名稱為 `com.amazon.ionhiveserde.IonHiveSerDe`。如需原始程式碼資訊，請參閱 GitHub.com 上的 [Amazon Ion Hive SerDe](https://github.com/amazon-ion/ion-hive-serde)。

## 考量和限制
<a name="ion-serde-considerations-and-limitations"></a>
+ **重複的欄位** – Amazon Ion 結構井然有序並支援重複的欄位，而 Hive 的 `STRUCT<>` 和 `MAP<>` 並非如此。因此，當您從 Amazon Ion 結構中將重複的欄位還原序列化時，將非確定性地選擇一個值，而忽略其他值。
+ **不支援外部符號資料表** – 目前，Athena 不支援外部符號資料表或以下 Amazon Ion Hive SerDe 屬性：
  + `ion.catalog.class`
  + `ion.catalog.file`
  + `ion.catalog.url`
  + `ion.symbol_table_imports`
+ **檔案副檔名** – Amazon Ion 使用檔案副檔名來確定用於還原序列化 Amazon Ion 檔案的壓縮轉碼器。因此，壓縮檔案必須具有與所使用的壓縮演算法相對應的檔案副檔名。例如，如果使用 ZSTD，則相應的檔案應該具有副檔名 `.zst`。
+ **同質資料**– Amazon Ion 對可用於特定欄位中的值的資料類型沒有限制。例如，兩個不同的 Amazon Ion 文件可能包含一個具有不同資料類型及相同名稱的欄位。但是，由於 Hive 使用結構描述，所以擷取到單一 Hive 資料欄的所有值都必須具有相同的資料類型。
+ **映射金鑰類型限制** – 將其他格式的資料序列化為 Amazon Ion 時，請確認映射金鑰類型是 `STRING`、`VARCHAR` 或 `CHAR`。雖然 Hive 允許您使用任何基本資料類型作為映射金鑰，但 [Amazon Ion 符號](https://amzn.github.io/ion-docs/docs/symbols.html)必須是字串類型。
+ **Union 類型** – Athena 目前不支援 Hive [Union 類型](https://cwiki.apache.org/confluence/display/hive/languagemanual+types/#LanguageManualTypes-UnionTypesunionUnionTypes)。
+ **雙精確度資料類型** – Amazon Ion 目前不支援資 `double` 料類型。

**Topics**
+ [序列化程式庫名稱](#library-name)
+ [考量和限制](#ion-serde-considerations-and-limitations)
+ [建立 Amazon Ion 資料表](ion-serde-using-create-table.md)
+ [使用 CTAS 和 INSERT INTO 來建立 Amazon Ion 資料表](ion-serde-using-ctas-and-insert-into-to-create-ion-tables.md)
+ [Amazon Ion SerDe 屬性參考](ion-serde-using-ion-serde-properties.md)
+ [使用路徑擷取器](ion-serde-using-path-extractors.md)

# 建立 Amazon Ion 資料表
<a name="ion-serde-using-create-table"></a>

若要在 Athena 中，從以 Amazon Ion 格式存放的資料中建立資料表，您可以在 CREATE TABLE 陳述式中使用下列其中一項技術：
+ 指定 `STORED AS ION`。在這種用法中，您不必明確指定 Amazon Ion Hive SerDe。這種選擇是更為直接的選項。
+ 在 `ROW FORMAT SERDE`、`INPUTFORMAT` 和 `OUTPUTFORMAT` 欄位中指定 Amazon Ion 類別路徑。

您還可以使用 `CREATE TABLE AS SELECT` (CTAS) 陳述式在 Athena 中建立 Amazon Ion 資料表。如需相關資訊，請參閱[使用 CTAS 和 INSERT INTO 來建立 Amazon Ion 資料表](ion-serde-using-ctas-and-insert-into-to-create-ion-tables.md)。

## 指定 STORED AS ION
<a name="ion-serde-specifying-stored-as-ion"></a>

以下 `CREATE TABLE` 陳述式範例在 `LOCATION` 子句前使用 `STORED AS ION`，以基於 Amazon Ion 格式的航班資料建立資料表。`LOCATION` 子句指定了 Ion 格式輸入文件所在的儲存貯體或資料夾。掃描指定位置中的所有檔案。

```
CREATE EXTERNAL TABLE flights_ion (
    yr INT,
    quarter INT,
    month INT,
    dayofmonth INT,
    dayofweek INT,
    flightdate STRING,
    uniquecarrier STRING,
    airlineid INT,
)
STORED AS ION
LOCATION 's3://amzn-s3-demo-bucket/'
```

## 指定 Amazon Ion 類別路徑
<a name="ion-serde-specifying-the-ion-class-paths"></a>

您可以明確指定 `ROW FORMAT SERDE`、`INPUTFORMAT` 和 `OUTPUTFORMAT` 子句的 Ion 類別路徑值，但不要使用 `STORED AS ION` 語法，如下所示。


****  

| 參數 | Ion 類別路徑 | 
| --- | --- | 
| ROW FORMAT SERDE | 'com.amazon.ionhiveserde.IonHiveSerDe' | 
| STORED AS INPUTFORMAT | 'com.amazon.ionhiveserde.formats.IonInputFormat' | 
| OUTPUTFORMAT | 'com.amazon.ionhiveserde.formats.IonOutputFormat' | 

以下 DDL 查詢使用此技術建立與上一個範例相同的外部資料表。

```
CREATE EXTERNAL TABLE flights_ion (
    yr INT,
    quarter INT,
    month INT,
    dayofmonth INT,
    dayofweek INT,
    flightdate STRING,
    uniquecarrier STRING,
    airlineid INT,
)
ROW FORMAT SERDE
 'com.amazon.ionhiveserde.IonHiveSerDe'
STORED AS INPUTFORMAT
 'com.amazon.ionhiveserde.formats.IonInputFormat'
OUTPUTFORMAT
 'com.amazon.ionhiveserde.formats.IonOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/'
```

有關 Athena 中的 `CREATE TABLE` 陳述式的 SerDe 屬性相關資訊，請參閱[Amazon Ion SerDe 屬性參考](ion-serde-using-ion-serde-properties.md)。

# 使用 CTAS 和 INSERT INTO 來建立 Amazon Ion 資料表
<a name="ion-serde-using-ctas-and-insert-into-to-create-ion-tables"></a>

您可以在 Athena 中，使用 `CREATE TABLE AS SELECT` (CTAS) 和 `INSERT INTO` 陳述式將資料表中的資料複製或插入到 Amazon Ion 格式的新資料表中。

在 CTAS 查詢中，以 `WITH` 子句指定 `format='ION'`，如下列範例所示。

```
CREATE TABLE new_table
WITH (format='ION')
AS SELECT * from existing_table
```

依預設，Athena 將以 [Ion 二進位格式](https://amzn.github.io/ion-docs/docs/binary.html)序列化 Amazon Ion 結果，但您也可以使用文字格式。要使用文字格式，請以 CTAS `WITH` 子句指定 `ion_encoding = 'TEXT'`，如下列範例所示。

```
CREATE TABLE new_table
WITH (format='ION', ion_encoding = 'TEXT')
AS SELECT * from existing_table
```

如需有關 CTAS `WITH` 子句中的 Amazon Ion 特定屬性的詳細資訊，請參閱 [CTAS WITH 子句的 Amazon Ion 屬性](#ion-serde-ctas-with-clause-properties)。

## CTAS WITH 子句的 Amazon Ion 屬性
<a name="ion-serde-ctas-with-clause-properties"></a>

在 CTAS 查詢中，您可以使用 `WITH` 子句來指定 Amazon Ion 格式，並可選擇指定要使用的 Amazon Ion 編碼及/或寫入壓縮演算法。

**格式**  
您可以將 `ION` 關鍵字指定為 CTAS 查詢的 `WITH` 子句中的格式選項。在執行這項操作時，您建立的資料表將使用您為 `IonInputFormat` 指定的格式進行讀取，並以您為 `IonOutputFormat` 指定的格式序列化資料。  
以下範例指定 CTAS 查詢使用 Amazon Ion 格式。  

```
WITH (format='ION')
```

**ion\$1encoding**  
選用  
預設：`BINARY`  
值：`BINARY`、`TEXT`  
指定資料是以 Amazon Ion 二進位格式還是以 Amazon Ion 文字格式序列化。以下範例指定了 Amazon Ion 文字格式。  

```
WITH (format='ION', ion_encoding='TEXT')
```

**write\$1compression**  
選用  
預設：`GZIP`  
值：`GZIP`、`ZSTD`、`BZIP2`、`SNAPPY`、`NONE`  
指定用於壓縮輸出檔案的壓縮演算法。  
以下範例指定了 CTAS 查詢使用 [Zstandard](https://facebook.github.io/zstd/) 壓縮演算法以 Amazon Ion 格式寫入其輸出。  

```
WITH (format='ION', write_compression = 'ZSTD')       
```
如需有關在 Athena 中使用壓縮的資訊，請參閱[在 Athena 中使用壓縮](compression-formats.md)。

如需有關在 Athena 中的其他 CTAS 屬性，請參閱 [CTAS 資料表屬性](create-table-as.md#ctas-table-properties)。

# Amazon Ion SerDe 屬性參考
<a name="ion-serde-using-ion-serde-properties"></a>

本主題包含 Athena 中 `CREATE TABLE` 陳述式的 SerDe 屬性的相關資訊。如需 Amazon Ion SerDe 屬性使用的詳細資訊和範例，請參閱 [GitHub](https://github.com/amzn/ion-hive-serde/tree/master/docs) 上的 Amazon Ion Hive SerDe 文件中的 [SerDe properties](https://github.com/amzn/ion-hive-serde/blob/master/docs/serde-properties.md) (SerDe 屬性)。

## 如何指定 Amazon Ion SerDe 屬性
<a name="ion-serde-specifying-ion-serde-properties"></a>

若要在 `CREATE TABLE` 陳述式中指定 Amazon Ion Hive SerDe 的屬性，請使用 `WITH SERDEPROPERTIES` 子句。由於 `WITH SERDEPROPERTIES` 是 `ROW FORMAT SERDE` 子句的子欄位，您必須先指定 `ROW FORMAT SERDE` 和 Amazon Ion Hive SerDe 類別路徑，如下列語法所示。

```
...
ROW FORMAT SERDE
 'com.amazon.ionhiveserde.IonHiveSerDe'
WITH SERDEPROPERTIES (
 'property' = 'value',
 'property' = 'value',
...
)
```

請注意，雖然如果您要使用 `WITH SERDEPROPERTIES`，則 `ROW FORMAT SERDE` 子句為必要條件，您可以使用 `STORED AS ION` 或者較長 `INPUTFORMAT` 和 `OUTPUTFORMAT` 語法來指定 Amazon Ion 格式。

## Amazon Ion SerDe 屬性
<a name="ion-serde-ion-serde-properties"></a>

以下是 Amazon Ion SerDe 屬性，可用於 Athena 中的 `CREATE TABLE` 陳述式。

**ion.encoding**  
選用  
預設：`BINARY`  
值：`BINARY`、`TEXT`  
此屬性會宣告新增的值是否序列化為 [Amazon Ion 二進位](https://amzn.github.io/ion-docs/docs/binary.html)或 Amazon Ion 文字格式。  
以下 SerDe 屬性範例指定了 Amazon Ion 文字格式。  

```
'ion.encoding' = 'TEXT'
```

**ion.fail\$1on\$1overflow**  
選用  
預設：`true`  
值：`true`、`false`  
Amazon Ion 允許任意大型數值類型，而 Hive 則不允許。依預設，如果 Amazon Ion 值不適合 Hive 資料欄，則 SerDe 將失敗，但您可以使用 `fail_on_overflow` 組態選項來使值溢位而不是失敗。  
可以在資料表或資料欄層級設定此屬性。要在資料表層級進行指定，請按如下範例所示指定 `ion.fail_on_overflow`。這樣一來，即會為所有資料欄設定預設行為。  

```
'ion.fail_on_overflow' = 'true'
```
要控制特定資料欄，請指定 `ion` 與 `fail_on_overflow` 之間的資料欄名稱，其中由句點分隔，如下列範例所示。  

```
'ion.<column>.fail_on_overflow' = 'false'
```

**ion.path\$1extractor.case\$1sensitive**  
選用  
預設：`false`  
值：`true`、`false`  
確定是否將 Amazon Ion 欄位名稱視為區分大小寫。當為 `false` 時，SerDe 將忽略剖析 Amazon Ion 欄位名稱的大小寫。  
例如，假設您有 Hive 資料表結構描述，它以小寫形式定義了欄位 `alias`，而 Amazon Ion 文件則包含 `alias` 欄位和 `ALIAS` 欄位，如下列範例所示。  

```
-- Hive Table Schema
alias: STRING

-- Amazon Ion Document
{ 'ALIAS': 'value1'} 
{ 'alias': 'value2'}
```
以下範例說明了當區分大小寫設定為 `false` 時的 SerDe 屬性以及產生的擷取資料表：  

```
-- Serde properties
'ion.alias.path_extractor' = '(alias)'
'ion.path_extractor.case_sensitive' = 'false'

--Extracted Table
| alias    |
|----------|
| "value1" |
| "value2" |
```
以下範例說明了當區分大小寫設定為 `true` 時的 SerDe 屬性以及產生的擷取資料表：  

```
-- Serde properties
'ion.alias.path_extractor' = '(alias)'
'ion.path_extractor.case_sensitive' = 'true'

--Extracted Table
| alias    |
|----------|
| "value2" |
```
在第二種情況下，當區分大小寫設定為 `true` 且路徑擷取器指定為 `alias` 時，會忽略 `ALIAS` 欄位的 `value1`。

**ion.*<column>*.path\$1extractor**  
選用  
預設：不適用  
值：含搜尋路徑的字串  
使用特定資料欄的指定搜尋路徑建立路徑擷取器。路徑擷取器將 Amazon Ion 欄位映射到 Hive 資料欄。如果未指定路徑擷取器，Athena 會根據資料欄名稱在執行時間動態建立路徑擷取器。  
以下路徑擷取器範例將 `example_ion_field` 映射至 `example_hive_column`。  

```
'ion.example_hive_column.path_extractor' = '(example_ion_field)'
```
如需有關路徑擷取器和搜尋路徑的詳細資訊，請參閱[使用路徑擷取器](ion-serde-using-path-extractors.md)。

**ion.timestamp.serialization\$1offset**  
選用  
預設：`'Z'`  
值：`OFFSET`，其中 `OFFSET ` 表示為 `<signal>hh:mm`。範例值：`01:00`、`+01:00`、`-09:30`、`Z` (UTC，與 00:00 相同)  
與 Apache Hive [時間戳記](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-timestamp)不同，它們沒有內建時區，並且存放為從 UNIX epoch 的偏移，Amazon Ion 時間戳記確實具有偏移。在序列化到 Amazon Ion 時，使用此屬性指定偏移。  
以下範例新增了一小時的偏移。  

```
'ion.timestamp.serialization_offset' = '+01:00'       
```

**ion.serialize\$1null**  
選用  
預設：`OMIT`  
值：`OMIT`、`UNTYPED`、`TYPED`  
可以將 Amazon Ion SerDe 設定為序列化或省略具有 null 值的資料欄。您可以選擇寫出強類型的 null 值 (`TYPED`) 或無類型的 null 值 (`UNTYPED`)。強類型 null 值是根據預設的 Amazon Ion 到 Hive 類型映射來決定的。  
以下範例指定了強類型的 null 值。  

```
'ion.serialize_null'='TYPED'
```

**ion.ignore\$1malformed**  
選用  
預設：`false`  
值：`true`、`false`  
當為 `true` 時，如果 SerDe 無法讀取，則會忽略格式錯誤的項目或整個檔案。如需詳細資訊，請參閱 GitHub 上文件中的[忽略格式錯誤](https://github.com/amzn/ion-hive-serde/blob/master/docs/serde-properties.md#ignore-malformed)。

**ion.*<column>*.serialize\$1as**  
選用  
預設：資料欄的預設類型。  
值：包含 Amazon Ion 類型的字串  
確定在其中序列化值的 Amazon Ion 資料類型。由於 Amazon Ion 和 Hive 類型並不總是具有直接映射，因此少數 Hive 類型具有多種用於序列化的有效資料類型。要將資料序列化為非預設資料類型，請使用此屬性。如需有關類型映射的詳細資訊，請參閱 GitHub 上的 Amazon Ion [Type mapping](https://github.com/amzn/ion-hive-serde/blob/master/docs/type-mapping.md) (類型映射) 頁面。  
依預設，二進位 Hive 資料欄序列化為 Amazon Ion blob，但它們也可以序列化為 [Amazon Ion clob](https://amzn.github.io/ion-docs/docs/stringclob.html#ion-clob) (字元大型物件)。以下範例將資料欄 `example_hive_binary_column` 序列化為 clob。  

```
'ion.example_hive_binary_column.serialize_as' = 'clob'       
```

# 使用路徑擷取器
<a name="ion-serde-using-path-extractors"></a>

Amazon Ion 是文件樣式檔案格式，而 Apache Hive 是平面直欄式格式。您可以使用名為 `path extractors` 的特殊 Amazon Ion SerDe 屬性來在兩種格式之間進行映射。路徑擷取器會展平階層式 Amazon Ion 格式，將 Amazon Ion 值映射到 Hive 資料欄，並可用於重新命名欄位。

Athena 可以為您產生擷取器，但如有必要，您也可以定義自己的擷取器。

**Topics**
+ [使用 Athena 產生的路徑擷取器](ion-serde-generated-path-extractors.md)
+ [指定自己的路徑擷取器](ion-serde-specifying-your-own-path-extractors.md)
+ [在路徑擷取器中使用搜尋路徑](ion-serde-using-search-paths-in-path-extractors.md)
+ [路徑擷取器範例](ion-serde-examples.md)

# 使用 Athena 產生的路徑擷取器
<a name="ion-serde-generated-path-extractors"></a>

依預設，Athena 會搜尋與 Hive 資料欄名稱相符的頂層 Amazon Ion 值，並根據這些相符的值在執行時間建立路徑擷取器。如果您的 Amazon Ion 資料格式與 Hive 資料表結構描述相符，Athena 會為您動態產生擷取器，並且您無需新增任何其他路徑擷取器。這些預設路徑擷取器不會存放在資料表中繼資料中。

下列範例說明了 Athena 如何根據資料欄名稱產生擷取器。

```
-- Example Amazon Ion Document
{
    identification: {
        name: "John Smith",
        driver_license: "XXXX"
    },
    
    alias: "Johnny"    
}

-- Example DDL
CREATE EXTERNAL TABLE example_schema2 (
    identification MAP<STRING, STRING>,
    alias STRING
)
STORED AS ION
LOCATION 's3://amzn-s3-demo-bucket/path_extraction1/'
```

下列範例擷取器由 Athena 產生。第一個會將 `identification` 欄位擷取為 `identification` 資料欄，第二個會將 `alias` 欄位擷取為 `alias` 資料欄。

```
'ion.identification.path_extractor' = '(identification)'
'ion.alias.path_extractor' = '(alias)'
```

下列範例說明了擷取的資料表。

```
|                  identification                    |  alias   |
|----------------------------------------------------|----------|
|{["name", "driver_license"],["John Smith", "XXXX"]} | "Johnny" |
```

# 指定自己的路徑擷取器
<a name="ion-serde-specifying-your-own-path-extractors"></a>

如果您的 Amazon Ion 欄位未能整齊地映射到 Hive 資料欄，您可以指定自己的路徑擷取器。在 `CREATE TABLE` 陳述式的 `WITH SERDEPROPERTIES` 子句中，使用以下語法。

```
WITH SERDEPROPERTIES (
   "ion.path_extractor.case_sensitive" = "<Boolean>", 
   "ion.<column_name>.path_extractor" = "<path_extractor_expression>"
)
```

**注意**  
依預設，路徑擷取器不區分大小寫。要覆寫此設定，請將 [ion.path_extractor.case_sensitive](ion-serde-using-ion-serde-properties.md#ioncase) SerDe 屬性設定為 `true`。

# 在路徑擷取器中使用搜尋路徑
<a name="ion-serde-using-search-paths-in-path-extractors"></a>

路徑擷取器的 SerDe 屬性語法包含 *<path\$1extractor\$1expression>*：

```
"ion.<column_name>.path_extractor" = "<path_extractor_expression>"         
```

您可以使用 *<path\$1extractor\$1expression>* 來指定用於剖析 Amazon Ion 文件並尋找相符資料的搜尋路徑。搜尋路徑含括在括號內，並且可以包含以下一個或多個由空格分隔的元件。
+ **萬用字元** – 符合所有值。
+ **索引** – 符合指定數字索引位置的值。索引以零為起始。
+ **文字** – 符合欄位名稱與指定文字相符的所有值。
+ **註釋** – 符合具有指定註釋的包裝路徑元件指定的值。

下列範例說明了 Amazon Ion 文件和一些搜尋路徑範例。

```
-- Amazon Ion document
{
    foo: ["foo1", "foo2"] ,
    bar: "myBarValue", 
    bar: A::"annotatedValue"
}

-- Example search paths
(foo 0)       # matches "foo1"
(1)           # matches "myBarValue"
(*)           # matches ["foo1", "foo2"], "myBarValue" and A::"annotatedValue"
()            # matches {foo: ["foo1", "foo2"] , bar: "myBarValue", bar: A::"annotatedValue"}
(bar)         # matches "myBarValue" and A::"annotatedValue"
(A::bar)      # matches A::"annotatedValue"
```

# 路徑擷取器範例
<a name="ion-serde-examples"></a>

下列路徑擷取器範例顯示如何扁平化和重新命名欄位，或將資料擷取為 Amazon Ion 文字。

## 扁平化和重新命名欄位
<a name="ion-serde-flattening-and-renaming-fields"></a>

下列範例說明了一組展平和重新命名欄位的搜尋路徑。此範例使用搜尋路徑來執行下列動作：
+ 將 `nickname` 資料欄映射至 `alias` 欄位
+ 將 `name` 資料欄映射至位於 `identification` 結構中的 `name` 子欄位。

以下是 Amazon Ion 文件範例。

```
-- Example Amazon Ion Document
{
    identification: {
        name: "John Smith",
        driver_license: "XXXX"
    },
    
    alias: "Johnny"    
}
```

以下是定義路徑擷取器的範例 `CREATE TABLE` 陳述式。

```
-- Example DDL Query
CREATE EXTERNAL TABLE example_schema2 (
    name STRING,
    nickname STRING
)
ROW FORMAT SERDE
 'com.amazon.ionhiveserde.IonHiveSerDe'
WITH SERDEPROPERTIES (
 'ion.nickname.path_extractor' = '(alias)',
 'ion.name.path_extractor' = '(identification name)'
 )
STORED AS ION
LOCATION 's3://amzn-s3-demo-bucket/path_extraction2/'
```

下列範例說明了擷取的資料。

```
-- Extracted Table
| name         |   nickname   |
|--------------|--------------|
| "John Smith" |  "Johnny"    |
```

如需搜尋路徑和其他搜尋路徑範例的詳細資訊，請參閱 GitHub 上的 [Ion Java Path Extraction](https://github.com/amzn/ion-java-path-extraction) (Ion Java 路徑擷取) 頁面。

## 將航班資料擷取為文字格式
<a name="ion-serde-extracting-flight-data-to-text-format"></a>

以下 `CREATE TABLE` 查詢範例使用 `WITH SERDEPROPERTIES` 來新增路徑擷取器，以擷取航班資料並將輸出編碼指定為 Amazon Ion 文字。此範例使用 `STORED AS ION` 語法。

```
CREATE EXTERNAL TABLE flights_ion (
    yr INT,
    quarter INT,
    month INT,
    dayofmonth INT,
    dayofweek INT,
    flightdate STRING,
    uniquecarrier STRING,
    airlineid INT,
)
ROW FORMAT SERDE
 'com.amazon.ionhiveserde.IonHiveSerDe'
WITH SERDEPROPERTIES (
 'ion.encoding' = 'TEXT',
 'ion.yr.path_extractor'='(year)',
 'ion.quarter.path_extractor'='(results quarter)',
 'ion.month.path_extractor'='(date month)')
STORED AS ION
LOCATION 's3://amzn-s3-demo-bucket/'
```

# Avro SerDe
<a name="avro-serde"></a>

使用 Avro SerDe，以從 Avro 資料建立 Athena 資料表。

## 序列化程式庫名稱
<a name="avro-serde-library-name"></a>

Avro SerDe 的序列化程式庫名稱為 `org.apache.hadoop.hive.serde2.avro.AvroSerDe`。如需技術資訊，請參閱 Apache 文件中的 [AvroSerDe](https://cwiki.apache.org/confluence/display/Hive/AvroSerDe)。

## 使用 Avro SerDe
<a name="avro-serde-using"></a>

基於安全理由，Athena 不支援使用 `avro.schema.url` 來指定資料表結構描述；請改用 `avro.schema.literal`。

若要從 Avro 格式的資料中擷取結構描述，請使用位於已安裝的 Avro 版本的 `java` 子目錄中的 Apache `avro-tools-<version>.jar` 檔案。使用 `getschema` 參數傳回您可在 `WITH SERDEPROPERTIES` 陳述式中使用的結構描述，如下列範例所示。

```
java -jar avro-tools-1.8.2.jar getschema my_data.avro
```

若要下載 Avro，請參閱 [Apache Avro 版本](http://avro.apache.org/releases.html#Download)。若要直接下載 Apache Avro 工具，請參閱 [Apache Avro 工具 Maven 儲存庫](https://mvnrepository.com/artifact/org.apache.avro/avro-tools)。

取得結構描述後，使用 `CREATE TABLE` 陳述式，根據存放在 Amazon S3 中的基礎 Avro 資料建立 Athena 資料表。若要在 `CREATE TABLE` 陳述式中指定 Avro SerDe，請使用 `ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'`。使用 `WITH SERDEPROPERTIES` 子句指定結構描述，如下列命令範例所示。

**注意**  
在 `s3://athena-examples-myregion/path/to/data/` 中，以您執行 Athena 之處的區域識別符 (例如 `s3://athena-examples-us-west-1/path/to/data/`) 取代 *myregion*。

```
CREATE EXTERNAL TABLE flights_avro_example (
   yr INT,
   flightdate STRING,
   uniquecarrier STRING,
   airlineid INT,
   carrier STRING,
   flightnum STRING,
   origin STRING,
   dest STRING,
   depdelay INT,
   carrierdelay INT,
   weatherdelay INT
)
PARTITIONED BY (year STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
WITH SERDEPROPERTIES ('avro.schema.literal'='
{
   "type" : "record",
   "name" : "flights_avro_subset",
   "namespace" : "default",
   "fields" : [ {
      "name" : "yr",
      "type" : [ "null", "int" ],
      "default" : null
   }, {
      "name" : "flightdate",
      "type" : [ "null", "string" ],
      "default" : null
   }, {
      "name" : "uniquecarrier",
      "type" : [ "null", "string" ],
      "default" : null
   }, {
      "name" : "airlineid",
      "type" : [ "null", "int" ],
      "default" : null
   }, {
      "name" : "carrier",
      "type" : [ "null", "string" ],
      "default" : null
   }, {
      "name" : "flightnum",
      "type" : [ "null", "string" ],
      "default" : null
   }, {
      "name" : "origin",
      "type" : [ "null", "string" ],
      "default" : null
   }, {
      "name" : "dest",
      "type" : [ "null", "string" ],
      "default" : null
   }, {
      "name" : "depdelay",
      "type" : [ "null", "int" ],
      "default" : null
   }, {
      "name" : "carrierdelay",
      "type" : [ "null", "int" ],
      "default" : null
   }, {
      "name" : "weatherdelay",
      "type" : [ "null", "int" ],
      "default" : null
    } ]
}
')
STORED AS AVRO
LOCATION 's3://athena-examples-myregion/flight/avro/';
```

對資料表執行 `MSCK REPAIR TABLE` 陳述式，以重新整理分割區中繼資料。

```
MSCK REPAIR TABLE flights_avro_example;
```

透過出境總數查詢 10 大出境城市。

```
SELECT origin, count(*) AS total_departures
FROM flights_avro_example
WHERE year >= '2000'
GROUP BY origin
ORDER BY total_departures DESC
LIMIT 10;
```

**注意**  
航班資料表資料來自美國運輸部[交通統計局](http://www.transtats.bts.gov/)提供的[航班](http://www.transtats.bts.gov/DL_SelectFields.asp?Table_ID=236&amp;DB_Short_Name=On-Time)。從原本資料去掉飽和度。

# Grok SerDe
<a name="grok-serde"></a>

Logstash Grok SerDe 是提供一組特殊化模式將非結構化文字資料 (通常是日誌) 還原序列化的程式庫。每個 Grok 模式是具名的規則表達式。您可以視需要識別和重複使用這些還原序列化模式。相較於使用規則表達式，這可讓您更輕鬆地使用 Grok。Grok 提供一組[預先定義的模式](https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns)。您也可以建立自訂模式。

## 序列化程式庫名稱
<a name="library-name"></a>

Grok SerDe 的序列化程式庫名稱為 `com.amazonaws.glue.serde.GrokSerDe`。

## 如何使用 Grok SerDe
<a name="grok-serde-using"></a>

在 Athena 中建立資料表時，若要指定 Grok SerDe，請使用 `ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe'` 子句，接著使用 `WITH SERDEPROPERTIES` 子句來指定資料中要符合的模式，其中：
+ `input.format` 表達式定義資料中要符合的模式。這是必要項目。
+ `input.grokCustomPatterns` 表達式定義具名的自訂模式，供您後續在 `input.format` 表達式內使用。這是選用的。若要將多個模式項目併入 `input.grokCustomPatterns` 表達式中，請使用新行逸出字元 (`\n`) 來分隔，如下所示： `'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)')`。
+ `STORED AS INPUTFORMAT` 和 `OUTPUTFORMAT` 子句是必要的。
+ `LOCATION` 子句會指定 Amazon S3 儲存貯體，其可以包含多個資料物件。儲存貯體中的所有資料物件都還原序列化來建立資料表。

## 範例
<a name="examples"></a>

本節中的範例倚賴預先定義的 Grok 模式清單。如需詳細資訊，請參閱 GitHub.com 上的 [grok-patterns](https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns)。

### 範例 1
<a name="example-1"></a>

此範例使用 `s3://amzn-s3-demo-bucket/groksample/` 中儲存的 Postfix maillog 項目內的來源資料。

```
Feb  9 07:15:00 m4eastmail postfix/smtpd[19305]: B88C4120838: connect from unknown[192.168.55.4]
Feb  9 07:15:00 m4eastmail postfix/smtpd[20444]: B58C4330038: client=unknown[192.168.55.4]
Feb  9 07:15:03 m4eastmail postfix/cleanup[22835]: BDC22A77854: message-id=<31221401257553.5004389LCBF@m4eastmail.example.com>
```

以下陳述式使用自訂模式和您指定的預先定義模式，在 Athena 中從來源資料建立名為 `mygroktable` 的資料表：

```
CREATE EXTERNAL TABLE `mygroktable`(
   syslogbase string,
   queue_id string,
   syslog_message string
   )
ROW FORMAT SERDE
   'com.amazonaws.glue.serde.GrokSerDe'
WITH SERDEPROPERTIES (
   'input.grokCustomPatterns' = 'POSTFIX_QUEUEID [0-9A-F]{7,12}',
   'input.format'='%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}'
   )
STORED AS INPUTFORMAT
   'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
   'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/groksample/';
```

首先使用類似 `%{NOTSPACE:column}` 的模式，先映射資料欄，再視需要將資料欄特殊化。

### 範例 2
<a name="example-2"></a>

在下列範例中，您為 Log4j 日誌建立查詢。範例日誌中的項目採用此格式：

```
2017-09-12 12:10:34,972 INFO  - processType=AZ, processId=ABCDEFG614B6F5E49, status=RUN,
threadId=123:amqListenerContainerPool23P:AJ|ABCDE9614B6F5E49||2017-09-12T12:10:11.172-0700],
executionTime=7290, tenantId=12456, userId=123123f8535f8d76015374e7a1d87c3c, shard=testapp1,
jobId=12312345e5e7df0015e777fb2e03f3c, messageType=REAL_TIME_SYNC,
action=receive, hostname=1.abc.def.com
```

查詢此日誌資料：
+ 針對每個欄，將 Grok 模式新增到 `input.format`。例如，對於 `timestamp`，新增 `%{TIMESTAMP_ISO8601:timestamp}`。對於 `loglevel`，新增 `%{LOGLEVEL:loglevel}`。
+ 映射在日誌格式中用於分隔項目的虛線 (`-`) 和逗號，以確定 `input.format` 中的模式完全符合日誌的格式。

  ```
  CREATE EXTERNAL TABLE bltest (
   timestamp STRING,
   loglevel STRING,
   processtype STRING,
   processid STRING,
   status STRING,
   threadid STRING,
   executiontime INT,
   tenantid INT,
   userid STRING,
   shard STRING,
   jobid STRING,
   messagetype STRING,
   action STRING,
   hostname STRING
   )
  ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe'
  WITH SERDEPROPERTIES (
  "input.grokCustomPatterns" = 'C_ACTION receive|send',
  "input.format" = "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} - processType=%{NOTSPACE:processtype}, processId=%{NOTSPACE:processid}, status=%{NOTSPACE:status}, threadId=%{NOTSPACE:threadid}, executionTime=%{POSINT:executiontime}, tenantId=%{POSINT:tenantid}, userId=%{NOTSPACE:userid}, shard=%{NOTSPACE:shard}, jobId=%{NOTSPACE:jobid}, messageType=%{NOTSPACE:messagetype}, action=%{C_ACTION:action}, hostname=%{HOST:hostname}"
  ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
  LOCATION 's3://amzn-s3-demo-bucket/samples/';
  ```

### 範例 3
<a name="example-3"></a>

下列 [Amazon S3 伺服器存取日誌](https://docs.aws.amazon.com/AmazonS3/latest/userguide/LogFormat.html) `CREATE TABLE` 陳述式的範例顯示 `'input.grokCustomPatterns'` 表達式，其中包含兩個以新行逸出字元 (`\n`) 來分隔的模式項目，如查詢範例中的這個片段所示：`'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)')`。

```
CREATE EXTERNAL TABLE `s3_access_auto_raw_02`(
  `bucket_owner` string COMMENT 'from deserializer', 
  `bucket` string COMMENT 'from deserializer', 
  `time` string COMMENT 'from deserializer', 
  `remote_ip` string COMMENT 'from deserializer', 
  `requester` string COMMENT 'from deserializer', 
  `request_id` string COMMENT 'from deserializer', 
  `operation` string COMMENT 'from deserializer', 
  `key` string COMMENT 'from deserializer', 
  `request_uri` string COMMENT 'from deserializer', 
  `http_status` string COMMENT 'from deserializer', 
  `error_code` string COMMENT 'from deserializer', 
  `bytes_sent` string COMMENT 'from deserializer', 
  `object_size` string COMMENT 'from deserializer', 
  `total_time` string COMMENT 'from deserializer', 
  `turnaround_time` string COMMENT 'from deserializer', 
  `referrer` string COMMENT 'from deserializer', 
  `user_agent` string COMMENT 'from deserializer', 
  `version_id` string COMMENT 'from deserializer')
ROW FORMAT SERDE 
  'com.amazonaws.glue.serde.GrokSerDe' 
WITH SERDEPROPERTIES ( 
  'input.format'='%{NOTSPACE:bucket_owner} %{NOTSPACE:bucket} \\[%{INSIDE_BRACKETS:time}\\] %{NOTSPACE:remote_ip} %{NOTSPACE:requester} %{NOTSPACE:request_id} %{NOTSPACE:operation} %{NOTSPACE:key} \"?%{INSIDE_QS:request_uri}\"? %{NOTSPACE:http_status} %{NOTSPACE:error_code} %{NOTSPACE:bytes_sent} %{NOTSPACE:object_size} %{NOTSPACE:total_time} %{NOTSPACE:turnaround_time} \"?%{INSIDE_QS:referrer}\"? \"?%{INSIDE_QS:user_agent}\"? %{NOTSPACE:version_id}', 
  'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket'
```

## 另請參閱
<a name="grok-serde-see-also"></a>
+ [了解 Grok 模式](https://edgedelta.com/company/blog/what-are-grok-patterns) (外部網站)
+ [內建模式 ](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#classifier-builtin-patterns)(*AWS Glue 使用者指南*)

# JSON SerDe 程式庫
<a name="json-serde"></a>

在 Athena 中，您可以使用 SerDe 程式庫來還原序列化 JSON 資料。還原序列化會轉換 JSON 資料，讓這些資料能夠序列化 (寫出) 至 Parquet 或 ORC 等不同格式。
+ [Hive JSON SerDe](hive-json-serde.md)
+ [OpenX JSON SerDe](openx-json-serde.md) 
+ [Amazon Ion Hive SerDe](ion-serde.md)

**注意**  
Hive 和 OpenX 程式庫預期 JSON 資料位於單行上 (未格式化)，且記錄由換行字元分隔。

由於 Amazon Ion 是 JSON 的超集，因此您可以使用 Amazon Ion Hive SerDe 來查詢非 Amazon Ion JSON 資料集。與 Hive 和 OpenX JSON SerDe 程式庫不同，Amazon Ion SerDe 不期望每一資料列都位於單獨一行上。如果您想查詢使用「美化顯示」格式的 JSON 資料集，或以其他方式用新行字元分解資料列中的欄位，則此功能非常有用。

## 程式庫名稱
<a name="library-names"></a>

請使用下列其中一個：

 [org.apache.hive.hcatalog.data.JsonSerDe](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-JSON) 

 [org.openx.data.jsonserde.JsonSerDe](https://github.com/rcongiu/Hive-JSON-Serde) 

[com.amazon.ionhiveserde.IonHiveSerDe](https://github.com/amzn/ion-hive-serde)

# Hive JSON SerDe
<a name="hive-json-serde"></a>

Hive JSON SerDe 經常用來處理事件等 JSON 資料。這些事件以 JSON 編碼文字 (以新行分隔) 的單行字串表示。Hive JSON SerDe 不允許在 `map` 或 `struct` 索引鍵名稱中使用重複的索引鍵。

**注意**  
SerDe 預期每筆 JSON 文件都以單行文字表示，而且沒有行終止字元分隔記錄中的欄位。如果 JSON 文字是美化過的列印格式，則在建立資料表後嘗試在其中查詢時可能會收到下列錯誤訊息：HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object (HIVE\$1CURSOR\$1ERROR：資料列不是有效的 JSON 物件) 或 HIVE\$1CURSOR\$1ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT (HIVE\$1CURSOR\$1ERROR：JsonParseException：非預期的輸入結束：預期為 OBJECT 的關閉標記)。如需詳細資訊，請參閱 GitHub 上 OpenX SerDe 文件中的 [JSON 資料檔案](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files)。

下列 DDL 陳述式範例使用 Hive JSON SerDe，以根據線上廣告資料範例建立資料表。在 `LOCATION` 子句中，請以您執行 Athena 所在位置的區域識別符 (例如 `s3://us-west-2.elasticmapreduce/samples/hive-ads/tables/impressions`) 來取代 `s3://amzn-s3-demo-bucket.elasticmapreduce/samples/hive-ads/tables/impressions` 中的 *myregion*。

```
CREATE EXTERNAL TABLE impressions (
    requestbegintime string,
    adid string,
    impressionid string,
    referrer string,
    useragent string,
    usercookie string,
    ip string,
    number string,
    processid string,
    browsercookie string,
    requestendtime string,
    timers struct
                <
                 modellookup:string, 
                 requesttime:string
                >,
    threadid string, 
    hostname string,
    sessionid string
)   
PARTITIONED BY (dt string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://amzn-s3-demo-bucket.elasticmapreduce/samples/hive-ads/tables/impressions';
```

## 使用 Hive JSON SerDe 指定時間戳記格式
<a name="hive-json-serde-timestamp-formats"></a>

若要從字串中剖析時間戳記值，您可以將 `WITH SERDEPROPERTIES` 子欄位新增至 `ROW FORMAT SERDE` 子句並使用它來指定 `timestamp.formats` 參數。在參數中，指定一個或多個時間戳記模式的逗號分隔清單，如下範例所示：

```
...
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
WITH SERDEPROPERTIES ("timestamp.formats"="yyyy-MM-dd'T'HH:mm:ss.SSS'Z',yyyy-MM-dd'T'HH:mm:ss")
...
```

如需詳細資訊，請參閱 Apache Hive 文件中[時間戳記](https://cwiki.apache.org/confluence/display/hive/languagemanual+types#LanguageManualTypes-TimestampstimestampTimestamps)。

## 載入資料表以進行查詢
<a name="hive-json-serde-loading-the-table"></a>

建立資料表後，請執行 [MSCK REPAIR TABLE](msck-repair-table.md) 以載入資料表，並讓其可從 Athena 查詢：

```
MSCK REPAIR TABLE impressions
```

## 查詢 CloudTrail 日誌
<a name="hive-json-serde-querying-cloud-trail-logs"></a>

您可以使用 Hive JSON SerDe 來查詢 CloudTrail 日誌。如需詳細資訊和範例 `CREATE TABLE` 陳述式，則請參閱 [查詢 AWS CloudTrail 日誌](cloudtrail-logs.md)。

# OpenX JSON SerDe
<a name="openx-json-serde"></a>

像 Hive JSON SerDe 一樣，您可以使用 OpenX JSON 來處理 JSON 資料。這些資料也可表示為 JSON 編碼文字 (以新行分隔) 的單行字串。就像 Hive JSON SerDe 一樣，OpenX JSON SerDe 不允許在 `map` 或 `struct` 索引鍵名稱中使用重複的索引鍵。

## 考量和限制
<a name="openx-json-serde-considerations-limitations"></a>
+ 使用 OpenX JSON SerDe 時，結果數量及其值可以是非確定性的。結果可以包含比預期更多的資料列、比預期更少的資料列，或當基礎資料中沒有空值時，結果中出現意外的 Null 值。若要解決此問題，請使用 [Hive JSON SerDe](hive-json-serde.md)，或將資料重寫為其他檔案格式類型。
+ SerDe 預期每筆 JSON 文件都以單行文字表示，而且沒有行終止字元分隔記錄中的欄位。如果 JSON 文字是美化過的列印格式，則在建立資料表後嘗試在其中查詢時可能會收到下列錯誤訊息：HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object (HIVE\$1CURSOR\$1ERROR：資料列不是有效的 JSON 物件) 或 HIVE\$1CURSOR\$1ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT (HIVE\$1CURSOR\$1ERROR：JsonParseException：非預期的輸入結束：預期為 OBJECT 的關閉標記)。

  如需詳細資訊，請參閱 GitHub 上 OpenX SerDe 文件中的 [JSON 資料檔案](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files)。

## 可選屬性
<a name="openx-json-serde-optional-properties"></a>

與 Hive JSON SerDe 不同，OpenX JSON SerDe 還具有以下可選 SerDe 屬性，可以用於解決資料的不一致性。

**use.null.for.invalid.data**  
選用。預設值為 `FALSE`。設為 `TRUE` 時，SerDe 會將 `NULL` 用於無法還原序列化為資料表結構描述中定義的資料欄類型的資料欄值。  
將 `use.null.for.invalid.data` 設定為 `TRUE` 可能會導致不正確或未預期的結果，因為 `NULL` 值會取代結構描述不相符的資料欄中的無效資料。我們建議您，修正檔案或資料表結構描述中的資料而不是啟用此屬性。啟用此屬性後，查詢不會因無效資料而失敗，且這可能會阻礙您發現資料品質問題。

**ignore.malformed.json**  
選用。設定為 `TRUE` 時，可讓您略過格式不正確的 JSON 語法。預設值為 `FALSE`。

**dots.in.keys**  
選用。預設值為 `FALSE`。設定為 `TRUE` 時，可讓 SerDe 以底線取代索引鍵名稱中的點。例如，如果 JSON 資料集包含名稱為 `"a.b"` 的索引鍵，您可以使用此屬性在 Athena 中將資料欄名稱定義為 `"a_b"`。在預設情況下 (不含此 SerDe)，Athena 在資料欄名稱中不允許點。

**case.insensitive**  
選用。預設值為 `TRUE`。設為 `TRUE` 時，SerDe 會將所有大寫資料欄轉換為小寫。  
若要在資料中使用區分大小寫的索引鍵名稱，請使用 `WITH SERDEPROPERTIES ("case.insensitive"= FALSE;)`. 然後，對於不是全部小寫的每個索引鍵，使用下列語法提供從資料欄名稱到屬性名稱的映射：  

```
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.userid" = "userId")
```
如果您有兩個在小寫時相同的索引鍵，如 `Url` 和 `URL`，則可能會發生類似以下的錯誤：  
HIVE\$1CURSOR\$1ERROR：列不是有效的 JSON 物件 - JSONException：重複索引鍵 "url"  
若要解決這個問題，請將 `case.insensitive` 屬性設定為 `FALSE`，並將索引鍵對應至不同的名稱，如下列範例所示：  

```
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.url1" = "URL", "mapping.url2" = "Url")
```

**對應**  
選用。將欄名稱映射到與欄名稱不完全相同的 JSON 索引鍵。當 JSON 資料包含為[關鍵字](reserved-words.md)的索引鍵時，`mapping` 參數將十分實用。例如，如果您有一個名為 `timestamp` 的 JSON 索引鍵，請使用下列語法將索引鍵映射至名為 `ts` 的欄：  

```
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ("mapping.ts" = "timestamp")
```
**將帶有冒號的巢狀欄位名稱映射到 Hive 相容名稱**  
如果 `struct` 內的欄位名稱中有冒號，則可以使用 `mapping` 屬性將該欄位映射至 Hive 相容名稱。例如，如果您的資料欄類型定義包含 `my:struct:field:string`，則可透過將下列項目包含在 `WITH SERDEPROPERTIES` 中，將定義映射至 `my_struct_field:string`：

```
("mapping.my_struct_field" = "my:struct:field")
```
下列範例會顯示對應的 `CREATE TABLE` 陳述式。  

```
CREATE EXTERNAL TABLE colon_nested_field (
item struct<my_struct_field:string>)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ("mapping.my_struct_field" = "my:struct:field")
```

## 範例：廣告資料
<a name="openx-json-serde-ad-data-example"></a>

下列 DDL 陳述式範例使用 OpenX JSON SerDe，以根據 Hive JSON SerDe 範例中所使用的同一個線上廣告資料範例來建立資料表。在 `LOCATION` 子句中，請以您執行 Athena 所在之處的區域識別符取代 *myregion*。

```
CREATE EXTERNAL TABLE impressions (
    requestbegintime string,
    adid string,
    impressionId string,
    referrer string,
    useragent string,
    usercookie string,
    ip string,
    number string,
    processid string,
    browsercokie string,
    requestendtime string,
    timers struct<
       modellookup:string, 
       requesttime:string>,
    threadid string, 
    hostname string,
    sessionid string
)   PARTITIONED BY (dt string)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://amzn-s3-demo-bucket.elasticmapreduce/samples/hive-ads/tables/impressions';
```

## 範例：還原序列化巢狀 JSON
<a name="nested-json-serde-example"></a>

您可以使用 JSON SerDes 來剖析更複雜的 JSON 編碼資料。這需要使用 `CREATE TABLE` 陳述式，它會使用 `struct` 和 `array` 元素來表示巢狀結構。

下列範例會根據具有巢狀結構的 JSON 資料建立 Athena 資料表。範例的結構如下：

```
{
"DocId": "AWS",
"User": {
        "Id": 1234,
        "Username": "carlos_salazar", 
        "Name": "Carlos",
"ShippingAddress": {
"Address1": "123 Main St.",
"Address2": null,
"City": "Anytown",
"State": "CA"
   },
"Orders": [
   {
     "ItemId": 6789,
     "OrderDate": "11/11/2022" 
   },
   {
     "ItemId": 4352,
     "OrderDate": "12/12/2022"
   }
  ]
 }
}
```

請記住，OpenX SerDe 預期每個 JSON 記錄都位於單行文字上。在 Amazon S3 中存放資料時，上述範例中的所有資料都應該位於單行上，如下所示：

```
{"DocId":"AWS","User":{"Id":1234,"Username":"carlos_salazar","Name":"Carlos","ShippingAddress" ...
```

下列 `CREATE TABLE` 陳述式將 [Openx-JsonSerDe](https://github.com/rcongiu/Hive-JSON-Serde) 與 `struct` 和 `array` 集合資料類型搭配使用，從而為範例資料建立物件群組。

```
CREATE external TABLE complex_json (
   docid string,
   `user` struct<
               id:INT,
               username:string,
               name:string,
               shippingaddress:struct<
                                      address1:string,
                                      address2:string,
                                      city:string,
                                      state:string
                                      >,
               orders:array<
                            struct<
                                 itemid:INT,
                                  orderdate:string
                                  >
                              >
               >
   )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://amzn-s3-demo-bucket/myjsondata/';
```

若要查詢資料表，請使用如下所示的 `SELECT` 陳述式。

```
SELECT 
 user.name as Name, 
 user.shippingaddress.address1 as Address, 
 user.shippingaddress.city as City, 
 o.itemid as Item_ID, o.orderdate as Order_date
FROM complex_json, UNNEST(user.orders) as temp_table (o)
```

若要存取結構內的資料欄位，範例查詢會使用點標記法 (例如 `user.name`)。若要存取結構的陣列內的資料 (例如 `orders` 欄位)，您可以使用 `UNNEST` 函式。`UNNEST` 函式會將陣列扁平化為臨時資料表 (在此案例中稱為 `o`)。這樣，您就可以使用點標記法，如同使用結構來存取非巢狀陣列元素一樣 (例如 `o.itemid`)。範例中用於說明用途的名稱 `temp_table` 通常縮寫為 `t`。

下列資料表會顯示查詢結果。


****  

| \$1 | 名稱 | 地址 | City | Item\$1ID | Order\$1date | 
| --- | --- | --- | --- | --- | --- | 
| 1 | Carlos | 123 Main St. | Anytown | 6789 | 11/11/2022 | 
| 2 | Carlos | 123 Main St. | Anytown | 4352 | 12/12/2022 | 

## 其他資源
<a name="json-serdes-additional-resources"></a>

如需有關在 Athena 中使用 JSON 和巢狀 JSON 的詳細資訊，請參閱下列資源：
+ [使用 JSONSerDe 從巢狀 JSON 和映射在 Amazon Athena 中建立資料表](https://aws.amazon.com/blogs/big-data/create-tables-in-amazon-athena-from-nested-json-and-mappings-using-jsonserde/) (AWS 大數據部落格）
+ [當我嘗試讀取 Amazon Athena 中的 JSON 資料時出現錯誤](https://aws.amazon.com/premiumsupport/knowledge-center/error-json-athena/) (AWS 知識中心文章）
+ [hive-json-schema](https://github.com/quux00/hive-json-schema) (GitHub) - 以 Java 撰寫的工具，會從 JSON 文件範例中產生 `CREATE TABLE` 陳述式。產生的 `CREATE TABLE` 陳述式會使用 OpenX JSON Serde。

# CSV SerDe 程式庫
<a name="serde-csv-choices"></a>

在 Athena 中建立 CSV 資料的資料表時，您可以使用 Open CSV SerDe 或 Lazy Simple SerDe 程式庫。為了協助您決定要使用哪個程式庫，請考慮下列準則。
+ 如果您資料包含的值含括在雙引號 (`"`) 中，您可以使用 [Open CSV SerDe](https://cwiki.apache.org/confluence/display/Hive/CSV+Serde) 程式庫，在 Athena 中將值還原序列化。如果您資料不包含括在雙引號 (`"`) 中的值，則可以省略指定任何 SerDe。在這種情況下，Athena 會使用預設的 Lazy Simple SerDe。如需相關資訊，請參閱[適用於 CSV、TSV 和自訂分隔檔案的 Lazy Simple SerDe](lazy-simple-serde.md)。
+  如果您的資料具有 UNIX 數字 `TIMESTAMP` 值 (例如 `1579059880000`)，則請使用 Open CSV SerDe。如果您的資料使用 `java.sql.Timestamp` 格式，則請使用 Lazy Simple SerDe。

**Topics**
+ [適用於 CSV、TSV 和自訂分隔檔案的 Lazy Simple SerDe](lazy-simple-serde.md)
+ [用於處理 CSV 的 Open CSV SerDe](csv-serde.md)

# 適用於 CSV、TSV 和自訂分隔檔案的 Lazy Simple SerDe
<a name="lazy-simple-serde"></a>

因為這是 Athena 中 CSV、TSV 和自訂分隔格式資料的預設 SerDe，所以將其指定為選用。在您的 `CREATE TABLE` 陳述式中，如果您未指定 SerDe 且僅指定了 `ROW FORMAT DELIMITED`，則 Athena 會使用此 SerDe。如果您的資料沒有括在引號中的值，請使用此 SerDe。

如需有關 Lazy Simple SerDe 的參考文件，請參閱《Apache Hive 開發人員指南》的 [Hive SerDe](https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide#DeveloperGuide-HiveSerDe) 一節。

## 序列化程式庫名稱
<a name="lazy-simple-serde-library-name"></a>

Lazy Simple SerDe 的序列化程式庫名稱為 `org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe`。如需原始程式碼資訊，請參閱 GitHub.com 上的 [LazySimpleSerDe.java](https://github.com/apache/hive/blob/master/serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazySimpleSerDe.java)。

## 忽略標頭
<a name="lazy-simple-serde-ignoring-headers"></a>

若要在定義資料表時忽略資料中的標題，您可以使用 `skip.header.line.count` 資料表屬性，如以下範例所示。

```
TBLPROPERTIES ("skip.header.line.count"="1")
```

如需忽略標頭的範例，請參閱 [查詢 Amazon VPC 流程日誌](vpc-flow-logs.md) 和 [查詢 Amazon CloudFront 日誌](cloudfront-logs.md) 中的 `CREATE TABLE` 陳述式。

## CSV 範例
<a name="csv-example"></a>

下列範例說明了如何使用 `LazySimpleSerDe` 程式庫，在 Athena 中從 CSV 資料建立資料表。若要使用此 SerDe 還原序列化自訂分隔檔案，請依照範例中的模式進行，但使用 `FIELDS TERMINATED BY` 子句來指定不同的單一字元分隔符號。Lazy Simple SerDe 不支援多字元分隔符號。

**注意**  
在 `s3://athena-examples-myregion/path/to/data/` 中，以您執行 Athena 之處的區域識別符 (例如 `s3://athena-examples-us-west-1/path/to/data/`) 取代 *myregion*。

使用 `CREATE TABLE` 陳述式，根據存放於 Amazon S3 的 CSV 基礎資料建立 Athena 資料表。

```
CREATE EXTERNAL TABLE flight_delays_csv (
    yr INT,
    quarter INT,
    month INT,
    dayofmonth INT,
    dayofweek INT,
    flightdate STRING,
    uniquecarrier STRING,
    airlineid INT,
    carrier STRING,
    tailnum STRING,
    flightnum STRING,
    originairportid INT,
    originairportseqid INT,
    origincitymarketid INT,
    origin STRING,
    origincityname STRING,
    originstate STRING,
    originstatefips STRING,
    originstatename STRING,
    originwac INT,
    destairportid INT,
    destairportseqid INT,
    destcitymarketid INT,
    dest STRING,
    destcityname STRING,
    deststate STRING,
    deststatefips STRING,
    deststatename STRING,
    destwac INT,
    crsdeptime STRING,
    deptime STRING,
    depdelay INT,
    depdelayminutes INT,
    depdel15 INT,
    departuredelaygroups INT,
    deptimeblk STRING,
    taxiout INT,
    wheelsoff STRING,
    wheelson STRING,
    taxiin INT,
    crsarrtime INT,
    arrtime STRING,
    arrdelay INT,
    arrdelayminutes INT,
    arrdel15 INT,
    arrivaldelaygroups INT,
    arrtimeblk STRING,
    cancelled INT,
    cancellationcode STRING,
    diverted INT,
    crselapsedtime INT,
    actualelapsedtime INT,
    airtime INT,
    flights INT,
    distance INT,
    distancegroup INT,
    carrierdelay INT,
    weatherdelay INT,
    nasdelay INT,
    securitydelay INT,
    lateaircraftdelay INT,
    firstdeptime STRING,
    totaladdgtime INT,
    longestaddgtime INT,
    divairportlandings INT,
    divreacheddest INT,
    divactualelapsedtime INT,
    divarrdelay INT,
    divdistance INT,
    div1airport STRING,
    div1airportid INT,
    div1airportseqid INT,
    div1wheelson STRING,
    div1totalgtime INT,
    div1longestgtime INT,
    div1wheelsoff STRING,
    div1tailnum STRING,
    div2airport STRING,
    div2airportid INT,
    div2airportseqid INT,
    div2wheelson STRING,
    div2totalgtime INT,
    div2longestgtime INT,
    div2wheelsoff STRING,
    div2tailnum STRING,
    div3airport STRING,
    div3airportid INT,
    div3airportseqid INT,
    div3wheelson STRING,
    div3totalgtime INT,
    div3longestgtime INT,
    div3wheelsoff STRING,
    div3tailnum STRING,
    div4airport STRING,
    div4airportid INT,
    div4airportseqid INT,
    div4wheelson STRING,
    div4totalgtime INT,
    div4longestgtime INT,
    div4wheelsoff STRING,
    div4tailnum STRING,
    div5airport STRING,
    div5airportid INT,
    div5airportseqid INT,
    div5wheelson STRING,
    div5totalgtime INT,
    div5longestgtime INT,
    div5wheelsoff STRING,
    div5tailnum STRING
)
    PARTITIONED BY (year STRING)
    ROW FORMAT DELIMITED
      FIELDS TERMINATED BY ','
      ESCAPED BY '\\'
      LINES TERMINATED BY '\n'
    LOCATION 's3://athena-examples-myregion/flight/csv/';
```

每次有新的分割區新增到這個資料表時，請執行 `MSCK REPAIR TABLE` 來重新整理分割區中繼資料：

```
MSCK REPAIR TABLE flight_delays_csv;
```

查詢延誤超過 1 小時的前 10 個航線：

```
SELECT origin, dest, count(*) as delays
FROM flight_delays_csv
WHERE depdelayminutes > 60
GROUP BY origin, dest
ORDER BY 3 DESC
LIMIT 10;
```

**注意**  
航班資料表資料來自美國運輸部[交通統計局](http://www.transtats.bts.gov/)提供的[航班](http://www.transtats.bts.gov/DL_SelectFields.asp?Table_ID=236&amp;DB_Short_Name=On-Time)。從原本資料去掉飽和度。

## TSV 範例
<a name="tsv-example"></a>

若要根據存放於 Amazon S3 的 TSV 資料建立 Athena 資料表，請使用 `ROW FORMAT DELIMITED`，然後將 `\t` 指定為標籤欄位分隔符號、將 `\n` 指定為行分隔符號，以及將 `\` 指定為逸出字元。此語法如下列範例所示。`athena-examples` 位置沒有可用的範例 TSV 航班資料，但是如同 CSV 資料表一樣，每次新增分割區時，您都會執行 `MSCK REPAIR TABLE` 重新整理分割區中繼資料。

```
...
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
...
```

# 用於處理 CSV 的 Open CSV SerDe
<a name="csv-serde"></a>

使用 Open CSV SerDe 從以逗號分隔的資料 (CSV) 建立資料表。

## 序列化程式庫名稱
<a name="csv-serde-library-name"></a>

Open CSV SerDe 的序列化程式庫名稱為 `org.apache.hadoop.hive.serde2.OpenCSVSerde`。如需原始程式碼資訊，請參閱 Apache 文件中的 [CSV SerDe](https://cwiki.apache.org/confluence/display/Hive/CSV+Serde)。

## 使用 Open CSV SerDe
<a name="csv-serde-using"></a>

若要使用此 SerDe，請在 `ROW FORMAT SERDE` 後指定其完整類別名稱。此外，在 `SERDEPROPERTIES` 內指定分隔符號，如下列範例所示。

```
...
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  "separatorChar" = ",",
  "quoteChar"     = "`",
  "escapeChar"    = "\\"
)
```

### 忽略標頭
<a name="csv-serde-opencsvserde-ignoring-headers"></a>

若要在定義資料表時忽略資料中的標題，您可以使用 `skip.header.line.count` 資料表屬性，如以下範例所示。

```
TBLPROPERTIES ("skip.header.line.count"="1")
```

如需相關範例，請參閱 [查詢 Amazon VPC 流程日誌](vpc-flow-logs.md) 和 [查詢 Amazon CloudFront 日誌](cloudfront-logs.md) 中的 `CREATE TABLE` 陳述式。

### 對無效資料使用 NULL
<a name="csv-serde-opencsvserde-using-null"></a>

若要對無法還原序列化至資料欄定義類型的資料使用 NULL 值，則您可以使用 `use.null.for.invalid.data` 資料表屬性，如下列範例所示。

```
TBLPROPERTIES ("skip.header.line.count"="1")
```

**重要**  
將 `use.null.for.invalid.data` 設定為 `TRUE` 可能會導致不正確或未預期的結果，因為 `NULL` 值會取代結構描述不相符的資料欄中的無效資料。我們建議您，修正檔案或資料表結構描述中的資料而不是啟用此屬性。啟用此屬性後，查詢不會因無效資料而失敗，且這可能會阻礙您發現資料品質問題。

### 字串資料的考量事項
<a name="csv-serde-opencsvserde-considerations-string"></a>

Open CSV SerDe 具有以下字串資料特性：
+ 使用雙引號 (`"`) 做為預設的引號字元，並且可讓您指定分隔符號、引號和逸出字元，例如：

  ```
  WITH SERDEPROPERTIES ("separatorChar" = ",", "quoteChar" = "`", "escapeChar" = "\\" )
  ```
+ 您無法直接逸出 `\t` 或 `\n`。若要將它們逸出，請使用 `"escapeChar" = "\\"`。如需範例，請參閱 [Example: Escaping \t or \n](#csv-serde-opencsvserde-example-escaping-t-or-n)。
+ Open CSV SerDe 不支援在 CSV 檔案中使用內嵌的換行符號。

### 非字串資料的考量事項
<a name="csv-serde-opencsvserde-considerations-non-string"></a>

如需 `STRING` 之外的其他資料類型，Open CSV SerDe 會有以下表現：
+ 識別 `BOOLEAN`、`BIGINT`、`INT`，以及 `DOUBLE` 資料類型。
+ 無法識別資料欄中定義為數值資料類型的空值或 null 值，而會將其保留為 `string`。一種解決方法是建立帶有 null 值的資料欄作為 `string`，然後使用 `CAST` 將查詢中的欄位轉換為數字資料類型，並為 null 提供 `0` 預設值。如需詳細資訊，請參閱 AWS 知識中心中的[當我在 Athena 中查詢 CSV 資料時，會收到錯誤 HIVE\$1BAD\$1DATA：剖析欄位值時發生錯誤](https://aws.amazon.com/premiumsupport/knowledge-center/athena-hive-bad-data-error-csv/)。
+ 對於使用 `CREATE TABLE` 陳述式中 `timestamp` 資料類型指定的資料欄，如果其是以 UNIX 數字格式指定 (以毫秒為單位)，例如 `1579059880000`，請識別 `TIMESTAMP` 資料。如需範例，請參閱 [Example: Using the TIMESTAMP type and DATE type specified in the UNIX numeric format](#csv-serde-opencsvserde-example-timestamp-unix)。
  + Open CSV SerDe 不支援使用 JDBC 相容 `java.sql.Timestamp` 格式的 `TIMESTAMP`，例如 `"YYYY-MM-DD HH:MM:SS.fffffffff"` (9 位小數精確度)。
+ 對於使用 `CREATE TABLE` 陳述式中 `DATE` 資料類型指定的資料欄，如果這些值代表 1970 年 1 月 1 日以來經過的天數，則請將這些值識別為日期。例如，資料欄中具有 `date` 資料類型的值 `18276` 會在查詢時呈現為 `2020-01-15`。在此 UNIX 格式中，每一天都會被認為有 86,400 秒。
  + Open CSV SerDe 不支援以任何其他格式直接表示的 `DATE`。若要處理其他格式的時間戳記資料，您可以將資料欄定義為 `string`，然後使用時間轉換函數在 `SELECT` 查詢中傳回所需結果。如需詳細資訊，請參閱 [AWS 知識中心](https://aws.amazon.com/premiumsupport/knowledge-center/)中的[當我在 Amazon Athena 中查詢資料表時，TIMESTAMP 結果為空](https://aws.amazon.com/premiumsupport/knowledge-center/query-table-athena-timestamp-empty/)。
+ 若要進一步將資料欄轉換為資料表中所需的類型，您可以對資料表[建立檢視](views.md)，並使用 `CAST` 來轉換為所需的類型。

## 範例
<a name="csv-serde-opencsvserde-examples"></a>

**Example 範例：查詢簡單的 CSV 資料**  
下列範例假設您在 `s3://amzn-s3-demo-bucket/mycsv/` 位置存放了 CSV 資料，其中包含下列內容：  

```
"a1","a2","a3","a4"
"1","2","abc","def"
"a","a1","abc3","ab4"
```
使用 `CREATE TABLE` 陳述式以根據資料建立 Athena 資料表。參考 `ROW FORMAT SERDE` 後的 `OpenCSVSerde` (請注意 "d" 為小寫)，並指定字元分隔符號、引號字元和 `WITH SERDEPROPERTIES` 中的逸出字元，如下列範例所示。  

```
CREATE EXTERNAL TABLE myopencsvtable (
   col1 string,
   col2 string,
   col3 string,
   col4 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   'separatorChar' = ',',
   'quoteChar' = '"',
   'escapeChar' = '\\'
   )
STORED AS TEXTFILE
LOCATION 's3://amzn-s3-demo-bucket/mycsv/';
```
查詢資料表中的所有值：  

```
SELECT * FROM myopencsvtable;
```
此查詢會傳回下列值：  

```
col1     col2    col3    col4
-----------------------------
a1       a2      a3      a4
1        2       abc     def
a        a1      abc3    ab4
```

**Example 範例：使用以 UNIX 數字格式指定的 TIMESTAMP (時間戳記) 類型和 DATE (日期) 類型**  
請考慮以下以逗號分隔資料的三個資料欄。每個資料欄中的值皆以雙引號括住。  

```
"unixvalue creationdate 18276 creationdatetime 1579059880000","18276","1579059880000"
```
以下陳述式會從指定的 Amazon S3 儲存貯體位置在 Athena 中建立資料表。  

```
CREATE EXTERNAL TABLE IF NOT EXISTS testtimestamp1(
 `profile_id` string,
 `creationdate` date,
 `creationdatetime` timestamp
 )
 ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
 LOCATION 's3://amzn-s3-demo-bucket'
```
下一步，執行下列查詢：  

```
SELECT * FROM testtimestamp1
```
查詢會傳回下列結果，顯示日期和時間資料：  

```
profile_id                                                        creationdate     creationdatetime
unixvalue creationdate 18276 creationdatetime 1579146280000       2020-01-15       2020-01-15 03:44:40.000
```

**Example 範例：逸出 \$1t 或 \$1n**  
考量下列測試資料：  

```
" \\t\\t\\n 123 \\t\\t\\n ",abc
" 456 ",xyz
```
下列陳述式會在 Athena 中建立資料表，並指定 `"escapeChar" = "\\"`。  

```
CREATE EXTERNAL TABLE test1 (
f1 string,
s2 string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES ("separatorChar" = ",", "escapeChar" = "\\") 
LOCATION 's3://amzn-s3-demo-bucket/dataset/test1/'
```
下一步，執行下列查詢：  

```
SELECT * FROM test1;
```
它會傳回此結果，正確地逸出 `\t` 或 `\n`：  

```
f1            s2
\t\t\n 123 \t\t\n            abc
456                          xyz
```

# ORC SerDe
<a name="orc-serde"></a>

使用 ORC SerDe，以從 ORC 資料建立 Athena 資料表。

## 序列化程式庫名稱
<a name="orc-serde-library-name"></a>

ORC SerDe 的序列化程式庫是 `org.apache.hadoop.hive.ql.io.orc.OrcSerde`，但在 `CREATE TABLE` 陳述式中，您可以使用子句 `STORED AS ORC` 指定此程式庫。如需原始程式碼資訊，請參閱 GitHub.com 上的 [OrcSerde.java](https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcSerde.java)。

## 範例：建立 ORC 航班資料的資料表
<a name="orc-serde-example"></a>

**注意**  
在 `s3://athena-examples-myregion/path/to/data/` 中，以您執行 Athena 之處的區域識別符 (例如 `s3://athena-examples-us-west-1/path/to/data/`) 取代 *myregion*。

以下範例以 ORC 為班機延誤資料建立資料表。資料表包含分割區：

```
DROP TABLE flight_delays_orc;
CREATE EXTERNAL TABLE flight_delays_orc (
    yr INT,
    quarter INT,
    month INT,
    dayofmonth INT,
    dayofweek INT,
    flightdate STRING,
    uniquecarrier STRING,
    airlineid INT,
    carrier STRING,
    tailnum STRING,
    flightnum STRING,
    originairportid INT,
    originairportseqid INT,
    origincitymarketid INT,
    origin STRING,
    origincityname STRING,
    originstate STRING,
    originstatefips STRING,
    originstatename STRING,
    originwac INT,
    destairportid INT,
    destairportseqid INT,
    destcitymarketid INT,
    dest STRING,
    destcityname STRING,
    deststate STRING,
    deststatefips STRING,
    deststatename STRING,
    destwac INT,
    crsdeptime STRING,
    deptime STRING,
    depdelay INT,
    depdelayminutes INT,
    depdel15 INT,
    departuredelaygroups INT,
    deptimeblk STRING,
    taxiout INT,
    wheelsoff STRING,
    wheelson STRING,
    taxiin INT,
    crsarrtime INT,
    arrtime STRING,
    arrdelay INT,
    arrdelayminutes INT,
    arrdel15 INT,
    arrivaldelaygroups INT,
    arrtimeblk STRING,
    cancelled INT,
    cancellationcode STRING,
    diverted INT,
    crselapsedtime INT,
    actualelapsedtime INT,
    airtime INT,
    flights INT,
    distance INT,
    distancegroup INT,
    carrierdelay INT,
    weatherdelay INT,
    nasdelay INT,
    securitydelay INT,
    lateaircraftdelay INT,
    firstdeptime STRING,
    totaladdgtime INT,
    longestaddgtime INT,
    divairportlandings INT,
    divreacheddest INT,
    divactualelapsedtime INT,
    divarrdelay INT,
    divdistance INT,
    div1airport STRING,
    div1airportid INT,
    div1airportseqid INT,
    div1wheelson STRING,
    div1totalgtime INT,
    div1longestgtime INT,
    div1wheelsoff STRING,
    div1tailnum STRING,
    div2airport STRING,
    div2airportid INT,
    div2airportseqid INT,
    div2wheelson STRING,
    div2totalgtime INT,
    div2longestgtime INT,
    div2wheelsoff STRING,
    div2tailnum STRING,
    div3airport STRING,
    div3airportid INT,
    div3airportseqid INT,
    div3wheelson STRING,
    div3totalgtime INT,
    div3longestgtime INT,
    div3wheelsoff STRING,
    div3tailnum STRING,
    div4airport STRING,
    div4airportid INT,
    div4airportseqid INT,
    div4wheelson STRING,
    div4totalgtime INT,
    div4longestgtime INT,
    div4wheelsoff STRING,
    div4tailnum STRING,
    div5airport STRING,
    div5airportid INT,
    div5airportseqid INT,
    div5wheelson STRING,
    div5totalgtime INT,
    div5longestgtime INT,
    div5wheelsoff STRING,
    div5tailnum STRING
)
PARTITIONED BY (year String)
STORED AS ORC
LOCATION 's3://athena-examples-myregion/flight/orc/'
tblproperties ("orc.compress"="ZLIB");
```

在資料表上執行 `MSCK REPAIR TABLE` 陳述式，以重新整理分割區中繼資料：

```
MSCK REPAIR TABLE flight_delays_orc;
```

使用此查詢以取得延誤超過 1 小時的前 10 個航線：

```
SELECT origin, dest, count(*) as delays
FROM flight_delays_orc
WHERE depdelayminutes > 60
GROUP BY origin, dest
ORDER BY 3 DESC
LIMIT 10;
```

# Parquet SerDe
<a name="parquet-serde"></a>

使用 Parquet SerDe，以根據 Parquet 資料建立 Athena 資料表。

Parquet SerDe 適用於以 [Parquet 格式](https://cwiki.apache.org/confluence/display/Hive/Parquet)存放的資料。要將資料轉換為 Parquet 格式，您可以使用 [CREATE TABLE AS SELECT (CTAS)](create-table-as.md) 查詢。如需詳細資訊，請參閱[從查詢結果建立資料表 (CTAS)](ctas.md)、[CTAS 查詢的範例](ctas-examples.md)及[使用 CTAS 和 INSERT INTO 以進行 ETL 和資料分析](ctas-insert-into-etl.md)。

## 序列化程式庫名稱
<a name="parquet-serde-library-name"></a>

Parquet SerDe 的序列化程式庫名稱為 `org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe`。如需原始程式碼資訊，請參閱 Apache 文件中的[類別 ParquetHiveSerDe](https://svn.apache.org/repos/infra/websites/production/hive/content/javadocs/r2.1.1/api/org/apache/hadoop/hive/ql/io/parquet/serde/ParquetHiveSerDe.html)。

## 範例：查詢以 Parquet 存放的檔案
<a name="example-querying-a-file-stored-in-parquet"></a>

**注意**  
在 `s3://athena-examples-myregion/path/to/data/` 中，以您執行 Athena 之處的區域識別符 (例如 `s3://athena-examples-us-west-1/path/to/data/`) 取代 *myregion*。

使用以下 `CREATE TABLE` 陳述式，從以 Parquet 格式存放於 Amazon S3 的基礎資料建立 Athena 資料表：

```
CREATE EXTERNAL TABLE flight_delays_pq (
    yr INT,
    quarter INT,
    month INT,
    dayofmonth INT,
    dayofweek INT,
    flightdate STRING,
    uniquecarrier STRING,
    airlineid INT,
    carrier STRING,
    tailnum STRING,
    flightnum STRING,
    originairportid INT,
    originairportseqid INT,
    origincitymarketid INT,
    origin STRING,
    origincityname STRING,
    originstate STRING,
    originstatefips STRING,
    originstatename STRING,
    originwac INT,
    destairportid INT,
    destairportseqid INT,
    destcitymarketid INT,
    dest STRING,
    destcityname STRING,
    deststate STRING,
    deststatefips STRING,
    deststatename STRING,
    destwac INT,
    crsdeptime STRING,
    deptime STRING,
    depdelay INT,
    depdelayminutes INT,
    depdel15 INT,
    departuredelaygroups INT,
    deptimeblk STRING,
    taxiout INT,
    wheelsoff STRING,
    wheelson STRING,
    taxiin INT,
    crsarrtime INT,
    arrtime STRING,
    arrdelay INT,
    arrdelayminutes INT,
    arrdel15 INT,
    arrivaldelaygroups INT,
    arrtimeblk STRING,
    cancelled INT,
    cancellationcode STRING,
    diverted INT,
    crselapsedtime INT,
    actualelapsedtime INT,
    airtime INT,
    flights INT,
    distance INT,
    distancegroup INT,
    carrierdelay INT,
    weatherdelay INT,
    nasdelay INT,
    securitydelay INT,
    lateaircraftdelay INT,
    firstdeptime STRING,
    totaladdgtime INT,
    longestaddgtime INT,
    divairportlandings INT,
    divreacheddest INT,
    divactualelapsedtime INT,
    divarrdelay INT,
    divdistance INT,
    div1airport STRING,
    div1airportid INT,
    div1airportseqid INT,
    div1wheelson STRING,
    div1totalgtime INT,
    div1longestgtime INT,
    div1wheelsoff STRING,
    div1tailnum STRING,
    div2airport STRING,
    div2airportid INT,
    div2airportseqid INT,
    div2wheelson STRING,
    div2totalgtime INT,
    div2longestgtime INT,
    div2wheelsoff STRING,
    div2tailnum STRING,
    div3airport STRING,
    div3airportid INT,
    div3airportseqid INT,
    div3wheelson STRING,
    div3totalgtime INT,
    div3longestgtime INT,
    div3wheelsoff STRING,
    div3tailnum STRING,
    div4airport STRING,
    div4airportid INT,
    div4airportseqid INT,
    div4wheelson STRING,
    div4totalgtime INT,
    div4longestgtime INT,
    div4wheelsoff STRING,
    div4tailnum STRING,
    div5airport STRING,
    div5airportid INT,
    div5airportseqid INT,
    div5wheelson STRING,
    div5totalgtime INT,
    div5longestgtime INT,
    div5wheelsoff STRING,
    div5tailnum STRING
)
PARTITIONED BY (year STRING)
STORED AS PARQUET
LOCATION 's3://athena-examples-myregion/flight/parquet/'
tblproperties ("parquet.compression"="SNAPPY");
```

在資料表上執行 `MSCK REPAIR TABLE` 陳述式，以重新整理分割區中繼資料：

```
MSCK REPAIR TABLE flight_delays_pq;
```

查詢延誤超過 1 小時的前 10 個航線：

```
SELECT origin, dest, count(*) as delays
FROM flight_delays_pq
WHERE depdelayminutes > 60
GROUP BY origin, dest
ORDER BY 3 DESC
LIMIT 10;
```

**注意**  
航班資料表資料來自美國運輸部[交通統計局](http://www.transtats.bts.gov/)提供的[航班](http://www.transtats.bts.gov/DL_SelectFields.asp?Table_ID=236&amp;DB_Short_Name=On-Time)。從原本資料去掉飽和度。

## 忽略 Parquet 統計資料
<a name="parquet-serde-ignoring-parquet-statistics"></a>

當您讀取 Parquet 資料時，您可能會收到下列錯誤訊息：

```
HIVE_CANNOT_OPEN_SPLIT: Index x out of bounds for length y
HIVE_CURSOR_ERROR: Failed to read x bytes
HIVE_CURSOR_ERROR: FailureException at Malformed input: offset=x
HIVE_CURSOR_ERROR: FailureException at java.io.IOException: 
can not read class org.apache.parquet.format.PageHeader: Socket is closed by peer.
```

若要解決此問題，請使用 [CREATE TABLE](create-table.md) 或 [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md) 陳述式，將 Parquet SerDe `parquet.ignore.statistics` 屬性設定為 `true`，如下列範例所示。

CREATE TABLE 範例

```
...
ROW FORMAT SERDE  
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
WITH SERDEPROPERTIES (  
'parquet.ignore.statistics'='true')  
STORED AS PARQUET 
...
```

ALTER TABLE 範例

```
ALTER TABLE ... SET TBLPROPERTIES ('parquet.ignore.statistics'='true')
```

# Regex SerDe
<a name="regex-serde"></a>

Regex SerDe 會將 regex 群組擷取到資料表欄，藉此使用規則表達式 (regex) 來還原序列化資料。

如果資料中的某一列不符合 regex，則該列中的所有欄都會以 `NULL` 的形式傳回。如果某一列符合 regex 但擁有的群組數量低於預期，則遺失的群組為 `NULL`。如果資料中的某一列符合 regex 但具有比 regex 中的群組更多的欄，則會忽略額外的欄。

如需詳細資訊，請參閱 Apache Hive 文件中的 [類別 RegexSerDe](https://svn.apache.org/repos/infra/websites/production/hive/content/javadocs/r1.2.2/api/org/apache/hadoop/hive/serde2/RegexSerDe.html)。

## 序列化程式庫名稱
<a name="regex-serde-library-name"></a>

Regex SerDe 的序列化程式庫名稱為 `org.apache.hadoop.hive.serde2.RegexSerDe`。如需原始程式碼資訊，請參閱 Apache 文件中的 [類別 RegexSerDe](https://svn.apache.org/repos/infra/websites/production/hive/content/javadocs/r1.2.2/api/org/apache/hadoop/hive/serde2/RegexSerDe.html)。

## 範例
<a name="regex-serde-examples"></a>

下列範例會使用 RegExSerDe 從 CloudFront 日誌建立資料表。在 `s3://athena-examples-myregion/cloudfront/plaintext/` 中，以您執行 Athena 之處的區域識別符 (例如 `s3://athena-examples-us-west-1/cloudfront/plaintext/`) 取代 *myregion*。

```
CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs (
  `Date` DATE,
  Time STRING,
  Location STRING,
  Bytes INT,
  RequestIP STRING,
  Method STRING,
  Host STRING,
  Uri STRING,
  Status INT,
  Referrer STRING,
  os STRING,
  Browser STRING,
  BrowserVersion STRING
 ) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
 WITH SERDEPROPERTIES (
 "input.regex" = "^(?!#)([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+[^\(]+[\(]([^\;]+).*\%20([^\/]+)[\/](.*)$"
 ) 
LOCATION 's3://athena-examples-myregion/cloudfront/plaintext/';
```

# 在 Amazon Athena 中執行 SQL 查詢
<a name="querying-athena-tables"></a>

對於已在 AWS Glue Data Catalog 註冊的資料來源，以及您使用 Amazon Athena 聯合查詢功能連接的資料來源 (例如 Hive 中繼存放區和 Amazon DocumentDB 執行個體)，您可以使用 Amazon Athena 執行 SQL 查詢。如需有關使用資料來源的詳細資訊，請參閱[連線至資料來源](work-with-data-stores.md)。當您執行資料定義語言 (DDL) 查詢來修改結構描述時，Athena 會將中繼資料寫入與資料來源相關聯的中繼存放區。此外，部分查詢 (例如 `CREATE TABLE AS` 和 `INSERT INTO`) 可以將記錄寫入資料集，例如將 CSV 記錄新增到 Amazon S3 位置。

本節指導如何使用各種 SQL 陳述式，對常見的資料來源和資料類型執行 Athena 查詢。也會提供常見結構和運算子的一般指導，例如，使用陣列、串連、篩選、扁平化和排序。其他範例包括查詢具有巢狀結構和映射之資料表中的資料、基於 JSON 編碼資料集的資料表，以及與 AWS 服務 AWS CloudTrail 日誌和 Amazon EMR 日誌相關聯的資料集。本文件並未涵蓋標準 SQL 的詳盡用途。如需有關 SQL 的詳細資訊，請參閱 [Trino](https://trino.io/docs/current/language.html) 和 [Presto](https://prestodb.io/docs/current/sql.html) 語言參考。

**Topics**
+ [檢視查詢計畫](query-plans.md)
+ [使用查詢結果和近期查詢](querying.md)
+ [在 Athena 中重複使用查詢結果](reusing-query-results.md)
+ [檢視查詢狀態](query-stats.md)
+ [使用檢視](views.md)
+ [使用已儲存的查詢](saved-queries.md)
+ [使用參數化查詢](querying-with-prepared-statements.md)
+ [使用成本型最佳化工具](cost-based-optimizer.md)
+ [查詢 S3 Express One Zone](querying-express-one-zone.md)
+ [查詢 Amazon Glacier](querying-glacier.md)
+ [處理結構描述更新](handling-schema-updates-chapter.md)
+ [查詢陣列](querying-arrays.md)
+ [查詢地理空間資料](querying-geospatial-data.md)
+ [查詢 JSON 資料](querying-JSON.md)
+ [搭配 Athena 使用機器學習 (ML)](querying-mlmodel.md)
+ [利用 UDF 查詢](querying-udf.md)
+ [跨區域查詢](querying-across-regions.md)
+ [查詢 AWS Glue Data Catalog](querying-glue-catalog.md)
+ [查詢 AWS 服務 日誌](querying-aws-service-logs.md)
+ [查詢 Web 伺服器日誌](querying-web-server-logs.md)

如需注意事項和限制，請參閱 [在 Amazon Athena 中進行 SQL 查詢的考量事項與限制](other-notable-limitations.md)。

# 檢視 SQL 查詢的執行計畫
<a name="query-plans"></a>

您可以使用 Athena 查詢編輯器來查看查詢執行方式的圖形呈現。當您在編輯器中輸入查詢並選擇 **Explain** (解釋) 選項時, Athena 會在您的查詢上使用 [EXPLAIN](athena-explain-statement.md) SQL 陳述式來建立兩個相應的圖形：分散式執行計劃和邏輯執行計劃。您可以使用這些圖形來分析、疑難排解並提高查詢的效率。

**若要檢視查詢的執行計劃**

1. 在 Athena 查詢編輯器中輸入查詢，然後選擇 **Explain** (解釋)。  
![\[在 Athena 查詢編輯器中選擇 Explain (解釋)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/query-plans-1.png)

   **Distributed plan** (分散式計劃) 索引標籤會顯示查詢在分散式環境中的執行計劃。分散式計劃具有處理片段或*階段*。每個階段都有從零開始的索引編號，而且會由一或多個節點處理。資料可以在節點之間進行交換。  
![\[查詢分散式計劃圖形範例。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/query-plans-2.png)

1. 若要導覽圖形，請使用以下選項：
   + 若要進行縮放，請使用滑鼠滾輪，或使用放大圖示。
   + 若要調整圖形以符合螢幕，請選擇 **Zoom to fit** (縮放至佈滿) 圖示。
   + 若要移動圖形，請用滑鼠游標拖曳。

1. 若要查看階段的詳細資訊，請選擇階段。  
![\[選擇階段以查看該階段的詳細資訊。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/query-plans-3.png)

1. 若要以全幅檢視階段詳細資訊，請選擇詳細資訊窗格右上角的展開圖示。

1. 若要查看更多詳細資訊，請展開運算子樹狀結構中的一或多個項目。如需有關分散式計劃片段的資訊，請參閱 [EXPLAIN 陳述式輸出類型](athena-explain-statement-understanding.md#athena-explain-statement-understanding-explain-plan-types)。  
![\[分散式查詢計劃中階段的展開運算子樹狀結構。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/query-plans-4.png)
**重要**  
目前，即使 Athena 確實將這些篩選條件套用至您的查詢，有些分割區篩選條件可能不會顯示在巢狀運算子樹狀結構圖形中。若要驗證此等篩選條件的效果，請在查詢上執行 [EXPLAIN](athena-explain-statement.md#athena-explain-statement-syntax-athena-engine-version-2) 或 [EXPLAIN ANALYZE](athena-explain-statement.md#athena-explain-analyze-statement) 並查看結果。

1. 選擇 **Logical plan** (邏輯計劃) 索引標籤。此圖形顯示執行查詢的邏輯計劃。如需操作用語的詳細資訊，請參閱 [了解 Athena EXPLAIN 陳述式結果](athena-explain-statement-understanding.md)。  
![\[Athena 中邏輯查詢計劃的圖形。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/query-plans-5.png)

1. 若要將計劃匯出為 SVG 或 PNG 圖像，或匯出為 JSON 文字，請選擇 **Export** (匯出)。

## 其他資源
<a name="query-plans-additional-resources"></a>

如需詳細資訊，請參閱下列資源。

[在 Athena 使用 EXPLAIN 和 EXPLAIN ANALYZE](athena-explain-statement.md)

[了解 Athena EXPLAIN 陳述式結果](athena-explain-statement-understanding.md)

[檢視已完成查詢的統計資料和執行詳細資訊](query-stats.md)

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/7JUyTqglmNU/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/7JUyTqglmNU)


# 使用查詢結果和近期查詢
<a name="querying"></a>

Amazon Athena 會自動將執行的每個查詢的查詢結果和查詢執行結果中繼資料存放在*查詢結果位置*，您可以在 Amazon S3 中指定該位置。如有必要，您可以存取此位置中的檔案來使用它們。您也可以直接從 Athena 主控台下載查詢結果檔案。

Athena 現在為您提供兩種管理查詢結果的選項；您可以使用客戶擁有的 S3 儲存貯體或選擇受管查詢結果功能。使用自己的儲存貯體，您可以完全控制儲存、許可、生命週期政策和保留，從而提供最大靈活性，但同時也需要更多的管理工作。或者，當您選擇受管查詢結果選項時，服務會自動處理儲存和生命週期管理，因此您無需設定單獨的結果儲存貯體，並在預定保留期間結束後自動清除結果。如需詳細資訊，請參閱[受管查詢結果](managed-results.md)。

若是第一次設定 Amazon S3 查詢結果位置，請參閱[使用 Athena 主控台指定查詢結果位置](query-results-specify-location-console.md)。

每個執行的查詢都會自動儲存輸出檔案。若要使用 Athena 主控台存取和檢視查詢輸出檔案，IAM 主體 (使用者和角色) 需要對查詢結果位置進行 Amazon S3 [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 動作的許可，以及 Athena [GetQueryResults](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryResults.html) 動作的許可。查詢結果位置可以加密。如果位置已加密，則使用者必須擁有適當的金鑰許可，才能加密和解密查詢結果位置。

**重要**  
具有查詢結果位置之 Amazon S3 `GetObject` 動作許可的 IAM 委託人，能夠從 Amazon S3 擷取查詢結果，即使 Athena `GetQueryResults` 動作的許可遭拒也一樣。

**注意**  
如果是已取消或失敗的查詢，Athena 可能已將局部結果寫入 Amazon S3。在這種情況下，Athena 不會從存放結果的 Amazon S3 字首中刪除這些局部結果。您必須移除含有局部結果的 Amazon S3 字首。Athena 使用 Amazon S3 分段上傳，將資料寫入 Amazon S3。我們建議您設定儲存貯體生命週期政策，指定當查詢失敗時結束分段上傳。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[使用儲存貯體生命週期政策中止未完成的分段上傳](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config)。
在某些情況下，Athena 可能會自動重試查詢執行。在大多數情況下，這些查詢能夠成功完成，且查詢 ID 會標記為 `Completed`。這些查詢可能在初始嘗試期間已寫入部分結果，並可能產生未完成的分段上傳。

**Topics**
+ [受管查詢結果](managed-results.md)
+ [指定查詢結果位置](query-results-specify-location.md)
+ [使用 Athena 主控台下載查詢結果檔案](saving-query-results.md)
+ [在 Athena 主控台中檢視近期查詢](queries-viewing-history.md)
+ [將多個近期查詢下載到 CSV 檔案](queries-downloading-multiple-recent-queries-to-csv.md)
+ [設定近期查詢顯示選項](queries-recent-queries-configuring-options.md)
+ [將查詢歷史記錄保留 45 天以上](querying-keeping-query-history.md)
+ [在 Amazon S3 中尋找查詢輸出檔案](querying-finding-output-files.md)

# 受管查詢結果
<a name="managed-results"></a>

利用受管查詢結果，您可以執行 SQL 查詢，而無需提供用於儲存查詢結果的 Amazon S3 儲存貯體。這樣，您就無需佈建、管理、控制存取和清除自己的 S3 儲存貯體。若要開始使用，請建立新的工作群組或編輯現有的工作群組。在**查詢結果組態**下，選取 **Athena 受管**。

**主要功能**
+ 為簡化工作流程，執行查詢前，請先移除選擇 S3 儲存貯體位置的需求。
+ 使用受管查詢結果無需額外付費，自動刪除查詢結果則可降低管理開銷，而且也不需要單獨的 S3 儲存貯體清除程序。
+ 簡單入門：可以輕鬆設定新的和既有的工作群組，以使用受管查詢結果。您可以在 AWS 帳戶中混合使用 Athena 受管和客戶受管查詢結果。
+ 簡化了 IAM 許可，允許透過繫結至個別工作群組的 `GetQueryResults` 和 `GetQueryResultsStream` 讀取結果。
+ 查詢結果會使用您選擇的 AWS 擁有金鑰或客戶擁有的金鑰自動加密。

## 考量和限制
<a name="managed-results-considerations"></a>

****
+ 在 Athena 中，對查詢結果的存取權會在工作群組級別進行管理。因此，對於特定工作群組，您需要 `GetQueryResults` 和 `GetQueryResultsStream` IAM 動作的明確許可。`GetQueryResults` 動作將決定誰能以分頁格式擷取已完成查詢的結果，而 `GetQueryResultsStream` 動作將決定誰可以串流已完成查詢的結果 (通常由 Athena 驅動器使用)。
+ 您無法從主控台下載大於 200 MB 的查詢結果檔案。使用 `UNLOAD` 陳述式，將大於 200 MB 的結果寫入您可以單獨下載的位置。
+ 受管查詢結果功能不支援[查詢結果重複使用](reusing-query-results.md)。
+ 查詢結果可以保留 24 小時。在此期間，可免費存放查詢結果。在此期間之後，查詢結果會自動刪除。

## 建立或編輯具有受管查詢結果的工作群組
<a name="using-managed-query-results"></a>

若要從主控台建立工作群組或更新具有受管查詢結果的現有工作群組：

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) 開啟 Athena 主控台。

1. 從左側導覽窗格，選擇**工作群組**。

1. 選擇**建立工作群組**以建立新的工作群組，或從清單中編輯現有工作群組。

1. 在**查詢結果組態**下，選擇 **Athena 受管**。  
![\[查詢結果組態選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/athena-managed.png)

1. 對於**加密查詢結果**，選擇您想要的加密選項。如需詳細資訊，請參閱[選擇查詢結果加密](#managed-query-results-encryption-at-rest)。

1. 填寫所有其他必要的詳細資訊，然後選擇**儲存變更**。

## 選擇查詢結果加密
<a name="managed-query-results-encryption-at-rest"></a>

加密組態時有兩種選項：
+ **使用 AWS 擁有的金鑰加密** – 當您使用受管查詢結果時，這是預設選項。如果您想要使用 AWS 擁有的金鑰加密查詢結果，請選擇此選項。
+ **使用客戶自管金鑰加密** – 如果您想要使用客戶自管金鑰對查詢結果進行加密和解密，請選擇此選項。若要使用客戶自管金鑰，請在金鑰政策區段的主體元素中新增 Athena 服務。如需詳細資訊，請參閱[為受管查詢結果設定 AWS KMS 金鑰政策](#managed-query-results-set-up)。若要成功執行查詢，執行查詢的使用者需要存取 AWS KMS 金鑰的許可。

## 為受管查詢結果設定 AWS KMS 金鑰政策
<a name="managed-query-results-set-up"></a>

金鑰政策的 `Principal` 區段指定誰可以使用此金鑰。受管查詢結果功能引入了主體 `encryption.athena.amazonaws.com`，而您必須在 `Principal` 區段中指定該主體。此服務主體專門用於存取非 Athena 擁有的金鑰。您還必須將 `kms:Decrypt`、`kms:GenerateDataKey` 和 `kms:DescribeKey` 動作新增至用於存取受管結果的金鑰政策。這三個動作是允許的最低動作。

受管查詢結果會將您的工作群組 ARN 用於[加密內容](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)。由於 `Principal`區段是 AWS 服務，因此您也需要將 `aws:sourceArn`和 `aws:sourceAccount` 新增至金鑰政策條件。下列範例顯示對單一工作群組具有最低許可的 AWS KMS 金鑰政策。

```
 {
    "Sid": "Allow athena service principal to use the key",
    "Effect": "Allow",
    "Principal": {
        "Service": "encryption.athena.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:DescribeKey"
      ],
    "Resource": "arn:aws:kms:us-east-1:{account-id}:key/{key-id}",
    "Condition": {
    "ArnLike": {
        "kms:EncryptionContext:aws:athena:arn": "arn:aws:athena:us-east-1:{account-id}:workgroup/{workgroup-name}",
        "aws:SourceArn": "arn:aws:athena:us-east-1:{account-id}:workgroup/{workgroup-name}"
    },
    "StringEquals": {
        "aws:SourceAccount": "{account-id}"
    }
}
```

下列範例 AWS KMS 金鑰政策允許相同*帳戶 ID *中的所有工作群組使用相同的 AWS KMS 金鑰。

```
{
    "Sid": "Allow athena service principal to use the key",
    "Effect": "Allow",
    "Principal": {
        "Service": "encryption.athena.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:DescribeKey"
    ],
    "Resource": "arn:aws:kms:us-east-1:account-id:key/{key-id}",
    "Condition": {
        "ArnLike": {
          "kms:EncryptionContext:aws:athena:arn": "arn:aws:athena:us-east-1:account-id:workgroup/*",
          "aws:SourceArn": "arn:aws:athena:us-east-1:account-id:workgroup/*"
        },
        "StringEquals": {
          "aws:SourceAccount": "account-id"
        }
    }
}
```

除了 Athena 和 Amazon S3 許可之外，您還必須取得執行 `kms:GenerateDataKey` 和 `kms:Decrypt` 動作的許可。如需詳細資訊，請參閱[Amazon S3 中加密資料的許可](encryption.md#permissions-for-encrypting-and-decrypting-data)。

如需有關受管查詢結果加密的詳細資訊，請參閱 [加密受管查詢結果](encrypting-managed-results.md)。

# 加密受管查詢結果
<a name="encrypting-managed-results"></a>

Athena 提供下列選項，以對 [受管查詢結果](managed-results.md) 進行加密。

## 使用 AWS 擁有的金鑰加密
<a name="encrypting-managed-results-aws-owned-key"></a>

當您使用受管查詢結果時，此為預設選項。此選項表示您想要使用 AWS 擁有的金鑰來加密查詢結果。 AWS 擁有的金鑰不會儲存在 AWS 您的帳戶中，並且是 AWS 擁有的 KMS 金鑰集合的一部分。當您使用 AWS 擁有的金鑰時，不會向您收取費用，而且它們不會計入您帳戶的 AWS KMS 配額。

## 使用 AWS KMS 客戶受管金鑰加密
<a name="encrypting-managed-results-customer-managed-key"></a>

客戶受管金鑰是您帳戶中建立、擁有和管理 AWS 的 KMS 金鑰。您可以完全控制這些 KMS 金鑰，包括建立和維護其金鑰政策、IAM 政策和授與、啟用和停用金鑰、輪換其密碼編譯材料、新增標籤、建立參考別名，以及排程供刪除。如需詳細資訊，請參閱[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

## Athena 如何使用客戶自管金鑰來對結果進行加密
<a name="encrypting-managed-results-how-ate-uses-cmk"></a>

當您指定客戶受管金鑰時，Athena 會使用它來對存放在自管查詢結果中的查詢結果進行加密。呼叫 `GetQueryResults` 時，需要使用相同的金鑰來對結果進行解密。當您將客戶自管金鑰的狀態設定為停用或排程刪除時，可避免 Athena 和所有使用者使用該金鑰對結果進行加密或解密。

Athena 使用封套加密和金鑰階層來加密資料。您的 AWS KMS 加密金鑰是用來產生和解密此金鑰階層的根金鑰。

每個結果都會使用加密時在工作群組中設定的客戶自管金鑰進行加密。將金鑰切換到不同的客戶受管金鑰或 AWS 擁有的金鑰不會使用新金鑰重新加密現有結果。刪除和停用特定客戶自管金鑰只會影響對金鑰加密結果的解密。

Athena 需要存取您的加密金鑰，才能執行 `kms:Decrypt`、`kms:GenerateDataKey` 和 `kms:DescribeKey` 操作，以對結果進行加密和解密。如需詳細資訊，請參閱[Amazon S3 中加密資料的許可](encryption.md#permissions-for-encrypting-and-decrypting-data)。

使用 `StartQueryExecution` API 提交查詢並使用 `GetQueryResults` 讀取結果的主體，除了 Athena 和 Amazon S3 許可之外，還必須擁有對客戶自管金鑰的許可，以便進行 `kms:Decrypt`、`kms:GenerateDataKey` 和 `kms:DescribeKey` 操作。如需詳細資訊，請參閱 [中的金鑰政策 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users)。

# 指定查詢結果位置
<a name="query-results-specify-location"></a>

Athena 使用的查詢結果位置取決於工作群組設定與*用戶端設定*的組合。用戶端設定是以您執行查詢的方式為基礎。
+  如果您使用 Athena 主控台執行查詢，在導覽列中 **Settings** (設定) 下輸入的 **Query result location** (查詢結果位置) 會決定用戶端設定。
+ 如果您使用 Athena API 執行查詢，[StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) 動作的 `OutputLocation` 參數會決定用戶端設定。
+ 如果您使用 ODBC 或 JDBC 驅動程式執行查詢，連線 URL 中指定的 `S3OutputLocation` 屬性會決定用戶端設定。

**重要**  
當您使用 API 或使用 ODBC 或 JDBC 驅動程式執行查詢時，主控台設定並不適用。

每個工作群組組態都有可以啟用的 [Override client-side settings (覆寫用戶端設定)](https://docs.aws.amazon.com/athena/latest/ug/workgroups-settings-override.html) 選項。啟用此選項時，若與該工作群組相關聯的 IAM 委託人執行查詢，工作群組設定會優先於適用的用戶端設定。

## 關於先前建立的預設位置
<a name="query-results-specify-location-previous-defaults"></a>

先前，如果您在 Athena 中執行查詢而未指定 **Query result location** (查詢結果位置) 的值，且查詢結果位置設定未被工作群組覆寫，則 Athena 會為您建立預設位置。預設位置為 `aws-athena-query-results-MyAcctID-MyRegion`，其中 *MyAcctID* 為執行查詢之 IAM 委託人的 Amazon Web Services 帳戶 ID，*MyRegion* 是查詢執行所在的區域 (例如：`us-west-1`)。

現在，您必須指定查詢結果位置，或使用可覆寫查詢結果位置設定的工作群組，才能在帳戶之前並未使用過 Athena 的區域中執行 Athena 查詢。雖然 Athena 不再為您建立預設查詢結果位置，但先前建立的預設 `aws-athena-query-results-MyAcctID-MyRegion` 位置仍然有效，您可以繼續使用。

**Topics**
+ [關於先前建立的預設位置](#query-results-specify-location-previous-defaults)
+ [使用 Athena 主控台指定查詢結果位置](query-results-specify-location-console.md)
+ [使用工作群組指定查詢結果位置](query-results-specify-location-workgroup.md)

# 使用 Athena 主控台指定查詢結果位置
<a name="query-results-specify-location-console"></a>

您必須指定 Amazon S3 中的查詢結果儲存貯體位置，然後才能執行查詢，否則您必須使用已指定儲存貯體，且其組態可覆寫用戶端設定的工作群組。

**若要使用 Athena 主控台指定用戶端設定查詢結果位置**

1. [切換](switching-workgroups.md)至您要為其指定查詢結果位置的工作群組。預設工作群組的名稱為 **primary** (主要)。

1. 從導覽列中，選擇 **Settings** (設定)。

1. 請在導覽列中選擇 **Manage** (管理)。

1. 對於 **Manage settings** (管理設定)，請執行下列其中一項動作：
   + 在 **Location of query result** (查詢結果的位置) 方塊中，輸入您在 Amazon S3 中為查詢結果建立的儲存貯體路徑。在路徑中加上 `s3://` 作為字首。
   + 選擇 **Browse S3** (瀏覽 S3)，選擇您在目前區域建立的 Amazon S3 儲存貯體，然後選擇 **Choose** (選擇)。
**注意**  
如果您使用為工作群組中的所有使用者指定查詢結果位置的工作群組，則變更查詢結果位置的選項將無法使用。

1. (選用) 選擇 **View lifecycle configuration** (檢視生命週期組態)，以檢視和設定查詢結果儲存貯體上的 [Amazon S3 生命週期規則](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)。您建立的 Amazon S3 生命週期規則可以是到期規則或轉換規則。到期規則會在一段時間之後自動刪除查詢結果。轉換規則會將其移至另一個 Amazon S3 儲存層。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》中的[設定儲存貯體的生命週期組態](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)。

1. （選用） 對於**預期儲存貯體擁有者**，輸入 AWS 帳戶 您預期成為輸出位置儲存貯體擁有者的 ID。這是一項附加的安全措施。如果儲存貯體擁有者的帳戶 ID 與您在此處指定的 ID 不相符，則嘗試輸出到儲存貯體的動作會失敗。如需詳細資訊，請參閱 *Amazon S3 使用者指南*中的[使用儲存貯體擁有者條件驗證儲存貯體擁有權](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-owner-condition.html)。
**注意**  
預期的儲存貯體擁有者設定僅適用於您為 Athena 查詢結果指定的 Amazon S3 輸出位置。它不適用於其他 Amazon S3 位置，例如外部 Amazon S3 儲存貯體、`CTAS` 和 `INSERT INTO` 目的地資料表位置、`UNLOAD` 陳述式輸出位置等資料來源位置，也不適用於溢出聯合查詢儲存貯體的操作，或針對另一個帳戶中的資料表執行的 `SELECT` 查詢。

1. (選用) 如果要將存放在 Simple Storage Service (Amazon S3) 中的查詢結果加密，選擇 **Encrypt query results** (將查詢結果加密)。如需在 Athena 中加密的詳細資訊，請參閱 [靜態加密](encryption.md)。

1. (選用) 對於查詢結果儲存貯體，選擇 **Assign bucket owner full control over query results** (指派儲存貯體擁有者對查詢結果的完整控制)，以便在 [ACL 已啟用](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)時，授予儲存貯體擁有者對查詢結果的完整存取。例如，如果您的查詢結果位置係由另一個帳戶所擁有，則可以授予另一個帳戶對查詢結果的所有權和完整控制。如需詳細資訊，請參閱《*Simple Storage Service (Amazon S3) 使用者指南*》中的[控制物件的所有權並停用儲存貯體的 ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)。

1. 選擇**儲存**。

# 使用工作群組指定查詢結果位置
<a name="query-results-specify-location-workgroup"></a>

您可以使用 AWS 管理主控台、 AWS CLI或 Athena API，在工作群組組態中指定查詢結果位置。

使用 時 AWS CLI，當您執行 [https://docs.aws.amazon.com/cli/latest/reference/athena/create-work-group.html](https://docs.aws.amazon.com/cli/latest/reference/athena/create-work-group.html)或 [https://docs.aws.amazon.com/cli/latest/reference/athena/update-work-group.html](https://docs.aws.amazon.com/cli/latest/reference/athena/update-work-group.html)命令時，請使用 `--configuration`選項的 `OutputLocation` 參數指定查詢結果位置。

**若要使用 Athena 主控台指定工作群組的查詢結果位置**

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 在導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在工作群組清單中，選擇您要編輯的工作群組之連結。

1. 選擇**編輯**。

1. 對於 **Query result location and encryption** (查詢結果位置和加密)，執行下列其中一項：
   + 在 **Location of query result** (查詢結果的位置) 文字方塊中，輸入您要在 Amazon S3 中存放查詢結果的儲存貯體路徑。在路徑中加上 `s3://` 作為字首。
   + 選擇 **Browse S3** (瀏覽 S3)，選擇您在目前區域中想要使用的 Amazon S3 儲存貯體，然後選擇 **Choose** (選擇)。

1. （選用） 對於**預期儲存貯體擁有者**，輸入 AWS 帳戶 您預期成為輸出位置儲存貯體擁有者的 ID。這是一項附加的安全措施。如果儲存貯體擁有者的帳戶 ID 與您在此處指定的 ID 不相符，則嘗試輸出到儲存貯體的動作會失敗。如需詳細資訊，請參閱 *Amazon S3 使用者指南*中的[使用儲存貯體擁有者條件驗證儲存貯體擁有權](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-owner-condition.html)。
**注意**  
預期的儲存貯體擁有者設定僅適用於您為 Athena 查詢結果指定的 Amazon S3 輸出位置。它不適用於其他 Amazon S3 位置，例如外部 Amazon S3 儲存貯體、`CTAS` 和 `INSERT INTO` 目的地資料表位置、`UNLOAD` 陳述式輸出位置等資料來源位置，也不適用於溢出聯合查詢儲存貯體的操作，或針對另一個帳戶中的資料表執行的 `SELECT` 查詢。

1. (選用) 如果要將存放在 Simple Storage Service (Amazon S3) 中的查詢結果加密，選擇 **Encrypt query results** (將查詢結果加密)。如需在 Athena 中加密的詳細資訊，請參閱 [靜態加密](encryption.md)。

1. (選用) 對於查詢結果儲存貯體，選擇 **Assign bucket owner full control over query results** (指派儲存貯體擁有者對查詢結果的完整控制)，以便在 [ACL 已啟用](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)時，授予儲存貯體擁有者對查詢結果的完整存取。例如，如果您的查詢結果位置係由另一個帳戶所擁有，則可以授予另一個帳戶對查詢結果的所有權和完整控制。

   如果儲存貯體的 S3 物件所有權設定為 **Bucket owner preferred** (首選的儲存貯體擁有者) 時，則儲存貯體擁有者亦擁有從此工作群組寫入的所有查詢結果物件。例如，如果外部帳戶的工作群組啟用此選項，並將其查詢結果位置設定為您帳戶的 Simple Storage Service (Amazon S3) 儲存貯體，且該儲存貯體的 S3 物件所有權設定為 **Bucket owner preferred** (首選的儲存貯體擁有者) 時，則您擁有外部工作群組的查詢結果並具有完整的控制存取。

   當查詢結果儲存貯體的 S3 物件所有權設定為 **Bucket owner enforced** (強制的儲存貯體擁有者) 時，則選取此選項不會有任何作用。如需詳細資訊，請參閱《*Simple Storage Service (Amazon S3) 使用者指南*》中的[控制物件的所有權並停用儲存貯體的 ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)。

1. 如果要讓工作群組的所有使用者使用您指定的查詢結果位置，請往下捲動到 **Settings** (設定) 部分，然後選擇 **Override client-side settings** (覆寫用戶端設定)。

1. 選擇**儲存變更**。

# 使用 Athena 主控台下載查詢結果檔案
<a name="saving-query-results"></a>

您可以在執行查詢之後，立即從查詢窗格下載查詢結果 CSV 檔案檔案。您也可以從 **Recent queries** (近期查詢) 索引標籤中，下載近期查詢的查詢結果。

**注意**  
Athena 查詢結果檔案是資料檔案，內含個別使用者可設定的資訊。讀取與分析此資料的某些程式很可能會將某些資料解譯為命令 (CSV injection)。因此，將查詢結果 CSV 資料匯入至試算表程式時，該程式可能會提醒您關於安全方面的考量。為確保系統的安全，您應該始終選擇停用下載的查詢結果中的連結或巨集。

**執行查詢並下載查詢結果**

1. 在查詢編輯器中輸入查詢，然後選擇 **Run** (執行)。

   當查詢完成執行時，**Results (結果)** 窗格會顯示查詢結果。

1. 若要下載查詢結果的 CSV 檔案，請選擇查詢結果窗格上方的 **Download results** (下載結果)。根據您的瀏覽器和瀏覽器組態，您可能需要確認下載。  
![\[將查詢結果儲存至 Athena 主控台中的 .csv 檔案。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-query-results-download-csv.png)

**下載先前查詢的查詢結果檔案**

1. 選擇 **Recent queries** (近期查詢)。  
![\[選擇 Recent queries (近期查詢) 以檢視先前的查詢。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-recent-queries.png)

1. 使用搜尋方塊尋找查詢、選擇查詢，然後選擇 **Download results** (下載結果)。
**注意**  
您無法使用 **Download results** (下載結果) 選項來擷取已手動刪除的查詢結果，或擷取已由 Amazon S3 [生命週期規則](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)刪除或移至其他位置的查詢結果。  
![\[選擇 Download results (近期查詢) 以尋找並下載以前的查詢結果。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-recent-queries-tab-download.png)

# 在 Athena 主控台中檢視近期查詢
<a name="queries-viewing-history"></a>

使用 Athena 主控台可查看哪些查詢成功或失敗，並檢視失敗查詢的錯誤詳細資訊。Athena 會將查詢歷史記錄保留 45 天。

**在 Athena 主控台中檢視近期查詢。**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 選擇 **Recent queries** (近期查詢)。**Recent queries** (近期查詢) 索引標籤顯示每個已執行查詢的相關資訊。

1. 若要在查詢編輯器中開啟查詢陳述式，請選擇查詢的執行 ID。  
![\[選擇查詢的執行 ID 即可在查詢編輯器中看到該查詢內容。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-view-query-statement.png)

1. 若要查看失敗查詢的詳細資訊，請選擇查詢的 **Failed** (失敗) 連結。  
![\[選擇查詢的 Failed (失敗) 連結以檢視失敗相關資訊。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-view-query-failure-details.png)

# 將多個近期查詢下載到 CSV 檔案
<a name="queries-downloading-multiple-recent-queries-to-csv"></a>

您可以使用 Athena 主控台的 **Recent queries** (近期查詢) 標籤，將一或多個近期查詢匯出至 CSV 檔案，以便以表格格式檢視這些查詢。下載的檔案不包含查詢結果，而是 SQL 查詢字串本身以及有關查詢的其他資訊。匯出的欄位包括執行 ID、查詢字串內容、查詢開始時間、狀態、執行時間、掃描的資料量、使用的查詢引擎版本以及加密方法。您可以匯出最多 500 個近期查詢，或使用在搜尋方塊中輸入的條件，匯出最多 500 個篩選的查詢。

**若要將一或多個近期查詢匯出至 CSV 檔案**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 選擇 **Recent queries** (近期查詢)。

1. (選用) 使用搜尋方塊，篩選您要下載的近期查詢。

1. 選擇**下載 CSV**。  
![\[選擇下載 CSV。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-recent-queries-csv.png)

1. 出現檔案儲存提示時，選擇 **Save** (儲存)。預設檔案名稱 `Recent Queries` 後面接著一個時間戳記 (例如，`Recent Queries 2022-12-05T16 04 27.352-08 00.csv`)

# 設定近期查詢顯示選項
<a name="queries-recent-queries-configuring-options"></a>

您可以設定 **Recent queries** (近期查詢) 標籤的選項 (例如要顯示的資料欄和文字換行)。

**若要設定 **Recent queries** (近期查詢) 標籤的選項**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 選擇 **Recent queries** (近期查詢)。

1. 選擇選項按鈕 (齒輪圖示)。  
![\[選擇選項按鈕以設定近期查詢的顯示。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-recent-queries-options.png)

1. 在 **Preferences** (偏好設定) 對話方塊中，選擇每頁的列數、換行反應和要顯示的資料欄。  
![\[設定近期查詢的顯示方式。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-recent-queries-preferences.png)

1. 選擇**確認**。

# 將查詢歷史記錄保留 45 天以上
<a name="querying-keeping-query-history"></a>

若要將查詢歷史記錄保留 45 天以上，您可以擷取查詢歷史記錄，並將其儲存至資料存放區，例如 Amazon S3。若要自動執行此程序，您可以使用 Athena 和 Amazon S3 API 動作以及 CLI 命令。下列程序概述這些步驟。

**使用程式擷取和儲存查詢歷史記錄的步驟**

1. 使用 Athena [ListQueryExecutions](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListQueryExecutions.html) API 動作或 [list-query-executions](https://docs.aws.amazon.com/cli/latest/reference/athena/list-query-executions.html) CLI 命令來擷取查詢 ID。

1. 使用 Athena [GetQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryExecution.html) API 動作或 [get-query-execution](https://docs.aws.amazon.com/cli/latest/reference/athena/get-query-execution.html) CLI 命令，根據其 ID 擷取每個查詢的相關資訊。

1. 使用 Amazon S3 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) API 動作或 [put-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html) CLI 命令，將資訊儲存在 Amazon S3 中。

# 在 Amazon S3 中尋找查詢輸出檔案
<a name="querying-finding-output-files"></a>

除非查詢是發生在其組態會覆寫用戶端設定的工作群組中，否則查詢輸出檔案會以下列路徑模式存放在 Amazon S3 的子資料夾中。當工作群組組態取代用戶端設定時，查詢會使用工作群組指定的結果路徑。

```
QueryResultsLocationInS3/[QueryName|Unsaved/yyyy/mm/dd/]
```
+ *QueryResultsLocationInS3* 是由工作群組設定或用戶端設定所指定的查詢結果位置。如需詳細資訊，請參閱本文件稍後的[指定查詢結果位置](query-results-specify-location.md)。
+ 只有從主控台執行且其結果路徑尚未被工作群組組態覆寫的查詢，會建立下列子資料夾。從 AWS CLI 或使用 Athena API 執行的查詢會直接儲存至 *QueryResultsLocationInS3*。
  + *QueryName* 是儲存其結果的查詢名稱。如果查詢已執行但未儲存，則會使用 `Unsaved`。
  + *yyyy/mm/dd* 是查詢執行的日期。

與 `CREATE TABLE AS SELECT` 查詢相關聯的檔案會存放在上述模式的 `tables` 子資料夾中。

## 識別查詢輸出檔案
<a name="querying-identifying-output-files"></a>

系统會根據查詢的名稱、查詢 ID 和查詢執行的日期，將檔案儲存至 Amazon S3 中的查詢結果位置。每個查詢的檔案都是使用 *QueryID* 命名，此 QueryID 是每个查询执行时 Athena 指派給查詢的唯一識別符。

系統會儲存下列檔案類型：


| 檔案類型 | 檔案命名模式 | Description | 
| --- | --- | --- | 
|  **查詢結果檔案**  |  `QueryID.csv` `QueryID.txt`  |  DML 查詢結果檔案會以逗號分隔值 (CSV) 格式儲存。 DDL 查詢結果會儲存為純文字檔案。 使用主控台時，您可以從主控台的 **Results** (結果) 窗格下載結果檔案，或從查詢 **History** (歷史記錄) 進行下載。如需詳細資訊，請參閱[使用 Athena 主控台下載查詢結果檔案](saving-query-results.md)。  | 
|  **查詢中繼資料檔案**  |  `QueryID.csv.metadata` `QueryID.txt.metadata`  |  DML 和 DDL 查詢中繼資料檔案以二進位格式儲存，而且人類不可讀取。副檔名會對應到相關的查詢結果檔案。Athena 在使用 `GetQueryResults` 動作讀取查詢結果時，會使用中繼資料。雖然可以刪除這些檔案，但我們不建議這麼做，因為有關查詢的重要資訊會遺失。  | 
|  **資料資訊清單檔案**  |  `QueryID-manifest.csv`  |  產生資料資訊清單檔案，以追蹤在執行 [INSERT INTO](insert-into.md) 查詢時，Athena 在 Amazon S3 資料來源位置中建立的檔案。如果查詢失敗，資訊清單也會追蹤查詢要寫入的檔案。資訊清單可用於識別失敗查詢所產生的遺棄檔案。  | 

## 使用 AWS CLI 來識別查詢輸出位置和檔案
<a name="querying-finding-output-files-cli"></a>

若要使用 AWS CLI 來識別查詢輸出位置和結果檔案，請執行 `aws athena get-query-execution`命令，如下列範例所示。將 *abc1234d-5efg-67hi-jklm-89n0op12qr34* 取代為查詢 ID。

```
aws athena get-query-execution --query-execution-id abc1234d-5efg-67hi-jklm-89n0op12qr34
```

此命令會傳回如下輸出：如需每個輸出參數的說明，請參閱 *AWS CLI 命令參考*中的 [get-query-execution](https://docs.aws.amazon.com/cli/latest/reference/athena/get-query-execution.html)。

```
{
    "QueryExecution": {
        "Status": {
            "SubmissionDateTime": 1565649050.175,
            "State": "SUCCEEDED",
            "CompletionDateTime": 1565649056.6229999
        },
        "Statistics": {
            "DataScannedInBytes": 5944497,
            "DataManifestLocation": "s3://amzn-s3-demo-bucket/athena-query-results-123456789012-us-west-1/MyInsertQuery/2019/08/12/abc1234d-5efg-67hi-jklm-89n0op12qr34-manifest.csv",
            "EngineExecutionTimeInMillis": 5209
        },
        "ResultConfiguration": {
            "EncryptionConfiguration": {
                "EncryptionOption": "SSE_S3"
            },
            "OutputLocation": "s3://amzn-s3-demo-bucket/athena-query-results-123456789012-us-west-1/MyInsertQuery/2019/08/12/abc1234d-5efg-67hi-jklm-89n0op12qr34"
        },
        "QueryExecutionId": "abc1234d-5efg-67hi-jklm-89n0op12qr34",
        "QueryExecutionContext": {},
        "Query": "INSERT INTO mydb.elb_log_backup SELECT * FROM mydb.elb_logs LIMIT 100",
        "StatementType": "DML",
        "WorkGroup": "primary"
    }
}
```

# 在 Athena 中重複使用查詢結果
<a name="reusing-query-results"></a>

當您在 Athena 中重新執行查詢時，您可以選擇性地選擇重複使用最近儲存的查詢結果。此選項可以提高效能並降低已掃描的位元組數的成本。例如，如果您知道結果在指定時間範圍內不會變更，則重複使用查詢結果就很有用。您可以指定重複使用查詢結果的最長期限。只要 Athena 的結果不超過您指定的期限，就會使用儲存的結果。如需詳細資訊，請參閱 *AWS 大數據部落格*中的[使用 Amazon Athena 降低成本和提升查詢效能](https://aws.amazon.com/blogs/big-data/reduce-cost-and-improve-query-performance-with-amazon-athena-query-result-reuse/)。

## 主要功能
<a name="reusing-query-results-key-features"></a>

當您啟用查詢的結果重複使用時，Athena 會在相同的工作群組中尋找先前執行的查詢。如果 Athena 找到相符項目，它會略過執行，並傳回先前相符執行項目的查詢結果。您可以針對每次查詢啟用查詢結果重複使用。

當下列所有條件都成立時，Athena 會重複使用最後一個查詢結果：
+ 查詢字串符合由 Athena 決定。
+ 資料庫和目錄名稱相符。
+ 先前的結果尚未過期。
+ 查詢結果組態符合先前執行的查詢結果組態。
+ 您可以存取查詢中參考的所有資料表。
+ 您可以存取儲存先前結果的 S3 檔案位置。

如果不符合上述任何條件，則 Athena 會在不使用快取結果的情況下執行查詢。

## 考量和限制
<a name="reusing-query-results-considerations-and-limitations"></a>

使用查詢結果重複使用功能時，請謹記以下幾點：
+ Athena 只會在相同的工作群組中重複使用查詢結果。
+ 重複使用查詢結果功能遵循工作群組組態。如果您覆寫查詢的結果組態，則會停用該功能。
+ 僅支援在 Amazon S3 上產生結果集的查詢。`EXECUTE` 不支援 `SELECT`和 以外的陳述式。
+  AWS Glue 支援向 註冊的 Apache Hive、Apache Hudi、Apache Iceberg 和 Linux Foundation Delta Lake 資料表。不支援外部 Hive 中繼存放區。
+ 不支援參考聯合目錄或外部 Hive 中繼存放區的查詢。
+ Lake Formation 受管理的資料表不支援查詢結果重複使用。
+ 當資料表來源的 Amazon S3 位置註冊為 Lake Formation 中的資料位置時，不支援查詢結果重複使用。
+ 不支援具有資料列和資料欄許可的資料表。
+ 不支援具有精細的存取控制 (例如資料欄或資料列篩選) 的資料表。
+ 任何參考不支援資料表的查詢都不符合查詢結果重複使用的資格。
+ Athena 要求您擁有 Amazon S3 讀取許可，如此才能重複使用之前產生的輸出檔案。
+ 重複使用查詢結果功能會假設先前結果的內容尚未修改。Athena 在使用之前不會檢查先前結果的完整性。
+ 如果先前執行的查詢結果已刪除或移至 Amazon S3 中的其他位置，後續執行相同查詢將不會重複使用查詢結果。
+ 可能會傳回過時結果。在達到您指定的重複使用最長期限之前，Athena 不會檢查來源資料是否有變更。
+ 如果有多個結果可供重複使用，則 Athena 會使用最新的結果。
+ 使用類似 `rand()` 或 `shuffle()` 的非確定性運算子或函數的查詢，並未使用快取結果。例如，不含 `ORDER BY` 的 `LIMIT` 是非確定性的，且並非快取，但含有 `ORDER BY` 的 `LIMIT` 是確定性的其已快取。
+ 若要搭配 JDBC 使用查詢結果重複使用功能，所需的最低驅動程式版本為 2.0.34.1000。對於 ODBC，所需的最低驅動程式版本為 1.1.19.1002。如需驅動程序下載資訊，請參閱 [使用 ODBC 和 JDBC 驅動器連接至 Amazon Athena](athena-bi-tools-jdbc-odbc.md)。
+ 使用多個資料目錄的查詢不支援查詢結果重複使用。
+  包含超過 20 個資料表的查詢不支援查詢結果重複使用。
+ 對於大小小於 100 KB 的查詢字串，會忽略註解和空格的差異，`INNER JOIN`並`JOIN`視為對等字串以重複使用結果。大於 100 KB 的查詢字串必須完全相符，才能重複使用結果。
+ 如果查詢結果超過指定的最長存留期，則視為過期；如果未指定最長存留期，則視為超過預設值 60 分鐘。您可以以分鐘、小時或天數來指定重複使用查詢結果的最長期限。無論使用的時間單位為何，可指定的最長期限相等於 7 天。
+ 不支援[受管查詢結果](https://docs.aws.amazon.com/athena/latest/ug/managed-results.html)。

## 如何在 Athena 主控台中重複使用查詢結果
<a name="reusing-query-results-athena-console"></a>

若要使用此功能，請在 Athena 查詢編輯器中啟用 **Reuse query results** (重複使用查詢結果)。

![\[在 Athena 查詢編輯器中，啟用 Reuse query results (重複使用查詢結果)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/reusing-query-results-1.png)


**若要設定重複使用查詢結果功能**

1. 在 Athena 查詢編輯器的 **Reuse query results** (重複使用查詢結果) 選項下，選擇 **up to 60 minutes ago** (最多 60 分鐘前) 旁邊的編輯圖示。

1. 在 **Edit reuse time** (編輯重複使用時間) 對話方塊中，從右側的方塊中選擇時間單位 (分鐘、小時或天)。

1. 在左側的方塊中，輸入或選擇您要指定的時間單位數目。無論選擇的時間單位為何，您可以輸入的最長時間相當於七天。  
![\[設定重複使用查詢結果的最長期限。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/reusing-query-results-2.png)

1. 選擇**確認**。

   橫幅會確認您的組態變更，而 **Reuse query results** (重新使用查詢結果) 選項會顯示您的新設定。

# 檢視已完成查詢的統計資料和執行詳細資訊
<a name="query-stats"></a>

執行查詢之後，您可以取得所處理之輸入和輸出資料的統計資料、查看查詢每個階段所花費時間的圖形呈現，並以互動方式探索執行詳細資訊。

**若要檢視已完成查詢的查詢統計資料**

1. 在 Athena 查詢編輯器中執行查詢之後，請選擇 **Query stats** (查詢統計資料) 索引標籤。  
![\[選擇 Query stats (查詢統計資料)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/query-stats-1.png)

   **Query stats** (查詢統計資料) 索引標籤提供以下資訊：
   + **Data processed** (處理的資料) – 顯示已處理的輸入資料列數和位元組數，以及輸出的資料列數和位元組數。
   + **The Total runtime** (總執行時間) – 顯示執行查詢所花費的總時間，以及花費在佇列、規劃、執行和服務處理上的時間的圖形呈現。
**注意**  
當查詢具有 Lake Formation 中定義的資料列層級篩選條件時，不會顯示階段層級輸入和輸出資料列計數和資料大小資訊。

1. 若要以互動方式探索查詢執行方式的資訊，請選擇 **Execution details** (執行詳細資訊)。  
![\[選擇 Execution details (執行詳細資訊)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/query-stats-2.png)

   **Execution details** (執行詳細資訊) 頁面顯示查詢的執行 ID，以及查詢中從零開始之階段的圖形。階段從下到上按開始到結束的順序排列。每個階段的標籤都會顯示階段執行所花費的時間量。
**注意**  
查詢的總執行時期和執行階段時間通常有很大的差異。例如，總執行時期 (以分鐘為單位) 的查詢可以顯示某個階段的執行時間 (以小時為單位)。由於階段是跨多個任務並行執行的運算邏輯單元，階段的執行時間就是其所有任務的彙總執行時間。儘管存在這種差異，階段執行時間仍有其作用，即可作為查詢中運算最密集階段的相對指標。  
![\[執行詳細資訊頁面。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/query-stats-3.png)

   若要導覽圖形，請使用以下選項：
   + 若要進行縮放，請使用滑鼠滾輪，或使用放大圖示。
   + 若要調整圖形以符合螢幕，請選擇 **Zoom to fit** (縮放至佈滿) 圖示。
   + 若要移動圖形，請用滑鼠游標拖曳。

1. 若要查看階段的更多詳細資訊，請選擇階段。右側的階段詳細資訊窗格顯示輸入和輸出的資料列數和位元組數，以及運算子樹狀結構。  
![\[階段詳細資訊窗格。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/query-stats-4.png)

1. 若要以全幅檢視階段詳細資訊，請選擇詳細資訊窗格右上角的展開圖示。

1. 若要取得有關階段各部分的資訊，請展開運算子樹狀結構中的一或多個項目。  
![\[展開運算子樹狀結構。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/query-stats-5.png)

如需執行詳細資訊的更多資訊，請參閱 [了解 Athena EXPLAIN 陳述式結果](athena-explain-statement-understanding.md)。

## 其他資源
<a name="query-stats-additional-resources"></a>

如需詳細資訊，請參閱下列資源。

[檢視 SQL 查詢的執行計畫](query-plans.md)

[在 Athena 使用 EXPLAIN 和 EXPLAIN ANALYZE](athena-explain-statement.md)

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/7JUyTqglmNU/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/7JUyTqglmNU)


# 使用檢視
<a name="views"></a>

Amazon Athena 中的檢視是邏輯資料表，而非實體資料表。每次在查詢中參考檢視時，定義該檢視的查詢就會執行。您可以從 `SELECT` 查詢建立檢視，然後在未來的查詢中參考此檢視。

在 Athena 中，您可以使用兩種不同類型的檢視：Athena 檢視和 AWS Glue Data Catalog 檢視。

## 何時使用 Athena 檢視？
<a name="when-to-use-views"></a>

您建立 Athena 檢視可能是為了：
+ **查詢資料子集** – 例如，您可以從原始資料表建立包含資料欄子集的檢視，以簡化查詢資料。
+ **合併資料表** – 您可以使用檢視將多個資料表合併到一個查詢。當您有多個資料表，且想要使用 `UNION ALL` 合併它們時，您可以使用該表達式建立檢視，以簡化查詢已合併的資料表。
+ **隱藏複雜性** – 使用檢視以隱藏現有基礎查詢的複雜性並簡化使用者執行的查詢。基礎查詢通常包含資料表之間的聯結、欄清單中的表達式，以及其他 SQL 語法，導致難以了解和除錯。您可以建立檢視以隱藏複雜性並簡化查詢。
+ **最佳化查詢** – 您可以使用檢視來試驗最佳化技術，進而建立最佳化查詢。例如，如果您發現有一組 `WHERE` 條件、`JOIN` 順序或其他表達式可展現最佳效能，您可以使用這些子句和表達式來建立檢視。然後，應用程式可以對此檢視執行相當簡單的查詢。如果您後來發現有更好的方式可最佳化原始查詢，當您重新建立檢視時，所有應用程式就可立即利用最佳化基礎查詢。
+ **隱藏基礎名稱** – 您可以使用檢視來隱藏基礎資料表和資料欄名稱，並將維護問題減到最少 (如果這些名稱變更)。如果名稱發生變更，您可以直接使用新的名稱重新建立檢視。直接使用檢視 (而不是資料表) 的查詢可繼續執行，而不需要變更。

  如需詳細資訊，請參閱[使用 Athena 檢視](views-console.md)。

## 何時使用 AWS Glue Data Catalog 檢視？
<a name="when-to-use-views-gdc"></a>

當您想要跨 Amazon Athena 和 Amazon Redshift AWS 服務 的單一通用 AWS Glue Data Catalog 檢視時，請使用檢視。在 Data Catalog 檢視中，存取許可由建立檢視的使用者定義，而不是由查詢檢視的使用者定義。授予許可的這種方法被稱為*定義程式*語義。

下列使用案例顯示如何使用 Data Catalog 檢視。
+ **更大的存取權** – 您建立的檢視會根據使用者需要的許可層級，來限制資料存取權。例如，您可使用 Data Catalog 檢視，來阻止不在人力資源 (HR) 部門工作的員工查看可識別的個人身分資訊。
+ **確保完整記錄** – 透過將某些篩選條件套用至 Data Catalog 檢視，您可確保 Data Catalog 檢視中的資料記錄一律是完整的。
+ **增強的安全性** – 在 Data Catalog 檢視中，建立檢視的查詢定義必須完整，才能建立檢視。這使得 Data Catalog 檢視不易受到惡意執行者的 SQL 命令的影響。
+ **防止存取基礎資料表** – 定義程式語意可讓使用者存取檢視，而無需讓基礎資料表可供其使用。只有定義檢視的使用者才需要存取該資料表。

Data Catalog 檢視定義存放在 AWS Glue Data Catalog中。這意味著您可使用 AWS Lake Formation ，以透過資源授權、資料欄授權或以標籤為基礎的存取控制來授予存取權。如需有關在 Lake Formation 中授予和撤銷存取權的詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的[授與和撤銷存取 Data Catalog 資源的許可](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)。

如需詳細資訊，請參閱[在 Athena 中使用 Data Catalog 檢視](views-glue.md)。

# 使用 Athena 檢視
<a name="views-console"></a>

在 Athena 主控台中，可以輕鬆建立、更新和管理 Athena 檢視。

## 建立檢視
<a name="creating-views"></a>

使用範本或執行現有查詢可在 Athena 主控台中建立檢視。

**使用範本建立檢視**

1. 在 Athena 主控台中的 **Tables and views** (資料表和檢視) 旁，選擇 **Create** (建立)，然後選擇 **Create view** (建立檢視)。  
![\[建立檢視。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/create-view.png)

   此動作會將可編輯的檢視範本放入查詢編輯器中。

1. 根據您的需求編輯檢視範本。在陳述式中輸入檢視的名稱時，請謹記，視圖名稱不能包含底線 `(_)` 以外的特殊字元。請參閱 [為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)。避免使用[在查詢中逸出預留關鍵字](reserved-words.md)來命名檢視。

   如需建立檢視的相關詳細資訊，請參閱[CREATE VIEW 和 CREATE PROTECTED MULTI DIALECT VIEW](create-view.md)和[Athena 檢視的範例](views-examples.md)。

1. 選擇 **Run** (執行) 以建立檢視。檢視隨即出現在 Athena 主控台的檢視清單中。

**根據現有查詢建立檢視**

1. 使用 Athena 查詢編輯器執行現有查詢。

1. 在查詢編輯器視窗底下，選擇 **Create** (建立)，然後選擇 **View from query** (從查詢建立檢視)。  
![\[選擇 Create (建立)、View from query (從查詢建立檢視)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/create-view-from-query.png)

1. 在 **Create View** (建立檢視) 對話方塊中輸入檢視的名稱，然後選擇 **Create** (建立)。檢視名稱不可包含除了底線 `(_)` 以外的特殊字元。請參閱 [為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)。避免使用[在查詢中逸出預留關鍵字](reserved-words.md)來命名檢視。

   Athena 會將檢視新增至主控台的檢視清單中，並在查詢編輯器中顯示檢視的 `CREATE VIEW` 陳述式。

**備註**
+ 如果您刪除用以建立資料表的資料表，然後嘗試執行檢視，Athena 會顯示錯誤訊息。
+ 您可以建立巢狀檢視，這是位於現有檢視上方的檢視。Athena 不會讓您執行自我參照的遞迴檢視。

# Athena 檢視的範例
<a name="views-examples"></a>

若要顯示檢視查詢的語法，請使用 [SHOW CREATE VIEW](show-create-view.md)。

**Example 範例 1**  
假設有以下兩個資料表：資料表 `employees` 有兩欄：`id` 和 `name`；資料表 `salaries` 有兩欄：`id` 和 `salary`。  
在這個範例中，我們以 `SELECT` 查詢建立名為 `name_salary` 的檢視，從資料表 `employees` 和 `salaries` 取得映射到 salaries 的 ID 清單：  

```
CREATE VIEW name_salary AS
SELECT
 employees.name, 
 salaries.salary 
FROM employees, salaries 
WHERE employees.id = salaries.id
```

**Example 範例 2**  
在下列範例中，我們建立名為 `view1` 的檢視，讓您隱藏較複雜的查詢語法。  
此檢視在兩個資料表上執行：`table1` 和 `table2`，其中每個資料表是不同的 `SELECT` 查詢。此檢視從 `table1` 選取資料欄，然後將結果與 `table2` 聯結。聯結是根據兩個資料表中都存在的 `a` 資料欄。  

```
CREATE VIEW view1 AS
WITH
  table1 AS (
         SELECT a, 
         MAX(b) AS the_max 
         FROM x 
         GROUP BY a
         ),
  table2 AS (
         SELECT a, 
         AVG(d) AS the_avg 
         FROM y 
         GROUP BY a)
SELECT table1.a, table1.the_max, table2.the_avg
FROM table1
JOIN table2 
ON table1.a = table2.a;
```

如需有關查詢聯合檢視的資訊，請參閱 [查詢聯合檢視](running-federated-queries.md#running-federated-queries-federated-views)。

# 管理 Athena 檢視
<a name="views-managing"></a>

在 Athena 主控台中，您可以：
+ 在列出資料表的左側窗格中，找到所有檢視。
+ 篩選檢視。
+ 預覽檢視、顯示其屬性、編輯它或刪除它。

**顯示檢視畫面的動作**

必須先建立檢視，檢視才會出現在主控台中。

1. 在 Athena 主控台中，選擇 **Views** (檢視)，然後選擇一個檢視以將其展開並在檢視中顯示資料欄。

1. 選擇檢視旁的三個垂直點可顯示檢視的動作清單。  
![\[檢視的動作選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/view-options.png)

1. 選擇動作可預覽檢視、將檢視名稱插入查詢編輯器中、刪除檢視、查看檢視的屬性，或在查詢編輯器中顯示和編輯檢視。

## 對 Athena 檢視支援的 DDL 動作
<a name="views-supported-actions"></a>

Athena 對檢視支援下列管理動作。


| 陳述式 | Description | 
| --- | --- | 
| [CREATE VIEW 和 CREATE PROTECTED MULTI DIALECT VIEW](create-view.md) |  從指定的 `SELECT` 查詢建立新的檢視。如需詳細資訊，請參閱[建立檢視](views-console.md#creating-views)。 選用的 `OR REPLACE` 子句可讓您透過取代來更新現有的檢視。  | 
| [DESCRIBE VIEW](describe-view.md) |  顯示指定檢視的資料欄清單。這可讓您檢查複雜檢視的屬性。  | 
| [DROP VIEW](drop-view.md) |  刪除現有的檢視。如果檢視不存在，選用的 `IF EXISTS` 子句可以阻止錯誤發生。  | 
| [SHOW CREATE VIEW](show-create-view.md) |  顯示用於建立指定檢視的 SQL 陳述式。  | 
| [SHOW VIEWS](show-views.md) |  列出指定的資料庫或目前資料庫 (如果省略資料庫名稱) 中的檢視。使用選用的 `LIKE` 子句搭配規則表達式，以限制檢視名稱的清單。您也可以在主控台的左側窗格中看到檢視清單。  | 
| [SHOW COLUMNS](show-columns.md) |  列出檢視的結構描述中的欄。  | 

# Athena 檢視的考量事項與限制
<a name="considerations-limitations-views"></a>

Athena 檢視具有下列考量事項與限制。

## 考量事項
<a name="considerations-views"></a>

在 Athena 中建立和使用檢視時有以下考量事項：
+ 在 Athena 中，您可以預覽和使用在 Athena 主控台、 中建立的檢視， AWS Glue Data Catalog 或在連接到相同目錄的 Amazon EMR 叢集上執行的 Presto。
+ 如果您已在資料目錄中建立 Athena 檢視，則資料目錄會將檢視視為資料表。您可以在資料目錄中使用資料表層級的精細存取控制，對這些檢視[限制存取](fine-grained-access-to-glue-resources.md)。
+  Athena 會阻止您執行遞迴檢視，且在這種情況下會顯示錯誤訊息。遞迴檢視是自我參考的檢視查詢。
+ Athena 會在偵測到過時的檢視時顯示錯誤訊息。當發生下列其中一種情況時，便會報告過時的檢視：
  + 檢視參考資料表或資料庫不存在。
  + 在參考的資料表中進行了結構描述或中繼資料變更。
  + 參考的資料表遭捨棄，並使用不同的結構描述或組態重新建立。
+ 只要巢狀檢視背後的查詢有效，而且資料表和資料庫存在，您就可以建立和執行巢狀檢視。

## 限制
<a name="limitations-views"></a>
+ Athena 檢視名稱不可包含除了底線 `(_)` 以外的特殊字元。如需詳細資訊，請參閱[為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)。
+ 避免使用預留關鍵字來命名檢視。如果您使用預留關鍵字，請在檢視的查詢中以雙引號括住預留關鍵字。請參閱 [在查詢中逸出預留關鍵字](reserved-words.md)。
+ 您無法將在 Athena 中建立的檢視與外部 Hive 中繼存放區或 UDF 搭配使用。如需使用在 Hive 外部建立的檢視的相關資訊，請參閱 [使用 Hive 檢視](hive-views.md)。
+ 您不能使用具有地理空間函數的檢視。
+ 對於 Amazon S3 中的資料，您無法使用檢視來管理存取控制。若要查詢檢視，您需要許可來存取 Amazon S3 中存放的資料。如需詳細資訊，請參閱[透過 Athena 控制 Amazon S3 的存取權](s3-permissions.md)。
+ 雖然 Athena 引擎版本 3 支援跨帳戶查詢檢視，但您無法建立包含跨帳戶 AWS Glue Data Catalog的檢視。如需有關跨帳戶資料目錄存取的資訊，請參閱[設定 AWS Glue 資料目錄的跨帳戶存取](security-iam-cross-account-glue-catalog-access.md)。
+ Athena 中的檢視不支援 Hive 或 Iceberg 隱藏的中繼資料欄 `$bucket`、`$file_modified_time`、`$file_size` 和 `$partition`。如需有關在 Athena 中使用 `$path` 中繼資料欄的資訊，請參閱 [在 Amazon S3 中取得來源資料的檔案位置](select.md#select-path)。

# 在 Athena 中使用 Data Catalog 檢視
<a name="views-glue"></a>

在 Amazon Athena 中建立 Data Catalog 檢視需要特殊的 `CREATE VIEW` 陳述式。進行查詢則使用傳統的 SQL `SELECT` 語法。Data Catalog 檢視也稱為*多方言*檢視或 MDV。

## 建立 Data Catalog 檢視
<a name="views-glue-creating-a-data-catalog-view"></a>

若要在 Athena 中建立 Data Catalog 檢視，請使用下列語法。

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW view_name 
SECURITY DEFINER 
[ SHOW VIEW JSON ]
AS athena-sql-statement
```

**注意**  
`SHOW VIEW JSON` 選項僅適用於 Data Catalog 檢視，並且不適用於 Athena 檢視。使用 `SHOW VIEW JSON` 選項會執行可驗證輸入的「試轉」，如果驗證成功，則會傳回將表示檢視的 AWS Glue 資料表物件的 JSON。此舉不會建立實際檢視。如果未指定 `SHOW VIEW JSON` 選項，則會完成驗證，並在 Data Catalog 中如常建立檢視。

下列範例顯示具有 `Definer` 角色的使用者如何建立 `orders_by_date` Data Catalog 檢視。此範例假設 `Definer` 角色對 `default` 資料庫中的 `orders` 資料表具有完整的 `SELECT` 許可。

```
CREATE PROTECTED MULTI DIALECT VIEW orders_by_date 
SECURITY DEFINER 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
WHERE order_city = 'SEATTLE' 
GROUP BY orderdate
```

如需語法資訊，請參閱 [CREATE PROTECTED MULTI DIALECT VIEW](create-view.md#create-protected-multi-dialect-view)。

## 查詢 Data Catalog 檢視
<a name="views-glue-querying-a-data-catalog-view"></a>

建立檢視之後，`Lake Formation` 管理員可將 Data Catalog 檢視的 `SELECT` 許可授予 `Invoker` 主體。然後，`Invoker` 主體可查詢檢視，而無需存取檢視參考的基礎基本資料表。以下是範例 `Invoker` 查詢。

```
SELECT * from orders_by_date where price > 5000
```

## 考量和限制
<a name="views-glue-limitations"></a>

下列大多數 Data Catalog 檢視限制專用於 Athena。如需 Data Catalog 檢視 (還適用於其他服務) 的其他限制，請參閱 Lake Formation 文件。
+ Data Catalog 檢視無法參考其他檢視、資料庫資源連結或資料表資源連結。
+ 檢視定義中可參考最多 10 個資料表。
+ 資料表不得具有 Lake Formation 中的 `IAMAllowedPrincipals` 資料湖許可。如果存在，則錯誤多方言檢視只能參考沒有 IAMAllowedPrincipals 許可的資料表。
+ 資料表的 Amazon S3 位置必須註冊為 Lake Formation 資料湖位置。如果資料表並未如此註冊，則會發生錯誤多方言檢視只能參考 Lake Formation 受管資料表。如需有關如何在 Lake Formation 中註冊 Amazon S3 位置的資訊，請參閱《AWS Lake Formation 開發人員指南**》中的[註冊 Amazon S3 位置](https://docs.aws.amazon.com/lake-formation/latest/dg/register-location.html)。
+  AWS Glue [GetTables](https://docs.aws.amazon.com/glue/latest/webapi/API_GetTables.html) 和 [SearchTables](https://docs.aws.amazon.com/glue/latest/webapi/API_SearchTables.html) API 呼叫不會更新 `IsRegisteredWithLakeFormation` 參數。若要檢視 參數的正確值，請使用 AWS Glue [GetTable](https://docs.aws.amazon.com/glue/latest/webapi/API_GetTable.html) API。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南**》中的 [GetTables 和 SearchTables API 不會更新 IsRegisteredWithLakeFormation 參數的值](https://docs.aws.amazon.com/lake-formation/latest/dg/limitations.html#issue-GetTables-value)。
+ `DEFINER` 主體只能是 IAM 角色。
+ `DEFINER` 角色必須具有基礎資料表的完整 `SELECT` (可授予) 許可。
+ `UNPROTECTED` Data Catalog 檢視不受支援。
+ 檢視定義中不支援使用者定義函數 (UDF)。
+ Athena 聯合資料來源無法用於 Data Catalog 檢視。
+ 外部 Hive 中繼儲存不支援 Data Catalog 檢視。
+ Athena 會在偵測到過時的檢視時顯示錯誤訊息。當發生下列其中一種情況時，便會報告過時的檢視：
  + 檢視參考資料表或資料庫不存在。
  + 在參考的資料表中進行了結構描述或中繼資料變更。
  + 參考的資料表遭捨棄，並使用不同的結構描述或組態重新建立。

## 許可
<a name="views-glue-permissions"></a>

Data Catalog 檢視需要三個角色：`Lake Formation Admin`、`Definer` 和 `Invoker`。
+ **`Lake Formation Admin`** – 具有設定所有 Lake Formation 許可的存取權。
+ **`Definer`** – 建立 Data Catalog 檢視。對於檢視定義參考的所有基礎資料表，`Definer` 角色必須具有完整的可授予 `SELECT` 許可。
+ **`Invoker`** – 可查詢 Data Catalog 檢視或檢查其中繼資料。若要顯示查詢的調用者，您可以使用 `invoker_principal()` DML 函式。如需詳細資訊，請參閱[invoker\$1principal()](functions-env3.md#functions-env3-invoker-principal)。

`Definer` 角色的信任關係必須允許 AWS Glue 和 Lake Formation 服務主體`sts:AssumeRole`的動作。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南**》中的[建立檢視的先決條件](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html#views-prereqs)。

還需要 Athena 進行存取的 IAM 許可。如需詳細資訊，請參閱[AWS Amazon Athena 的 受管政策](security-iam-awsmanpol.md)。

# 管理 Data Catalog 檢視
<a name="views-glue-managing"></a>

您可以使用 DDL 命令來更新和管理 Data Catalog 檢視。

## 更新 Data Catalog 檢視
<a name="views-glue-updating-a-data-catalog-view"></a>

`Lake Formation` 管理員或定義程式可使用 `ALTER VIEW UPDATE DIALECT` 語法來更新檢視定義。下列範例會修改檢視定義，以從 `returns` 資料表，而非 `orders` 資料表中選取資料欄。

```
ALTER VIEW orders_by_date UPDATE DIALECT
AS
SELECT return_date, sum(totalprice) AS price
FROM returns
WHERE order_city = 'SEATTLE'
GROUP BY orderdate
```

## AWS Glue Data Catalog 檢視支援的 DDL 動作
<a name="views-glue-supported-actions"></a>

Athena 支援下列 AWS Glue Data Catalog 檢視動作。


| 陳述式 | Description | 
| --- | --- | 
| [變更檢視方言](alter-view-dialect.md) |  透過新增引擎方言，或者更新或捨棄現有引擎方言來更新 Data Catalog 檢視。  | 
| [CREATE PROTECTED MULTI DIALECT VIEW](create-view.md#create-protected-multi-dialect-view) |  從指定的 `SELECT` 查詢建立 Data Catalog 檢視。如需詳細資訊，請參閱[CREATE PROTECTED MULTI DIALECT VIEW](create-view.md#create-protected-multi-dialect-view)。 選用的 `OR REPLACE` 子句可讓您透過取代來更新現有的檢視。  | 
| [DESCRIBE VIEW](describe-view.md) |  顯示指定檢視的資料欄清單。這可讓您檢查複雜檢視的屬性。  | 
| [DROP VIEW](drop-view.md) |  刪除現有的檢視。如果檢視不存在，選用的 `IF EXISTS` 子句可以阻止錯誤發生。  | 
| [SHOW CREATE VIEW](show-create-view.md) |  顯示用於建立指定檢視的 SQL 陳述式。  | 
| [SHOW VIEWS](show-views.md) |  列出指定的資料庫或目前資料庫 (如果省略資料庫名稱) 中的檢視。使用選用的 `LIKE` 子句搭配規則表達式，以限制檢視名稱的清單。您也可以在主控台的左側窗格中看到檢視清單。  | 
| [SHOW COLUMNS](show-columns.md) |  列出檢視的結構描述中的欄。  | 

# 使用已儲存的查詢
<a name="saved-queries"></a>

您可以使用 Athena 主控台保存、編輯、執行、重新命名和刪除您在 Athena 查詢編輯器中建立的查詢。

## 考量和限制
<a name="saved-queries-considerations-and-limitations"></a>
+ 您可以更新儲存的查詢的名稱、描述和查詢文字。
+ 您只能在您自己的帳戶中更新查詢。
+ 您無法變更查詢所屬的工作群組或資料庫。
+ Athena 不會保留查詢修改的歷史記錄。如果您要保留查詢的特定版本，請使用其他名稱進行儲存。

**注意**  
Amazon Athena 資源現可在 Amazon SageMaker Unified Studio (預覽版) 內進行存取，如此可協助您存取組織的資料，並使用最佳工具對其採取行動。您可以將儲存的查詢從 Athena 工作群組移轉至 SageMaker Unified Studio 專案、使用現有的 Athena 工作群組設定專案，以及透過 IAM 角色更新維護必要許可。如需詳細資訊，請參閱[將 Amazon Athena 資源移轉至 Amazon SageMaker Unified Studio (預覽版)](https://github.com/aws/Unified-Studio-for-Amazon-Sagemaker/tree/main/migration/athena)。

**Topics**
+ [考量和限制](#saved-queries-considerations-and-limitations)
+ [儲存查詢並命名](saved-queries-name.md)
+ [執行已儲存的查詢](saved-queries-run.md)
+ [編輯已儲存的查詢](saved-queries-edit.md)
+ [重新命名或刪除已儲存的查詢](saved-queries-rename-or-delete.md)
+ [重新命名未顯示的已儲存查詢](saved-queries-rename-not-displayed.md)
+ [刪除未顯示的已儲存查詢](saved-queries-delete-not-displayed.md)
+ [使用 Athena API 更新已儲存的查詢](saved-queries-update-with-api.md)

# 儲存查詢並命名
<a name="saved-queries-name"></a>

**若要儲存查詢並為其命名**

1. 在 Athena 主控台查詢編輯器中，輸入或執行查詢。

1. 在查詢編輯器視窗上方的查詢標籤上，選擇三個垂直點，然後選擇 **Save as** (另存新檔)。

1. 在 **Save query** (儲存查詢) 對話方塊中，輸入查詢的名稱和選擇性描述。您可以使用可展開的 **Preview SQL query** (預覽 SQL 查詢) 視窗先確認查詢的內容，然後再儲存查詢。

1. 選擇 **Save query** (儲存查詢)。

   在查詢編輯器中，查詢的索引標籤顯示您指定的名稱。

# 執行已儲存的查詢
<a name="saved-queries-run"></a>

**執行已儲存的查詢**

1. 在 Athena 主控台中，選擇 **Saved queries** (已儲存的查詢) 索引標籤。

1. 在 **Saved queries** (已儲存的查詢) 清單中，選擇您要執行的查詢 ID。

   查詢編輯器會顯示您選擇的查詢。

1. 選擇**執行**。

# 編輯已儲存的查詢
<a name="saved-queries-edit"></a>

**若要編輯已儲存的查詢**

1. 在 Athena 主控台中，選擇 **Saved queries** (已儲存的查詢) 索引標籤。

1. 在 **Saved queries** (已儲存的查詢) 清單中，選擇您要編輯的查詢 ID。

1. 在查詢編輯器中編輯查詢。

1. 執行下列步驟之一：
   + 若要執行查詢，選擇 **Run** (執行)。
   + 若要儲存查詢，請選擇查詢標籤上的三個垂直點，然後選擇 **Save** (儲存)。
   + 若要以不同的名稱儲存查詢，請選擇查詢標籤上的三個垂直點，然後選擇 **Save as** (另存新檔)。

# 重新命名或刪除已儲存的查詢
<a name="saved-queries-rename-or-delete"></a>

**重新命名或刪除已顯示在查詢編輯器中的已儲存的查詢**

1. 選擇查詢標籤上的三個垂直點，然後選擇 **Rename** (重新命名) 或 **Delete** (刪除)。

1. 依照提示重新命名或刪除查詢。

# 重新命名未顯示的已儲存查詢
<a name="saved-queries-rename-not-displayed"></a>

**若要重新命名已顯示在查詢編輯器中的已儲存的查詢**

1. 在 Athena 主控台中，選擇 **Saved queries** (已儲存的查詢) 索引標籤。

1. 選取您要重新命名的查詢的核取方塊。

1. 選擇 **Rename (重新命名)**。

1. 在 **Rename query** (重新命名查詢) 對話方塊中，編輯查詢的名稱和查詢的描述。您可以使用可展開的 **Preview SQL query** (預覽 SQL 查詢) 視窗先確認查詢的內容，然後再重新命名。

1. 選擇 **Rename query** (重新命名查詢)。

   重命名的查詢會出現在 **Saved queries** (已儲存的查詢) 清單中。

# 刪除未顯示的已儲存查詢
<a name="saved-queries-delete-not-displayed"></a>

**若要刪除已顯示在查詢編輯器中的已儲存的查詢**

1. 在 Athena 主控台中，選擇 **Saved queries** (已儲存的查詢) 索引標籤。

1. 選取一個或多個您要刪除的查詢的核取方塊。

1. 選擇 **刪除**。

1. 在確認提示中，選擇 **Delete** (刪除)。

   將從 **Saved queries** (已儲存的查詢) 清單中刪除一個或多個查詢。

# 使用 Athena API 更新已儲存的查詢
<a name="saved-queries-update-with-api"></a>

如需有關使用 Athena API 更新已儲存的查詢的詳細資訊，請參閱 Athena API 參考中的 [UpdateNamedQuery](https://docs.aws.amazon.com/athena/latest/APIReference/API_UpdateNamedQuery.html) 動作。

# 使用參數化查詢
<a name="querying-with-prepared-statements"></a>

您可以使用 Athena 參數化查詢，在執行時間使用不同的參數值重新執行相同的查詢，並協助防範 SQL 隱碼攻擊。在 Athena 中，參數化查詢可以採用任何 DML 查詢或 SQL 預備陳述式中的執行參數形式。
+ 具有執行參數的查詢可以在一個步驟中完成，而且並非針對特定工作群組。對於您想要參數化的值，可以在任何 DML 查詢中放置問號。當您執行查詢時，依序宣告執行參數值。參數的宣告和參數值的指派可以在同一個查詢中完成，但是以解耦的方式進行。與預備陳述式不同，您可以在提交具有執行參數的查詢時選取工作群組。
+ 預備陳述式需要兩個獨立的 SQL 陳述式：`PREPARE` 和 `EXECUTE`。首先，您在 `PREPARE` 陳述式中定義參數。接下來，執行一個為您定義的參數提供值的 `EXECUTE` 陳述式。預備陳述式針對特定工作群組；您無法在其所屬的工作群組情境之外執行這些陳述式。

## 考量和限制
<a name="querying-with-prepared-statements-considerations-and-limitations"></a>
+ Athena 引擎版本 2 和更新版本才支援參數化查詢。如需有關 Athena 引擎版本的資訊，請參閱[Athena 引擎版本控制](engine-versions.md)。
+ 目前，參數化查詢僅支援 `SELECT`、`INSERT INTO`、`CTAS` 以及 `UNLOAD` 陳述式。
+ 在參數化查詢中，參數具有位置性，以 `?` 表示。依參數在查詢中的順序指派參數值。不支援具名參數。
+ 目前，`?` 參數只能放置在 `WHERE` 子句。不支援類似 `SELECT ? FROM table` 的語法。
+ 問號參數不能放在雙引號或單引號中 (也就是說，`'?'` 和 `"?"` 不是有效的語法)。
+ 若要將 SQL 執行參數視為字串，它們必須使用單引號而非雙引號。
+ 如有必要，您可以在輸入參數化術語的值時使用 `CAST` 函數。例如，如果您有一個已在查詢中參數化的 `date` 類型資料欄，並且想要查詢日期 `2014-07-05`，則輸入 `CAST('2014-07-05' AS DATE)` 參數值將會傳回結果。
+ 預備陳述式針對特定工作群組，預備陳述式的名稱在工作群組中必須是唯一的。
+ 需要預備陳述式的 IAM 權限。如需詳細資訊，請參閱[設定存取預備陳述式](security-iam-athena-prepared-statements.md)。
+ 在 Athena 主控台中具有執行參數的查詢限制為最多 25 個問號。

**Topics**
+ [考量和限制](#querying-with-prepared-statements-considerations-and-limitations)
+ [使用執行參數](querying-with-prepared-statements-querying-using-execution-parameters.md)
+ [使用預備陳述式](querying-with-prepared-statements-querying.md)
+ [其他資源](querying-with-prepared-statements-additional-resources.md)

# 使用執行參數
<a name="querying-with-prepared-statements-querying-using-execution-parameters"></a>

您可以在任何 DML 查詢中使用問號預留位置來建立參數化查詢，無需建立預備陳述式。若要執行這些查詢，您可以使用 Athena 主控台，或使用 AWS CLI 或 AWS 開發套件，並在 `execution-parameters` 引數中宣告變數。

**Topics**
+ [使用 Athena 主控台](querying-with-prepared-statements-running-queries-with-execution-parameters-in-the-athena-console.md)
+ [使用 AWS CLI](querying-with-prepared-statements-running-queries-with-execution-parameters-using-the-aws-cli.md)

# 在 Athena 主控台中執行具有執行參數的查詢
<a name="querying-with-prepared-statements-running-queries-with-execution-parameters-in-the-athena-console"></a>

當您在 Athena 主控台中執行具有執行參數 (問號) 的參數化查詢時，系統會依照問號在查詢中出現的順序提示您輸入值。

**若要執行具有執行參數的查詢**

1. 在 Athena 編輯器中輸入帶有問號預留位置的查詢，如以下範例所示。

   ```
   SELECT * FROM "my_database"."my_table"
   WHERE year = ? and month= ? and day= ?
   ```

1. 選擇**執行**。

1. 在 **Enter parameters** (輸入參數) 對話方塊中，依序輸入查詢中每個問號的值。  
![\[依序輸入查詢參數的值\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-with-prepared-statements-1.png)

1. 完成參數輸入後，請選擇 **Run** (執行)。編輯器會顯示您輸入之參數值的查詢結果。

在此時，您可以執行以下其中一項：
+ 為相同的查詢輸入不同的參數值，然後選擇 **Run again** (再次執行)。
+ 若要一次清除輸入的所有值，請選擇 **Clear** (清除)。
+ 若要直接編輯查詢 (例如，若要新增或移除問號)，請先關閉 **Enter parameters** (輸入參數) 對話方塊。
+ 若要儲存參數化查詢以供日後使用，請選擇 **Save** (儲存) 或 **Save as** (另存為)，然後為查詢命名。如需使用已儲存查詢的詳細資訊，請參閱 [使用已儲存的查詢](saved-queries.md)。

為了方便起見，只要您在查詢編輯器中使用相同的索引標籤，**Enter parameters** (輸入參數) 對話方塊就會記住您先前為查詢輸入的值。

# 使用 搭配執行參數執行查詢 AWS CLI
<a name="querying-with-prepared-statements-running-queries-with-execution-parameters-using-the-aws-cli"></a>

若要使用 AWS CLI 搭配執行參數執行查詢，請使用 `start-query-execution`命令，並在 `query-string`引數中提供參數化查詢。然後，在 `execution-parameters` 引數中，提供執行參數的值。以下範例說明此技術。

```
aws athena start-query-execution 
--query-string "SELECT * FROM table WHERE x = ? AND y = ?"
--query-execution-context "Database"="default" 
--result-configuration "OutputLocation"="s3://amzn-s3-demo-bucket;/..."
--execution-parameters "1" "2"
```

# 使用預備陳述式
<a name="querying-with-prepared-statements-querying"></a>

您可以使用預備陳述式來重複執行具有不同查詢參數的相同查詢。預備陳述式包含參數預留位置，其值在執行時提供。

**注意**  
工作群組中預備陳述式的數量上限為 1000。

**Topics**
+ [SQL 語法](querying-with-prepared-statements-sql-statements.md)
+ [使用 Athena 主控台](querying-with-prepared-statements-executing-prepared-statements-without-the-using-clause-athena-console.md)
+ [使用 AWS CLI](querying-with-prepared-statements-cli-section.md)

# 預備陳述式的 SQL 語法
<a name="querying-with-prepared-statements-sql-statements"></a>

您可以使用 `PREPARE`、`EXECUTE` 和 `DEALLOCATE PREPARE` SQL 陳述式，在 Athena 主控台查詢編輯器中執行參數化查詢。

 
+ 若要指定您通常會使用常值的參數，請使用 `PREPARE` 陳述式中的問號。
+ 若要在執行查詢時以值取代參數，請使用 `EXECUTE` 陳述式中的 `USING` 子句。
+ 若要從工作群組的預備陳述式中移除預備陳述式，請使用 `DEALLOCATE PREPARE` 陳述式。

下列各節提供有關各個陳述式的其他詳細資訊。

**Topics**
+ [PREPARE](querying-with-prepared-statements-prepare.md)
+ [EXECUTE](querying-with-prepared-statements-execute.md)
+ [DEALLOCATE PREPARE](querying-with-prepared-statements-deallocate-prepare.md)

# PREPARE
<a name="querying-with-prepared-statements-prepare"></a>

預備好要在稍後執行的陳述式。預備陳述式會以您指定的名稱儲存在目前的工作群組中。該陳述式可以包含可代替文字的參數，以在查詢執行時替換文字。要由值取代的參數以問號表示。

## 語法
<a name="querying-with-prepared-statements-prepare-syntax"></a>

```
PREPARE statement_name FROM statement
```

下表描述了這些參數。


****  

| 參數 | Description | 
| --- | --- | 
| statement\$1name | 要預備之陳述式的名稱。該名稱在工作群組內必須是唯一的。 | 
| 陳述式 | SELECT、CTAS 或 INSERT INTO 查詢。 | 

## PREPARE 範例
<a name="querying-with-prepared-statements-prepare-examples"></a>

下列範例顯示如何使用 `PREPARE` 陳述式。問號表示執行查詢時由 `EXECUTE` 陳述式提供的值。

```
PREPARE my_select1 FROM
SELECT * FROM nation
```

```
PREPARE my_select2 FROM
SELECT * FROM "my_database"."my_table" WHERE year = ?
```

```
PREPARE my_select3 FROM
SELECT order FROM orders WHERE productid = ? and quantity < ?
```

```
PREPARE my_insert FROM
INSERT INTO cities_usa (city, state)
SELECT city, state
FROM cities_world
WHERE country = ?
```

```
PREPARE my_unload FROM
UNLOAD (SELECT * FROM table1 WHERE productid < ?)
TO 's3://amzn-s3-demo-bucket/'
WITH (format='PARQUET')
```

# EXECUTE
<a name="querying-with-prepared-statements-execute"></a>

執行預備陳述式。參數的值在 `USING` 子句中指定。

## 語法
<a name="querying-with-prepared-statements-execute-syntax"></a>

```
EXECUTE statement_name [USING value1 [ ,value2, ... ] ]
```

*statement\$1name* 是預備陳述式的名稱。*value1* 和 *value2* 是要為陳述式中的參數指定的值。

## EXECUTE 範例
<a name="querying-with-prepared-statements-execute-examples"></a>

下列範例會執行 `my_select1` 預備陳述式，其中不包含任何參數。

```
EXECUTE my_select1
```

下列範例會執行 `my_select2` 預備陳述式，其中包含一個參數。

```
EXECUTE my_select2 USING 2012
```

下列範例會執行 `my_select3` 預備陳述式，其中有兩個參數。

```
EXECUTE my_select3 USING 346078, 12
```

下列範例為預備陳述式 `my_insert` 中的參數提供字串值。

```
EXECUTE my_insert USING 'usa'
```

下列範例為預備陳述式 `my_unload` 中的 `productid` 參數提供數值。

```
EXECUTE my_unload USING 12
```

# DEALLOCATE PREPARE
<a name="querying-with-prepared-statements-deallocate-prepare"></a>

從目前工作群組的預備陳述式清單中移除具有指定名稱的預備陳述式。

## 語法
<a name="querying-with-prepared-statements-deallocate-prepare-syntax"></a>

```
DEALLOCATE PREPARE statement_name
```

*statement\$1name* 是要移除的預備陳述式名稱。

## 範例
<a name="querying-with-prepared-statements-deallocate-prepare-examples"></a>

下列範例會從目前的工作群組中移除 `my_select1` 預備陳述式。

```
DEALLOCATE PREPARE my_select1
```

# 在 Athena 主控台中，執行互動式預備陳述式
<a name="querying-with-prepared-statements-executing-prepared-statements-without-the-using-clause-athena-console"></a>

如果您在查詢編輯器中使用語法 `EXECUTE` *prepared\$1statement* 執行現有的預備陳述式，則 Athena 會開啟 **Enter parameters** (輸入參數) 對話方塊，以便您輸入通常會進入 `EXECUTE ... USING` 陳述式 `USING` 子句的值。

**若要使用 **Enter parameters** (輸入參數) 對話方塊執行預備陳述式**

1. 在查詢編輯器中，使用語法 `EXECUTE` *prepared\$1statement*，而不是使用語法 `EXECUTE prepared_statement USING` *value1*`,` *value2* ` ...`。

1. 選擇**執行**。出現 **Enter parameters** (輸入參數) 對話方塊。  
![\[在 Athena 主控台中輸入預備陳述式的參數值。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-with-prepared-statements-2.png)

1. 在 **Execution parameters** (執行參數) 對話方塊中依序輸入值。由於看不到查詢的原始文字，因此您必須記住每個位置參數的意義，或有預備陳述式可供參考。

1. 選擇**執行**。

# 使用 AWS CLI 建立、執行和列出預備陳述式
<a name="querying-with-prepared-statements-cli-section"></a>

您可以使用 AWS CLI 來建立、執行和列出預備陳述式。

**Topics**
+ [建立](querying-with-prepared-statements-creating-prepared-statements-using-the-aws-cli.md)
+ [Execute](querying-with-prepared-statements-cli-executing-prepared-statements.md)
+ [清單](querying-with-prepared-statements-listing.md)

# 使用 建立預備陳述式 AWS CLI
<a name="querying-with-prepared-statements-creating-prepared-statements-using-the-aws-cli"></a>

若要使用 AWS CLI 建立預備陳述式，您可以使用下列其中一個`athena`命令：
+ 使用 `create-prepared-statement` 命令並提供具有執行參數的查詢陳述式。
+ 使用 `start-query-execution` 指令並提供使用 `PREPARE` 語法的查詢字串。

## 使用 create-prepared-statement
<a name="querying-with-prepared-statements-cli-using-create-prepared-statement"></a>

在 `create-prepared-statement` 命令中，在 `query-statement` 引數中定義查詢文字，如以下範例所示。

```
aws athena create-prepared-statement 
--statement-name PreparedStatement1 
--query-statement "SELECT * FROM table WHERE x = ?" 
--work-group athena-engine-v2
```

## 使用 start-query-execution 和 PREPARE 語法
<a name="querying-with-prepared-statements-cli-using-start-query-execution-and-the-prepare-syntax"></a>

使用 `start-query-execution` 命令。將 `PREPARE` 陳述式放置在 `query-string` 引數中，如以下範例所示：

```
aws athena start-query-execution 
--query-string "PREPARE PreparedStatement1 FROM SELECT * FROM table WHERE x = ?" 
--query-execution-context '{"Database": "default"}' 
--result-configuration '{"OutputLocation": "s3://amzn-s3-demo-bucket/..."}'
```

# 使用 執行預備陳述式 AWS CLI
<a name="querying-with-prepared-statements-cli-executing-prepared-statements"></a>

若要使用 執行預備陳述式 AWS CLI，您可以使用下列其中一種方法提供參數的值：
+ 使用 `execution-parameters` 引數。
+ 在 `query-string` 引數中使用 `EXECUTE ... USING` SQL 語法。

## 使用執行參數引數
<a name="querying-with-prepared-statements-cli-using-the-execution-parameters-argument"></a>

在此方式中，您可以使用 `start-query-execution` 命令並在 `query-string` 引數中提供現有預備陳述式的名稱。然後，在 `execution-parameters` 引數中，提供執行參數的值。此方法如以下範例所示。

```
aws athena start-query-execution 
--query-string "Execute PreparedStatement1" 
--query-execution-context "Database"="default" 
--result-configuration "OutputLocation"="s3://amzn-s3-demo-bucket/..."
--execution-parameters "1" "2"
```

## 使用 EXECUTE ... 使用 SQL 語法
<a name="querying-with-prepared-statements-cli-using-the-execute-using-sql-syntax"></a>

若要使用 `EXECUTE ... USING` 語法執行現有的預備陳述式，您可以使用 `start-query-execution` 命令並將預備陳述式的名稱和參數值都放在 `query-string` 引數中，如以下範例所示：

```
aws athena start-query-execution 
--query-string "EXECUTE PreparedStatement1 USING 1"
--query-execution-context '{"Database": "default"}' 
--result-configuration '{"OutputLocation": "s3://amzn-s3-demo-bucket/..."}'
```

# 使用 列出預備陳述式 AWS CLI
<a name="querying-with-prepared-statements-listing"></a>

若要列出特定工作群組的預備陳述式，您可以使用 Athena [list-prepared-statements](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/list-prepared-statements.html) AWS CLI 命令或 [ListPreparedStatements](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListPreparedStatements.html) Athena API 動作。`--work-group` 參數是必要參數。

```
aws athena list-prepared-statements --work-group primary
```

# 其他資源
<a name="querying-with-prepared-statements-additional-resources"></a>

請參閱 AWS 大數據部落格中的下列相關文章。
+ [Improve reusability and security using Amazon Athena parameterized queries](https://aws.amazon.com/blogs/big-data/improve-reusability-and-security-using-amazon-athena-parameterized-queries/) (使用 Amazon Athena 參數化查詢改善可再用性和安全性) 
+ [Use Amazon Athena parameterized queries to provide data as a service](https://aws.amazon.com/blogs/big-data/use-amazon-athena-parameterized-queries-to-provide-data-as-a-service/) (使用 Amazon Athena 參數化查詢提供資料即服務) 

# 使用成本型最佳化工具
<a name="cost-based-optimizer"></a>

您可以使用 Athena SQL 中的成本型最佳化工具 (CBO) 功能，來最佳化您的查詢。您可以選擇請求 Athena 為 AWS Glue的其中一個資料表收集資料表，或資料欄層級的統計資訊。如果查詢中的所有資料表都有統計資訊，Athena 會使用這些統計資訊建立其判斷為效能最佳的執行計畫。查詢最佳化工具會依據統計模型計算備選計畫，然後選取執行查詢最快的計劃。

 AWS Glue 資料表的統計資料會收集並儲存在 中， AWS Glue Data Catalog 並提供給 Athena 以改善查詢規劃和執行。這些統計資訊是有關檔案類型 (例如 Parquet、ORC、JSON、ION、CSV 和 XML) 的資料欄層級的統計資訊，例如不同值的數目、空值數目、最大值和最小值。Amazon Athena 會使用這些統計資訊，儘早在查詢處理中套用限制最嚴格的篩選條件，以最佳化查詢。這項篩選會限制記憶體用量，以及為傳送查詢結果必須讀取的記錄數目。

當與 CBO 結合時，Athena 會使用稱為規則型最佳化工具 (RBO) 的功能。RBO 以機械方式套用預期可以改善查詢效能的規則。RBO 通常是有益的，因為它的轉換旨在簡化查詢計畫。但是，由於 RBO 不執行成本計算或計畫比較，因此更複雜的查詢會使 RBO 難以建立最佳計劃。

因此，Athena 同時使用 RBO 和 CBO 來最佳化您的查詢。Athena 在識別到改善查詢執行的機會之後，就會建立最佳計畫。如需有關執行計畫的詳細資訊，請參閱 [檢視 SQL 查詢的執行計畫](query-plans.md)。如需 CBO 運作方式的詳細討論，請參閱 AWS 巨量資料部落格中的[使用 Amazon Athena 中的成本型最佳化工具加速查詢](https://aws.amazon.com/blogs/big-data/speed-up-queries-with-cost-based-optimizer-in-amazon-athena/)。

若要產生 AWS Glue 目錄資料表的統計資料，您可以使用 Athena 主控台 AWS Glue 、主控台或 AWS Glue APIs。由於 Athena 已與 AWS Glue Catalog 整合，因此當您從 Amazon Athena 執行查詢時，會自動取得對應的查詢效能改進。

## 考量和限制
<a name="cost-based-optimizer-considerations-and-limitations"></a>
+ **資料表類型** – 目前，Athena 的 CBO 功能只支援 AWS Glue Data Catalog中的 Hive 和 Iceberg 資料表。
+ **Athena for Spark** – CBO 功能在 Athena for Spark 中不可用。
+ **定價** – 如需定價資訊，請造訪 [AWS Glue 定價頁面](https://aws.amazon.com/glue/pricing)。

## 使用 Athena 主控台產生資料表統計資訊
<a name="cost-based-optimizer-generating-table-statistics-using-the-athena-console"></a>

本節說明如何使用 Athena 主控台在 AWS Glue中產生資料表或資料表資料欄層級的統計資訊。如需使用 AWS Glue 產生資料表統計資料的資訊，請參閱《 *AWS Glue 開發人員指南*》中的[使用資料欄統計資料](https://docs.aws.amazon.com/glue/latest/dg/column-statistics.html)。

**若要使用 Athena 主控台產生資料表統計資訊**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在 Athena 查詢編輯器的**資料表**清單中，為您想要的資料表選擇三個垂直點，然後選擇**產生統計資訊**。  
![\[Athena 查詢編輯器中的資料表內容選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/cost-based-optimizer-1.png)

1. 在**產生統計資訊**對話方塊中，選擇**所有資料欄**以產生資料表中所有資料欄的統計資訊，或選擇**選取的資料欄**來選取特定的資料欄。預設值是**所有資料欄**。  
![\[「產生統計資訊」對話方塊。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/cost-based-optimizer-2.png)

1. 針對**AWS Glue 服務角色**，建立或選取現有的服務角色，以授予 產生統計資料 AWS Glue 的許可。 AWS Glue 服務角色還需要對包含資料表資料的 Amazon S3 儲存貯體的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 許可。  
![\[選擇 AWS Glue 服務角色。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/cost-based-optimizer-3.png)

1. 選擇**產生統計資料**。**正在產生 *table\$1name* 的統計資訊**通知橫幅會顯示任務狀態。  
![\[「正在產生統計資訊」通知橫幅。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/cost-based-optimizer-4.png)

1. 若要在 AWS Glue 主控台中檢視詳細資訊，請選擇在 **Glue 中檢視**。

   如需有關在 AWS Glue 主控台中檢視統計資料的資訊，請參閱[《 開發人員指南》中的檢視欄統計資料](https://docs.aws.amazon.com/glue/latest/dg/view-column-stats.html)。 *AWS Glue *

1. 產生統計資訊之後，具有統計資訊的資料表和資料欄會在括弧中顯示**統計資訊**一詞，如下圖所示。  
![\[Athena 查詢編輯器中顯示統計資訊圖示的資料表。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/cost-based-optimizer-5.png)

現在，當您執行查詢時，Athena 會針對產生統計資訊的資料表和資料欄，執行成本型最佳化。

## 啟用和停用資料表統計資訊
<a name="cost-based-optimizer-enabling-iceberg-table-statistics"></a>

當您依照上一節的步驟產生 Iceberg 資料表的資料表統計資料時，名為 的 Glue 資料表屬性`use_iceberg_statistics`會自動新增至 中的 Iceberg 資料表， AWS Glue Data Catalog 並預設為 **true**。如果您移除此屬性或將其設定為 **false**，則在查詢執行期間，CBO 不會在嘗試最佳化查詢計畫時使用 Iceberg 資料表統計資訊，即使該統計資訊是由 Glue 產生的。如需有關如何產生資料表統計資訊的詳細資訊，請參閱 [使用 Athena 主控台產生資料表統計資訊](#cost-based-optimizer-generating-table-statistics-using-the-athena-console)。

相反地，Glue Data Catalog 中的 Hive 資料表沒有類似的資料表屬性，無法啟用或停用 CBO 的資料表統計資訊。因此，CBO 在嘗試最佳化 Hive 資料表的查詢計畫時，一律會使用 Glue 產生的資料表統計資訊。

## 其他資源
<a name="cost-based-optimizer-additional-resources"></a>

如需其他資訊，請參閱以下資源。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/zUHEXJdHUxs?si=rMAhJj3I5IlhN-1R/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/zUHEXJdHUxs?si=rMAhJj3I5IlhN-1R)


# 查詢 S3 Express One Zone 資料
<a name="querying-express-one-zone"></a>

Amazon S3 Express One Zone 儲存類別是一種高效能 Amazon S3 儲存類別，可提供延遲不到 10 毫秒的回應時間。因此，對於經常以每秒數十萬個請求存取資料的應用程式而言非常有用。

S3 Express 單區域會在相同的可用區域內複寫和存放資料，以最佳化速度和成本。這與 Amazon S3 區域儲存類別不同，後者會自動在 內至少三個 AWS 可用區域中複寫資料 AWS 區域。

如需詳細資訊，請參閱《Amazon S3 使用者指南》**中的[什麼是 S3 Express 單區域？](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-one-zone.html)。

## 先決條件
<a name="querying-express-one-zone-prerequisites"></a>

請確認滿足下列條件再開始：
+ **Athena 引擎第 3 版** – 若要搭配 Athena SQL 使用 S3 Express 單區域，您的工作群組必須設定為使用 Athena 引擎第 3 版。
+ **S3 Express 單區域許可** – 當 S3 Express 單區域在 Amazon S3 物件上呼叫 `GET`、`LIST` 或 `PUT` 等動作，儲存類別會代表您呼叫 `CreateSession`。因此，您的 IAM 政策必須允許 `s3express:CreateSession` 動作，這樣 Athena 才能調用對應的 API 作業。

## 考量和限制
<a name="querying-express-one-zone-considerations-and-limitations"></a>

當您使用 Athena 查詢 S3 Express 單區域時，請考慮下列幾點。
+ S3 Express One Zone 儲存貯體支援 `SSE_S3` 和 `SSE-KMS` 加密。無論您在工作群組設定中選擇哪個選項來加密查詢結果，都會使用 `SSE_S3` 加密來編寫 Athena 查詢結果。此限制包括 Athena 將資料寫入 S3 Express 單區域儲存貯體的所有案例，包括 `CREATE TABLE AS` (CTA) 和 `INSERT INTO` 陳述式。
+  AWS Glue 爬蟲程式不支援在 S3 Express One Zone 資料上建立資料表。
+ `MSCK REPAIR TABLE` 陳述式不受支援。解決方法是使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。
+ S3 Express One Zone 不支援修改 DDL 陳述式 (即不支援 `ALTER TABLE` 陳述式) 的 Apache Iceberg 資料表。
+ S3 Express One Zone 儲存貯體不支援 Lake Formation。
+ 下列檔案和資料表格式不受支援或支援有限。如果格式未列出，但 Athena 支援這些格式 (例如 Parquet、ORC 和 JSON)，則使用 S3 Express 單區域時也支援這些格式。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/querying-express-one-zone.html)

## 開始使用
<a name="querying-express-one-zone-getting-started"></a>

使用 Athena 查詢 S3 Express 單區域資料非常簡單。若要開始使用，請使用下列程序。

**使用 Athena SQL 查詢 S3 Express 單區域資料**

1. 將您的資料轉移到 S3 Express 單區域儲存。如需詳細資訊，請參閱《Amazon S3 使用者指南》**中的[設定物件的儲存類別](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html#sc-howtoset)。

1. 使用 Athena 中的 [CREATE TABLE](create-table.md) 陳述式來編目 AWS Glue Data Catalog中的資料。如需在 Athena 中建立資料表的詳細資訊，請參閱 [在 Athena 中建立資料表](creating-tables.md) 和 [CREATE TABLE](create-table.md) 陳述式。

1. (選用) 設定 Athena 工作群組的查詢結果位置，以使用 Amazon S3 *目錄儲存貯體*。Amazon S3 目錄儲存貯體的效能比一般儲存貯體更佳，並且專為需要延遲不到 10 毫秒持續效能的工作負載或效能關鍵型應用程式而設計。如需詳細資訊，請參閱《Amazon S3 使用者指南》**中的[目錄儲存貯體概觀](https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html)。

# 查詢還原的 Amazon Glacier 物件
<a name="querying-glacier"></a>

您可以使用 Athena 查詢從 Amazon Glacier Flexible Retrieval (舊稱 Glacier) 和 Amazon Glacier Deep Archive [Amazon S3 儲存類別](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html#sc-glacier)中還原的物件。您必須基於每個資料表啟用此功能。如果您在執行查詢之前未在資料表上啟用此功能，Athena 會在查詢執行期略過資料表的所有 Amazon Glacier Flexible Retrieval 和 Amazon Glacier Deep Archive 物件。

## 考量事項與限制
<a name="querying-glacier-considerations-and-limitations"></a>
+  只有 Athena 引擎版本 3 才支援查詢還原的 Amazon Glacier 物件。
+  此功能僅支援 Apache Hive 資料表。
+  在查詢資料之前，您必須先還原物件；Athena 不會為您還原物件。

## 設定資料表，以使用還原的物件
<a name="querying-glacier-configuring-a-table-to-use-restored-objects"></a>

 若要將 Athena 資料表設定為在查詢中包含還原的物件，您必須將其 `read_restored_glacier_objects` 資料表屬性設定為 `true`。若要這樣做，您可以使用 Athena 查詢編輯器或 AWS Glue 主控台。您也可以使用 [AWS Glue CLI](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/update-table.html)、[AWS Glue API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-UpdateTable) 或 [AWS Glue SDK](https://docs.aws.amazon.com/glue/latest/dg/sdk-general-information-section.html)。

### 使用 Athena 查詢編輯器
<a name="querying-glacier-using-the-athena-query-editor"></a>

 在 Athena 中，您可以使用 [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md) 命令來設定資料表屬性，如下列範例所示。

```
ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'true')
```

### 使用 AWS Glue 主控台
<a name="querying-glacier-using-the-aws-glue-console"></a>

 在 AWS Glue 主控台中，執行下列步驟來新增`read_restored_glacier_objects`資料表屬性。

**在 AWS Glue 主控台中設定資料表屬性**

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

1. 執行以下任意一項：
   + 選擇**移至資料目錄**。
   + 在導覽窗格中，選擇**資料目錄資料表**。

1. 在**資料表**頁面的資料表清單中，選擇您要編輯之資料表的連結。

1. 選擇 **Actions** (動作)、**Edit table** (編輯資料表)。

1. 在**編輯資料表**頁面的**資料表屬性**區段中，新增下列鍵值對。
   + 對於 **Key** (索引鍵)，新增 `read_restored_glacier_objects`。
   + 針對**數值**，輸入 `true`。

1. 選擇**儲存**。

### 使用 AWS CLI
<a name="querying-glacier-using-the-aws-cli"></a>

 在 中 AWS CLI，您可以使用 AWS Glue [update-table](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/update-table.html) 命令及其`--table-input`引數來重新定義資料表，並在 中新增 `read_restored_glacier_objects` 屬性。在 `--table-input` 引數中，使用 `Parameters` 結構來指定 `read_restored_glacier_objects` 屬性和 `true` 的值。請注意，`--table-input` 的引數不得有空格，且必須使用反斜線來逸出雙引號。在以下範例中，使用您資料庫和資料表的名稱取代 *my\$1database* 和 *my\$1table*。

```
aws glue update-table \
   --database-name my_database \
   --table-input={\"Name\":\"my_table\",\"Parameters\":{\"read_restored_glacier_objects\":\"true\"}}
```

**重要**  
 AWS Glue `update-table` 命令會以覆寫模式運作，這表示它會以 `table-input` 參數指定的新定義取代現有的資料表定義。因此，在新增 `read_restored_glacier_objects` 屬性時，請務必也在 `table-input` 參數中指定您想要在資料表中顯示的所有欄位。

# 處理結構描述更新
<a name="handling-schema-updates-chapter"></a>

本節指導處理各種資料格式的結構描述更新。Athena 是一種讀取時定義結構描述的查詢引擎。這表示當您在 Athena 中建立資料表時，將於讀取資料時套用結構描述。並不會變更或重寫基礎資料。

如果您預期資料表結構描述會變更，請考慮以符合您需要的資料格式建立結構描述。您的目標是隨著不斷演變的結構描述而重複使用現有的 Athena 查詢，並避免在查詢含有分割區的資料表時，發生結構描述不符的錯誤。

為了達到這些目標，請根據下列主題中的表格來選擇資料表的資料格式。

**Topics**
+ [資料格式支援的結構描述更新操作](#summary-of-updates)
+ [了解 Apache ORC 和 Apache Parquet 的索引存取](#index-access)
+ [進行結構描述更新](make-schema-updates.md)
+ [更新含有分割區的資料表](updates-and-partitions.md)

## 資料格式支援的結構描述更新操作
<a name="summary-of-updates"></a>

下表彙總資料儲存格式及其支援的結構描述操作。使用此資料表協助您選擇格式，即使結構描述隨著時間而變更，此格式也能讓您繼續使用 Athena 查詢。

在此表格中，請注意 Parquet 和 ORC 是單欄式格式，具有不同的預設欄存取方法。在預設情況下，Parquet 依名稱存取欄，而 ORC 依索引 (序數值) 存取欄。因此，Athena 提供建立資料表時定義的 SerDe 屬性，以切換預設資料欄存取方法，順應結構描述演變而能有更大的靈活性。

對於 Parquet，`parquet.column.index.access` 屬性可以設為 `true`，以設定資料欄存取方法來使用資料欄的序號。將此屬性設為 `false` 會變更欄存取方法來使用欄名稱。同樣地，對於 ORC，請使用 `orc.column.index.access` 屬性來控制欄存取方法。如需詳細資訊，請參閱[了解 Apache ORC 和 Apache Parquet 的索引存取](#index-access)。

CSV 和 TSV 可讓您執行所有結構描述操作，但不包括重新排序欄，或在資料表開頭新增欄。例如，如果您的結構描述演變只需要重新命名欄，而不需要移除欄，則您可以選擇以 CSV 或 TSV 建立資料表。如果您需要移除欄，請勿使用 CSV 或 TSV，而應該使用任何其他支援的格式，最好是單欄格式，例如 Parquet 或 ORC。


**Athena 中的結構描述更新和資料格式**  

| 預期的結構描述更新類型 | 摘要 | CSV (具有和沒有標頭) 和 TSV | JSON | AVRO | PARQUET：依名稱讀取 (預設) | PARQUET：依索引讀取 | ORC：依索引讀取 (預設) | ORC：依名稱讀取 | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | 
|  [重新命名欄](updates-renaming-columns.md) | 以 CSV 和 TSV 存放資料，或如果是依索引讀取資料，請以 ORC 和 Parquet 存放資料。 | Y | N | N | N  | Y | Y | N | 
|  [在資料表開頭或中間新增欄](updates-add-columns-beginning-middle-of-table.md) | 以 JSON、AVRO 存放資料，或如果是依名稱讀取資料，請以 Parquet 和 ORC 存放資料。請勿使用 CSV 和 TSV。 | N | Y | Y | Y | N | N | Y | 
|  [在資料表尾端新增欄](updates-add-columns-end-of-table.md) | 以 CSV 或 TSV、JSON、AVRO、ORC 或 Parquet 存放您的資料。 | Y | Y | Y | Y | Y | Y | Y | 
| [移除欄](updates-removing-columns.md) |  如果是依名稱讀取資料，請以 JSON、AVRO 或 Parquet 和 ORC 存放資料。請勿使用 CSV 和 TSV。 | N | Y | Y | Y | N | N | Y | 
| [重新排序欄](updates-reordering-columns.md) | 如果是依名稱讀取資料，請以 AVRO、JSON 或 ORC 和 Parquet 存放資料。 | N | Y | Y | Y | N | N | Y | 
| [變更欄的資料類型](updates-changing-column-type.md) | 以任何格式存放資料，但在 Athena 中測試您的查詢，以確保資料類型相容。對於 Parquet 和 ORC，變更資料類型僅適用於分割資料表。 | Y | Y | Y | Y | Y | Y | Y | 

## 了解 Apache ORC 和 Apache Parquet 的索引存取
<a name="index-access"></a>

PARQUET 和 ORC 是可依索引或依名稱讀取的單欄資料儲存格式。以這些格式存放資料可讓您對結構描述執行所有操作和執行 Athena 查詢，而不會發生結構描述不符的錯誤。
+ Athena 根據預設*依索引讀取 ORC*，如 `SERDEPROPERTIES ( 'orc.column.index.access'='true')` 中所定義。如需詳細資訊，請參閱[ORC：依索引讀取](#orc-read-by-index)。
+ Athena *根據預設依名稱讀取 Parquet*，如 `SERDEPROPERTIES ( 'parquet.column.index.access'='false')` 中所定義。如需詳細資訊，請參閱[Parquet：依名稱讀取](#parquet-read-by-name)。

由於這些是預設值，在 `CREATE TABLE` 查詢中指定這些 SerDe 屬性是選擇性，且隱含地使用。使用時可讓您執行一些結構描述更新操作，同時會防止其他這類操作。若要啟用這些操作，請執行另一個 `CREATE TABLE` 查詢並變更 SerDe 設定。

**注意**  
SerDe 屬性並*不會*自動傳播到每個分割區。使用 `ALTER TABLE ADD PARTITION` 陳述式設定每個分割區的 SerDe 屬性。若要讓這個程序自動化，請編寫可執行 `ALTER TABLE ADD PARTITION` 陳述式的指令碼。

下列各節詳細說明這些案例。

### ORC：依索引讀取
<a name="orc-read-by-index"></a>

預設會*依索引讀取 ORC 資料表*。這是由下列語法所定義：

```
WITH SERDEPROPERTIES ( 
  'orc.column.index.access'='true')
```

*依索引讀取*可讓您重新命名欄。但之後您就無法在資料表中間移除欄或新增欄。

若要讓 ORC 依名稱讀取，以允許您在資料表中間以 ORC 新增欄或移除欄，請在 `CREATE TABLE` 陳述式中將 SerDe 屬性 `orc.column.index.access` 設為 `false`。在此組態中，您將無法重新命名欄。

**注意**  
在 Athena 引擎版本 2 中，當 ORC 資料表設定為依名稱讀取時，Athena 會要求 ORC 檔案中的所有資料欄名稱都為小寫字母。Apache Spark 在產生 ORC 檔案時不會以小寫字母顯示欄位名稱，所以 Athena 可能無法讀取所產生的資料。解決方法是重新以小寫字母命名資料欄，或使用 Athena 引擎版本 3。

以下範例說明如何將 ORC 變更為依名稱讀取：

```
CREATE EXTERNAL TABLE orders_orc_read_by_name (
   `o_comment` string,
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderpriority` string, 
   `o_orderstatus` string, 
   `o_clerk` string, 
   `o_shippriority` int, 
   `o_orderdate` string
) 
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
WITH SERDEPROPERTIES ( 
  'orc.column.index.access'='false') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/orders_orc/';
```

### Parquet：依名稱讀取
<a name="parquet-read-by-name"></a>

預設會*依名稱讀取 Parquet 資料表*。這是由下列語法所定義：

```
WITH SERDEPROPERTIES ( 
  'parquet.column.index.access'='false')
```

*依名稱讀取*可讓您在資料表中間新增欄及移除欄。但之後您就無法重新命欄。

若要讓 Parquet 依索引讀取，以允許您重新命名欄，您建立資料表時必須將 `parquet.column.index.access` SerDe 屬性設為 `true`。

# 進行結構描述更新
<a name="make-schema-updates"></a>

本主題說明您可以在不實際變更資料的情況下對 `CREATE TABLE` 陳述式中的結構描述進行的一些變更。要更新結構描述，您可以在某些情況下使用 `ALTER TABLE` 命令，但在其他情況下，您實際上不會修改現有的資料表。相反，您可以使用新名稱建立資料表，該資料表會修改您在原始 `CREATE TABLE` 陳述式中使用的結構描述。

根據您預期結構描述如何演進，若要繼續使用 Athena 查詢，請選擇相容的資料格式。

假設有一個應用程式會讀取訂單資訊，而此資訊來自於兩種格式的 `orders` 資料表：CSV 和 Parquet。

以下範例以 Parquet 建立資料表：

```
CREATE EXTERNAL TABLE orders_parquet (
   `orderkey` int, 
   `orderstatus` string, 
   `totalprice` double, 
   `orderdate` string, 
   `orderpriority` string, 
   `clerk` string, 
   `shippriority` int
) STORED AS PARQUET
LOCATION 's3://amzn-s3-demo-bucket/orders_ parquet/';
```

以下範例以 CSV 建立同一個資料表：

```
CREATE EXTERNAL TABLE orders_csv (
   `orderkey` int, 
   `orderstatus` string, 
   `totalprice` double, 
   `orderdate` string, 
   `orderpriority` string, 
   `clerk` string, 
   `shippriority` int
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://amzn-s3-demo-bucket/orders_csv/';
```

下列主題說明這些資料表的更新會如何影響 Athena 查詢。

**Topics**
+ [在資料表開頭或中間新增欄](updates-add-columns-beginning-middle-of-table.md)
+ [在資料表尾端新增欄](updates-add-columns-end-of-table.md)
+ [移除資料欄](updates-removing-columns.md)
+ [重新命名欄](updates-renaming-columns.md)
+ [重新排序欄](updates-reordering-columns.md)
+ [變更資料欄資料類型](updates-changing-column-type.md)

# 在資料表開頭或中間新增欄
<a name="updates-add-columns-beginning-middle-of-table"></a>

新增欄是最常見的其中一個結構描述變更。例如，您可以新增欄以新資料來富集資料表。或者，如果現有欄的來源已變更，您可以新增欄，並保留此欄的前一版，以調整依賴這些欄的應用程式。

若要在資料表開頭或中間新增欄，並繼續對現有資料表執行查詢，請使用 AVRO、JSON 及 Parquet 和 ORC (如果其 SerDe 屬性設為依名稱讀取)。如需相關資訊，請參閱[了解 Apache ORC 和 Apache Parquet 的索引存取](handling-schema-updates-chapter.md#index-access)。

請勿在 CSV 和 TSV 表格的開頭或中間新增欄，因為這些格式取決於排序。如果在這種情況下新增欄，當分割區的結構描述變更時，將會導致結構描述不符錯誤。

 下列範例會建立新資料表，該資料表會根據 JSON 資料在資料表中間新增 `o_comment` 資料欄。

```
CREATE EXTERNAL TABLE orders_json_column_addition (
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderstatus` string, 
   `o_comment` string, 
   `o_totalprice` double, 
   `o_orderdate` string, 
   `o_orderpriority` string, 
   `o_clerk` string, 
   `o_shippriority` int, 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://amzn-s3-demo-bucket/orders_json/';
```

# 在資料表尾端新增欄
<a name="updates-add-columns-end-of-table"></a>

如果您以 Athena 支援的任何格式 (如 Parquet、ORC、Avro、JSON、CSV 和 TSV) 建立資料表，您可以使用 `ALTER TABLE ADD COLUMNS` 陳述式將資料欄新增在現有資料欄之後，但在分割區資料欄之前。

下列範例會在任何分割區資料欄之前的 `comment` 資料表結尾新增 `orders_parquet` 資料欄：

```
ALTER TABLE orders_parquet ADD COLUMNS (comment string)
```

**注意**  
若要在執行 `ALTER TABLE ADD COLUMNS` 之後查看 Athena 查詢編輯器中的新資料表資料欄，請手動重新整理編輯器中的資料表清單，然後再次展開資料表。

# 移除資料欄
<a name="updates-removing-columns"></a>

您可能需要從資料表中移除已不再包含資料的欄，或是限制存取這些欄的資料。
+ 您可以從 JSON、Avro 及 Parquet 和 ORC (如果依名稱讀取) 的資料表中移除欄。如需相關資訊，請參閱[了解 Apache ORC 和 Apache Parquet 的索引存取](handling-schema-updates-chapter.md#index-access)。
+ 如果想要保留您在 Athena 中已建立的資料表，則不建議從 CSV 和 TSV 格式的資料表中移除資料欄。移除資料欄會破壞結構描述，而且您需要重新建立不含已移除的資料欄的資料表。

在這個範例中，從 Parquet 的資料表中移除 ``totalprice`` 資料欄，並執行查詢。在 Athena 中，預設會依名稱讀取 Parquet，因此我們省略 SERDEPROPERTIES 組態 (指定依名稱讀取)。請注意，即使您變更結構描述，以下查詢也會成功：

```
CREATE EXTERNAL TABLE orders_parquet_column_removed (
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderstatus` string, 
   `o_orderdate` string, 
   `o_orderpriority` string, 
   `o_clerk` string, 
   `o_shippriority` int, 
   `o_comment` string
) 
STORED AS PARQUET
LOCATION 's3://amzn-s3-demo-bucket/orders_parquet/';
```

# 重新命名欄
<a name="updates-renaming-columns"></a>

您可能需要重新命名資料表以更正拼字、讓資料欄名稱更具描述性，或重複使用現有的資料欄以避免資料欄重新排序。

如果您以 CSV 和 TSV 存放資料，或以設定為依索引讀取的 Parquet 和 ORC 存放資料，您可以重新命名資料欄。如需相關資訊，請參閱[了解 Apache ORC 和 Apache Parquet 的索引存取](handling-schema-updates-chapter.md#index-access)。

Athena 依結構描述中的資料欄順序讀取 CSV 和 TSV 資料，並以相同順序傳回資料。它不使用資料欄名稱將資料映射到資料欄，因此您可以重新命名 CSV 或 TSV 格式的資料欄，而不會破壞 Athena 查詢。

重新命名資料欄的一種策略是根據相同的基礎資料建立一個新資料表，但使用新的資料欄名稱。下列範例建立新的 `orders_parquet` 資料表，名為 `orders_parquet_column_renamed`。此範例會變更資料欄 ``o_totalprice`` 名稱為 ``o_total_price``，然後在 Athena 中執行查詢：

```
CREATE EXTERNAL TABLE orders_parquet_column_renamed (
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderstatus` string, 
   `o_total_price` double, 
   `o_orderdate` string, 
   `o_orderpriority` string, 
   `o_clerk` string, 
   `o_shippriority` int, 
   `o_comment` string
) 
STORED AS PARQUET
LOCATION 's3://amzn-s3-demo-bucket/orders_parquet/';
```

在 Parquet 資料表案例中，以下查詢執行，但重新命名的資料欄不會顯示資料，因為資料欄是依名稱存取 (Parquet 的預設值)，而不是依索引：

```
SELECT * 
FROM orders_parquet_column_renamed;
```

CSV 資料表的查詢也類似：

```
CREATE EXTERNAL TABLE orders_csv_column_renamed (
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderstatus` string, 
   `o_total_price` double, 
   `o_orderdate` string, 
   `o_orderpriority` string, 
   `o_clerk` string, 
   `o_shippriority` int, 
   `o_comment` string
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://amzn-s3-demo-bucket/orders_csv/';
```

在 CSV 資料表案例中，以下查詢執行，且資料會顯示在所有資料欄中，包括已重新命名的資料欄：

```
SELECT * 
FROM orders_csv_column_renamed;
```

# 重新排序欄
<a name="updates-reordering-columns"></a>

只有資料格式依名稱讀取的資料表，才能重新排序資料欄，例如 JSON 或 Parquet (預設為依名稱讀取)。如有需要，您也可以將 ORC 變成依名稱讀取。如需相關資訊，請參閱[了解 Apache ORC 和 Apache Parquet 的索引存取](handling-schema-updates-chapter.md#index-access)。

下列範例會建立新的資料表，其中資料欄的順序各不相同：

```
CREATE EXTERNAL TABLE orders_parquet_columns_reordered (
   `o_comment` string,
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderpriority` string, 
   `o_orderstatus` string, 
   `o_clerk` string, 
   `o_shippriority` int, 
   `o_orderdate` string
) 
STORED AS PARQUET
LOCATION 's3://amzn-s3-demo-bucket/orders_parquet/';
```

# 變更資料欄資料類型
<a name="updates-changing-column-type"></a>

當現有類型無法再保留所需資訊量時，您可能想要使用不同的資料欄類型。例如，ID 資料欄的值可能超過 `INT` 資料類型的大小，而且需要使用 `BIGINT` 資料類型。

## 考量事項
<a name="updates-changing-column-type-considerations"></a>

當您規劃使用不同的資料類型做為資料欄時，請考慮下列幾點：
+ 在大多數的案例中，您無法直接變更資料欄的資料類型。相反，您要重新建立 Athena 資料表，並使用新的資料類型定義資料欄。
+ 只有特定資料類型才可讀取為其他資料類型。有關可如此處理的資料類型，請參閱本節中的資料表。
+ 對於 Parquet 和 ORC 的資料，如果資料表未分割，則您無法對一個資料欄使用不同的資料類型。
+ 對於 Parquet 和 ORC 的分割資料表，分割區的資料欄類型可能不同於另一個分割區的資料欄類型，可能的話，Athena 會 `CAST` 到所需的類型。如需相關資訊，請參閱[避免含有分割區的資料表發生結構描述不符的錯誤](updates-and-partitions.md#partitions-dealing-with-schema-mismatch-errors)。
+ 對於僅使用 [LazySimpleSerDe](lazy-simple-serde.md) 建立的資料表，則可以使用 `ALTER TABLE REPLACE COLUMNS` 陳述式將現有的資料欄取代為不同的資料類型，但是您想要保留的所有現有資料欄也必須在陳述式中重新定義，否則它們將會被刪除。如需詳細資訊，請參閱[ALTER TABLE REPLACE COLUMNS](alter-table-replace-columns.md)。
+ 僅對於 Apache Iceberg 資料表，您可以使用 [ALTER TABLE CHANGE COLUMN](querying-iceberg-alter-table-change-column.md) 陳述式來變更資料欄的資料類型。 `ALTER TABLE REPLACE COLUMNS` 不支援 Iceberg 資料表。如需詳細資訊，請參閱[演進 Iceberg 資料表結構描述](querying-iceberg-evolving-table-schema.md)。

**重要**  
在執行資料類型轉換之前，強烈建議您測試和驗證您的查詢。如果 Athena 無法使用目標資料類型，`CREATE TABLE` 查詢可能會失敗。

## 使用相容的資料類型
<a name="updates-changing-column-type-use-compatible-data-types"></a>

盡可能使用相容的資料類型。下表列出了可能會被視為其他資料類型的資料類型：


| 原始資料類型 | 可用的目標資料類型 | 
| --- | --- | 
| STRING | BYTE, TINYINT, SMALLINT, INT, BIGINT | 
| BYTE | TINYINT, SMALLINT, INT, BIGINT | 
| TINYINT | SMALLINT, INT, BIGINT | 
| SMALLINT | INT, BIGINT | 
| INT | BIGINT | 
| FLOAT | DOUBLE | 

下列範例會使用原始 `orders_json` 資料表的 `CREATE TABLE` 陳述式來建立名為 `orders_json_bigint` 的新資料表。新資料表使用 `BIGINT` (而不是 `INT`) 做為 ``o_shippriority`` 資料欄的資料類型。

```
CREATE EXTERNAL TABLE orders_json_bigint (
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderstatus` string, 
   `o_totalprice` double, 
   `o_orderdate` string, 
   `o_orderpriority` string, 
   `o_clerk` string, 
   `o_shippriority` BIGINT
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://amzn-s3-demo-bucket/orders_json';
```

在資料類型變更之前，以下查詢執行成功，類似於原始 `SELECT` 查詢：

```
Select * from orders_json 
LIMIT 10;
```

# 更新含有分割區的資料表
<a name="updates-and-partitions"></a>

在 Athena 中，資料表及其分割區必須使用相同的資料格式，但其結構描述可能不同。當您建立新的分割區時，該分區通常會繼承資料表的結構描述。隨著時間經過，結構描述可能開始不同。原因包括：
+ 如果資料表的結構描述變更，分割區的結構描述不會更新，而無法與資料表的結構描述保持同步。
+ 爬 AWS Glue 蟲程式可讓您在具有不同結構描述的分割區中探索資料。這表示如果您使用 在 Athena 中建立資料表 AWS Glue，則在爬蟲程式完成處理後，資料表及其分割區的結構描述可能會不同。
+ 如果您直接使用 AWS API 新增分割區。

如果含有分割區的資料表符合下列限制條件，Athena 會成功處理資料表。如果不符合這些限制條件，Athena 會發出 HIVE\$1PARTITION\$1SCHEMA\$1MISMATCH 錯誤。
+ 每個分割區的結構描述與資料表的結構描述相容。
+ 資料表的資料格式允許您想要執行的更新類型：新增、刪除、重新排序欄，或變更欄的資料類型。

  例如，對於 CSV 和 TSV 格式，您可以重新命名欄、在資料表尾端新增欄，以及變更欄的資料類型 (如果類型相容)，但您無法移除欄。對於其他格式，您可以新增或移除欄，或將欄變更為另一種資料類型 (如果類型相容)。如需相關資訊，請參閱[摘要：Athena 中的更新和資料格式](handling-schema-updates-chapter.md#summary-of-updates)。

## 避免含有分割區的資料表發生結構描述不符的錯誤
<a name="partitions-dealing-with-schema-mismatch-errors"></a>

在開始執行查詢時，Athena 會檢查資料表與分割區之間的每個資料欄資料類型是否相容，以驗證資料表的結構描述。
+ 對於 Parquet 和 ORC 資料儲存類型，Athena 倚賴資料欄名稱，並使用它們來進行以資料欄名稱為基礎的結構描述驗證。這樣可避免含有分割區的 Parquet 和 ORC 資料表發生 `HIVE_PARTITION_SCHEMA_MISMATCH` 錯誤。(如果 SerDe 屬性設為依名稱存取索引，則這適用於 ORC：`orc.column.index.access=FALSE`。Parquet 預設會依名稱讀取索引)。
+ 對於 CSV、JSON 和 Avro，Athena 使用以索引為基礎的結構描述驗證。這表示如果您遇到結構描述不符的錯誤，則應該捨棄導致結構描述不符的分割區，並重新建立分割區，讓 Athena 在查詢它時不會失敗。

 Athena 會比較資料表的結構描述與分割區結構描述。如果您在 Athena 中使用 AWS Glue 爬蟲程式在 CSV、JSON 和 AVRO 中建立資料表，則在爬蟲程式完成處理後，資料表及其分割區的結構描述可能會不同。如果資料表的結構描述與分割區結構描述不相符，則您在 Athena 中的查詢會失敗，因為發生類似如下的結構描述驗證錯誤：'crawler\$1test.click\$1avro' is declared as type 'string', but partition 'partition\$10=2017-01-17' declared column 'col68' as type 'double'." ('crawler\$1test.click\$1avro' 宣告為類型 'string'，但分割區 'partition\$10=2017-01-17' 將資料欄 'col68' 宣告為類型 'double'。)

這類錯誤的典型解決方法是捨棄造成錯誤的分割區，然後重新建立。如需詳細資訊，請參閱[ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)及[ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。

# 查詢陣列
<a name="querying-arrays"></a>

Amazon Athena 可讓您建立陣列、串連陣列、將陣列轉換為不同的資料類型，然後篩選、展開和排序陣列。

**Topics**
+ [建立陣列](creating-arrays.md)
+ [串連字串和陣列](concatenating-strings-and-arrays.md)
+ [轉換陣列資料類型](converting-array-data-types.md)
+ [尋找陣列長度](finding-lengths.md)
+ [存取陣列元素](accessing-array-elements.md)
+ [將巢狀陣列扁平化](flattening-arrays.md)
+ [從子查詢建立陣列](creating-arrays-from-subqueries.md)
+ [篩選陣列](filtering-arrays.md)
+ [排序陣列](sorting-arrays.md)
+ [搭配陣列使用彙總函式](arrays-and-aggregation.md)
+ [將陣列轉換為字串](converting-arrays-to-strings.md)
+ [使用陣列建立映射](arrays-create-maps.md)
+ [查詢具有複雜類型的陣列](rows-and-structs.md)

# 建立陣列
<a name="creating-arrays"></a>

若要在 Athena 中建置陣列常值，請使用 `ARRAY` 關鍵字，後面接著方括弧 `[ ]` 並包含陣列元素 (以逗號分隔)。

## 範例
<a name="examples"></a>

此查詢會建立具有四個元素的陣列。

```
SELECT ARRAY [1,2,3,4] AS items
```

它會傳回：

```
+-----------+
| items     |
+-----------+
| [1,2,3,4] |
+-----------+
```

此查詢會建立兩個陣列。

```
SELECT ARRAY[ ARRAY[1,2], ARRAY[3,4] ] AS items
```

它會傳回：

```
+--------------------+
| items              |
+--------------------+
| [[1, 2], [3, 4]]   |
+--------------------+
```

若要從選取的相容類型資料欄建立陣列，請使用查詢，如此範例所示：

```
WITH
dataset AS (
  SELECT 1 AS x, 2 AS y, 3 AS z
)
SELECT ARRAY [x,y,z] AS items FROM dataset
```

此查詢會傳回：

```
+-----------+
| items     |
+-----------+
| [1,2,3]   |
+-----------+
```

在以下範例中，選取了兩個陣列，並以歡迎訊息傳回。

```
WITH
dataset AS (
  SELECT
    ARRAY ['hello', 'amazon', 'athena'] AS words,
    ARRAY ['hi', 'alexa'] AS alexa
)
SELECT ARRAY[words, alexa] AS welcome_msg
FROM dataset
```

此查詢會傳回：

```
+----------------------------------------+
| welcome_msg                            |
+----------------------------------------+
| [[hello, amazon, athena], [hi, alexa]] |
+----------------------------------------+
```

若要建立一系列的金鑰值組，請使用 `MAP` 運算子，其會使用一系列的金鑰，接著是一系列的值，如此範例所示：

```
SELECT ARRAY[
   MAP(ARRAY['first', 'last', 'age'],ARRAY['Bob', 'Smith', '40']),
   MAP(ARRAY['first', 'last', 'age'],ARRAY['Jane', 'Doe', '30']),
   MAP(ARRAY['first', 'last', 'age'],ARRAY['Billy', 'Smith', '8'])
] AS people
```

此查詢會傳回：

```
+-----------------------------------------------------------------------------------------------------+
| people                                                                                              |
+-----------------------------------------------------------------------------------------------------+
| [{last=Smith, first=Bob, age=40}, {last=Doe, first=Jane, age=30}, {last=Smith, first=Billy, age=8}] |
+-----------------------------------------------------------------------------------------------------+
```

# 串連字串和陣列
<a name="concatenating-strings-and-arrays"></a>

串連字串和串連陣列會使用類似的技術。

## 串連字串
<a name="concatenating-strings"></a>

若要串連兩個字串，您可以使用雙縱線 `||` 運算子，如下列範例所示。

```
SELECT 'This' || ' is' || ' a' || ' test.' AS Concatenated_String
```

此查詢會傳回：


****  

| \$1 | Concatenated\$1String | 
| --- | --- | 
| 1 |  `This is a test.`  | 

您可以使用 `concat()` 函數達到相同的效果。

```
SELECT concat('This', ' is', ' a', ' test.') AS Concatenated_String
```

此查詢會傳回：


****  

| \$1 | Concatenated\$1String | 
| --- | --- | 
| 1 |  `This is a test.`  | 

您可以使用 `concat_ws()` 函式將字串與第一個引數中指定的分隔符號串連。

```
SELECT concat_ws(' ', 'This', 'is', 'a', 'test.') as Concatenated_String
```

此查詢會傳回：


****  

| \$1 | Concatenated\$1String | 
| --- | --- | 
| 1 |  `This is a test.`  | 

若要使用點串連字串資料類型的兩個資料欄，請使用雙引號引用這兩個資料欄，並以單引號括住該點做為硬式編碼字串。如果資料欄不是字串資料類型，您可以先使用 `CAST("column_name" as VARCHAR)` 轉換資料欄類型。

```
SELECT "col1" || '.' || "col2" as Concatenated_String
FROM my_table
```

此查詢會傳回：


****  

| \$1 | Concatenated\$1String | 
| --- | --- | 
| 1 |  `col1_string_value.col2_string_value`  | 

## 串連陣列
<a name="concatenating-arrays"></a>

您可以使用相同的技巧串連陣列。

若要串連多個陣列，請使用雙縱線 `||` 運算子。

```
SELECT ARRAY [4,5] || ARRAY[ ARRAY[1,2], ARRAY[3,4] ] AS items
```

此查詢會傳回：


****  

| \$1 | items | 
| --- | --- | 
| 1 |  `[[4, 5], [1, 2], [3, 4]]`  | 

若要將多個陣列合併到單一陣列，請使用雙縱線運算子或 `concat()` 函數。

```
WITH
dataset AS (
  SELECT
    ARRAY ['Hello', 'Amazon', 'Athena'] AS words,
    ARRAY ['Hi', 'Alexa'] AS alexa
)
SELECT concat(words, alexa) AS welcome_msg
FROM dataset
```

此查詢會傳回：


****  

| \$1 | welcome\$1msg | 
| --- | --- | 
| 1 |  `[Hello, Amazon, Athena, Hi, Alexa]`  | 

如需有關 `concat()` 其他字串函數的詳細資訊，請參閱 Trino 文件中的 [String functions and operators](https://trino.io/docs/current/functions/string.html) (字串函數和運算子)。

# 轉換陣列資料類型
<a name="converting-array-data-types"></a>

若要將陣列中的資料轉換為支援的資料類型，請以 `CAST(value AS type)` 的格式使用 `CAST` 運算子。Athena 支援所有原生 Presto 資料類型。

```
SELECT
   ARRAY [CAST(4 AS VARCHAR), CAST(5 AS VARCHAR)]
AS items
```

此查詢會傳回：

```
+-------+
| items |
+-------+
| [4,5] |
+-------+
```

以鍵值組元素建立兩個陣列，將它們轉換為 JSON 並串連在一起，如這個範例所示：

```
SELECT
   ARRAY[CAST(MAP(ARRAY['a1', 'a2', 'a3'], ARRAY[1, 2, 3]) AS JSON)] ||
   ARRAY[CAST(MAP(ARRAY['b1', 'b2', 'b3'], ARRAY[4, 5, 6]) AS JSON)]
AS items
```

此查詢會傳回：

```
+--------------------------------------------------+
| items                                            |
+--------------------------------------------------+
| [{"a1":1,"a2":2,"a3":3}, {"b1":4,"b2":5,"b3":6}] |
+--------------------------------------------------+
```

# 尋找陣列長度
<a name="finding-lengths"></a>

`cardinality` 函數會傳回陣列的長度，如此範例所示：

```
SELECT cardinality(ARRAY[1,2,3,4]) AS item_count
```

此查詢會傳回：

```
+------------+
| item_count |
+------------+
| 4          |
+------------+
```

# 存取陣列元素
<a name="accessing-array-elements"></a>

若要存取陣列元素，使用 `[]` 運算子，並以 1 指定第一個元素，2 指定第二個元素，依此類推，如此範例所示：

```
WITH dataset AS (
SELECT
   ARRAY[CAST(MAP(ARRAY['a1', 'a2', 'a3'], ARRAY[1, 2, 3]) AS JSON)] ||
   ARRAY[CAST(MAP(ARRAY['b1', 'b2', 'b3'], ARRAY[4, 5, 6]) AS JSON)]
AS items )
SELECT items[1] AS item FROM dataset
```

此查詢會傳回：

```
+------------------------+
| item                   |
+------------------------+
| {"a1":1,"a2":2,"a3":3} |
+------------------------+
```

若要存取指定位置的陣列元素 (稱為索引位置)，請使用 `element_at()` 函數，並指定陣列名稱和索引位置：
+ 如果索引大於 0，`element_at()` 會傳回您指定的元素，從陣列的開頭開始往結尾算。它的行為和 `[]` 運算子一樣。
+ 如果索引小於 0，`element_at()` 傳回的元素是從陣列的結尾開始往開頭算。

以下查詢會建立陣列 `words`，並從中選取第一個元素 `hello` 做為 `first_word`，選取第二個元素 `amazon` (從陣列結尾往前算) 做為 `middle_word`，選取第三個元素 `athena` 做為 `last_word`。

```
WITH dataset AS (
  SELECT ARRAY ['hello', 'amazon', 'athena'] AS words
)
SELECT
  element_at(words, 1) AS first_word,
  element_at(words, -2) AS middle_word,
  element_at(words, cardinality(words)) AS last_word
FROM dataset
```

此查詢會傳回：

```
+----------------------------------------+
| first_word  | middle_word | last_word  |
+----------------------------------------+
| hello       | amazon      | athena     |
+----------------------------------------+
```

# 將巢狀陣列扁平化
<a name="flattening-arrays"></a>

使用巢狀陣列時，您經常需要將巢狀陣列元素展開至單一陣列，或將陣列展開至多個資料列。

## 使用扁平化函式
<a name="flattening-arrays-flatten-function"></a>

若要將巢狀陣列的元素扁平化至值的單一陣列，請使用 `flatten` 函數。此查詢會為陣列中的每個元素傳回一個資料列。

```
SELECT flatten(ARRAY[ ARRAY[1,2], ARRAY[3,4] ]) AS items
```

此查詢會傳回：

```
+-----------+
| items     |
+-----------+
| [1,2,3,4] |
+-----------+
```

## 使用 CROSS JOIN 和 UNNEST
<a name="flattening-arrays-cross-join-and-unnest"></a>

若要將陣列扁平化至多個資料列，請使用 `CROSS JOIN` 結合 `UNNEST` 運算子，如此範例所示：

```
WITH dataset AS (
  SELECT
    'engineering' as department,
    ARRAY['Sharon', 'John', 'Bob', 'Sally'] as users
)
SELECT department, names FROM dataset
CROSS JOIN UNNEST(users) as t(names)
```

此查詢會傳回：

```
+----------------------+
| department  | names  |
+----------------------+
| engineering | Sharon |
+----------------------|
| engineering | John   |
+----------------------|
| engineering | Bob    |
+----------------------|
| engineering | Sally  |
+----------------------+
```

若要將一系列的金鑰值組扁平化，請將選取的金鑰調換至資料欄，如此範例所示：

```
WITH
dataset AS (
  SELECT
    'engineering' as department,
     ARRAY[
      MAP(ARRAY['first', 'last', 'age'],ARRAY['Bob', 'Smith', '40']),
      MAP(ARRAY['first', 'last', 'age'],ARRAY['Jane', 'Doe', '30']),
      MAP(ARRAY['first', 'last', 'age'],ARRAY['Billy', 'Smith', '8'])
     ] AS people
  )
SELECT names['first'] AS
 first_name,
 names['last'] AS last_name,
 department FROM dataset
CROSS JOIN UNNEST(people) AS t(names)
```

此查詢會傳回：

```
+--------------------------------------+
| first_name | last_name | department  |
+--------------------------------------+
| Bob        | Smith     | engineering |
| Jane       | Doe       | engineering |
| Billy      | Smith     | engineering |
+--------------------------------------+
```

從員工清單中選擇具有最高組合評分的員工。`UNNEST` 可用於 `FROM` 子句，而不需先有`CROSS JOIN`，因為它是預設的聯結運算子，因此已隱含具備。

```
WITH
dataset AS (
  SELECT ARRAY[
    CAST(ROW('Sally', 'engineering', ARRAY[1,2,3,4]) AS ROW(name VARCHAR, department VARCHAR, scores ARRAY(INTEGER))),
    CAST(ROW('John', 'finance', ARRAY[7,8,9]) AS ROW(name VARCHAR, department VARCHAR, scores ARRAY(INTEGER))),
    CAST(ROW('Amy', 'devops', ARRAY[12,13,14,15]) AS ROW(name VARCHAR, department VARCHAR, scores ARRAY(INTEGER)))
  ] AS users
),
users AS (
 SELECT person, score
 FROM
   dataset,
   UNNEST(dataset.users) AS t(person),
   UNNEST(person.scores) AS t(score)
)
SELECT person.name, person.department, SUM(score) AS total_score FROM users
GROUP BY (person.name, person.department)
ORDER BY (total_score) DESC
LIMIT 1
```

此查詢會傳回：

```
+---------------------------------+
| name | department | total_score |
+---------------------------------+
| Amy  | devops     | 54          |
+---------------------------------+
```

從員工清單中選擇具有最高個別評分的員工。

```
WITH
dataset AS (
 SELECT ARRAY[
   CAST(ROW('Sally', 'engineering', ARRAY[1,2,3,4]) AS ROW(name VARCHAR, department VARCHAR, scores ARRAY(INTEGER))),
   CAST(ROW('John', 'finance', ARRAY[7,8,9]) AS ROW(name VARCHAR, department VARCHAR, scores ARRAY(INTEGER))),
   CAST(ROW('Amy', 'devops', ARRAY[12,13,14,15]) AS ROW(name VARCHAR, department VARCHAR, scores ARRAY(INTEGER)))
 ] AS users
),
users AS (
 SELECT person, score
 FROM
   dataset,
   UNNEST(dataset.users) AS t(person),
   UNNEST(person.scores) AS t(score)
)
SELECT person.name, score FROM users
ORDER BY (score) DESC
LIMIT 1
```

此查詢會傳回：

```
+--------------+
| name | score |
+--------------+
| Amy  | 15    |
+--------------+
```

### CROSS JOIN 和 UNNEST 的注意事項
<a name="flattening-arrays-cross-join-and-unnest-considerations"></a>

如果 `UNNEST` 在查詢中的一個或多個陣列上使用，且其中一個陣列是 `NULL`，則查詢不會傳回任何資料列。如果 `UNNEST` 在一個空字串陣列上使用，則會傳回空字串。

例如，在下列查詢中，由於第二個陣列為 Null，因此查詢不會傳回任何資料列。

```
SELECT 
    col1, 
    col2 
FROM UNNEST (ARRAY ['apples','oranges','lemons']) AS t(col1)
CROSS JOIN UNNEST (ARRAY []) AS t(col2)
```

在下面的範例中，第二個數組修改為包含一個空字串。針對每次資料列，查詢會傳回 `col1` 中的值，以及 `col2` 中的值的空字串。第二個陣列中的空字串為必要，以便傳回第一個陣列中的值。

```
SELECT 
    col1, 
    col2 
FROM UNNEST (ARRAY ['apples','oranges','lemons']) AS t(col1)
CROSS JOIN UNNEST (ARRAY ['']) AS t(col2)
```

# 從子查詢建立陣列
<a name="creating-arrays-from-subqueries"></a>

從資料列的集合建立陣列。

```
WITH
dataset AS (
  SELECT ARRAY[1,2,3,4,5] AS items
)
SELECT array_agg(i) AS array_items
FROM dataset
CROSS JOIN UNNEST(items) AS t(i)
```

此查詢會傳回：

```
+-----------------+
| array_items     |
+-----------------+
| [1, 2, 3, 4, 5] |
+-----------------+
```

若要從一組資料列建立一系列的多個唯一值，請使用 `distinct` 關鍵字。

```
WITH
dataset AS (
  SELECT ARRAY [1,2,2,3,3,4,5] AS items
)
SELECT array_agg(distinct i) AS array_items
FROM dataset
CROSS JOIN UNNEST(items) AS t(i)
```

此查詢會傳回下列結果。請注意，無法保證順序。

```
+-----------------+
| array_items     |
+-----------------+
| [1, 2, 3, 4, 5] |
+-----------------+
```

如需有關使用 `array_agg` 函數的詳細資訊，請參閱 Trino 文件中的 [Aggregate functions](https://trino.io/docs/current/functions/aggregate.html) (彙總函數)。

# 篩選陣列
<a name="filtering-arrays"></a>

如果資料列的集合符合篩選條件，則從資料列的集合建立陣列。

```
WITH
dataset AS (
  SELECT ARRAY[1,2,3,4,5] AS items
)
SELECT array_agg(i) AS array_items
FROM dataset
CROSS JOIN UNNEST(items) AS t(i)
WHERE i > 3
```

此查詢會傳回：

```
+-------------+
| array_items |
+-------------+
| [4, 5]      |
+-------------+
```

根據其元素是否包含特定的值 (例如 2) 來篩選陣列，如此範例所示：

```
WITH
dataset AS (
  SELECT ARRAY
  [
    ARRAY[1,2,3,4],
    ARRAY[5,6,7,8],
    ARRAY[9,0]
  ] AS items
)
SELECT i AS array_items FROM dataset
CROSS JOIN UNNEST(items) AS t(i)
WHERE contains(i, 2)
```

此查詢會傳回：

```
+--------------+
| array_items  |
+--------------+
| [1, 2, 3, 4] |
+--------------+
```

## 使用 `filter` 函式
<a name="filtering-arrays-filter-function"></a>

```
 filter(ARRAY [list_of_values], boolean_function)
```

您可以在 `ARRAY` 表達式上使用 `filter` 函數建立一個新的陣列，該陣列是 *list\$1of\$1values* 中項目的子集，其 *boolean\$1function* 為 true。`filter` 函數在您無法使用 *UNNEST* 函數的情況下十分有用。

以下範例會篩選陣列 `[1,0,5,-1]` 中大於零的值。

```
SELECT filter(ARRAY [1,0,5,-1], x -> x>0)
```

**結果**  
`[1,5]`

以下範例會篩選陣列 `[-1, NULL, 10, NULL]` 中的非零值。

```
SELECT filter(ARRAY [-1, NULL, 10, NULL], q -> q IS NOT NULL)
```

**結果**  
`[-1,10]`

# 排序陣列
<a name="sorting-arrays"></a>

若要從一組資料行建立已排序的唯一值陣列，您可以使用 [array\$1sort](https://prestodb.io/docs/current/functions/array.html#array_sort) 函數，如下列範例所示。

```
WITH
dataset AS (
  SELECT ARRAY[3,1,2,5,2,3,6,3,4,5] AS items
)
SELECT array_sort(array_agg(distinct i)) AS array_items
FROM dataset
CROSS JOIN UNNEST(items) AS t(i)
```

此查詢會傳回：

```
+--------------------+
| array_items        |
+--------------------+
| [1, 2, 3, 4, 5, 6] |
+--------------------+
```

如需將陣列展開成多個資料列的相關資訊，請參閱[將巢狀陣列扁平化](flattening-arrays.md)。

# 搭配陣列使用彙總函式
<a name="arrays-and-aggregation"></a>
+ 若要在陣列中新增值，請使用 `SUM`，如下列範例所示。
+ 若要彙總陣列中的多個資料列，請使用 `array_agg`。如需相關資訊，請參閱[從子查詢建立陣列](creating-arrays-from-subqueries.md)。

**注意**  
自 Athena 引擎版本 2 開始，彙總函數支援 `ORDER BY`。

```
WITH
dataset AS (
  SELECT ARRAY
  [
    ARRAY[1,2,3,4],
    ARRAY[5,6,7,8],
    ARRAY[9,0]
  ] AS items
),
item AS (
  SELECT i AS array_items
  FROM dataset, UNNEST(items) AS t(i)
)
SELECT array_items, sum(val) AS total
FROM item, UNNEST(array_items) AS t(val)
GROUP BY array_items;
```

在最後一個 `SELECT` 陳述式中，與其使用 `sum()` 和 `UNNEST`，您可以使用 `reduce()` 來減少處理時間和資料傳輸，如下列範例所示。

```
WITH
dataset AS (
  SELECT ARRAY
  [
    ARRAY[1,2,3,4],
    ARRAY[5,6,7,8],
    ARRAY[9,0]
  ] AS items
),
item AS (
  SELECT i AS array_items
  FROM dataset, UNNEST(items) AS t(i)
)
SELECT array_items, reduce(array_items, 0 , (s, x) -> s + x, s -> s) AS total
FROM item;
```

此查詢會傳回下列結果。無法保證傳回結果的順序。

```
+----------------------+
| array_items  | total |
+----------------------+
| [1, 2, 3, 4] | 10    |
| [5, 6, 7, 8] | 26    |
| [9, 0]       | 9     |
+----------------------+
```

# 將陣列轉換為字串
<a name="converting-arrays-to-strings"></a>

若要將陣列為單一字串，請使用 `array_join` 函數。以下個別範例會建立名為 `dataset` 的資料表，其中包含名為 `words` 的別名陣列。查詢會使用 `array_join` 讓陣列元素加入 `words`、以空格分隔元素，然後在名為 `welcome_msg` 的別名資料欄中傳回產生的字串。

```
WITH
dataset AS (
  SELECT ARRAY ['hello', 'amazon', 'athena'] AS words
)
SELECT array_join(words, ' ') AS welcome_msg
FROM dataset
```

此查詢會傳回：

```
+---------------------+
| welcome_msg         |
+---------------------+
| hello amazon athena |
+---------------------+
```

# 使用陣列建立映射
<a name="arrays-create-maps"></a>

映射是由 Athena 中可用的資料類型組成的鍵值組。若要建立映射，請使用 `MAP` 運算子並傳入兩個陣列：第一個是欄 (金鑰) 名稱，第二個是值。陣列的所有值必須是相同類型。如果任何映射值陣列元素必須是不同類型，您稍後可以轉換它們。

## 範例
<a name="examples"></a>

此範例從資料集選取使用者。它使用 `MAP` 運算子並傳入兩個陣列。第一個陣列包含欄名稱的值，例如 "first"、"last" 和 "age"。第二個陣列包含每個欄的值，例如 "Bob"、"Smith"、"35"。

```
WITH dataset AS (
  SELECT MAP(
    ARRAY['first', 'last', 'age'],
    ARRAY['Bob', 'Smith', '35']
  ) AS user
)
SELECT user FROM dataset
```

此查詢會傳回：

```
+---------------------------------+
| user                            |
+---------------------------------+
| {last=Smith, first=Bob, age=35} |
+---------------------------------+
```

您可以選取欄位名稱，後面接著 `[key_name]`，以擷取 `Map` 值，如以下範例所示：

```
WITH dataset AS (
 SELECT MAP(
   ARRAY['first', 'last', 'age'],
   ARRAY['Bob', 'Smith', '35']
 ) AS user
)
SELECT user['first'] AS first_name FROM dataset
```

此查詢會傳回：

```
+------------+
| first_name |
+------------+
| Bob        |
+------------+
```

# 查詢具有複雜類型和巢狀結構的陣列
<a name="rows-and-structs"></a>

您的來源資料通常包含具有複雜資料類型和巢狀結構的陣列。本節中的範例展示如何使用 Athena 查詢來變更元素的資料類型、在陣列內尋找元素，以及尋找關鍵字。

**Topics**
+ [建立 `ROW`](creating-row.md)
+ [使用 `CAST` 變更陣列中的欄位名稱](changing-row-arrays-with-cast.md)
+ [使用 `.` 標記法篩選陣列](filtering-with-dot.md)
+ [篩選含有巢狀值的陣列](filtering-nested-with-dot.md)
+ [使用 `UNNEST` 篩選陣列](filtering-with-unnest.md)
+ [使用 `regexp_like` 在陣列中尋找關鍵字](filtering-with-regexp.md)

# 建立 `ROW`
<a name="creating-row"></a>

**注意**  
本節中的範例使用 `ROW` 當為方法來建立要使用的範例資料。當您在 Athena 內查詢資料表時，您不需要建立 `ROW` 資料類型，因為已經從您的資料來源建立它們。當您使用 `CREATE_TABLE` 時，Athena 會在其中定義 `STRUCT`，在其中填入資料，然後替您為資料集的每個資料行建立 `ROW` 資料類型。基礎 `ROW` 資料類型由任何受支援 SQL 資料類型的具名欄位組成。

```
WITH dataset AS (
 SELECT
   ROW('Bob', 38) AS users
 )
SELECT * FROM dataset
```

此查詢會傳回：

```
+-------------------------+
| users                   |
+-------------------------+
| {field0=Bob, field1=38} |
+-------------------------+
```

# 使用 `CAST` 變更陣列中的欄位名稱
<a name="changing-row-arrays-with-cast"></a>

若要變更陣列中含有 `ROW` 值的欄位名稱，您可以 `CAST` `ROW` 宣告：

```
WITH dataset AS (
  SELECT
    CAST(
      ROW('Bob', 38) AS ROW(name VARCHAR, age INTEGER)
    ) AS users
)
SELECT * FROM dataset
```

此查詢會傳回：

```
+--------------------+
| users              |
+--------------------+
| {NAME=Bob, AGE=38} |
+--------------------+
```

**注意**  
在上述範例中，您將 `name` 宣告為 `VARCHAR`，因為這是它在 Presto 中的類型。如果您在 `CREATE TABLE` 陳述式內宣告這個 `STRUCT`，請使用 `String` 類型，因為 Hive 將此資料類型定義為 `String`。

# 使用 `.` 標記法篩選陣列
<a name="filtering-with-dot"></a>

在下列範例中，使用點`.`符號從 AWS CloudTrail 日誌資料表的 `userIdentity` 欄中選取 `accountId` 欄位。如需詳細資訊，請參閱[查詢 AWS CloudTrail 日誌](cloudtrail-logs.md)。

```
SELECT
  CAST(useridentity.accountid AS bigint) as newid
FROM cloudtrail_logs
LIMIT 2;
```

此查詢會傳回：

```
+--------------+
| newid        |
+--------------+
| 112233445566 |
+--------------+
| 998877665544 |
+--------------+
```

若要查詢值陣列，請發出此查詢：

```
WITH dataset AS (
  SELECT ARRAY[
    CAST(ROW('Bob', 38) AS ROW(name VARCHAR, age INTEGER)),
    CAST(ROW('Alice', 35) AS ROW(name VARCHAR, age INTEGER)),
    CAST(ROW('Jane', 27) AS ROW(name VARCHAR, age INTEGER))
  ] AS users
)
SELECT * FROM dataset
```

它會傳回此結果：

```
+-----------------------------------------------------------------+
| users                                                           |
+-----------------------------------------------------------------+
| [{NAME=Bob, AGE=38}, {NAME=Alice, AGE=35}, {NAME=Jane, AGE=27}] |
+-----------------------------------------------------------------+
```

# 篩選含有巢狀值的陣列
<a name="filtering-nested-with-dot"></a>

大型陣列通常包含巢狀結構，您必須能夠篩選或搜尋其中的值。

若要為包含巢狀 `BOOLEAN` 值的值陣列定義資料集，請發出此查詢：

```
WITH dataset AS (
  SELECT
    CAST(
      ROW('aws.amazon.com', ROW(true)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
    ) AS sites
)
SELECT * FROM dataset
```

它會傳回此結果：

```
+----------------------------------------------------------+
| sites                                                    |
+----------------------------------------------------------+
| {HOSTNAME=aws.amazon.com, FLAGGEDACTIVITY={ISNEW=true}}  |
+----------------------------------------------------------+
```

接著，若要篩選並存取該元素的 `BOOLEAN` 值，請繼續使用點 `.` 標記法。

```
WITH dataset AS (
  SELECT
    CAST(
      ROW('aws.amazon.com', ROW(true)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
    ) AS sites
)
SELECT sites.hostname, sites.flaggedactivity.isnew
FROM dataset
```

此查詢會選取巢狀欄位，並傳回此結果：

```
+------------------------+
| hostname       | isnew |
+------------------------+
| aws.amazon.com | true  |
+------------------------+
```

# 使用 `UNNEST` 篩選陣列
<a name="filtering-with-unnest"></a>

若要依其中一個子元素來篩選含有巢狀結構的陣列，請以 `UNNEST` 運算子發出查詢。如需 `UNNEST` 的詳細資訊，請參閱[展開巢狀陣列](flattening-arrays.md)。

例如，此查詢會在資料集尋找網站的主機名稱。

```
WITH dataset AS (
  SELECT ARRAY[
    CAST(
      ROW('aws.amazon.com', ROW(true)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
    ),
    CAST(
      ROW('news.cnn.com', ROW(false)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
    ),
    CAST(
      ROW('netflix.com', ROW(false)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
    )
  ] as items
)
SELECT sites.hostname, sites.flaggedActivity.isNew
FROM dataset, UNNEST(items) t(sites)
WHERE sites.flaggedActivity.isNew = true
```

它會傳回：

```
+------------------------+
| hostname       | isnew |
+------------------------+
| aws.amazon.com | true  |
+------------------------+
```

# 使用 `regexp_like` 在陣列中尋找關鍵字
<a name="filtering-with-regexp"></a>

以下範例說明如何使用 [regexp\$1like](https://prestodb.io/docs/current/functions/regexp.html) 函數，在資料集搜尋陣列內某個元素內的關鍵字。它接受規則表達式模式或以管線 (\$1) 分隔的詞彙清單作為輸入來評估，評估模式，然後判斷指定的字串是否包含它。

規則表達式模式必須存在於字串內，但不一定要符合它。若要比對整個字串，請在模式開頭加上 ^，在尾端加上 &，以括住模式，例如 `'^pattern$'`。

假設有一個包含主機名稱的網站陣列，還有一個 `flaggedActivity` 元素。這個元素包含 `ARRAY`，其中包含幾個 `MAP` 元素，各列出不同的熱門關鍵字及熱門度計數。假設您想在此陣列中的 `MAP` 內尋找特定的關鍵字。

為了依特定關鍵字在此資料集搜尋網站，我們使用 `regexp_like` 而不是類似的 SQL `LIKE` 運算子，因為以 `regexp_like` 搜尋大量關鍵字更有效率。

**Example 範例 1：使用 `regexp_like`**  
這個範例中的查詢使用 `regexp_like` 函數來搜尋詞彙 `'politics|bigdata'`，並於陣列內的值中找到：  

```
WITH dataset AS (
  SELECT ARRAY[
    CAST(
      ROW('aws.amazon.com', ROW(ARRAY[
          MAP(ARRAY['term', 'count'], ARRAY['bigdata', '10']),
          MAP(ARRAY['term', 'count'], ARRAY['serverless', '50']),
          MAP(ARRAY['term', 'count'], ARRAY['analytics', '82']),
          MAP(ARRAY['term', 'count'], ARRAY['iot', '74'])
      ])
      ) AS ROW(hostname VARCHAR, flaggedActivity ROW(flags ARRAY(MAP(VARCHAR, VARCHAR)) ))
   ),
   CAST(
     ROW('news.cnn.com', ROW(ARRAY[
       MAP(ARRAY['term', 'count'], ARRAY['politics', '241']),
       MAP(ARRAY['term', 'count'], ARRAY['technology', '211']),
       MAP(ARRAY['term', 'count'], ARRAY['serverless', '25']),
       MAP(ARRAY['term', 'count'], ARRAY['iot', '170'])
     ])
     ) AS ROW(hostname VARCHAR, flaggedActivity ROW(flags ARRAY(MAP(VARCHAR, VARCHAR)) ))
   ),
   CAST(
     ROW('netflix.com', ROW(ARRAY[
       MAP(ARRAY['term', 'count'], ARRAY['cartoons', '1020']),
       MAP(ARRAY['term', 'count'], ARRAY['house of cards', '112042']),
       MAP(ARRAY['term', 'count'], ARRAY['orange is the new black', '342']),
       MAP(ARRAY['term', 'count'], ARRAY['iot', '4'])
     ])
     ) AS ROW(hostname VARCHAR, flaggedActivity ROW(flags ARRAY(MAP(VARCHAR, VARCHAR)) ))
   )
 ] AS items
),
sites AS (
  SELECT sites.hostname, sites.flaggedactivity
  FROM dataset, UNNEST(items) t(sites)
)
SELECT hostname
FROM sites, UNNEST(sites.flaggedActivity.flags) t(flags)
WHERE regexp_like(flags['term'], 'politics|bigdata')
GROUP BY (hostname)
```
此查詢會傳回兩個網站：  

```
+----------------+
| hostname       |
+----------------+
| aws.amazon.com |
+----------------+
| news.cnn.com   |
+----------------+
```

**Example 範例 2：使用 `regexp_like`**  
下列範例中的查詢對於 `regexp_like` 函數中符合搜尋詞彙的網站，合計其熱門度總分，然後依最高到最低排序。  

```
WITH dataset AS (
  SELECT ARRAY[
    CAST(
      ROW('aws.amazon.com', ROW(ARRAY[
          MAP(ARRAY['term', 'count'], ARRAY['bigdata', '10']),
          MAP(ARRAY['term', 'count'], ARRAY['serverless', '50']),
          MAP(ARRAY['term', 'count'], ARRAY['analytics', '82']),
          MAP(ARRAY['term', 'count'], ARRAY['iot', '74'])
      ])
      ) AS ROW(hostname VARCHAR, flaggedActivity ROW(flags ARRAY(MAP(VARCHAR, VARCHAR)) ))
    ),
    CAST(
      ROW('news.cnn.com', ROW(ARRAY[
        MAP(ARRAY['term', 'count'], ARRAY['politics', '241']),
        MAP(ARRAY['term', 'count'], ARRAY['technology', '211']),
        MAP(ARRAY['term', 'count'], ARRAY['serverless', '25']),
        MAP(ARRAY['term', 'count'], ARRAY['iot', '170'])
      ])
      ) AS ROW(hostname VARCHAR, flaggedActivity ROW(flags ARRAY(MAP(VARCHAR, VARCHAR)) ))
    ),
    CAST(
      ROW('netflix.com', ROW(ARRAY[
        MAP(ARRAY['term', 'count'], ARRAY['cartoons', '1020']),
        MAP(ARRAY['term', 'count'], ARRAY['house of cards', '112042']),
        MAP(ARRAY['term', 'count'], ARRAY['orange is the new black', '342']),
        MAP(ARRAY['term', 'count'], ARRAY['iot', '4'])
      ])
      ) AS ROW(hostname VARCHAR, flaggedActivity ROW(flags ARRAY(MAP(VARCHAR, VARCHAR)) ))
    )
  ] AS items
),
sites AS (
  SELECT sites.hostname, sites.flaggedactivity
  FROM dataset, UNNEST(items) t(sites)
)
SELECT hostname, array_agg(flags['term']) AS terms, SUM(CAST(flags['count'] AS INTEGER)) AS total
FROM sites, UNNEST(sites.flaggedActivity.flags) t(flags)
WHERE regexp_like(flags['term'], 'politics|bigdata')
GROUP BY (hostname)
ORDER BY total DESC
```
此查詢會傳回兩個網站：  

```
+------------------------------------+
| hostname       | terms    | total  |
+----------------+-------------------+
| news.cnn.com   | politics |  241   |
+----------------+-------------------+
| aws.amazon.com | bigdata |  10    |
+----------------+-------------------+
```

# 查詢地理空間資料
<a name="querying-geospatial-data"></a>

地理空間資料包含識別符來指定物體的地理位置。這類資料的例子包括天氣報告、地圖方向、含地理位置的推文、商店位置，以及飛機航線。地理空間資料在商業分析、報告和預測方面扮演重要角色。

地理空間識別符 (例如經緯度) 可讓您將任何郵寄地址轉換為一組地理座標。

## 什麼是地理空間查詢？
<a name="geospatial-query-what-is"></a>

地理空間查詢為 Athena 中支援的特殊 SQL 查詢類型。它們與非空間 SQL 查詢的差別在於下列各方面：
+ 使用以下特殊化幾何資料類型：`point`、`line`、`multiline`、`polygon` 和 `multipolygon`。
+ 表示幾何資料類型之間的關係，例如 `distance`、`equals`、`crosses`、`touches`、`overlaps`、`disjoint` 等等。

您可以在 Athena 中使用地理空間查詢，執行這些和其他類似操作：
+ 尋找兩點之間的距離。
+ 檢查是否一個區域 (多邊形) 包含其他區域。
+ 檢查一個線條是否與其他線條或多邊形交錯或碰觸。

例如，若要在 Athena 中從瑞尼爾山之地理座標的類型 `double` 值中取得 `point` 幾何資料類型，請如下列範例所示，使用 `ST_Point (longitude, latitude)` 地理空間函數。

```
ST_Point(-121.7602, 46.8527)
```

## 輸入資料格式和幾何資料類型
<a name="geospatial-input-data-formats-supported-geometry-types"></a>

若要在 Athena 中使用地理空間函數，請以 WKT 格式輸入資料，或使用 Hive JSON SerDe。您也可以使用 Athena 中支援的幾何資料類型。

### 輸入資料格式
<a name="input-data-formats"></a>

為處理地理空間查詢，Athena 支援以下資料格式的輸入資料：
+  **WKT (已知文字)**。在 Athena 中，WKT 會以 `varchar(x)` 或 `string` 資料類型表示。
+  **JSON 編碼的地理空間資料**。為剖析具有地理空間資料的 JSON 檔案並為它們建立資料表，Athena 會使用 [Hive SerDe JSON](https://github.com/Esri/spatial-framework-for-hadoop/wiki/Hive-JSON-SerDe)。如需有關在 Athena 中使用此 SerDe 的詳細資訊，請參閱 [JSON SerDe 程式庫](json-serde.md)。

### 幾何資料類型
<a name="geometry-data-types"></a>

為處理地理空間查詢，Athena 支援以下特殊幾何資料類型：
+  `point` 
+  `line` 
+  `polygon` 
+  `multiline` 
+  `multipolygon` 

## 支援的地理空間函數
<a name="geospatial-functions-list"></a>

如需有關 Athena 引擎版本 3 中地理空間函數的資訊，請參閱 Trino 文件中的 [Geospatial functions](https://trino.io/docs/current/functions/geospatial.html) (地理空間函數)。

# 範例：地理空間查詢
<a name="geospatial-example-queries"></a>

本主題中的範例會從 GitHub 上可用的範例資料建立兩個資料表，並根據該資料查詢資料表。範例資料位於下列檔案中，僅供說明之用且不保證準確無誤：
+ **[https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/earthquake-data/earthquakes.csv](https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/earthquake-data/earthquakes.csv)** – 列出在加州發生的地震。範例 `earthquakes` 資料表使用此資料的欄位。
+ **[https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/counties-data/california-counties.json](https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/counties-data/california-counties.json)** – 以[符合 ESRI 規範的 GeoJSON 格式](https://doc.arcgis.com/en/arcgis-online/reference/geojson.htm)列出加州的郡資料。該資料包含許多欄位，例如 `AREA`、`PERIMETER`、`STATE`、`COUNTY` 和 `NAME`，但範例 `counties` 資料表僅使用兩個欄位：`Name` (字串) 和 `BoundaryShape` (二進位)。
**注意**  
Athena 使用 `com.esri.json.hadoop.EnclosedEsriJsonInputFormat`，將 JSON 資料轉換為地理空間二進位格式。

以下程式碼範例會建立名為 `earthquakes` 的資料表：

```
CREATE external TABLE earthquakes
(
 earthquake_date string,
 latitude double,
 longitude double,
 depth double,
 magnitude double,
 magtype string,
 mbstations string,
 gap string,
 distance string,
 rms string,
 source string,
 eventid string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE LOCATION 's3://amzn-s3-demo-bucket/my-query-log/csv/';
```

以下程式碼範例會建立名為 `counties` 的資料表：

```
CREATE external TABLE IF NOT EXISTS counties
 (
 Name string,
 BoundaryShape binary
 )
ROW FORMAT SERDE 'com.esri.hadoop.hive.serde.EsriJsonSerDe'
STORED AS INPUTFORMAT 'com.esri.json.hadoop.EnclosedEsriJsonInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/my-query-log/json/';
```

下列範例查詢使用 `counties` 和 `earthquake` 資料表上的 `CROSS JOIN` 函數。該範例使用 `ST_CONTAINS` 查詢其界限包括地震位置的郡，該地震位置是使用 `ST_POINT` 指定。該查詢會將這類郡依名稱分組、依計數排序，並依遞減順序傳回。

```
SELECT counties.name,
        COUNT(*) cnt
FROM counties
CROSS JOIN earthquakes
WHERE ST_CONTAINS (ST_GeomFromLegacyBinary(counties.boundaryshape), ST_POINT(earthquakes.longitude, earthquakes.latitude))
GROUP BY  counties.name
ORDER BY  cnt DESC
```

此查詢會傳回：

```
+------------------------+
| name             | cnt |
+------------------------+
| Kern             | 36  |
+------------------------+
| San Bernardino   | 35  |
+------------------------+
| Imperial         | 28  |
+------------------------+
| Inyo             | 20  |
+------------------------+
| Los Angeles      | 18  |
+------------------------+
| Riverside        | 14  |
+------------------------+
| Monterey         | 14  |
+------------------------+
| Santa Clara      | 12  |
+------------------------+
| San Benito       | 11  |
+------------------------+
| Fresno           | 11  |
+------------------------+
| San Diego        | 7   |
+------------------------+
| Santa Cruz       | 5   |
+------------------------+
| Ventura          | 3   |
+------------------------+
| San Luis Obispo  | 3   |
+------------------------+
| Orange           | 2   |
+------------------------+
| San Mateo        | 1   |
+------------------------+
```

## 其他資源
<a name="geospatial-example-queries-additional-resources"></a>

如需地理空間查詢的其他範例，請參閱下列部落格文章：
+ [使用 UDFs 和 擴展 Amazon Athena 中的地理空間查詢 AWS Lambda](https://aws.amazon.com/blogs/big-data/extend-geospatial-queries-in-amazon-athena-with-udfs-and-aws-lambda/) 
+ [使用 Amazon Athena 和 Amazon Quick 視覺化超過 200 年的全球氣候資料](https://aws.amazon.com/blogs/big-data/visualize-over-200-years-of-global-climate-data-using-amazon-athena-and-amazon-quicksight/)。
+ [使用 Amazon Athena 查詢 OpenStreetMap](https://aws.amazon.com/blogs/big-data/querying-openstreetmap-with-amazon-athena/)

# 查詢 JSON 資料
<a name="querying-JSON"></a>

Amazon Athena 可讓您查詢 JSON 編碼資料、從巢狀 JSON 擷取資料、搜尋值，以及尋找 JSON 陣列的長度和大小。若要了解在 Athena 中查詢 JSON 資料的基本知識，請考慮下列範例行星資料：

```
{name:"Mercury",distanceFromSun:0.39,orbitalPeriod:0.24,dayLength:58.65}
{name:"Venus",distanceFromSun:0.72,orbitalPeriod:0.62,dayLength:243.02}
{name:"Earth",distanceFromSun:1.00,orbitalPeriod:1.00,dayLength:1.00}
{name:"Mars",distanceFromSun:1.52,orbitalPeriod:1.88,dayLength:1.03}
```

請注意，每一筆記錄 (基本上是資料表中的每個資料列) 都自成一行。若要查詢此 JSON 資料，可以使用 `CREATE TABLE` 陳述式，如下所示：

```
CREATE EXTERNAL TABLE `planets_json`(
  `name` string,
  `distancefromsun` double,
  `orbitalperiod` double,
  `daylength` double)
ROW FORMAT SERDE
  'org.openx.data.jsonserde.JsonSerDe'
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/json/'
```

若要查詢資料，請使用簡單的 `SELECT` 陳述式，如下列範例所示。

```
SELECT * FROM planets_json
```

查詢結果如下所示。


****  

| \$1 | name | distancefromsun | orbitalperiod | daylength | 
| --- | --- | --- | --- | --- | 
| 1 | Mercury | 0.39 | 0.24 | 58.65 | 
| 2 | Venus | 0.72 | 0.62 | 243.02 | 
| 3 | Earth | 1.0 | 1.0 | 1.0 | 
| 4 | Mars | 1.52 | 1.88 | 1.03 | 

請注意，`CREATE TABLE` 陳述式如何使用 [OpenX JSON SerDe](openx-json-serde.md)，這需要每一筆 JSON 記錄自成一行。如果 JSON 是美化顯示格式，或者所有記錄都自成一行，則資料將無法正確讀取。

若要查詢美化顯示格式的 JSON 資料，可以使用 [Amazon Ion Hive SerDe](ion-serde.md) 而不是 OpenX JSON SerDe。請考慮以美化顯示格式存放的先前資料：

```
{
  name:"Mercury",
  distanceFromSun:0.39,
  orbitalPeriod:0.24,
  dayLength:58.65
}
{
  name:"Venus",
  distanceFromSun:0.72,
  orbitalPeriod:0.62,
  dayLength:243.02
}
{
  name:"Earth",
  distanceFromSun:1.00,
  orbitalPeriod:1.00,
  dayLength:1.00
}
{
  name:"Mars",
  distanceFromSun:1.52,
  orbitalPeriod:1.88,
  dayLength:1.03
}
```

若要查詢此資料而不重新格式化，可以使用 `CREATE TABLE` 陳述式，如下所示。請注意，陳述式並未指定 OpenX JSON SerDe，而是指定 `STORED AS ION`。

```
CREATE EXTERNAL TABLE `planets_ion`(
  `name` string,
  `distancefromsun` DECIMAL(10, 2),
  `orbitalperiod` DECIMAL(10, 2),
  `daylength` DECIMAL(10, 2))
STORED AS ION
LOCATION
  's3://amzn-s3-demo-bucket/json-ion/'
```

查詢 `SELECT * FROM planets_ion` 會產生與之前相同的結果。如需有關使用 Amazon Ion Hive SerDe 以這種方式建立資料表的詳細資訊，請參閱 [建立 Amazon Ion 資料表](ion-serde-using-create-table.md)。

上述範例 JSON 資料不包含複雜的資料類型，例如巢狀陣列或結構。如需有關查詢巢狀 JSON 資料的詳細資訊，請參閱 [範例：還原序列化巢狀 JSON](openx-json-serde.md#nested-json-serde-example)。

**Topics**
+ [讀取 JSON 資料的最佳實務](parsing-json-data.md)
+ [從字串擷取 JSON 資料](extracting-data-from-JSON.md)
+ [搜尋 JSON 陣列中的值](searching-for-values.md)
+ [取得 JSON 陣列的長度和大小](length-and-size.md)
+ [對 JSON 查詢進行疑難排解](json-troubleshooting.md)

# 讀取 JSON 資料的最佳實務
<a name="parsing-json-data"></a>

JavaScript 物件標記法 (JSON) 是將資料結構編碼為文字的常見方法。許多應用程式和工具輸出的資料都是 JSON 編碼。

在 Amazon Athena 中，您可以從外部資料建立資料表，並將 JSON 編碼的資料加入資料表。對於此類型的來源資料，請將 Athena 搭配 [JSON SerDe 程式庫](json-serde.md) 一起使用。

使用以下秘訣讀取 JSON 編碼的資料：
+ 選擇正確的 SerDe、原生 JSON SerDe、`org.apache.hive.hcatalog.data.JsonSerDe` 或 OpenX SerDe、`org.openx.data.jsonserde.JsonSerDe`。如需詳細資訊，請參閱[JSON SerDe 程式庫](json-serde.md)。
+ 確保每一筆 JSON 編碼記錄都自成一行，並沒有呈現漂亮列印的狀態。
**注意**  
SerDe 預期每筆 JSON 文件都以單行文字表示，而且沒有行終止字元分隔記錄中的欄位。如果 JSON 文字是美化過的列印格式，則在建立資料表後嘗試在其中查詢時可能會收到下列錯誤訊息：HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object (HIVE\$1CURSOR\$1ERROR：資料列不是有效的 JSON 物件) 或 HIVE\$1CURSOR\$1ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT (HIVE\$1CURSOR\$1ERROR：JsonParseException：非預期的輸入結束：預期為 OBJECT 的關閉標記)。如需詳細資訊，請參閱 GitHub 上 OpenX SerDe 文件中的 [JSON 資料檔案](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files)。
+ 在區分大小寫的欄中產生 JSON 編碼的資料。
+ 提供選項以忽略格式不正確的記錄，如這個範例所示。

  ```
  CREATE EXTERNAL TABLE json_table (
    column_a string,
    column_b int
   )
   ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
   WITH SERDEPROPERTIES ('ignore.malformed.json' = 'true')
   LOCATION 's3://amzn-s3-demo-bucket/path/';
  ```
+ 在 Athena 中，將來源資料中結構描述不明的欄位，轉換為 JSON 編碼字串。

Athena 在建立受 JSON 資料支援的資料表時，會根據現有和預先定義的結構描述來剖析資料。不過，並非所有資料都有預先定義的結構描述。在這種情況下，為了簡化結構描述管理，通常建議在 Athena 中將來源資料中結構描述不明的欄位，轉換為 JSON 字串，然後使用 [JSON SerDe 程式庫](json-serde.md)。

例如，假設 IoT 應用程式從不同的感應器發佈含有常見欄位的事件。其中一個欄位必須存放傳送事件的感應器所獨有的自訂承載。在這種情況下，因為您不知道結構描述，建議您以 JSON 編碼字串來存放資訊。若要這樣做，請將 Athena 資料表中的資料轉換為 JSON，如下列範例所示。您也可以將 JSON 編碼的資料轉換為 Athena 資料類型。

**Topics**
+ [將 Athena 資料類型轉換為 JSON](converting-native-data-types-to-json.md)
+ [將 JSON 轉換為 Athena 資料類型](converting-json-to-native-data-types.md)

# 將 Athena 資料類型轉換為 JSON
<a name="converting-native-data-types-to-json"></a>

若要將 Athena 資料類型轉換為 JSON，請使用 `CAST`。

```
WITH dataset AS (
  SELECT
    CAST('HELLO ATHENA' AS JSON) AS hello_msg,
    CAST(12345 AS JSON) AS some_int,
    CAST(MAP(ARRAY['a', 'b'], ARRAY[1,2]) AS JSON) AS some_map
)
SELECT * FROM dataset
```

此查詢會傳回：

```
+-------------------------------------------+
| hello_msg      | some_int | some_map      |
+-------------------------------------------+
| "HELLO ATHENA" | 12345    | {"a":1,"b":2} |
+-------------------------------------------+
```

# 將 JSON 轉換為 Athena 資料類型
<a name="converting-json-to-native-data-types"></a>

若要將 JSON 資料轉換為 Athena 資料類型，請使用 `CAST`。

**注意**  
在這個範例中，若要以 JSON 編碼表示字串，請以 `JSON` 關鍵字為開頭，並使用單引號，例如 `JSON '12345'` 

```
WITH dataset AS (
  SELECT
    CAST(JSON '"HELLO ATHENA"' AS VARCHAR) AS hello_msg,
    CAST(JSON '12345' AS INTEGER) AS some_int,
    CAST(JSON '{"a":1,"b":2}' AS MAP(VARCHAR, INTEGER)) AS some_map
)
SELECT * FROM dataset
```

此查詢會傳回：

```
+-------------------------------------+
| hello_msg    | some_int | some_map  |
+-------------------------------------+
| HELLO ATHENA | 12345    | {a:1,b:2} |
+-------------------------------------+
```

# 從字串擷取 JSON 資料
<a name="extracting-data-from-JSON"></a>

您可能會有來源資料，其中包含您不想要還原序列化到 Athena 中的資料表、以 JSON 編碼的字串。在這種情況下，您仍然可以使用 Presto 中提供的 JSON 函數來對此資料執行 SQL 操作。

將此 JSON 字串做為範例資料集。

```
{"name": "Susan Smith",
"org": "engineering",
"projects":
    [
     {"name":"project1", "completed":false},
     {"name":"project2", "completed":true}
    ]
}
```

## 範例：擷取屬性
<a name="examples-extracting-properties"></a>

若要從 JSON 字串擷取 `name` 和 `projects` 屬性，請使用 `json_extract` 函數，如以下範例所示。`json_extract` 函數會取得包含 JSON 字串的資料欄，並使用具有句點 `.` 表示法、類似 `JSONPath` 的表達式來搜尋它。

**注意**  
 `JSONPath` 會執行簡單的樹狀目錄周遊。它使用 `$` 符號來表示 JSON 文件的根目錄，接著是一個句點和一個元素，直接在根目錄形成巢狀，例如 `$.name`。

```
WITH dataset AS (
  SELECT '{"name": "Susan Smith",
           "org": "engineering",
           "projects": [{"name":"project1", "completed":false},
           {"name":"project2", "completed":true}]}'
    AS myblob
)
SELECT
  json_extract(myblob, '$.name') AS name,
  json_extract(myblob, '$.projects') AS projects
FROM dataset
```

傳回的值是一個 JSON 編碼字串，而不是原生 Athena 資料類型。

```
+-----------------------------------------------------------------------------------------------+
| name           | projects                                                                     |
+-----------------------------------------------------------------------------------------------+
| "Susan Smith"  | [{"name":"project1","completed":false},{"name":"project2","completed":true}] |
+-----------------------------------------------------------------------------------------------+
```

若要從 JSON 字串擷取純量值，請使用 `json_extract_scalar(json, json_path)` 函數。它類似於 `json_extract`，但會傳回 `varchar` 字串值，而不是 JSON 編碼字串。*json\$1path* 參數的值必須是純量值 (布林值、數字或字串)。

**注意**  
請勿在陣列、地圖或結構上使用 `json_extract_scalar` 函數。

```
WITH dataset AS (
  SELECT '{"name": "Susan Smith",
           "org": "engineering",
           "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}'
    AS myblob
)
SELECT
  json_extract_scalar(myblob, '$.name') AS name,
  json_extract_scalar(myblob, '$.projects') AS projects
FROM dataset
```

此查詢會傳回：

```
+---------------------------+
| name           | projects |
+---------------------------+
| Susan Smith    |          |
+---------------------------+
```

若要取得範例陣列中 `projects` 屬性的第一個元素，請使用 `json_array_get` 函數，並指定索引位置。

```
WITH dataset AS (
  SELECT '{"name": "Bob Smith",
           "org": "engineering",
           "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}'
    AS myblob
)
SELECT json_array_get(json_extract(myblob, '$.projects'), 0) AS item
FROM dataset
```

它會傳回在以 JSON 編碼的陣列中指定索引位置的值。

```
+---------------------------------------+
| item                                  |
+---------------------------------------+
| {"name":"project1","completed":false} |
+---------------------------------------+
```

若要傳回 Athena 字串類型，請在 `JSONPath` 表達式內使用 `[]` 運算子，然後使用 `json_extract_scalar` 函數。如需 `[]` 的相關資訊，請參閱 [存取陣列元素](accessing-array-elements.md)。

```
WITH dataset AS (
   SELECT '{"name": "Bob Smith",
             "org": "engineering",
             "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}'
     AS myblob
)
SELECT json_extract_scalar(myblob, '$.projects[0].name') AS project_name
FROM dataset
```

它會傳回此結果：

```
+--------------+
| project_name |
+--------------+
| project1     |
+--------------+
```

# 搜尋 JSON 陣列中的值
<a name="searching-for-values"></a>

若要判斷特定的值是否存在 JSON 編碼陣列內，請使用 `json_array_contains` 函數。

以下查詢列出參與 "project2" 的使用者名稱。

```
WITH dataset AS (
  SELECT * FROM (VALUES
    (JSON '{"name": "Bob Smith", "org": "legal", "projects": ["project1"]}'),
    (JSON '{"name": "Susan Smith", "org": "engineering", "projects": ["project1", "project2", "project3"]}'),
    (JSON '{"name": "Jane Smith", "org": "finance", "projects": ["project1", "project2"]}')
  ) AS t (users)
)
SELECT json_extract_scalar(users, '$.name') AS user
FROM dataset
WHERE json_array_contains(json_extract(users, '$.projects'), 'project2')
```

此查詢會傳回使用者清單。

```
+-------------+
| user        |
+-------------+
| Susan Smith |
+-------------+
| Jane Smith  |
+-------------+
```

以下查詢範例列出已完成專案的使用者名稱，以及完成的專案總數。它會執行下列動作：
+ 使用巢狀 `SELECT` 陳述式以清楚顯示。
+ 擷取專案陣列。
+ 使用 `CAST` 將陣列轉換為鍵值對的原生陣列。
+ 使用 `UNNEST` 運算子擷取每一個陣列元素。
+ 依完成的專案篩選獲得的值並計算總數。

**注意**  
對 `MAP` 使用 `CAST` 時，您可以將索引鍵元素指定為 `VARCHAR` (Presto 中的原生 String)，但值要保持為 JSON，因為 `MAP` 中的值是不同類型：第一個鍵值對使用 String，第二個使用 Boolean。

```
WITH dataset AS (
  SELECT * FROM (VALUES
    (JSON '{"name": "Bob Smith",
             "org": "legal",
             "projects": [{"name":"project1", "completed":false}]}'),
    (JSON '{"name": "Susan Smith",
             "org": "engineering",
             "projects": [{"name":"project2", "completed":true},
                          {"name":"project3", "completed":true}]}'),
    (JSON '{"name": "Jane Smith",
             "org": "finance",
             "projects": [{"name":"project2", "completed":true}]}')
  ) AS t (users)
),
employees AS (
  SELECT users, CAST(json_extract(users, '$.projects') AS
    ARRAY(MAP(VARCHAR, JSON))) AS projects_array
  FROM dataset
),
names AS (
  SELECT json_extract_scalar(users, '$.name') AS name, projects
  FROM employees, UNNEST (projects_array) AS t(projects)
)
SELECT name, count(projects) AS completed_projects FROM names
WHERE cast(element_at(projects, 'completed') AS BOOLEAN) = true
GROUP BY name
```

此查詢會傳回下列結果：

```
+----------------------------------+
| name        | completed_projects |
+----------------------------------+
| Susan Smith | 2                  |
+----------------------------------+
| Jane Smith  | 1                  |
+----------------------------------+
```

# 取得 JSON 陣列的長度和大小
<a name="length-and-size"></a>

若要取得 JSON 陣列的長度和大小，您可以使用 `json_array_length` 和 `json_size` 函式。

## 範例：`json_array_length`
<a name="example-json-array-length"></a>

若要取得 JSON 編碼陣列的長度，請使用 `json_array_length` 函數。

```
WITH dataset AS (
  SELECT * FROM (VALUES
    (JSON '{"name":
            "Bob Smith",
            "org":
            "legal",
            "projects": [{"name":"project1", "completed":false}]}'),
    (JSON '{"name": "Susan Smith",
            "org": "engineering",
            "projects": [{"name":"project2", "completed":true},
                         {"name":"project3", "completed":true}]}'),
    (JSON '{"name": "Jane Smith",
             "org": "finance",
             "projects": [{"name":"project2", "completed":true}]}')
  ) AS t (users)
)
SELECT
  json_extract_scalar(users, '$.name') as name,
  json_array_length(json_extract(users, '$.projects')) as count
FROM dataset
ORDER BY count DESC
```

此查詢會傳回以下結果：

```
+---------------------+
| name        | count |
+---------------------+
| Susan Smith | 2     |
+---------------------+
| Bob Smith   | 1     |
+---------------------+
| Jane Smith  | 1     |
+---------------------+
```

## 範例：`json_size`
<a name="example-json-size"></a>

若要取得 JSON 編碼陣列或物件的大小，請使用 `json_size` 函數，並指定包含 JSON 字串的欄，以及陣列或物件的 `JSONPath` 表達式。

```
WITH dataset AS (
  SELECT * FROM (VALUES
    (JSON '{"name": "Bob Smith", "org": "legal", "projects": [{"name":"project1", "completed":false}]}'),
    (JSON '{"name": "Susan Smith", "org": "engineering", "projects": [{"name":"project2", "completed":true},{"name":"project3", "completed":true}]}'),
    (JSON '{"name": "Jane Smith", "org": "finance", "projects": [{"name":"project2", "completed":true}]}')
  ) AS t (users)
)
SELECT
  json_extract_scalar(users, '$.name') as name,
  json_size(users, '$.projects') as count
FROM dataset
ORDER BY count DESC
```

此查詢會傳回以下結果：

```
+---------------------+
| name        | count |
+---------------------+
| Susan Smith | 2     |
+---------------------+
| Bob Smith   | 1     |
+---------------------+
| Jane Smith  | 1     |
+---------------------+
```

# 對 JSON 查詢進行疑難排解
<a name="json-troubleshooting"></a>

如需對 JSON 相關查詢之問題進行疑難排解的說明，請參閱 [JSON 相關錯誤](troubleshooting-athena.md#troubleshooting-athena-json-related-errors) 或諮詢下列資源：
+ [當我嘗試在 Amazon Athena 中讀取 JSON 資料時出現錯誤](https://aws.amazon.com/premiumsupport/knowledge-center/error-json-athena/)
+ [在 Athena AWS Config 中從 讀取檔案時，如何解析「HIVE\$1CURSOR\$1ERROR： 資料列不是有效的 JSON 物件 - JSONException：複製金鑰」？](https://aws.amazon.com/premiumsupport/knowledge-center/json-duplicate-key-error-athena-config/)
+ [輸入 JSON 文件有多筆記錄，但 Amazon Athena 中的 SELECT COUNT 查詢只傳回一筆記錄](https://aws.amazon.com/premiumsupport/knowledge-center/select-count-query-athena-json-records/)
+ [如何查看 Athena 資料表中某資料列的 Amazon S3 來源檔案？](https://aws.amazon.com/premiumsupport/knowledge-center/find-s3-source-file-athena-table-row/)

另請參閱[在 Amazon Athena 中進行 SQL 查詢的考量事項與限制](other-notable-limitations.md)。

# 搭配 Amazon Athena 使用機器學習 (ML)
<a name="querying-mlmodel"></a>

搭配 Amazon Athena 的機器學習 (ML) 可讓您使用 Athena 撰寫 SQL 陳述式，以使用 Amazon SageMaker AI 執行機器學習 (ML) 推論。此功能讓您輕鬆存取 ML 模型以分析資料，無需使用複雜的程式設計方法來執行推論。

若要搭配 Athena 使用機器學習 (ML)，您可以使用 `USING EXTERNAL FUNCTION` 子句定義帶有 Athena 函數的機器學習 (ML)。此函式指向您要使用的 SageMaker AI 模型端點，並指定要傳遞給模型的變數名稱和資料類型。查詢中的後續子句參考此函數，將值傳遞給模型。模型根據查詢傳遞的值執行推論，然後傳回推論結果。如需有關 SageMaker AI 以及 SageMaker AI 端點運作方式的詳細資訊，請參閱《Amazon SageMaker AI 開發人員指南[https://docs.aws.amazon.com/sagemaker/latest/dg/](https://docs.aws.amazon.com/sagemaker/latest/dg/)》。

如需使用 ML 搭配 Athena 和 SageMaker AI 推論來偵測結果集中異常值的範例，請參閱 AWS 大數據部落格文章[透過叫用 Amazon Athena 機器學習推論函數來偵測異常值](https://aws.amazon.com/blogs/big-data/detecting-anomalous-values-by-invoking-the-amazon-athena-machine-learning-inference-function/)。

## 考量和限制
<a name="considerations-and-limitations"></a>
+ **可用區域** – Athena ML 功能可在支援 Athena 引擎第 2 版或更新版本 AWS 區域 的 中使用。
+ **SageMaker AI 模型端點必須接受並傳回 `text/csv`** – 如需有關資料格式的詳細資訊，請參閱《Amazon SageMaker AI 開發人員指南**》中的[推論的一般資料格式](https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-inference.html)。
+ **Athena 不會傳送 CSV 標頭** – 如果您的 SageMaker AI 端點是 `text/csv`，您的輸入處理常式不應假設輸入的第一行是 CSV 標頭。由於 Athena 不會傳送 CSV 標頭，因此傳回至 Athena 的輸出將包含比 Athena 預期的少一個資料列，並導致錯誤。
+ **SageMaker AI 端點擴展** – 確保參考的 SageMaker AI 模型端點已充分向上擴展到可讓 Athena 呼叫端點。如需詳細資訊，請參閱《Amazon SageMaker AI 開發人員指南**》中的[自動擴展 SageMaker AI 模型](https://docs.aws.amazon.com/sagemaker/latest/dg/endpoint-auto-scaling.html)和《Amazon SageMaker AI API 參考**》中的 [CreateEndpointConfig](https://docs.aws.amazon.com/sagemaker/latest/dg/API_CreateEndpointConfig.html)。
+ **IAM 許可** – 若要執行指定帶有 Athena 函式的機器學習 (ML) 的查詢，則執行該查詢的 IAM 主體必須能夠針對參考的 SageMaker AI 模型端點執行 `sagemaker:InvokeEndpoint` 動作。如需詳細資訊，請參閱[允許使用 Athena 存取機器學習](machine-learning-iam-access.md)。
+ **不能直接在 `GROUP BY` 子句中使用帶有 Athena 函數的機器學習 (ML)**

**Topics**
+ [考量和限制](#considerations-and-limitations)
+ [使用帶有 Athena 的機器學習 (ML) 語法](ml-syntax.md)
+ [請參閱客戶使用範例](ml-videos.md)

# 使用帶有 Athena 的機器學習 (ML) 語法
<a name="ml-syntax"></a>

`USING EXTERNAL FUNCTION` 子句會指定帶有一或多個 Athena 函數的機器學習 (ML)，供查詢中的後續 `SELECT` 陳述句參考。您定義函數名稱、變數名稱，以及變數和傳回值的資料類型。

## 概要
<a name="ml-synopsis"></a>

下面的語法顯示了 `USING EXTERNAL FUNCTION` 子句，其會指定帶有 Athena 函數的機器學習 (ML)。

```
USING EXTERNAL FUNCTION ml_function_name (variable1 data_type[, variable2 data_type][,...])
RETURNS data_type 
SAGEMAKER 'sagemaker_endpoint'
SELECT ml_function_name()
```

## Parameters
<a name="udf-parameters"></a>

**USING EXTERNAL FUNCTION *ml\$1function\$1name* (*variable1* *data\$1type*[, *variable2* *data\$1type*][,...])**  
*ml\$1function\$1name* 定義函數名稱，供後續查詢子句中使用。每個 *variable data\$1type* 指定具名變數及其相應的資料類型，供 SageMaker AI 模型接受作為輸入。指定的資料類型必須是支援的 Athena 資料類型。

**RETURNS *data\$1type***  
*data\$1type* 指定 *ml\$1function\$1name* 傳回給查詢的 SQL 資料類型，作為 SageMaker AI 模型的輸出。

**SAGEMAKER '*sagemaker\$1endpoint*'**  
*sagemaker\$1endpoint* 指定 SageMaker AI 模型的端點。

**SELECT [...] *ml\$1function\$1name*(*expression*) [...]**  
將值傳遞給函式變數和 SageMaker AI 模型以傳回結果的 SELECT 查詢。*ml\$1function\$1name* 指定先前在查詢中定義的函式，後面的 *expression* 會經過評估以傳遞值。傳遞和傳回的值必須符合 `USING EXTERNAL FUNCTION` 子句中為函數指定的相應資料類型。

## 範例
<a name="ml-examples"></a>

下例範例示範一個搭配 Athena 使用機器學習 (ML) 的查詢。

**Example**  

```
USING EXTERNAL FUNCTION predict_customer_registration(age INTEGER) 
    RETURNS DOUBLE
    SAGEMAKER 'xgboost-2019-09-20-04-49-29-303' 
SELECT predict_customer_registration(age) AS probability_of_enrolling, customer_id 
     FROM "sampledb"."ml_test_dataset" 
     WHERE predict_customer_registration(age) < 0.5;
```

# 請參閱客戶使用範例
<a name="ml-videos"></a>

下列影片搭配 Amazon Athena 使用機器學習 (ML) 的預覽版本，展示您可以將 SageMaker AI 搭配 Athena 使用的方法。

## 預測客戶流失率
<a name="ml-videos-predict-churn"></a>

下列影片展示如何將 Athena 與 Amazon SageMaker AI 的機器學習功能結合起來，預測客戶流失率。

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


## 偵測殭屍網路
<a name="ml-videos-detect-botnets"></a>

下列影片展示一家公司如何使用 Amazon Athena 和 Amazon SageMaker AI 來偵測殭屍網路。

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


# 利用使用者定義函式進行查詢
<a name="querying-udf"></a>

Amazon Athena 中的使用者定義函數 (UDF) 可讓您建立自訂函數，以處理記錄或記錄群組。UDF 接受參數、執行工作，然後傳回結果。

若要在 Athena 中使用 UDF，請在 SQL 查詢中的 `SELECT` 陳述式之前撰寫 `USING EXTERNAL FUNCTION` 子句。`SELECT` 陳述式參考 UDF，並定義在執行查詢時傳遞至 UDF 的變數。SQL 查詢呼叫 UDF 時使用 Java 執行時間叫用 Lambda 函數。UDF 在 Lambda 函數內被定義為 Java 部署套件中的方法。在同一個 Java 部署套件中，一個 Lambda 函數可以定義多個 UDF。您也可以在 `USING EXTERNAL FUNCTION` 子句中指定 Lambda 函數的名稱。

部署 Athena UDF 的 Lambda 函數時有兩種選項。您可以直接使用 Lambda，也可以使用 AWS Serverless Application Repository部署函數。若要尋找 UDFs的現有 Lambda 函數，您可以搜尋公有 AWS Serverless Application Repository 或私有儲存庫，然後部署至 Lambda。您也可以建立或修改 Java 原始程式碼、將其封裝成 JAR 檔案，然後使用 Lambda 或 AWS Serverless Application Repository部署此檔案。如需 Java 原始程式碼和套件範例來協助您開始使用，請參閱[使用 Lambda 建立和部署 UDF](udf-creating-and-deploying.md)。如需有關 Lambda 的詳細資訊，請參閱《[AWS Lambda 開發人員指南](https://docs.aws.amazon.com/lambda/latest/dg/)》。如需 的詳細資訊 AWS Serverless Application Repository，請參閱 [AWS Serverless Application Repository 開發人員指南](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/)。

如需搭配 Athena 使用 UDFs 來翻譯和分析文字的範例，請參閱 AWS Machine Learning部落格文章[搭配 Amazon Athena、Amazon Translate 和 Amazon Comprehend 使用 SQL 函數來翻譯和分析文字](https://aws.amazon.com/blogs/machine-learning/translate-and-analyze-text-using-sql-functions-with-amazon-athena-amazon-translate-and-amazon-comprehend/)，或觀看 [video](udf-videos.md#udf-videos-xlate)。

如需使用 UDF 在 Amazon Athena 擴充地理空間查詢的範例，請參閱使用 *AWS 大數據部落格*中的[使用 UDF 和 AWS Lambda在 Amazon Athena 中擴充地理空間查詢](https://aws.amazon.com/blogs/big-data/extend-geospatial-queries-in-amazon-athena-with-udfs-and-aws-lambda/)。

**Topics**
+ [有關 Athena 中的 UDF 的影片](udf-videos.md)
+ [考量和限制](udf-considerations-limitations.md)
+ [使用 UDF 查詢語法進行查詢](udf-query-syntax.md)
+ [使用 Lambda 建立和部署 UDF](udf-creating-and-deploying.md)

# 有關 Athena 中的 UDF 的影片
<a name="udf-videos"></a>

請觀看以下影片，進一步了解如何在 Athena 中使用 UDF。

**影片：Amazon Athena 中使用者定義函數 (UDF) 的簡介**  
下面的影片展示如何在 Amazon Athena 中使用 UDF 來修訂敏感資訊。

**注意**  
本影片中的語法是發行前版本，但概念相同。在沒有 `AmazonAthenaPreviewFunctionality` 工作群組的情況下使用 Athena。

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


**影片：使用 Amazon Athena 中的 SQL 查詢，翻譯、分析和修訂文字欄位**  
下面的影片示範如何在 Amazon Athena 中使用 UDF 與其他 AWS 服務 來翻譯和分析文字。

**注意**  
本影片中的語法是發行前版本，但概念相同。如需正確的語法，請參閱在 *AWS Machine Learning 部落格*中的相關部落格文章：[搭配 Amazon Athena、Amazon Translate 和 Amazon Comprehend 使用 SQL 函數，翻譯、修訂和分析文字](https://aws.amazon.com/blogs/machine-learning/translate-and-analyze-text-using-sql-functions-with-amazon-athena-amazon-translate-and-amazon-comprehend/)。

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


# 考量和限制
<a name="udf-considerations-limitations"></a>

當您在 Athena 中運用使用者定義函式 (UDF) 時，請考慮下列幾點。
+ **內建 Athena 函數** – Athena 中內建的函數專為高效能而設計。建議您盡可能使用內建函數，而不要使用 UDF。如需內建函數的詳細資訊，請參閱[Amazon Athena 中的函數](functions.md)。
+ **僅限純量 UDF** – Athena 僅支援純量 UDF，一次只處理一個資料行，並傳回單一資料欄值。Athena 每次叫用 Lambda 時，可能會平行地將一整批的資料行傳遞給 UDF。在設計 UDF 和查詢時，請注意此處理可能對網路流量造成的潛在影響。
+ **UDF 處理常式函數使用縮寫格式** – 針對 UDF 函數使用縮寫格式 (非完整格式) (例如 `package.Class` 而不是 `package.Class::method`)。
+ **UDF 方法必須為小寫** – UDF 方法必須為小寫；不允許使用駱駝大小寫。
+ **UDF 方法需要參數** – UDF 方法至少必須有一個輸入參數。嘗試調用不帶輸入參數定義的 UDF 會導致執行期例外。UDF 旨在針對資料記錄執行函數，但是不帶引數的 UDF 不接受任何資料，因此發生例外。
+ **Java 執行時期支援** – 目前 Athena UDF 支援 Lambda 的 Java 8、Java 11 和 Java 17 執行時期。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的[使用 Java 建立 Lambda 函數](https://docs.aws.amazon.com/lambda/latest/dg/lambda-java.html)。
**注意**  
 對於 Java 17，您必須將 `JAVA_TOOL_OPTIONS` 環境變數的值設定為 Lambda 中的 `--add-opens=java.base/java.nio=ALL-UNNAMED`。
+ **IAM 許可** – 若要在 Athena 中執行和建立 UDF 查詢陳述式，執行查詢的 IAM 委託人必須能夠執行 Athena 函數以外的動作。如需詳細資訊，請參閱[允許存取 Athena UDF：範例政策](udf-iam-access.md)。
+ **Lambda 配額** – Lambda 配額適用於 UDF。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/limits.html)。
+ **資料列層級篩選** – UDF 不支援 Lake Formation 資料列層級篩選。
+ **檢視** – 您無法搭配使用檢視與 UDF。
+ **已知問題** – 如需最新的已知問題清單，請參閱 GitHub 的 awslabs/aws-athena-query-federation 一節中的[限制與問題](https://github.com/awslabs/aws-athena-query-federation/wiki/Limitations_And_Issues)。

# 使用 UDF 查詢語法進行查詢
<a name="udf-query-syntax"></a>

`USING EXTERNAL FUNCTION` 子句指定一個 UDF 或多個 UDF，供查詢中的後續 `SELECT` 陳述式參考。您需要 UDF 的方法名稱及託管 UDF 之 Lambda 函數的名稱。若要取代 Lambda 函數名稱，您可以使用 Lambda ARN。在跨帳戶案例中，需要使用 Lambda ARN。

## 概要
<a name="udf-synopsis"></a>

```
USING EXTERNAL FUNCTION UDF_name(variable1 data_type[, variable2 data_type][,...])
RETURNS data_type
LAMBDA 'lambda_function_name_or_ARN'
[, EXTERNAL FUNCTION UDF_name2(variable1 data_type[, variable2 data_type][,...]) 
RETURNS data_type 
LAMBDA 'lambda_function_name_or_ARN'[,...]]
SELECT  [...] UDF_name(expression) [, UDF_name2(expression)] [...]
```

## Parameters
<a name="udf-parameters"></a>

**USING EXTERNAL FUNCTION *UDF\$1name*(*variable1* *data\$1type*[, *variable2* *data\$1type*][,...])**  
*UDF\$1name* 指定 UDF 的名稱，其必須對應於所參考 Lambda 函數中的 Java 方法。每個 *variable data\$1type* 會指定具名變數及其相應的資料類型，供 UDF 接受作為輸入。此 *data\$1type* 必須是下表列出的其中一種支援的 Athena 資料類型，並對應至相應的 Java 資料類型。      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/udf-query-syntax.html)

**RETURNS *data\$1type***  
`data_type` 會指定 UDF 傳回作為輸出的 SQL 資料類型。支援上表列出的 Athena 資料類型。對於 `DECIMAL` 資料類型，請使用語法 `RETURNS DECIMAL(precision, scale)`，其中*精確度*和*比例*是整數。

**LAMBDA '*lambda\$1function*'**  
*lambda\$1function* 指定在執行 UDF 時要叫用的 Lambda 函數之名稱。

**SELECT [...] *UDF\$1name*(*expression*) [...]**  
將值傳遞給 UDF 並傳回結果的 `SELECT` 查詢。*UDF\$1name* 指定要使用的 UDF，後接評估為傳遞值的 *expression*。傳遞和傳回的值必須符合 `USING EXTERNAL FUNCTION` 子句中為 UDF 指定的相應資料類型。

### 範例
<a name="udf-examples"></a>

如需 GitHub 上基於 [AthenaUDFHandler.java](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-udfs/src/main/java/com/amazonaws/athena/connectors/udfs/AthenaUDFHandler.java) 程式碼的查詢範例，請參閱 GitHub [Amazon Athena UDF 連接器](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-udfs)頁面。

# 使用 Lambda 建立和部署 UDF
<a name="udf-creating-and-deploying"></a>

若要建立自訂 UDF，請延伸 `UserDefinedFunctionHandler` 類別來建立新的 Java 類別。開發套件中的 [UserDefinedFunctionHandler.java](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-federation-sdk/src/main/java/com/amazonaws/athena/connector/lambda/handlers/UserDefinedFunctionHandler.java) 的原始程式碼位於 GitHub 的 awslabs/aws-athena-query-federation/athena-federation-sdk [儲存庫](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-federation-sdk)中，另外還有 [UDF 實作範例](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-udfs)，供您檢查和修改以建立自訂 UDF。

本節的步驟示範使用 [Apache Maven](https://maven.apache.org/index.html)，從命令列和部署來撰寫和建置自訂 UDF Jar 檔案。

執行下列步驟，以使用 Maven 為 Athena 建立自訂 UDF

1. [複製開發套件並準備開發環境](#udf-create-install-sdk-prep-environment)

1. [建立 Maven 專案](#create-maven-project)

1. [將相依性和外掛程式新增至 Maven 專案](#udf-add-maven-dependencies)

1. [撰寫 UDF 的 Java 程式碼](#udf-write-java)

1. [建置 JAR 檔案](#udf-create-package-jar)

1. [將 JAR 部署至 AWS Lambda](#udf-create-deploy)

## 複製開發套件並準備開發環境
<a name="udf-create-install-sdk-prep-environment"></a>

開始之前，務必使用 `sudo yum install git -y` 將 git 安裝在您的系統上。

**安裝 AWS 查詢聯合開發套件**
+ 在命令列輸入以下命令，以複製開發套件儲存庫。此儲存庫包含開發套件、範例和一套資料來源連接器。如需資料來源連接器的詳細資訊，請參閱[使用 Amazon Athena 聯合查詢](federated-queries.md)。

  ```
  git clone https://github.com/awslabs/aws-athena-query-federation.git
  ```

**安裝此程序的先決條件**

如果您在已安裝 Apache Maven、 AWS CLI和 AWS Serverless Application Model 建置工具的開發機器上工作，您可以略過此步驟。

1. 從您複製時所建立的 `aws-athena-query-federation` 目錄的根目錄，執行 [prepare\$1dev\$1env.sh](https://github.com/awslabs/aws-athena-query-federation/blob/master/tools/prepare_dev_env.sh) 指令碼以準備開發環境。

1. 更新 shell 以獲取安裝程序所建立的新變數，或重新啟動終端機工作階段。

   ```
   source ~/.profile
   ```
**重要**  
如果您略過此步驟，稍後會收到有關 AWS CLI 或 AWS SAM 建置工具無法發佈 Lambda 函數的錯誤。

## 建立 Maven 專案
<a name="create-maven-project"></a>

執行以下命令來建立 Maven 專案。以組織的唯一 ID 替換 *groupId*，以應用程式的名稱替換 *my-athena-udf*。如需詳細資訊，請參閱 Apache Maven 文件中的[如何建立我的第一個 Maven 專案？](https://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project)。

```
mvn -B archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DgroupId=groupId \
-DartifactId=my-athena-udfs
```

## 將相依性和外掛程式新增至 Maven 專案
<a name="udf-add-maven-dependencies"></a>

將以下組態新增至 Maven 專案 `pom.xml` 檔檔案。相關範例請參閱 GitHub 中的 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-udfs/pom.xml) 檔案。

```
<properties>
    <aws-athena-federation-sdk.version>2022.47.1</aws-athena-federation-sdk.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-athena-federation-sdk</artifactId>
        <version>${aws-athena-federation-sdk.version}</version>
    </dependency>
</dependencies>
    
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.1</version>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
```

## 撰寫 UDF 的 Java 程式碼
<a name="udf-write-java"></a>

延伸 [UserDefinedFunctionHandler.java](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-federation-sdk/src/main/java/com/amazonaws/athena/connector/lambda/handlers/UserDefinedFunctionHandler.java) 以建立新的類別。在類別中撰寫 UDF。

在下列範例中，類別 `MyUserDefinedFunctions` 內建立 UDF 的兩個 Java 方法：`compress()` 和 `decompress()`。

```
*package *com.mycompany.athena.udfs;

public class MyUserDefinedFunctions
        extends UserDefinedFunctionHandler
{
    private static final String SOURCE_TYPE = "MyCompany";

    public MyUserDefinedFunctions()
    {
        super(SOURCE_TYPE);
    }

    /**
     * Compresses a valid UTF-8 String using the zlib compression library.
     * Encodes bytes with Base64 encoding scheme.
     *
     * @param input the String to be compressed
     * @return the compressed String
     */
    public String compress(String input)
    {
        byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8);

        // create compressor
        Deflater compressor = new Deflater();
        compressor.setInput(inputBytes);
        compressor.finish();

        // compress bytes to output stream
        byte[] buffer = new byte[4096];
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(inputBytes.length);
        while (!compressor.finished()) {
            int bytes = compressor.deflate(buffer);
            byteArrayOutputStream.write(buffer, 0, bytes);
        }

        try {
            byteArrayOutputStream.close();
        }
        catch (IOException e) {
            throw new RuntimeException("Failed to close ByteArrayOutputStream", e);
        }

        // return encoded string
        byte[] compressedBytes = byteArrayOutputStream.toByteArray();
        return Base64.getEncoder().encodeToString(compressedBytes);
    }

    /**
     * Decompresses a valid String that has been compressed using the zlib compression library.
     * Decodes bytes with Base64 decoding scheme.
     *
     * @param input the String to be decompressed
     * @return the decompressed String
     */
    public String decompress(String input)
    {
        byte[] inputBytes = Base64.getDecoder().decode((input));

        // create decompressor
        Inflater decompressor = new Inflater();
        decompressor.setInput(inputBytes, 0, inputBytes.length);

        // decompress bytes to output stream
        byte[] buffer = new byte[4096];
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(inputBytes.length);
        try {
            while (!decompressor.finished()) {
                int bytes = decompressor.inflate(buffer);
                if (bytes == 0 && decompressor.needsInput()) {
                    throw new DataFormatException("Input is truncated");
                }
                byteArrayOutputStream.write(buffer, 0, bytes);
            }
        }
        catch (DataFormatException e) {
            throw new RuntimeException("Failed to decompress string", e);
        }

        try {
            byteArrayOutputStream.close();
        }
        catch (IOException e) {
            throw new RuntimeException("Failed to close ByteArrayOutputStream", e);
        }

        // return decoded string
        byte[] decompressedBytes = byteArrayOutputStream.toByteArray();
        return new String(decompressedBytes, StandardCharsets.UTF_8);
    }
}
```

## 建置 JAR 檔案
<a name="udf-create-package-jar"></a>

執行 `mvn clean install` 來建置專案。成功建置後，專案的 `target` 資料夾中會建立名為 `artifactId-version.jar` 的 JAR 檔案，其中 *artifactId* 是您在 Maven 專案中提供的名稱，例如 `my-athena-udfs`。

## 將 JAR 部署至 AWS Lambda
<a name="udf-create-deploy"></a>

將程式碼部署到 Lambda 時有兩種選項：
+ 使用 部署 AWS Serverless Application Repository （建議）
+ 從 JAR 檔案建立 Lambda 函數

### 選項 1：部署至 AWS Serverless Application Repository
<a name="udf-create-deploy-sar"></a>

當您將 JAR 檔案部署到 時 AWS Serverless Application Repository，您可以建立代表應用程式架構的 AWS SAM 範本 YAML 檔案。然後，您需指定此 YAML 檔案和 Simple Storage Service (Amazon S3) 儲存貯體，應用程式的成品會上傳到此處，並提供給 AWS Serverless Application Repository。下列程序使用 [publish.sh](https://github.com/awslabs/aws-athena-query-federation/blob/master/tools/publish.sh) 指令碼 (位於您先前複製的 Athena Query Federation 軟體開發套件的 `athena-query-federation/tools` 目錄中)。

如需詳細資訊和需求，請參閱《 *AWS Serverless Application Repository 開發人員指南*》中的[發佈應用程式](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/serverlessrepo-publishing-applications.html)、《 *AWS Serverless Application Model 開發人員指南*》中的[AWS SAM 範本概念](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-basics.html)，以及[使用 CLI AWS SAM 發佈無伺服器應用程式](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-publishing-applications.html)。

下列範例示範 YAML 檔案中的參數。將類似的參數新增至 YAML 檔案，並儲存在專案目錄中。如需完整範例，請參閱 GitHub 中的 [athena-udf.yaml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-udfs/athena-udfs.yaml)。

```
Transform: 'AWS::Serverless-2016-10-31'
Metadata:
  'AWS::ServerlessRepo::Application':
    Name: MyApplicationName
    Description: 'The description I write for my application'
    Author: 'Author Name'
    Labels:
      - athena-federation
    SemanticVersion: 1.0.0
Parameters:
  LambdaFunctionName:
    Description: 'The name of the Lambda function that will contain your UDFs.'
    Type: String
  LambdaTimeout:
    Description: 'Maximum Lambda invocation runtime in seconds. (min 1 - 900 max)'
    Default: 900
    Type: Number
  LambdaMemory:
    Description: 'Lambda memory in MB (min 128 - 3008 max).'
    Default: 3008
    Type: Number
Resources:
  ConnectorConfig:
    Type: 'AWS::Serverless::Function'
    Properties:
      FunctionName: !Ref LambdaFunctionName
      Handler: "full.path.to.your.handler. For example, com.amazonaws.athena.connectors.udfs.MyUDFHandler"
      CodeUri: "Relative path to your JAR file. For example, ./target/athena-udfs-1.0.jar"
      Description: "My description of the UDFs that this Lambda function enables."
      Runtime: java8
      Timeout: !Ref LambdaTimeout
      MemorySize: !Ref LambdaMemory
```

將 `publish.sh` 指令碼複製到您儲存 YAML 檔案的專案目錄，然後執行以下命令：

```
./publish.sh MyS3Location MyYamlFile
```

例如，如果儲存貯體位置是 `s3://amzn-s3-demo-bucket/mysarapps/athenaudf`，而且 YAML 檔案儲存為 `my-athena-udfs.yaml`：

```
./publish.sh amzn-s3-demo-bucket/mysarapps/athenaudf my-athena-udfs
```

**若要建立 Lambda 函數**

1. 前往以下位置開啟 Lambda 主控台：[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)，選擇 **Create function** (建立函數)，然後選擇 **Browse serverless app repository** (瀏覽無伺服器應用程式儲存庫)

1. 選擇 **Private applications (私有應用程式)**，在清單中尋找您的應用程式，或使用關鍵字搜尋應用程式，然後選取應用程式。

1. 檢閱並提供應用程式詳細資料，然後選擇 **Deploy (部署)**。

   您現在可以使用 Lambda 函數 JAR 檔案中定義的方法名稱，作為 Athena 中的 UDF。

### 選項 2：直接建立 Lambda 函式
<a name="udf-create-deploy-lambda"></a>

您也可以直接使用 主控台或 建立 Lambda 函數 AWS CLI。下列範例示範如何使用 Lambda `create-function` CLI 命令。

```
aws lambda create-function \
 --function-name MyLambdaFunctionName \
 --runtime java8 \
 --role arn:aws:iam::1234567890123:role/my_lambda_role \
 --handler com.mycompany.athena.udfs.MyUserDefinedFunctions \
 --timeout 900 \
 --zip-file fileb://./target/my-athena-udfs-1.0-SNAPSHOT.jar
```

# 跨區域查詢
<a name="querying-across-regions"></a>

Athena 支援在與您使用 Athena 的區域 AWS 區域 不同的 中查詢 Amazon S3 資料的能力。如果移動資料不切實際或未獲許可，或者您想要跨多個區域查詢資料，則可以選擇跨區域查詢。即使 Athena 在特定區域中不可用，也可以從 Athena 可用的另一個區域查詢來自該區域的資料。

若要查詢某個區域中的資料，您的帳戶必須在該區域中啟用，即使 Amazon S3 資料不屬於您的帳戶亦是如此。對於某些區域，如美國東部 (俄亥俄)，您在建立帳戶時會自動啟用對該區域的存取權限。其他區域要求您的帳戶在使用該區域之前「選擇加入」該區域。如需要求選擇加入的區域的清單，請參閱《Amazon EC2 使用者指南**》中的[可用區域](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions)。如需選擇加入區域的特定指示，請參閱《》中的[管理 AWS 區域](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html)*Amazon Web Services 一般參考*。

## 考量和限制
<a name="querying-across-regions-considerations-and-limitations"></a>
+ **資料存取許可** – 要從 Athena 跨地區成功查詢 Amazon S3 資料，您的帳戶必須具有讀取資料的許可。如果要查詢的資料屬於另一個帳戶，則另一個帳戶必須授予您對包含資料的 Amazon S3 位置的存取權限。
+ **資料傳輸費** – 跨區域查詢要支付 Amazon S3 資料傳輸費。執行查詢可能會導致傳輸的資料量超過資料集大小。建議您先測試資料子集的查詢，並檢閱 [AWS Cost Explorer](https://aws.amazon.com/aws-cost-management/aws-cost-explorer/) 中的成本。
+ **AWS Glue** – 您可以 AWS Glue 跨區域使用 。跨區域 AWS Glue 流量可能會收取額外費用。如需詳細資訊，請參閱*AWS 大數據部落格*中的[建立跨帳戶和跨區域 AWS Glue 連線](https://aws.amazon.com/blogs/big-data/create-cross-account-and-cross-region-aws-glue-connections/)。
+ **Amazon S3 加密選項** – 跨區域查詢支援 SSE-S3 和 SSE-KMS 加密選項；但不支援 CSE-KMS。如需詳細資訊，請參閱[支援的 Amazon S3 加密選項](encryption.md#encryption-options-S3-and-Athena)。
+ **聯合查詢** – AWS 區域 不支援跨 使用聯合查詢。

只要符合上述條件，您就可以建立一個指向您指定的 `LOCATION` 值的 Athena 資料表，並以透明方式查詢資料。並不需要特別語法。如需有關建立 Athena 資料表的資訊，請參閱 [在 Athena 中建立資料表](creating-tables.md)。

# 查詢 AWS Glue Data Catalog
<a name="querying-glue-catalog"></a>

由於許多 使用 AWS Glue Data Catalog AWS 服務 做為其中央中繼資料儲存庫，因此您可能想要查詢 Data Catalog 中繼資料。若要執行此操作，您可以在 Athena 中使用 SQL 查詢。您可以使用 Athena 查詢 AWS Glue 目錄中繼資料，例如資料庫、資料表、分割區和資料欄。

若要取得 AWS Glue 目錄中繼資料，您可以在 Athena 後端查詢`information_schema`資料庫。本主題中的查詢範例會顯示如何使用 Athena 來查詢常見使用案例的 AWS Glue 目錄中繼資料。

## 考量和限制
<a name="querying-glue-catalog-considerations-limitations"></a>
+ 不是查詢 `information_schema` 資料庫，可使用個別 Apache Hive [DDL 命令](ddl-reference.md)，擷取特定資料庫、資料表、檢視、分割區和資料欄的中繼資料資訊。然而，輸出採用非表格格式。
+ 如果您有少量到中等數量的 AWS Glue 中繼資料，查詢`information_schema`效能最佳。如果您有大量中繼資料，則可能會出現錯誤。
+ 您無法使用 `CREATE VIEW` 在 `information_schema` 資料庫上建立檢視。

**Topics**
+ [考量和限制](#querying-glue-catalog-considerations-limitations)
+ [列出資料庫並搜尋指定的資料庫](querying-glue-catalog-querying-available-databases-including-rdbms.md)
+ [列出指定資料庫中的資料表，並依名稱搜尋資料表](querying-glue-catalog-listing-tables.md)
+ [列出特定資料表的分割區](querying-glue-catalog-listing-partitions.md)
+ [列示或搜尋指定的資料表或檢視的資料欄](querying-glue-catalog-listing-columns.md)
+ [列出特定資料表共有的資料欄](querying-glue-catalog-listing-columns-in-common.md)
+ [列出所有資料表的所有資料欄](querying-glue-catalog-listing-all-columns-for-all-tables.md)

# 列出資料庫並搜尋指定的資料庫
<a name="querying-glue-catalog-querying-available-databases-including-rdbms"></a>

本節中的範例顯示如何依結構描述名稱列出中繼資料中的資料庫。

**Example – 列出資料庫**  
以下範例查詢會列出 `information_schema.schemata` 資料表中的數據庫。  

```
SELECT schema_name
FROM   information_schema.schemata
LIMIT  10;
```
下列資料表會顯示範例結果。  


****  

|  |  | 
| --- |--- |
| 6 | alb-databas1 | 
| 7 | alb\$1original\$1cust | 
| 8 | alblogsdatabase | 
| 9 | athena\$1db\$1test | 
| 10 | athena\$1ddl\$1db | 

**Example – 搜尋指定資料庫**  
在下列範例查詢中，`rdspostgresql` 是範例資料庫。  

```
SELECT schema_name
FROM   information_schema.schemata
WHERE  schema_name = 'rdspostgresql'
```
下列資料表會顯示範例結果。  


****  

|  | schema\$1name | 
| --- | --- | 
| 1 | rdspostgresql | 

# 列出指定資料庫中的資料表，並依名稱搜尋資料表
<a name="querying-glue-catalog-listing-tables"></a>

若要列出資料表的中繼資料，您可以透過資料表模式或資料表名稱查詢。

**Example – 依結構描述列出資料表**  
下列查詢會列出使用 `rdspostgresql` 資料表模式的資料表。  

```
SELECT table_schema,
       table_name,
       table_type
FROM   information_schema.tables
WHERE  table_schema = 'rdspostgresql'
```
下列資料表會顯示範例結果。  


****  

|  | table\$1schema | table\$1name | table\$1type | 
| --- | --- | --- | --- | 
| 1 | rdspostgresql | rdspostgresqldb1\$1public\$1account | BASE TABLE | 

**Example – 依名稱搜尋資料表**  
下列查詢包含 `athena1` 資料表的中繼資料資訊。  

```
SELECT table_schema,
       table_name,
       table_type
FROM   information_schema.tables
WHERE  table_name = 'athena1'
```
下列資料表會顯示範例結果。  


****  

|  | table\$1schema | table\$1name | table\$1type | 
| --- | --- | --- | --- | 
| 1 | 預設 | athena1 | BASE TABLE | 

# 列出特定資料表的分割區
<a name="querying-glue-catalog-listing-partitions"></a>

您可以如下列範例所示，使用 `SHOW PARTITIONS table_name` 列出指定資料表的分割區。

```
SHOW PARTITIONS cloudtrail_logs_test2
```

您可以使用 `$partitions` 中繼資料查詢，列出特定資料表的分割區編號和分割區值。

**Example – 使用 \$1partitions 語法查詢資料表的分割區**  
下列範例查詢會使用 `$partitions` 語法，列出資料表 `cloudtrail_logs_test2` 的分割區。  

```
SELECT * FROM default."cloudtrail_logs_test2$partitions" ORDER BY partition_number
```
下列資料表會顯示範例結果。  


****  

|  | table\$1catalog | table\$1schema | table\$1name | 年 | 月 | 天 | 
| --- | --- | --- | --- | --- | --- | --- | 
| 1 | awsdatacatalog | 預設 | cloudtrail\$1logs\$1test2 | 2020 | 08 | 10 | 
| 2 | awsdatacatalog | 預設 | cloudtrail\$1logs\$1test2 | 2020 | 08 | 11 | 
| 3 | awsdatacatalog | 預設 | cloudtrail\$1logs\$1test2 | 2020 | 08 | 12 | 

# 列示或搜尋指定的資料表或檢視的資料欄
<a name="querying-glue-catalog-listing-columns"></a>

您可以列出資料表的所有資料欄、檢視的所有資料欄，或在指定的資料庫和資料表中依名稱搜尋欄。

若要列出資料欄，請使用 `SELECT *` 查詢。在 `FROM` 子句中，指定 `information_schema.columns`。在 `WHERE` 子句中，使用 `table_schema='database_name'` 來指定資料庫，使用 `table_name = 'table_name'` 以指定具有您想要列出之資料欄的資料表或檢視。

**Example – 列出指定資料表的所有資料欄**  
下面的範例查詢會列出資料表 `rdspostgresqldb1_public_account` 的所有資料欄。  

```
SELECT *
FROM   information_schema.columns
WHERE  table_schema = 'rdspostgresql'
       AND table_name = 'rdspostgresqldb1_public_account'
```
下列資料表會顯示範例結果。  


****  

|  | table\$1catalog | table\$1schema | table\$1name | column\$1name | ordinal\$1position | column\$1default | is\$1nullable | data\$1type | comment | extra\$1info | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | 
| 1 | awsdatacatalog | rdspostgresql | rdspostgresqldb1\$1public\$1account | password | 1 |  | 是 | varchar |  |  | 
| 2 | awsdatacatalog | rdspostgresql | rdspostgresqldb1\$1public\$1account | user\$1id | 2 |  | 是 | integer |  |  | 
| 3 | awsdatacatalog | rdspostgresql | rdspostgresqldb1\$1public\$1account | created\$1on | 3 |  | 是 | timestamp |  |  | 
| 4 | awsdatacatalog | rdspostgresql | rdspostgresqldb1\$1public\$1account | last\$1login | 4 |  | 是 | timestamp |  |  | 
| 5 | awsdatacatalog | rdspostgresql | rdspostgresqldb1\$1public\$1account | email | 5 |  | 是 | varchar |  |  | 
| 6 | awsdatacatalog | rdspostgresql | rdspostgresqldb1\$1public\$1account | username | 6 |  | 是 | varchar |  |  | 

**Example – 列出指定檢視的資料欄**  
下列範例查詢會針對檢視 `default` 列出 `arrayview` 資料庫中的所有資料欄。  

```
SELECT *
FROM   information_schema.columns
WHERE  table_schema = 'default'
       AND table_name = 'arrayview'
```
下列資料表會顯示範例結果。  


****  

|  | table\$1catalog | table\$1schema | table\$1name | column\$1name | ordinal\$1position | column\$1default | is\$1nullable | data\$1type | comment | extra\$1info | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | 
| 1 | awsdatacatalog | 預設 | arrayview | searchdate | 1 |  | 是 | varchar |  |  | 
| 2 | awsdatacatalog | 預設 | arrayview | sid | 2 |  | 是 | varchar |  |  | 
| 3 | awsdatacatalog | 預設 | arrayview | btid | 3 |  | 是 | varchar |  |  | 
| 4 | awsdatacatalog | 預設 | arrayview | p | 4 |  | 是 | varchar |  |  | 
| 5 | awsdatacatalog | 預設 | arrayview | infantprice | 5 |  | 是 | varchar |  |  | 
| 6 | awsdatacatalog | 預設 | arrayview | sump | 6 |  | 是 | varchar |  |  | 
| 7 | awsdatacatalog | 預設 | arrayview | journeymaparray | 7 |  | 是 | array(varchar) |  |  | 

**Example – 在指定的資料庫與資料表中依名稱搜尋資料欄**  
下列範例查詢會在 `sid` 資料庫的 `arrayview` 檢視中搜尋 `default` 資料欄的中繼資料。  

```
SELECT *
FROM   information_schema.columns
WHERE  table_schema = 'default'
       AND table_name = 'arrayview' 
       AND column_name='sid'
```
下列資料表會顯示範例結果。  


****  

|  | table\$1catalog | table\$1schema | table\$1name | column\$1name | ordinal\$1position | column\$1default | is\$1nullable | data\$1type | comment | extra\$1info | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | 
| 1 | awsdatacatalog | 預設 | arrayview | sid | 2 |  | 是 | varchar |  |  | 

# 列出特定資料表共有的資料欄
<a name="querying-glue-catalog-listing-columns-in-common"></a>

可列出資料庫中的特定資料表的共同資料欄。
+ 使用語法 `SELECT column_name FROM information_schema.columns`。
+ 對於 `WHERE` 子句，請使用語法 `WHERE table_name IN ('table1', 'table2')`。

**Example – 列出同一資料庫中兩個表的共同資料欄**  
下列範例查詢會列出資料表 `table1` 和 `table2` 的共同資料欄。  

```
SELECT column_name
FROM information_schema.columns
WHERE table_name IN ('table1', 'table2')
GROUP BY column_name
HAVING COUNT(*) > 1;
```

# 列出所有資料表的所有資料欄
<a name="querying-glue-catalog-listing-all-columns-for-all-tables"></a>

您可以列出 `AwsDataCatalog` 中所有資料表的所有資料欄，或者 `AwsDataCatalog` 中特定資料庫的所有資料表。
+ 若要列出 `AwsDataCatalog` 中所有資料庫的所有資料欄，請使用查詢 `SELECT * FROM information_schema.columns`。
+ 若要將結果限制在特定資料庫，請在 `WHERE` 子句中使用 `table_schema='database_name'`。

**Example - 列出特定資料庫中所有資料表的所有資料欄**  
下面的範例查詢會列出資料庫 `webdata` 中所有資料表的所有資料欄。  

```
SELECT * FROM information_schema.columns WHERE table_schema = 'webdata'            
```

# 查詢 AWS 服務 日誌
<a name="querying-aws-service-logs"></a>

本節包含數個使用 Amazon Athena 查詢熱門資料集的程序，例如 AWS CloudTrail 日誌、Amazon CloudFront 日誌、Classic Load Balancer 日誌、Application Load Balancer 日誌、Amazon VPC 流程日誌和 Network Load Balancer 日誌。

本節中的任務使用 Athena 主控台，但您也可以使用其他工具，例如 [Athena JDBC 驅動程式](connect-with-jdbc.md)、[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/athena/) 或 [Amazon Athena API 參考](https://docs.aws.amazon.com/athena/latest/APIReference/)。

如需有關使用 AWS CloudFormation 在 Athena 中自動建立 AWS 服務 日誌資料表、分割區和範例查詢的資訊，請參閱 AWS 大數據部落格中的[自動化 AWS 服務 日誌資料表建立和使用 Amazon Athena 進行查詢](https://aws.amazon.com/blogs/big-data/automating-aws-service-logs-table-creation-and-querying-them-with-amazon-athena/)。如需使用適用於 的 Python 程式庫 AWS Glue 來建立常見架構以在 Athena 中處理 AWS 服務 日誌和查詢它們的相關資訊，請參閱[使用 Amazon Athena 輕鬆查詢 AWS 服務 日誌](https://aws.amazon.com/blogs/big-data/easily-query-aws-service-logs-using-amazon-athena/)。

本節中的主題假設您已設定適當許可來存取 Athena，以及應包含要查詢的資料的 Amazon S3 儲存貯體。如需詳細資訊，請參閱[設定、管理和以程式設計方式存取](setting-up.md)及[開始使用](getting-started.md)。

**Topics**
+ [Application Load Balancer](application-load-balancer-logs.md)
+ [Elastic Load Balancing](elasticloadbalancer-classic-logs.md)
+ [CloudFront](cloudfront-logs.md)
+ [CloudTrail](cloudtrail-logs.md)
+ [Amazon EMR](emr-logs.md)
+ [Global Accelerator](querying-global-accelerator-flow-logs.md)
+ [GuardDuty](querying-guardduty.md)
+ [Network Firewall](querying-network-firewall-logs.md)
+ [Network Load Balancer](networkloadbalancer-classic-logs.md)
+ [Route 53](querying-r53-resolver-logs.md)
+ [Amazon SES](querying-ses-logs.md)
+ [Amazon VPC](vpc-flow-logs.md)
+ [AWS WAF](waf-logs.md)

# 查詢 Application Load Balancer 日誌
<a name="application-load-balancer-logs"></a>

Application Load Balancer 是 Elastic Load Balancing 的一個負載平衡選項，可實施使用容器的微服務部署中的流量分配。查詢 Application Load Balancer 日誌可讓您查看流量來源、延遲，以及往返於 Elastic Load Balancing 執行個體與後端應用程式傳輸的位元組。如需詳細資訊，請參閱《Application Load Balancer 使用者指南**》中的 [Application Load Balancer 的存取日誌](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html)和 [Application Load Balancer 的連線日誌](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html)。

## 先決條件
<a name="application-load-balancer-logs-prerequisites"></a>
+ 啟用[存取日誌記錄](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html)或[連線日誌記錄](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html)，以便 Application Load Balancer 日誌可以儲存到您的 Amazon S3 儲存貯體中。
+ 用於保存您將為 Athena 建立的資料表的資料庫。若要建立資料庫，您可以使用 Athena 或 AWS Glue 主控台。如需詳細資訊，請參閱本指南中的 [在 Athena 中建立資料庫](creating-databases.md)，或《 AWS 開發人員指南》[https://docs.aws.amazon.com/glue/latest/dg/console-databases.html](https://docs.aws.amazon.com/glue/latest/dg/console-databases.html)中的*在AWS Glue Glue 主控台上使用資料庫*。

**Topics**
+ [先決條件](#application-load-balancer-logs-prerequisites)
+ [建立 ALB 存取日誌的資料表](create-alb-access-logs-table.md)
+ [使用分割區投影在 Athena 中建立 ALB 存取日誌的資料表](create-alb-access-logs-table-partition-projection.md)
+ [ALB 存取日誌的查詢範例](query-alb-access-logs-examples.md)
+ [建立 ALB 連線日誌的資料表](create-alb-connection-logs-table.md)
+ [使用分割區投影在 Athena 中建立 ALB 連線日誌的資料表](create-alb-connection-logs-table-partition-projection.md)
+ [ALB 連線日誌的查詢範例](query-alb-connection-logs-examples.md)
+ [其他資源](application-load-balancer-logs-additional-resources.md)

# 建立 ALB 存取日誌的資料表
<a name="create-alb-access-logs-table"></a>

1. 複製下列 `CREATE TABLE` 陳述式，並將其貼到 Athena 主控台查詢編輯器，然後針對自己的日誌項目要求視需要進行修改。如需有關 Athena 主控台入門的資訊，請參閱[開始使用](getting-started.md)。將 `LOCATION` 子句中的路徑取代為您的 Amazon S3 存取日誌資料夾位置。如需有關存取日誌檔案位置的詳細資訊，請參閱《Application Load Balancer 使用者指南**》中的[存取日誌檔案](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-file-format)。

   如需有關每個日誌檔案欄位的資訊，請參閱《Application Load Balancer 使用者指南**》中的[存取日誌項目](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-format)。
**注意**  
下列範例 `CREATE TABLE` 陳述式包含最近新增的 `classification`、`classification_reason` 和 `conn_trace_id` (「可追溯性 ID」或 TID) 資料欄。若要為不含這些項目的 Application Load Balancer 存取日誌建立資料表，請從 `CREATE TABLE` 陳述式移除相應的資料欄，然後據此修改規則表達式。

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_logs (
               type string,
               time string,
               elb string,
               client_ip string,
               client_port int,
               target_ip string,
               target_port int,
               request_processing_time double,
               target_processing_time double,
               response_processing_time double,
               elb_status_code int,
               target_status_code string,
               received_bytes bigint,
               sent_bytes bigint,
               request_verb string,
               request_url string,
               request_proto string,
               user_agent string,
               ssl_cipher string,
               ssl_protocol string,
               target_group_arn string,
               trace_id string,
               domain_name string,
               chosen_cert_arn string,
               matched_rule_priority string,
               request_creation_time string,
               actions_executed string,
               redirect_url string,
               lambda_error_reason string,
               target_port_list string,
               target_status_code_list string,
               classification string,
               classification_reason string,
               conn_trace_id string
               )
               ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
               WITH SERDEPROPERTIES (
               'serialization.format' = '1',
               'input.regex' = 
           '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\\s]+?)\" \"([^\\s]+)\" \"([^ ]*)\" \"([^ ]*)\" ?([^ ]*)? ?( .*)?'
               )
               LOCATION 's3://amzn-s3-demo-bucket/access-log-folder-path/'
   ```
**注意**  
我們建議在 `input.regex` 參數的結尾一律保留模式 *`?( .*)?`*，以便在新增新的 ALB 日誌欄位時，處理未來的日誌項目。

1. 在 Athena 主控台中執行查詢。查詢完成之後，Athena 會註冊 `alb_access_logs` 資料表，讓其中的資料可供您發出查詢。

# 使用分割區投影在 Athena 中建立 ALB 存取日誌的資料表
<a name="create-alb-access-logs-table-partition-projection"></a>

由於 ALB 存取日誌具有您可以事先指定其分割區結構描述的已知結構，您可以使用 Athena 分割區投影功能減少查詢執行時期並自動化分割區管理。分割區投影會在新增資料時自動新增分割區。因此您無需使用 `ALTER TABLE ADD PARTITION` 手動新增分割區。

以下範例 `CREATE TABLE` 陳述式會從指定日期到現在，對單一 AWS 區域的 ALB 存取日誌自動使用分割區投影。該陳述式基於上一節中的範例，但新增了 `PARTITIONED BY` 和 `TBLPROPERTIES` 子句以啟用分割區投影。在 `LOCATION` 和 `storage.location.template` 子句中，請將預留位置取代為識別 ALB 存取日誌的 Amazon S3 儲存貯體位置的值。如需有關存取日誌檔案位置的詳細資訊，請參閱《Application Load Balancer 使用者指南**》中的[存取日誌檔案](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-file-format)。對於 `projection.day.range`，請用您要使用的開始日期取代 *2022*/*01*/*01*。成功執行查詢之後，您可以查詢資料表。您無須執行 `ALTER TABLE ADD PARTITION` 就能載入分割區。如需有關每個日誌檔案欄位的資訊，請參閱[存取日誌項目](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-format)。

```
CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_logs (
            type string,
            time string,
            elb string,
            client_ip string,
            client_port int,
            target_ip string,
            target_port int,
            request_processing_time double,
            target_processing_time double,
            response_processing_time double,
            elb_status_code int,
            target_status_code string,
            received_bytes bigint,
            sent_bytes bigint,
            request_verb string,
            request_url string,
            request_proto string,
            user_agent string,
            ssl_cipher string,
            ssl_protocol string,
            target_group_arn string,
            trace_id string,
            domain_name string,
            chosen_cert_arn string,
            matched_rule_priority string,
            request_creation_time string,
            actions_executed string,
            redirect_url string,
            lambda_error_reason string,
            target_port_list string,
            target_status_code_list string,
            classification string,
            classification_reason string,
            conn_trace_id string
            )
            PARTITIONED BY
            (
             day STRING
            )
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' = 
        '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\\s]+?)\" \"([^\\s]+)\" \"([^ ]*)\" \"([^ ]*)\" ?([^ ]*)? ?( .*)?'
            )
            LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/'
            TBLPROPERTIES
            (
             "projection.enabled" = "true",
             "projection.day.type" = "date",
             "projection.day.range" = "2022/01/01,NOW",
             "projection.day.format" = "yyyy/MM/dd",
             "projection.day.interval" = "1",
             "projection.day.interval.unit" = "DAYS",
             "storage.location.template" = "s3://amzn-s3-demo-bucket/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/${day}"
            )
```

如需有關分割區投影的詳細資訊，請參閱[透過 Amazon Athena 使用分割區投影](partition-projection.md)。

**注意**  
我們建議在 `input.regex` 參數的結尾一律保留模式 *?( .\$1)?*，以便在新增新的 ALB 日誌欄位時，處理未來的日誌項目。

# ALB 存取日誌的查詢範例
<a name="query-alb-access-logs-examples"></a>

以下查詢會計算負載平衡器收到的 HTTP GET 請求，並依用戶端 IP 地址分組：

```
SELECT COUNT(request_verb) AS
 count,
 request_verb,
 client_ip
FROM alb_access_logs
GROUP BY request_verb, client_ip
LIMIT 100;
```

另一個查詢顯示 Safari 瀏覽器使用者造訪的 URL：

```
SELECT request_url
FROM alb_access_logs
WHERE user_agent LIKE '%Safari%'
LIMIT 10;
```

下列查詢顯示具有 ELB 狀態碼值大於或等於 500 的記錄。

```
SELECT * FROM alb_access_logs
WHERE elb_status_code >= 500
```

下列範例說明如何以 `datetime` 剖析日誌：

```
SELECT client_ip, sum(received_bytes) 
FROM alb_access_logs
WHERE parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') 
     BETWEEN parse_datetime('2018-05-30-12:00:00','yyyy-MM-dd-HH:mm:ss') 
     AND parse_datetime('2018-05-31-00:00:00','yyyy-MM-dd-HH:mm:ss') 
GROUP BY client_ip;
```

下列查詢會查詢對指定日期的所有 ALB 存取日誌使用分割區投影的資料表。

```
SELECT * 
FROM alb_access_logs 
WHERE day = '2022/02/12'
```

# 建立 ALB 連線日誌的資料表
<a name="create-alb-connection-logs-table"></a>

1. 複製下列範例 `CREATE TABLE` 陳述式，並將其貼到 Athena 主控台查詢編輯器，然後針對自己的日誌項目要求視需要進行修改。如需有關 Athena 主控台入門的資訊，請參閱[開始使用](getting-started.md)。將 `LOCATION` 子句中的路徑取代為您的 Amazon S3 連線日誌資料夾位置。如需有關連線日誌檔案位置的詳細資訊，請參閱《Application Load Balancer 使用者指南**》中的[連線日誌檔案](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html#connection-log-file-format)。如需有關每個日誌檔案欄位的資訊，請參閱[連線日誌項目](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html#connection-log-entry-format)。

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS alb_connection_logs (
            time string,
            client_ip string,
            client_port int,
            listener_port int,
            tls_protocol string,
            tls_cipher string,
            tls_handshake_latency double,
            leaf_client_cert_subject string,
            leaf_client_cert_validity string,
            leaf_client_cert_serial_number string,
            tls_verify_status string,
            conn_trace_id string
            ) 
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' =
             '([^ ]*) ([^ ]*) ([0-9]*) ([0-9]*) ([A-Za-z0-9.-]*) ([^ ]*) ([-.0-9]*) \"([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?'
            )
            LOCATION 's3://amzn-s3-demo-bucket/connection-log-folder-path/'
   ```

1. 在 Athena 主控台中執行查詢。查詢完成之後，Athena 會註冊 `alb_connection_logs` 資料表，讓其中的資料可供您發出查詢。

# 使用分割區投影在 Athena 中建立 ALB 連線日誌的資料表
<a name="create-alb-connection-logs-table-partition-projection"></a>

由於 ALB 連線日誌具有您可以事先指定其分割區名稱的已知結構，您可以使用 Athena 分割區投影功能減少查詢執行時期並自動化分割區管理。分割區投影會在新增資料時自動新增分割區。因此您無需使用 `ALTER TABLE ADD PARTITION` 手動新增分割區。

以下範例 `CREATE TABLE` 陳述式會從指定日期到現在，對單一 AWS 區域的 ALB 連線日誌自動使用分割區投影。該陳述式基於上一節中的範例，但新增了 `PARTITIONED BY` 和 `TBLPROPERTIES` 子句以啟用分割區投影。在 `LOCATION` 和 `storage.location.template` 子句中，請將預留位置取代為識別 ALB 連線日誌的 Amazon S3 儲存貯體位置的值。如需有關連線日誌檔案位置的詳細資訊，請參閱《Application Load Balancer 使用者指南**》中的[連線日誌檔案](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html#connection-log-file-format)。對於 `projection.day.range`，請用您要使用的開始日期取代 *2023*/*01*/*01*。成功執行查詢之後，您可以查詢資料表。您無須執行 `ALTER TABLE ADD PARTITION` 就能載入分割區。如需有關每個日誌檔案欄位的資訊，請參閱[連線日誌項目](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html#connection-log-entry-format)。

```
CREATE EXTERNAL TABLE IF NOT EXISTS alb_connection_logs (
         time string,
         client_ip string,
         client_port int,
         listener_port int,
         tls_protocol string,
         tls_cipher string,
         tls_handshake_latency double,
         leaf_client_cert_subject string,
         leaf_client_cert_validity string,
         leaf_client_cert_serial_number string,
         tls_verify_status string,
         conn_trace_id string
         )
            PARTITIONED BY
            (
             day STRING
            )
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' =
             '([^ ]*) ([^ ]*) ([0-9]*) ([0-9]*) ([A-Za-z0-9.-]*) ([^ ]*) ([-.0-9]*) \"([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?'
            )
            LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/'
            TBLPROPERTIES
            (
             "projection.enabled" = "true",
             "projection.day.type" = "date",
             "projection.day.range" = "2023/01/01,NOW",
             "projection.day.format" = "yyyy/MM/dd",
             "projection.day.interval" = "1",
             "projection.day.interval.unit" = "DAYS",
             "storage.location.template" = "s3://amzn-s3-demo-bucket/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/${day}"
            )
```

如需有關分割區投影的詳細資訊，請參閱[透過 Amazon Athena 使用分割區投影](partition-projection.md)。

# ALB 連線日誌的查詢範例
<a name="query-alb-connection-logs-examples"></a>

下列查詢會計算 `tls_verify_status` 的值並非 `'Success'` 的出現次數，並依用戶端 IP 位址分組：

```
SELECT DISTINCT client_ip, count() AS count FROM alb_connection_logs
WHERE tls_verify_status != 'Success'
GROUP BY client_ip
ORDER BY count() DESC;
```

下列查詢會搜尋 `tls_handshake_latency` 的值在指定時間範圍內超過 2 秒的出現次數：

```
SELECT * FROM alb_connection_logs
WHERE 
  (
    parse_datetime(time, 'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') 
    BETWEEN 
    parse_datetime('2024-01-01-00:00:00', 'yyyy-MM-dd-HH:mm:ss') 
    AND 
    parse_datetime('2024-03-20-00:00:00', 'yyyy-MM-dd-HH:mm:ss') 
  ) 
  AND 
    (tls_handshake_latency >= 2.0);
```

# 其他資源
<a name="application-load-balancer-logs-additional-resources"></a>

如需有關使用 ALB 日誌的詳細資訊，請參閱以下資源。
+ *AWS 知識中心*中的[如何使用 Amazon Athena 分析 Application Load Balancer 存取日誌？](https://repost.aws/knowledge-center/athena-analyze-access-logs)。
+ 如需有關 Elastic Load Balancing 中的 HTTP 狀態碼的資訊，請參閱《*Application Load Balancers 使用者指南*》中的[對 Application Load Balancer 進行疑難排解](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html)。
+ *AWS 大數據部落格*中的[使用 AWS Glue 自訂分類器和 Amazon Athena 更有效地編目和分析 Application Load Balancer 日誌](https://aws.amazon.com/blogs/big-data/catalog-and-analyze-application-load-balancer-logs-more-efficiently-with-aws-glue-custom-classifiers-and-amazon-athena/)。

# 查詢 Classic Load Balancer 日誌
<a name="elasticloadbalancer-classic-logs"></a>

使用 Classic Load Balancer 日誌來分析和了解往返於 Elastic Load Balancing 執行個體與後端應用程式的流量模式。您可以查看流量的來源、延遲和已傳輸的位元組。

分析 Elastic Load Balancing 日誌之前，請對其進行設定，以在目的地 Amazon S3 儲存貯體中儲存。如需詳細資訊，請參閱[為您的 Classic Load Balancer 啟用存取日誌](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/enable-access-logs.html)。

**若要為 Elastic Load Balancing 日誌建立資料表**

1. 複製下列 DDL 陳述式，並將其貼到 Athena 主控台。檢查 Elastic Load Balancing 日誌記錄的[語法](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/access-log-collection.html#access-log-entry-format)。您可能需要更新以下查詢，為記錄的最新版本包含欄和 Regex 語法。

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS elb_logs (
    
    timestamp string,
    elb_name string,
    request_ip string,
    request_port int,
    backend_ip string,
    backend_port int,
    request_processing_time double,
    backend_processing_time double,
    client_response_time double,
    elb_response_code string,
    backend_response_code string,
    received_bytes bigint,
    sent_bytes bigint,
    request_verb string,
    url string,
    protocol string,
    user_agent string,
    ssl_cipher string,
    ssl_protocol string
   )
   ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
   WITH SERDEPROPERTIES (
    'serialization.format' = '1',
    'input.regex' = '([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (\"[^\"]*\") ([A-Z0-9-]+) ([A-Za-z0-9.-]*)$'
   )
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/AWS_account_ID/elasticloadbalancing/';
   ```

1. 修改 `LOCATION` Amazon S3 儲存貯體，以指定您的 Elastic Load Balancing 日誌的目的地。

1. 在 Athena 主控台中執行查詢。查詢完成之後，Athena 會註冊 `elb_logs` 資料表，讓其中的資料可供您查詢。如需詳細資訊，請參閱[查詢範例](#query-elb-classic-example)。

## 查詢範例
<a name="query-elb-classic-example"></a>

使用與以下範例類似的查詢。它會列出傳回 `4XX` 或 `5XX` 錯誤回應碼的後端應用程式伺服器。使用 `LIMIT` 運算子來限制一次查詢的日誌數量。

```
SELECT
 timestamp,
 elb_name,
 backend_ip,
 backend_response_code
FROM elb_logs
WHERE backend_response_code LIKE '4%' OR
      backend_response_code LIKE '5%'
LIMIT 100;
```

使用後續的查詢來將依後端 IP 地址和 Elastic Load Balancing 執行個體名稱分組的所有交易的回應時間加總。

```
SELECT sum(backend_processing_time) AS
 total_ms,
 elb_name,
 backend_ip
FROM elb_logs WHERE backend_ip <> ''
GROUP BY backend_ip, elb_name
LIMIT 100;
```

如需詳細資訊，請參閱[使用 Athena 在 S3 中分析資料](https://aws.amazon.com/blogs/big-data/analyzing-data-in-s3-using-amazon-athena/)。

# 查詢 Amazon CloudFront 日誌
<a name="cloudfront-logs"></a>

您可以設定 Amazon CloudFront CDN 來將 Web 分佈存取日誌匯出至 Amazon Simple Storage Service。使用這些日誌來探索使用者的瀏覽模式，其涵蓋 CloudFront 提供的所有 Web 屬性。

開始查詢日誌之前，請在您偏好的 CloudFront 分佈中啟用 Web 分佈存取日誌。如需相關資訊，請參閱《Amazon CloudFront 開發人員指南》**中的[存取日誌](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html)。記下儲存這些日誌的 Amazon S3 儲存貯體。

**Topics**
+ [建立 CloudFront 標準日誌的資料表 (舊版)](create-cloudfront-table-standard-logs.md)
+ [使用手動分割 (JSON) 在 Athena 中建立 CloudFront 日誌的資料表](create-cloudfront-table-manual-json.md)
+ [使用手動分割 (Parquet) 在 Athena 中建立 CloudFront 日誌的資料表](create-cloudfront-table-manual-parquet.md)
+ [使用分割區投影 (JSON) 在 Athena 中建立 CloudFront 日誌的資料表](create-cloudfront-table-partition-json.md)
+ [使用分割區投影 (Parquet) 在 Athena 中建立 CloudFront 日誌的資料表](create-cloudfront-table-partition-parquet.md)
+ [建立 CloudFront 即時日誌的資料表](create-cloudfront-table-real-time-logs.md)
+ [其他資源](cloudfront-logs-additional-resources.md)

# 建立 CloudFront 標準日誌的資料表 (舊版)
<a name="create-cloudfront-table-standard-logs"></a>

**注意**  
下列程序適用於 CloudFront 中的 Web 分佈存取日誌。不適用於來自 RTMP 分佈的串流日誌。

**建立 CloudFront 標準日誌檔案欄位的資料表**

1. 複製下列範例 DDL 陳述式，並將其貼到 Athena 主控台查詢編輯器。範例陳述式使用《**Amazon CloudFront 開發人員指南》中[標準日誌檔欄位](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#BasicDistributionFileFormat)章節中所述的日誌檔欄位。為存放日誌的 Amazon S3 儲存貯體修改 `LOCATION`。如需有關使用查詢編輯器的資訊，請參閱[開始使用](getting-started.md)。

   此查詢可指定 `ROW FORMAT DELIMITED` 和 `FIELDS TERMINATED BY '\t'`，表示欄位以定位字元分隔。對於 `ROW FORMAT DELIMITED`，Athena 預設使用 [LazySimpleSerDe](lazy-simple-serde.md)。因為在 Athena 中它是保留字，所以使用反引號 (') 逸出 `date` 資料欄。如需相關資訊，請參閱[在查詢中逸出預留關鍵字](reserved-words.md)。

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_standard_logs (
     `date` DATE,
     time STRING,
     x_edge_location STRING,
     sc_bytes BIGINT,
     c_ip STRING,
     cs_method STRING,
     cs_host STRING,
     cs_uri_stem STRING,
     sc_status INT,
     cs_referrer STRING,
     cs_user_agent STRING,
     cs_uri_query STRING,
     cs_cookie STRING,
     x_edge_result_type STRING,
     x_edge_request_id STRING,
     x_host_header STRING,
     cs_protocol STRING,
     cs_bytes BIGINT,
     time_taken FLOAT,
     x_forwarded_for STRING,
     ssl_protocol STRING,
     ssl_cipher STRING,
     x_edge_response_result_type STRING,
     cs_protocol_version STRING,
     fle_status STRING,
     fle_encrypted_fields INT,
     c_port INT,
     time_to_first_byte FLOAT,
     x_edge_detailed_result_type STRING,
     sc_content_type STRING,
     sc_content_len BIGINT,
     sc_range_start BIGINT,
     sc_range_end BIGINT
   )
   ROW FORMAT DELIMITED 
   FIELDS TERMINATED BY '\t'
   LOCATION 's3://amzn-s3-demo-bucket/'
   TBLPROPERTIES ( 'skip.header.line.count'='2' )
   ```

1. 在 Athena 主控台中執行查詢。查詢完成之後，Athena 會註冊 `cloudfront_standard_logs` 資料表，讓其中的資料可供您發出查詢。

## 查詢範例
<a name="query-examples-cloudfront-logs"></a>

以下查詢加總 CloudFront 在 2018 年 6 月 9 日到 6 月 11 日之間提供的位元組數。以雙引號圍住日期欄名稱，因為它是保留字。

```
SELECT SUM(bytes) AS total_bytes
FROM cloudfront_standard_logs
WHERE "date" BETWEEN DATE '2018-06-09' AND DATE '2018-06-11'
LIMIT 100;
```

若要從查詢結果中除去重複的資料列 (例如，重複的空白資料列)，您可以使用 `SELECT DISTINCT` 陳述式，如下列範例所示。

```
SELECT DISTINCT * 
FROM cloudfront_standard_logs 
LIMIT 10;
```

# 使用手動分割 (JSON) 在 Athena 中建立 CloudFront 日誌的資料表
<a name="create-cloudfront-table-manual-json"></a>

**使用 JSON 格式建立 CloudFront 標準日誌檔案欄位的資料表**

1. 複製下列範例 DDL 陳述式，並將其貼到 Athena 主控台查詢編輯器。範例陳述式使用《**Amazon CloudFront 開發人員指南》中[標準日誌檔欄位](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#BasicDistributionFileFormat)章節中所述的日誌檔欄位。為存放日誌的 Amazon S3 儲存貯體修改 `LOCATION`。

   此查詢會搭配下列 SerDe 屬性使用 OpenX JSON SerDe，以在 Athena 中正確讀取 JSON 欄位。

   ```
   CREATE EXTERNAL TABLE `cf_logs_manual_partition_json`(
     `date` string , 
     `time` string , 
     `x-edge-location` string , 
     `sc-bytes` string , 
     `c-ip` string , 
     `cs-method` string , 
     `cs(host)` string , 
     `cs-uri-stem` string , 
     `sc-status` string , 
     `cs(referer)` string , 
     `cs(user-agent)` string , 
     `cs-uri-query` string , 
     `cs(cookie)` string , 
     `x-edge-result-type` string , 
     `x-edge-request-id` string , 
     `x-host-header` string , 
     `cs-protocol` string , 
     `cs-bytes` string , 
     `time-taken` string , 
     `x-forwarded-for` string , 
     `ssl-protocol` string , 
     `ssl-cipher` string , 
     `x-edge-response-result-type` string , 
     `cs-protocol-version` string , 
     `fle-status` string , 
     `fle-encrypted-fields` string , 
     `c-port` string , 
     `time-to-first-byte` string , 
     `x-edge-detailed-result-type` string , 
     `sc-content-type` string , 
     `sc-content-len` string , 
     `sc-range-start` string , 
     `sc-range-end` string )
   ROW FORMAT SERDE 
     'org.openx.data.jsonserde.JsonSerDe' 
   WITH SERDEPROPERTIES ( 
     'paths'='c-ip,c-port,cs(Cookie),cs(Host),cs(Referer),cs(User-Agent),cs-bytes,cs-method,cs-protocol,cs-protocol-version,cs-uri-query,cs-uri-stem,date,fle-encrypted-fields,fle-status,sc-bytes,sc-content-len,sc-content-type,sc-range-end,sc-range-start,sc-status,ssl-cipher,ssl-protocol,time,time-taken,time-to-first-byte,x-edge-detailed-result-type,x-edge-location,x-edge-request-id,x-edge-response-result-type,x-edge-result-type,x-forwarded-for,x-host-header') 
   STORED AS INPUTFORMAT 
     'org.apache.hadoop.mapred.TextInputFormat' 
   OUTPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
     's3://amzn-s3-demo-bucket/'
   ```

1. 在 Athena 主控台中執行查詢。查詢完成之後，Athena 會註冊 `cf_logs_manual_partition_json` 資料表，讓其中的資料可供您發出查詢。

## 查詢範例
<a name="query-examples-cloudfront-logs-manual-json"></a>

下列查詢加總 CloudFront 在 2025 年 1 月 15 日提供的位元組數。

```
SELECT sum(cast("sc-bytes" as BIGINT)) as sc
FROM cf_logs_manual_partition_json
WHERE "date"='2025-01-15'
```

若要從查詢結果中除去重複的資料列 (例如，重複的空白資料列)，您可以使用 `SELECT DISTINCT` 陳述式，如下列範例所示。

```
SELECT DISTINCT * FROM cf_logs_manual_partition_json
```

# 使用手動分割 (Parquet) 在 Athena 中建立 CloudFront 日誌的資料表
<a name="create-cloudfront-table-manual-parquet"></a>

**使用 Parquet 格式建立 CloudFront 標準日誌檔案欄位的資料表**

1. 複製下列範例 DDL 陳述式，並將其貼到 Athena 主控台查詢編輯器。範例陳述式使用《**Amazon CloudFront 開發人員指南》中[標準日誌檔欄位](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#BasicDistributionFileFormat)章節中所述的日誌檔欄位。

   此查詢會搭配下列 SerDe 屬性使用 ParquetHiveSerDe，以在 Athena 中正確讀取 Parquet 欄位。

   ```
   CREATE EXTERNAL TABLE `cf_logs_manual_partition_parquet`(
     `date` string, 
     `time` string, 
     `x_edge_location` string, 
     `sc_bytes` string, 
     `c_ip` string, 
     `cs_method` string, 
     `cs_host` string, 
     `cs_uri_stem` string, 
     `sc_status` string, 
     `cs_referer` string, 
     `cs_user_agent` string, 
     `cs_uri_query` string, 
     `cs_cookie` string, 
     `x_edge_result_type` string, 
     `x_edge_request_id` string, 
     `x_host_header` string, 
     `cs_protocol` string, 
     `cs_bytes` string, 
     `time_taken` string, 
     `x_forwarded_for` string, 
     `ssl_protocol` string, 
     `ssl_cipher` string, 
     `x_edge_response_result_type` string, 
     `cs_protocol_version` string, 
     `fle_status` string, 
     `fle_encrypted_fields` string, 
     `c_port` string, 
     `time_to_first_byte` string, 
     `x_edge_detailed_result_type` string, 
     `sc_content_type` string, 
     `sc_content_len` string, 
     `sc_range_start` string, 
     `sc_range_end` string)
   ROW FORMAT SERDE 
     'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
   STORED AS INPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
   OUTPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
   LOCATION
     's3://amzn-s3-demo-bucket/'
   ```

1. 在 Athena 主控台中執行查詢。查詢完成之後，Athena 會註冊 `cf_logs_manual_partition_parquet` 資料表，讓其中的資料可供您發出查詢。

## 查詢範例
<a name="query-examples-cloudfront-logs-manual-parquet"></a>

下列查詢加總 CloudFront 在 2025 年 1 月 19 日提供的位元組數。

```
SELECT sum(cast("sc_bytes" as BIGINT)) as sc
FROM cf_logs_manual_partition_parquet
WHERE "date"='2025-01-19'
```

若要從查詢結果中除去重複的資料列 (例如，重複的空白資料列)，您可以使用 `SELECT DISTINCT` 陳述式，如下列範例所示。

```
SELECT DISTINCT * FROM cf_logs_manual_partition_parquet
```

# 使用分割區投影 (JSON) 在 Athena 中建立 CloudFront 日誌的資料表
<a name="create-cloudfront-table-partition-json"></a>

您可以使用 Athena 分割區投影功能減少查詢執行時期並自動化分割區管理。分割區投影會在新增資料時自動新增分割區。因此您無需使用 `ALTER TABLE ADD PARTITION` 手動新增分割區。

下列 CREATE TABLE 陳述式範例會從指定 CloudFront 分佈到現在，對單一 AWS 區域的 CloudFront 日誌自動使用分割區投影。成功執行查詢之後，您可以查詢資料表。

```
CREATE EXTERNAL TABLE `cloudfront_logs_pp`(
  `date` string, 
  `time` string, 
  `x-edge-location` string, 
  `sc-bytes` string, 
  `c-ip` string, 
  `cs-method` string, 
  `cs(host)` string, 
  `cs-uri-stem` string, 
  `sc-status` string, 
  `cs(referer)` string, 
  `cs(user-agent)` string, 
  `cs-uri-query` string, 
  `cs(cookie)` string, 
  `x-edge-result-type` string, 
  `x-edge-request-id` string, 
  `x-host-header` string, 
  `cs-protocol` string, 
  `cs-bytes` string, 
  `time-taken` string, 
  `x-forwarded-for` string, 
  `ssl-protocol` string, 
  `ssl-cipher` string, 
  `x-edge-response-result-type` string, 
  `cs-protocol-version` string, 
  `fle-status` string, 
  `fle-encrypted-fields` string, 
  `c-port` string, 
  `time-to-first-byte` string, 
  `x-edge-detailed-result-type` string, 
  `sc-content-type` string, 
  `sc-content-len` string, 
  `sc-range-start` string, 
  `sc-range-end` string)
  PARTITIONED BY(
         distributionid string,
         year int,
         month int,
         day int,
         hour int )
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 
  'paths'='c-ip,c-port,cs(Cookie),cs(Host),cs(Referer),cs(User-Agent),cs-bytes,cs-method,cs-protocol,cs-protocol-version,cs-uri-query,cs-uri-stem,date,fle-encrypted-fields,fle-status,sc-bytes,sc-content-len,sc-content-type,sc-range-end,sc-range-start,sc-status,ssl-cipher,ssl-protocol,time,time-taken,time-to-first-byte,x-edge-detailed-result-type,x-edge-location,x-edge-request-id,x-edge-response-result-type,x-edge-result-type,x-forwarded-for,x-host-header') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/'
TBLPROPERTIES (
  'projection.distributionid.type'='enum',
  'projection.distributionid.values'='E2Oxxxxxxxxxxx',
  'projection.day.range'='01,31', 
  'projection.day.type'='integer', 
  'projection.day.digits'='2', 
  'projection.enabled'='true', 
  'projection.month.range'='01,12', 
  'projection.month.type'='integer', 
  'projection.month.digits'='2', 
  'projection.year.range'='2025,2026', 
  'projection.year.type'='integer', 
  'projection.hour.range'='00,23',
  'projection.hour.type'='integer',
  'projection.hour.digits'='2',
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/${distributionid}/${year}/${month}/${day}/${hour}/')
```

以下是先前範例中所用屬性的一些考量事項。
+ **資料表名稱** – 資料表名稱 *`cloudfront_logs_pp`* 為可取代。您可以將其變更為您偏好的任何名稱。
+ **位置** – 修改 `s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/` 來指向您的 Amazon S3 儲存貯體。
+ **分佈 ID** – 對於 `projection.distributionid.values`，如果您使用逗號分隔分佈 ID，則可以指定多個分佈 ID。例如，*<distributionID1>*、*<distributionID2>*。
+ **年份範圍** – 在 `projection.year.range` 中，您可以根據資料定義年份範圍。例如，您可以將其調整為任何期間，例如 *2025 年*、*2026 年*。
**注意**  
包含空的分割區 (例如未來日期的分割區，例如：2025-2040 年) 可能會影響查詢效能。不過，分割區投影旨在有效地處理未來日期。為了維持最佳效能，請確保仔細管理分割區，並盡可能避免過多的空的分割區。
+ **儲存位置範本** – 您必須確保根據下列 CloudFront 分割結構和 S3 路徑正確更新 `storage.location.template`。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/create-cloudfront-table-partition-json.html)

  在確認 CloudFront 分割結構和 S3 結構符合所需的模式後，請更新 `storage.location.template`，如下所示：

  ```
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/account_id/CloudFront/${distributionid}/folder2/${year}/${month}/${day}/${hour}/folder3/'
  ```
**注意**  
`storage.location.template` 的適當組態對於確保正確的資料儲存和擷取至關重要。

# 使用分割區投影 (Parquet) 在 Athena 中建立 CloudFront 日誌的資料表
<a name="create-cloudfront-table-partition-parquet"></a>

下列 CREATE TABLE 陳述式範例會從指定 CloudFront 分佈到現在，對單一 AWS 區域的 Parquet 格式 CloudFront 日誌自動使用分割區投影。成功執行查詢之後，您可以查詢資料表。

```
CREATE EXTERNAL TABLE `cloudfront_logs_parquet_pp`(
`date` string, 
`time` string, 
`x_edge_location` string, 
`sc_bytes` string, 
`c_ip` string, 
`cs_method` string, 
`cs_host` string, 
`cs_uri_stem` string, 
`sc_status` string, 
`cs_referer` string, 
`cs_user_agent` string, 
`cs_uri_query` string, 
`cs_cookie` string, 
`x_edge_result_type` string, 
`x_edge_request_id` string, 
`x_host_header` string, 
`cs_protocol` string, 
`cs_bytes` string, 
`time_taken` string, 
`x_forwarded_for` string, 
`ssl_protocol` string, 
`ssl_cipher` string, 
`x_edge_response_result_type` string, 
`cs_protocol_version` string, 
`fle_status` string, 
`fle_encrypted_fields` string, 
`c_port` string, 
`time_to_first_byte` string, 
`x_edge_detailed_result_type` string, 
`sc_content_type` string, 
`sc_content_len` string, 
`sc_range_start` string, 
`sc_range_end` string)
PARTITIONED BY(
 distributionid string,
 year int,
 month int,
 day int,
 hour int )
ROW FORMAT SERDE 
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/'
TBLPROPERTIES (
'projection.distributionid.type'='enum',
'projection.distributionid.values'='E3OK0LPUNWWO3',
'projection.day.range'='01,31',
'projection.day.type'='integer',
'projection.day.digits'='2',
'projection.enabled'='true',
'projection.month.range'='01,12',
'projection.month.type'='integer',
'projection.month.digits'='2',
'projection.year.range'='2019,2025',
'projection.year.type'='integer',
'projection.hour.range'='01,12',
'projection.hour.type'='integer',
'projection.hour.digits'='2',
'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/${distributionid}/${year}/${month}/${day}/${hour}/')
```

以下是先前範例中所用屬性的一些考量事項。
+ **資料表名稱** – 資料表名稱 *`cloudfront_logs_pp`* 為可取代。您可以將其變更為您偏好的任何名稱。
+ **位置** – 修改 `s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/` 來指向您的 Amazon S3 儲存貯體。
+ **分佈 ID** – 對於 `projection.distributionid.values`，如果您使用逗號分隔分佈 ID，則可以指定多個分佈 ID。例如，*<distributionID1>*、*<distributionID2>*。
+ **年份範圍** – 在 `projection.year.range` 中，您可以根據資料定義年份範圍。例如，您可以將其調整為任何期間，例如 *2025 年*、*2026 年*。
**注意**  
包含空的分割區 (例如未來日期的分割區，例如：2025-2040 年) 可能會影響查詢效能。不過，分割區投影旨在有效地處理未來日期。為了維持最佳效能，請確保仔細管理分割區，並盡可能避免過多的空的分割區。
+ **儲存位置範本** – 您必須確保根據下列 CloudFront 分割結構和 S3 路徑正確更新 `storage.location.template`。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/create-cloudfront-table-partition-parquet.html)

  在確認 CloudFront 分割結構和 S3 結構符合所需的模式後，請更新 `storage.location.template`，如下所示：

  ```
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/account_id/CloudFront/${distributionid}/folder2/${year}/${month}/${day}/${hour}/folder3/'
  ```
**注意**  
`storage.location.template` 的適當組態對於確保正確的資料儲存和擷取至關重要。

# 建立 CloudFront 即時日誌的資料表
<a name="create-cloudfront-table-real-time-logs"></a>

**建立 CloudFront 即時日誌檔案欄位的資料表**

1. 複製下列範例 DDL 陳述式，並將其貼到 Athena 主控台查詢編輯器。範例陳述式使用《Amazon CloudFront 開發人員指南**》中[即時日誌](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/real-time-logs.html)章節中所述的日誌檔案欄位。為存放日誌的 Amazon S3 儲存貯體修改 `LOCATION`。如需有關使用查詢編輯器的資訊，請參閱[開始使用](getting-started.md)。

   此查詢可指定 `ROW FORMAT DELIMITED` 和 `FIELDS TERMINATED BY '\t'`，表示欄位以定位字元分隔。對於 `ROW FORMAT DELIMITED`，Athena 預設使用 [LazySimpleSerDe](lazy-simple-serde.md)。因為在 Athena 中它是保留字，所以使用反引號 (') 逸出 `timestamp` 資料欄。如需相關資訊，請參閱[在查詢中逸出預留關鍵字](reserved-words.md)。

   下列範例包含所有可用的欄位。您可以註解排除或移除不需要的欄位。

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_real_time_logs ( 
   `timestamp` STRING,
   c_ip STRING,
   time_to_first_byte BIGINT,
   sc_status BIGINT,
   sc_bytes BIGINT,
   cs_method STRING,
   cs_protocol STRING,
   cs_host STRING,
   cs_uri_stem STRING,
   cs_bytes BIGINT,
   x_edge_location STRING,
   x_edge_request_id STRING,
   x_host_header STRING,
   time_taken BIGINT,
   cs_protocol_version STRING,
   c_ip_version STRING,
   cs_user_agent STRING,
   cs_referer STRING,
   cs_cookie STRING,
   cs_uri_query STRING,
   x_edge_response_result_type STRING,
   x_forwarded_for STRING,
   ssl_protocol STRING,
   ssl_cipher STRING,
   x_edge_result_type STRING,
   fle_encrypted_fields STRING,
   fle_status STRING,
   sc_content_type STRING,
   sc_content_len BIGINT,
   sc_range_start STRING,
   sc_range_end STRING,
   c_port BIGINT,
   x_edge_detailed_result_type STRING,
   c_country STRING,
   cs_accept_encoding STRING,
   cs_accept STRING,
   cache_behavior_path_pattern STRING,
   cs_headers STRING,
   cs_header_names STRING,
   cs_headers_count BIGINT,
   primary_distribution_id STRING,
   primary_distribution_dns_name STRING,
   origin_fbl STRING,
   origin_lbl STRING,
   asn STRING
   )
   ROW FORMAT DELIMITED 
   FIELDS TERMINATED BY '\t'
   LOCATION 's3://amzn-s3-demo-bucket/'
   TBLPROPERTIES ( 'skip.header.line.count'='2' )
   ```

1. 在 Athena 主控台中執行查詢。查詢完成之後，Athena 會註冊 `cloudfront_real_time_logs` 資料表，讓其中的資料可供您發出查詢。

# 其他資源
<a name="cloudfront-logs-additional-resources"></a>

如需有關使用 Athena 查詢 CloudFront 日誌的詳細資訊，請參閱 [AWS 大數據部落格](https://aws.amazon.com/blogs/big-data/)中的下列貼文。

[使用 Amazon Athena 輕鬆查詢 AWS 服務 日誌](https://aws.amazon.com/blogs/big-data/easily-query-aws-service-logs-using-amazon-athena/) (2019 年 5 月 29 日）。

[大規模分析 Amazon CloudFront 存取日誌](https://aws.amazon.com/blogs/big-data/analyze-your-amazon-cloudfront-access-logs-at-scale/) (2018 年 12 月 21 日)。

[建置無伺服器架構，使用 AWS Lambda、Amazon Athena 和 Amazon Managed Service for Apache Flink (2017 年 5 月 26 日） 來分析 Amazon CloudFront 存取日誌 Amazon Athena](https://aws.amazon.com/blogs/big-data/build-a-serverless-architecture-to-analyze-amazon-cloudfront-access-logs-using-aws-lambda-amazon-athena-and-amazon-kinesis-analytics/)。

# 查詢 AWS CloudTrail 日誌
<a name="cloudtrail-logs"></a>

AWS CloudTrail 是一項服務，可記錄 Amazon Web Services 帳戶的 AWS API 呼叫和事件。

CloudTrail 日誌包含對 進行任何 API 呼叫的詳細資訊 AWS 服務，包括 主控台。CloudTrail 會產生加密的日誌檔案，並將它們存放在 Amazon S3 中。如需詳細資訊，請參閱《AWS CloudTrail 使用者指南》[https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)。

**注意**  
如果要跨帳戶、區域和日期對 CloudTrail 事件資訊執行 SQL 查詢，請考慮使用 CloudTrail Lake。CloudTrail Lake 是建立線索的 AWS 替代方案，可將企業的資訊彙總到單一可搜尋的事件資料存放區。其不使用 Amazon S3 儲存貯體儲存，而是將事件儲存在資料湖中，進而允許更豐富、更快的查詢。您可以使用它來建立 SQL 查詢，以便跨組織、區域並在自訂的時間範圍內搜尋事件。因為您在 CloudTrail 主控台本身中執行 CloudTrail Lake 查詢，因此使用 CloudTrail Lake 不需要 Athena。如需詳細資訊，請參閱 [CloudTrail Lake](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake.html) 文件。

搭配使用 Athena 與 CloudTrail 日誌是一種功能強大的方式，可增強 AWS 服務 活動的分析。例如，您可以使用查詢來識別趨勢，並依屬性 (例如來源 IP 地址或使用者) 進一步隔離活動。

常見的應用是使用 CloudTrail 日誌來分析營運活動的安全性與合規性。如需詳細範例的資訊，請參閱 AWS 大數據部落格文章、[使用 和 Amazon Athena 分析安全性、合規性 AWS CloudTrail 和操作活動](https://aws.amazon.com/blogs/big-data/aws-cloudtrail-and-amazon-athena-dive-deep-to-analyze-security-compliance-and-operational-activity/)。

您可以使用 Athena，指定日誌檔案的 `LOCATION`，直接從 Amazon S3 查詢這些日誌檔案。有以下兩種做法：
+ 從 CloudTrail 主控台直接建立 CloudTrail 日誌檔案的資料表。
+ 在 Athena 主控台中手動建立 CloudTrail 日誌檔案的資料表。

**Topics**
+ [了解 CloudTrail 日誌和 Athena 資料表](create-cloudtrail-table-understanding.md)
+ [使用 CloudTrail 主控台建立 CloudTrail 日誌的 Athena 資料表](create-cloudtrail-table-ct.md)
+ [使用手動分割在 Athena 中建立 CloudTrail 日誌的資料表](create-cloudtrail-table.md)
+ [使用手動分割為整個組織的追蹤建立資料表](create-cloudtrail-table-org-wide-trail.md)
+ [使用分割區投影在 Athena 中建立 CloudTrail 日誌的資料表](create-cloudtrail-table-partition-projection.md)
+ [CloudTrail 日誌查詢範例](query-examples-cloudtrail-logs.md)

# 了解 CloudTrail 日誌和 Athena 資料表
<a name="create-cloudtrail-table-understanding"></a>

開始建立資料表之前，您應該更深入了解 CloudTrail 及其如何存放資料。這可協助您建立所需資料表，不論您的建立方式是透過 CloudTrail 主控台或 Athena。

CloudTrail 將日誌以壓縮的 gzip 格式 (`*.json.gz`) 儲存在 JSON 文字檔案中。日誌檔案的位置取決於您設定追蹤的方式、您正在記錄的 AWS 區域 或 區域，以及其他因素。

如需有關日誌存放位置、JSON 結構、日誌檔案內容的詳細資訊，請參閱《[AWS CloudTrail 使用者指南](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)》中的下列主題：
+  [尋找 CloudTrail 日誌檔案](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-find-log-files.html) 
+  [CloudTrail 日誌檔案範例](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-log-file-examples.html) 
+  [CloudTrail 記錄內容](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)
+  [CloudTrail 事件參考](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference.html) 

若要收集日誌並儲存到 Amazon S3 中，請從 AWS 管理主控台啟用 CloudTrail。如需詳細資訊，請參閱《AWS CloudTrail 使用者指南》**中的[建立追蹤](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-a-trail-using-the-console-first-time.html)。

# 使用 CloudTrail 主控台建立 CloudTrail 日誌的 Athena 資料表
<a name="create-cloudtrail-table-ct"></a>

您可以建立非分割 Athena 資料表，以直接從 CloudTrail 主控台查詢 CloudTrail 日誌。從 CloudTrail 主控台建立 Athena 資料表時，您必須使用具有足夠許可的角色登入，才能在 Athena 中建立資料表。

**注意**  
您無法使用 CloudTrail 主控台建立組織線索日誌的 Athena 資料表。而是要使用 Athena 主控台手動建立資料表，以便指定正確的儲存位置。如需有關組織線索的資訊，請參閱《AWS CloudTrail 使用者指南》**中的[為組織建立追蹤](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/creating-trail-organization.html)。
+ 如需有關設定 Athena 許可的資訊，請參閱 [設定、管理和以程式設計方式存取](setting-up.md)。
+ 如需建立包含分割區之資料表的相關資訊，請參閱[使用手動分割在 Athena 中建立 CloudTrail 日誌的資料表](create-cloudtrail-table.md)。

**若要使用 CloudTrail 主控台為 CloudTrail 線索建立 Athena 資料表**

1. 透過 [https://console.aws.amazon.com/cloudtrail/](https://console.aws.amazon.com/cloudtrail/) 開啟 CloudTrail 主控台。

1. 在導覽窗格中，選擇 **Event history** (事件歷史記錄)。

1. 選擇 **Create Athena table** (建立 Athena 資料表)。  
![\[選擇 Create Athena table (建立 Athena 資料表)\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/cloudtrail-logs-create-athena-table.png)

1. 對於 **Storage location** (儲存位置)，請使用向下箭頭選取存放日誌檔案的 Amazon S3 儲存貯體，以供查詢線索。
**注意**  
若要尋找與線索相關聯的儲存貯體名稱，請選擇 CloudTrail 導覽窗格中的 **Trails** (線索)，然後檢視該線索的 **S3 bucket** (S3 儲存貯體) 資料欄。若要查看儲存貯體的 Amazon S3 位置，請在 **S3 bucket** (S3 儲存貯體) 資料欄中選擇儲存貯體的連結。這會開啟 Amazon S3 主控台，以前往 CloudTrail 儲存貯體位置。

1. 選擇 **Create Table** (建立資料表)。建立的資料表會使用包含 Amazon S3 儲存貯體名稱的預設名稱。

# 使用手動分割在 Athena 中建立 CloudTrail 日誌的資料表
<a name="create-cloudtrail-table"></a>

您可以在 Athena 主控台中手動建立 CloudTrail 日誌檔案的資料表，然後在 Athena 中執行查詢。

**若要使用 Athena 主控台為 CloudTrail 線索建立 Athena 資料表**

1. 複製下列 DDL 陳述式，並將其貼到 Athena 主控台查詢編輯器，然後根據您的要求進行修改。請注意，由於 CloudTrail 日誌檔案並非公有 API 呼叫的堆疊追蹤排序，因此日誌檔案中的欄位不會以任何特定順序出現。

   ```
   CREATE EXTERNAL TABLE cloudtrail_logs (
   eventversion STRING,
   useridentity STRUCT<
                  type:STRING,
                  principalid:STRING,
                  arn:STRING,
                  accountid:STRING,
                  invokedby:STRING,
                  accesskeyid:STRING,
                  username:STRING,
                  onbehalfof: STRUCT<
                       userid: STRING,
                       identitystorearn: STRING>,
     sessioncontext:STRUCT<
       attributes:STRUCT<
                  mfaauthenticated:STRING,
                  creationdate:STRING>,
       sessionissuer:STRUCT<  
                  type:STRING,
                  principalid:STRING,
                  arn:STRING, 
                  accountid:STRING,
                  username:STRING>,
       ec2roledelivery:string,
       webidfederationdata: STRUCT<
                  federatedprovider: STRING,
                  attributes: map<string,string>>
     >
   >,
   eventtime STRING,
   eventsource STRING,
   eventname STRING,
   awsregion STRING,
   sourceipaddress STRING,
   useragent STRING,
   errorcode STRING,
   errormessage STRING,
   requestparameters STRING,
   responseelements STRING,
   additionaleventdata STRING,
   requestid STRING,
   eventid STRING,
   resources ARRAY<STRUCT<
                  arn:STRING,
                  accountid:STRING,
                  type:STRING>>,
   eventtype STRING,
   apiversion STRING,
   readonly STRING,
   recipientaccountid STRING,
   serviceeventdetails STRING,
   sharedeventid STRING,
   vpcendpointid STRING,
   vpcendpointaccountid STRING,
   eventcategory STRING,
   addendum STRUCT<
     reason:STRING,
     updatedfields:STRING,
     originalrequestid:STRING,
     originaleventid:STRING>,
   sessioncredentialfromconsole STRING,
   edgedevicedetails STRING,
   tlsdetails STRUCT<
     tlsversion:STRING,
     ciphersuite:STRING,
     clientprovidedhostheader:STRING>
   )
   PARTITIONED BY (region string, year string, month string, day string)
   ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
   STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
   OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/Account_ID/';
   ```
**注意**  
我們建議使用範例中顯示的 `org.apache.hive.hcatalog.data.JsonSerDe`。雖然存在 `com.amazon.emr.hive.serde.CloudTrailSerde`，但目前不會處理一些較新的 CloudTrail 欄位。

1. (選用) 移除資料表不再需要的任何欄位。如果您只需要讀取特定的資料欄集，則您的資料表定義可排除其他資料欄。

1. 修改 `s3://amzn-s3-demo-bucket/AWSLogs/Account_ID/` 來指向包含您要查詢的日誌資料的 Amazon S3 儲存貯體。範例中使用特定帳戶日誌的 `LOCATION` 值，但您可以使用適合您應用程式的具體程度。例如：
   + 若要分析多個帳戶的資料，您可以復原 `LOCATION` 指標，使用 `LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/'` 來指定所有 `AWSLogs`。
   + 若要分析特定日期、帳戶和區域的資料，請使用 `LOCATION 's3://amzn-s3-demo-bucket/123456789012/CloudTrail/us-east-1/2016/03/14/'.` 
   + 若要分析網路活動資料，而不是管理事件，請將 `LOCATION` 子句中的 `/CloudTrail/` 取代為 `/CloudTrail-NetworkActivity/`。

   當您使用 Athena 進行查詢時，使用物件階層的最高層級可給您最大的靈活性。

1. 確認列出的欄位正確。如需有關 CloudTrail 記錄中欄位的完整清單的詳細資訊，請參閱 [CloudTrail 記錄內容](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)。

   步驟 1 中的範例 `CREATE TABLE` 陳述式使用 [Hive JSON SerDe](hive-json-serde.md)。在這個範例中，欄位 `requestparameters`、`responseelements` 和 `additionaleventdata` 在查詢中列為類型 `STRING`，但採用 JSON 格式時為 `STRUCT` 資料類型。因此，若要取得這些欄位的資料，請使用 `JSON_EXTRACT` 函數。如需詳細資訊，請參閱[從字串擷取 JSON 資料](extracting-data-from-JSON.md)。為了改善效能，範例會依 AWS 區域年、月和日分割資料。

1. 在 Athena 主控台執行 `CREATE TABLE` 陳述式。

1. 使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 命令載入分割區，以便進行查詢，如下列範例所示。

   ```
   ALTER TABLE table_name ADD 
      PARTITION (region='us-east-1',
                 year='2019',
                 month='02',
                 day='01')
      LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/Account_ID/CloudTrail/us-east-1/2019/02/01/'
   ```

# 使用手動分割為整個組織的追蹤建立資料表
<a name="create-cloudtrail-table-org-wide-trail"></a>

若要在 Athena 為整個組織的 CloudTrail 日誌檔建立資料表，請依循[使用手動分割在 Athena 中建立 CloudTrail 日誌的資料表](create-cloudtrail-table.md)所述的步驟在下列程序中修改。

**為整個組織的 CloudTrail 日誌建立 Athena 資料表**

1. 在 `CREATE TABLE` 陳述式中，修改 `LOCATION` 子句以加入組織 ID，如下列範例所示：

   ```
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/organization_id/'
   ```

1. 在 `PARTITIONED BY` 子句中，以字串形式新增帳戶 ID 項目，如下列範例所示：

   ```
   PARTITIONED BY (account string, region string, year string, month string, day string)
   ```

   上述步驟的合併結果如以下範例所示：

   ```
   ...
   
   PARTITIONED BY (account string, region string, year string, month string, day string) 
   ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
   STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
   OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/organization_id/Account_ID/CloudTrail/'
   ```

1. 在 `ALTER TABLE` 陳述式中的 `ADD PARTITION` 子句內加入帳戶 ID，如下列範例所示：

   ```
   ALTER TABLE table_name ADD
   PARTITION (account='111122223333',
   region='us-east-1',
   year='2022',
   month='08',
   day='08')
   ```

1. 在 `ALTER TABLE` 陳述式中的 `LOCATION` 子句內加入組織 ID、帳戶 ID，以及您要新增的分割區，如下列範例所示：

   ```
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/organization_id/Account_ID/CloudTrail/us-east-1/2022/08/08/'
   ```

   上述步驟的合併結果如以下 `ALTER TABLE` 陳述式範例所示：

   ```
   ALTER TABLE table_name ADD
   PARTITION (account='111122223333',
   region='us-east-1',
   year='2022',
   month='08',
   day='08')
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/organization_id/111122223333/CloudTrail/us-east-1/2022/08/08/'
   ```

請注意，在大型組織中，使用此方法來手動為每個組織帳戶 ID 新增和維護分割區可能會很麻煩。在這種情況下，請考慮使用 CloudTrail Lake 而不是 Athena。在這種情況下，CloudTrail Lake 可提供下列優勢：
+ 自動彙總整個組織的日誌
+ 不需要設定或維護分割區或 Athena 資料表
+ 查詢會在 CloudTrail 主控台中直接執行
+ 使用 SQL 相容查詢語言

如需詳細資訊，請參閱*AWS CloudTrail 《 使用者指南*》中的[使用 AWS CloudTrail Lake](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake.html)。

# 使用分割區投影在 Athena 中建立 CloudTrail 日誌的資料表
<a name="create-cloudtrail-table-partition-projection"></a>

由於 CloudTrail 日誌具有您可以事先指定其分割區配置的已知結構，您可以使用 Athena 分割區投影功能來減少查詢執行時間並自動化分割區管理。分割區投影會在新增資料時自動新增分割區。因此您無需使用 `ALTER TABLE ADD PARTITION` 手動新增分割區。

以下 `CREATE TABLE` 陳述式範例會從指定日期到現在，對單一 AWS 區域的 CloudTrail 日誌自動使用分割區投影。在 `LOCATION` 和 `storage.location.template` 子句中，請以對應的相同值取代*儲存貯體*、*account-id* 和 *aws-region* 預留位置。對於 `projection.timestamp.range`，請用您要使用的開始日期取代 *2020*/*01*/*01*。成功執行查詢之後，您可以查詢資料表。您無須執行 `ALTER TABLE ADD PARTITION` 就能載入分割區。

```
CREATE EXTERNAL TABLE cloudtrail_logs_pp(
    eventversion STRING,
    useridentity STRUCT<
        type: STRING,
        principalid: STRING,
        arn: STRING,
        accountid: STRING,
        invokedby: STRING,
        accesskeyid: STRING,
        username: STRING,
        onbehalfof: STRUCT<
             userid: STRING,
             identitystorearn: STRING>,
        sessioncontext: STRUCT<
            attributes: STRUCT<
                mfaauthenticated: STRING,
                creationdate: STRING>,
            sessionissuer: STRUCT<
                type: STRING,
                principalid: STRING,
                arn: STRING,
                accountid: STRING,
                username: STRING>,
            ec2roledelivery:string,
            webidfederationdata: STRUCT<
                federatedprovider: STRING,
                attributes: map<string,string>>
        >
    >,
    eventtime STRING,
    eventsource STRING,
    eventname STRING,
    awsregion STRING,
    sourceipaddress STRING,
    useragent STRING,
    errorcode STRING,
    errormessage STRING,
    requestparameters STRING,
    responseelements STRING,
    additionaleventdata STRING,
    requestid STRING,
    eventid STRING,
    readonly STRING,
    resources ARRAY<STRUCT<
        arn: STRING,
        accountid: STRING,
        type: STRING>>,
    eventtype STRING,
    apiversion STRING,
    recipientaccountid STRING,
    serviceeventdetails STRING,
    sharedeventid STRING,
    vpcendpointid STRING,
    vpcendpointaccountid STRING,
    eventcategory STRING,
    addendum STRUCT<
      reason:STRING,
      updatedfields:STRING,
      originalrequestid:STRING,
      originaleventid:STRING>,
    sessioncredentialfromconsole STRING,
    edgedevicedetails STRING,
    tlsdetails STRUCT<
      tlsversion:STRING,
      ciphersuite:STRING,
      clientprovidedhostheader:STRING>
  )
PARTITIONED BY (
   `timestamp` string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/AWSLogs/account-id/CloudTrail/aws-region'
TBLPROPERTIES (
  'projection.enabled'='true', 
  'projection.timestamp.format'='yyyy/MM/dd', 
  'projection.timestamp.interval'='1', 
  'projection.timestamp.interval.unit'='DAYS', 
  'projection.timestamp.range'='2020/01/01,NOW', 
  'projection.timestamp.type'='date', 
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/account-id/CloudTrail/aws-region/${timestamp}')
```

如需有關分割區投影的詳細資訊，請參閱[透過 Amazon Athena 使用分割區投影](partition-projection.md)。

# CloudTrail 日誌查詢範例
<a name="query-examples-cloudtrail-logs"></a>

以下範例顯示一個查詢的片段，該查詢從為 CloudTrail 事件日誌建立的資料表傳回所有匿名 (未簽署的) 請求。此查詢選擇 `useridentity.accountid` 是匿名且未指定 `useridentity.arn` 的那些請求：

```
SELECT *
FROM cloudtrail_logs
WHERE 
    eventsource = 's3.amazonaws.com' AND 
    eventname in ('GetObject') AND 
    useridentity.accountid = 'anonymous' AND 
    useridentity.arn IS NULL AND
    requestparameters LIKE '%[your bucket name ]%';
```

如需詳細資訊，請參閱 AWS 大數據部落格文章[使用 和 Amazon Athena 分析安全性、合規性 AWS CloudTrail 和營運活動](https://aws.amazon.com/blogs/big-data/aws-cloudtrail-and-amazon-athena-dive-deep-to-analyze-security-compliance-and-operational-activity/)。

## 查詢 CloudTrail 日誌中的巢狀欄位
<a name="cloudtrail-logs-nested-fields"></a>

由於 `userIdentity` 和 `resources` 欄位是巢狀資料類型，查詢它們需要特殊的處理。

`userIdentity` 物件由巢狀 `STRUCT` 類型組成。如以下範例所示，可以使用點來分隔欄位，以查詢這些類型：

```
SELECT 
    eventsource, 
    eventname,
    useridentity.sessioncontext.attributes.creationdate,
    useridentity.sessioncontext.sessionissuer.arn
FROM cloudtrail_logs
WHERE useridentity.sessioncontext.sessionissuer.arn IS NOT NULL
ORDER BY eventsource, eventname
LIMIT 10
```

`resources` 欄位是 `STRUCT` 物件的陣列。請對這些陣列使用 `CROSS JOIN UNNEST`，解除陣列巢狀，以便於查詢其物件。

以下範例會傳回資源 ARN 以 `example/datafile.txt` 結尾的所有資料行。為了可讀性，[replace](https://prestodb.io/docs/current/functions/string.html#replace) 函數會從 ARN 移除初始 `arn:aws:s3:::` 子字串。

```
SELECT 
    awsregion,
    replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as s3_resource,
    eventname,
    eventtime,
    useragent
FROM cloudtrail_logs t
CROSS JOIN UNNEST(t.resources) unnested (resources_entry)
WHERE unnested.resources_entry.ARN LIKE '%example/datafile.txt'
ORDER BY eventtime
```

下列範例為 `DeleteBucket` 事件的查詢範例。該查詢會從 `resources` 物件擷取儲存貯體的名稱及儲存貯體隸屬的帳戶 ID。

```
SELECT 
    awsregion,
    replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as deleted_bucket,
    eventtime AS time_deleted,
    useridentity.username, 
    unnested.resources_entry.accountid as bucket_acct_id 
FROM cloudtrail_logs t
CROSS JOIN UNNEST(t.resources) unnested (resources_entry)
WHERE eventname = 'DeleteBucket'
ORDER BY eventtime
```

如需有關解除巢狀的詳細資訊，請參閱[篩選陣列](filtering-arrays.md)。

## 查詢 CloudTrail 日誌的秘訣
<a name="tips-for-querying-cloudtrail-logs"></a>

探索 CloudTrail 日誌資料時，請考慮下列事項：
+ 查詢日誌之前，確認您的日誌資料表看起來和 [使用手動分割在 Athena 中建立 CloudTrail 日誌的資料表](create-cloudtrail-table.md) 中的相同。如果它不是第一個資料表，使用下列命令刪除現有的資料表：`DROP TABLE cloudtrail_logs`。
+ 捨棄現有資料表後，再重新建立。如需詳細資訊，請參閱[使用手動分割在 Athena 中建立 CloudTrail 日誌的資料表](create-cloudtrail-table.md)。

  確認 Athena 查詢中列出的欄位正確。如需有關 CloudTrail 記錄中欄位的完整清單的資訊，請參閱 [CloudTrail 記錄內容](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)。

  如果您的查詢包含 JSON 格式的欄位，例如 `STRUCT`，請從 JSON 擷取資料。如需詳細資訊，請參閱[從字串擷取 JSON 資料](extracting-data-from-JSON.md)。

  針對 CloudTrail 資料表發出查詢的部分建議。
+ 首先，查看哪些 使用者呼叫了哪些 API 操作以及從哪些來源 IP 地址進行呼叫。
+ 以下列基本 SQL 查詢當做您的範本。將查詢貼到 Athena 主控台然後執行。

  ```
  SELECT
   useridentity.arn,
   eventname,
   sourceipaddress,
   eventtime
  FROM cloudtrail_logs
  LIMIT 100;
  ```
+ 修改查詢，進一步探索您的資料。
+ 為了改善效能，加入 `LIMIT` 子句來傳回資料列的指定部分。

# 查詢 Amazon EMR 日誌
<a name="emr-logs"></a>

在 Amazon EMR 上執行的 Amazon EMR 和大數據應用程式會產生日誌檔案。日誌檔案會被寫入[主節點](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-master-core-task-nodes.html)，且您也可以將 Amazon EMR 設定為自動將日誌檔案存檔至 Amazon S3。您可以使用 Amazon Athena 來查詢這些日誌，以識別應用程式和叢集的事件和趨勢。如需有關 Amazon EMR 中的日誌檔案類型和將其儲存至 Amazon S3 的詳細資訊，請參閱《Amazon EMR 管理指南》**中的[檢視日誌檔案](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-manage-view-web-log-files.html)。

**Topics**
+ [根據 Amazon EMR 日誌檔案建立和查詢基本資料表](emr-create-table.md)
+ [根據 Amazon EMR 日誌建立和查詢分割的資料表](emr-create-table-partitioned.md)

# 根據 Amazon EMR 日誌檔案建立和查詢基本資料表
<a name="emr-create-table"></a>

以下範例會根據儲存至 `s3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/elasticmapreduce/` 的日誌檔建立基本資料表 `myemrlogs`。在以下範例中使用的 Amazon S3 位置會反映由 Amazon Web Services 帳戶 *123456789012* 在區域 *us-west-2* 中建立之 EMR 叢集的預設日誌位置的模式。如果您使用自訂位置，模式則為 s3://amzn-s3-demo-bucket/*ClusterID*。

如需建立分割的資料表以盡可能提升查詢效能並減少資料傳輸的詳細資訊，請參閱 [根據 Amazon EMR 日誌建立和查詢分割的資料表](emr-create-table-partitioned.md)。

```
CREATE EXTERNAL TABLE `myemrlogs`(
  `data` string COMMENT 'from deserializer')
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6'
```

## 查詢範例
<a name="emr-example-queries-basic"></a>

以下範例查詢可在上一個範例建立的 `myemrlogs` 資料表上執行。

**Example – 查詢 ERROR、WARN、INFO、EXCEPTION、FATAL 或 DEBUG 發生次數的步驟日誌**  

```
SELECT data,
        "$PATH"
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'s-86URH188Z6B1')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

**Example – 查詢 ERROR、WARN、INFO、EXCEPTION、FATAL 或 DEBUG 的特定執行個體日誌 i-00b3c0a839ece0a9c**  

```
SELECT "data",
        "$PATH" AS filepath
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'i-00b3c0a839ece0a9c')
        AND regexp_like("$PATH",'state')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

**Example – 查詢 ERROR、WARN、INFO、EXCEPTION、FATAL 或 DEBUG 的 Presto 應用程式日誌**  

```
SELECT "data",
        "$PATH" AS filepath
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'presto')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

**Example – 查詢 ERROR、WARN、INFO、EXCEPTION、FATAL 或 DEBUG 的 Namenode 應用程式日誌**  

```
SELECT "data",
        "$PATH" AS filepath
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'namenode')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

**Example – 依日期和小時查詢 ERROR、WARN、INFO、EXCEPTION、FATAL 或 DEBUG 的所有日誌**  

```
SELECT distinct("$PATH") AS filepath
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'2019-07-23-10')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

# 根據 Amazon EMR 日誌建立和查詢分割的資料表
<a name="emr-create-table-partitioned"></a>

這些範例使用相同的日誌位置來建立 Athena 資料表，但資料表會進行分割，然後為每個日誌位置建立分割區。如需詳細資訊，請參閱[分割您的資料](partitions.md)。

以下查詢會建立名為 `mypartitionedemrlogs` 的分割資料表：

```
CREATE EXTERNAL TABLE `mypartitionedemrlogs`(
  `data` string COMMENT 'from deserializer')
 partitioned by (logtype string)
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6'
```

以下查詢陳述式接著會根據 Amazon EMR 在 Amazon S3 中所建立之不同日誌類型的子目錄，建立資料表分割區：

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='containers')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/containers/'
```

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='hadoop-mapreduce')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/hadoop-mapreduce/'
```

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='hadoop-state-pusher')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/hadoop-state-pusher/'
```

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='node')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/node/'
```

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='steps')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/steps/'
```

建立分割區後，您可以在資料表上執行 `SHOW PARTITIONS` 查詢，以便確認：

```
SHOW PARTITIONS mypartitionedemrlogs;
```

## 查詢範例
<a name="emr-example-queries-partitioned"></a>

以下範例示範特定日誌項目的查詢會使用上述範例所建立的資料表和分割區。

**Example – 查詢 ERROR 或 WARN 的容器分割區中的應用程式 application\$11561661818238\$10002 日誌**  

```
SELECT data,
        "$PATH"
FROM "default"."mypartitionedemrlogs"
WHERE logtype='containers'
        AND regexp_like("$PATH",'application_1561661818238_0002')
        AND regexp_like(data, 'ERROR|WARN') limit 100;
```

**Example – 查詢任務 job\$11561661818238\$10004 的 hadoop-Mapreduce 分割區和失敗的 Reduce 次數**  

```
SELECT data,
        "$PATH"
FROM "default"."mypartitionedemrlogs"
WHERE logtype='hadoop-mapreduce'
        AND regexp_like(data,'job_1561661818238_0004|Failed Reduces') limit 100;
```

**Example – 在查詢 ID 056e0609-33e1-4611-956c-7a31b42d2663 的節點分割區中查詢 Hive 日誌**  

```
SELECT data,
        "$PATH"
FROM "default"."mypartitionedemrlogs"
WHERE logtype='node'
        AND regexp_like("$PATH",'hive')
        AND regexp_like(data,'056e0609-33e1-4611-956c-7a31b42d2663') limit 100;
```

**Example – 在應用程式 1567660019320\$10001\$101\$1000001 的節點分割區中查詢 resourcemanager 日誌**  

```
SELECT data,
        "$PATH"
FROM "default"."mypartitionedemrlogs"
WHERE logtype='node'
        AND regexp_like(data,'resourcemanager')
        AND regexp_like(data,'1567660019320_0001_01_000001') limit 100
```

# 查詢 AWS Global Accelerator 流程日誌
<a name="querying-global-accelerator-flow-logs"></a>

您可以使用 AWS Global Accelerator 建立加速器，透過 AWS 全球網路將網路流量導向最佳端點。如需 Global Accelerator 的詳細資訊，請參閱[什麼是 AWS Global Accelerator](https://docs.aws.amazon.com/global-accelerator/latest/dg/what-is-global-accelerator.html) 。

Global Accelerator 流程日誌可讓您擷取加速器中進出網路界面的 IP 地址流量相關資訊。流程日誌資料會發佈至 Amazon S3，您可以在其中擷取和檢視資料。如需詳細資訊，請參閱 [AWS Global Accelerator中的流程日誌](https://docs.aws.amazon.com/global-accelerator/latest/dg/monitoring-global-accelerator.flow-logs.html)。

您可以使用 Athena 建立在 Amazon S3 中指定其位置的資料表來查詢 Global Accelerator 流程日誌。

**若要建立 Global Accelerator 流程日誌的資料表**

1. 複製下列 DDL 陳述式，並將其貼到 Athena 主控台。此查詢會指定 *ROW FORMAT DELIMITED* 並省略指定 [SerDe](serde-reference.md)，這代表該查詢使用 [`LazySimpleSerDe`](lazy-simple-serde.md)。在這個查詢中，欄位以空格結尾。

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS aga_flow_logs (
     version string,
     account string,
     acceleratorid string,
     clientip string,
     clientport int,
     gip string,
     gipport int,
     endpointip string,
     endpointport int,
     protocol string,
     ipaddresstype string,
     numpackets bigint,
     numbytes int,
     starttime int,
     endtime int,
     action string,
     logstatus string,
     agasourceip string,
     agasourceport int,
     endpointregion string,
     agaregion string,
     direction string,
     vpc_id string,
     reject_reason string
   )
   PARTITIONED BY (dt string)
   ROW FORMAT DELIMITED
   FIELDS TERMINATED BY ' '
   LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/account_id/globalaccelerator/region/'
   TBLPROPERTIES ("skip.header.line.count"="1");
   ```

1. 修改 `LOCATION` 值來指向包含日誌資料的 Amazon S3 儲存貯體。

   ```
   's3://amzn-s3-demo-bucket/prefix/AWSLogs/account_id/globalaccelerator/region_code/'
   ```

1. 在 Athena 主控台中執行查詢。查詢完成之後，Athena 會註冊 `aga_flow_logs` 資料表，讓其中的資料可供查詢。

1. 建立分割區以讀取資料，如下列查詢範例所示。該查詢會針對指定日期建立單一分割區。將預留位置換成日期和位置。

   ```
   ALTER TABLE aga_flow_logs
   ADD PARTITION (dt='YYYY-MM-dd')
   LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/account_id/globalaccelerator/region_code/YYYY/MM/dd';
   ```

## AWS Global Accelerator 流程日誌的範例查詢
<a name="querying-global-accelerator-flow-logs-examples"></a>

**Example – 列出透過特定節點傳遞的請求**  
下列範例查詢列出了透過 LHR 節點傳遞的要求。使用 `LIMIT` 運算子來一次限制查詢的日誌數量。  

```
SELECT 
  clientip, 
  agaregion, 
  protocol, 
  action 
FROM 
  aga_flow_logs 
WHERE 
  agaregion LIKE 'LHR%' 
LIMIT 
  100;
```

**Example – 列出了接收最多 HTTPS 請求的端點 IP 地址**  
若要查看哪些端點 IP 位址正在接收最多的 HTTPS 要求數目，請使用下列查詢。此查詢會計算 HTTPS 連接埠 443 所接收的封包數、依目的地 IP 地址分組，然後傳回前 10 個 IP 地址。  

```
SELECT 
  SUM(numpackets) AS packetcount, 
  endpointip 
FROM 
  aga_flow_logs 
WHERE 
  endpointport = 443 
GROUP BY 
  endpointip 
ORDER BY 
  packetcount DESC 
LIMIT 
  10;
```

# 查詢 Amazon GuardDuty 調查結果
<a name="querying-guardduty"></a>

[Amazon GuardDuty](https://aws.amazon.com/guardduty/) 是一種安全監控服務，可協助識別您 AWS 環境中的非預期和可能未經授權或惡意活動。當偵測到未預期的和潛在的惡意活動時，GuardDuty 會產生安全[問題清單](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_findings.html)，您可將其匯出至 Amazon S3 以進行儲存和分析。將問題清單匯出至 Amazon S3 之後，您可以使用 Athena 來查詢它們。本文將示範如何在 Athena 中為您的 GuardDuty 問題清單建立資料表並進行查詢。

如需有關 Amazon GuardDuty 的詳細資訊，請參閱《[Amazon GuardDuty 使用者指南](https://docs.aws.amazon.com/guardduty/latest/ug/)》。

## 先決條件
<a name="querying-guardduty-prerequisites"></a>
+ 啟用 GuardDuty 功能以將問題清單匯出至 Amazon S3。如需相關步驟，請參閱《Amazon GuardDuty 使用者指南》中的[匯出問題清單](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_exportfindings.html)。

## 在 Athena 中為 GuardDuty 調查結果建立資料表
<a name="querying-guardduty-creating-a-table-in-athena-for-guardduty-findings"></a>

若要從 Athena 查詢您的 GuardDuty 問題清單，您必須為它們建立一個資料表。

**若要在 Athena 中為 GuardDuty 問題清單建立資料表**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 將下列 DDL 陳述式複製到 Athena 主控台。修改 `LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/account-id/GuardDuty/'` 中的數值，以指向 Amazon S3 中的 GuardDuty 問題清單。

   ```
   CREATE EXTERNAL TABLE `gd_logs` (
     `schemaversion` string,
     `accountid` string,
     `region` string,
     `partition` string,
     `id` string,
     `arn` string,
     `type` string,
     `resource` string,
     `service` string,
     `severity` string,
     `createdat` string,
     `updatedat` string,
     `title` string,
     `description` string)
   ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
    LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/account-id/GuardDuty/'
    TBLPROPERTIES ('has_encrypted_data'='true')
   ```
**注意**  
SerDe 預期每筆 JSON 文件都以單行文字表示，而且沒有行終止字元分隔記錄中的欄位。如果 JSON 文字是美化過的列印格式，則在建立資料表後嘗試在其中查詢時可能會收到下列錯誤訊息：HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object (HIVE\$1CURSOR\$1ERROR：資料列不是有效的 JSON 物件) 或 HIVE\$1CURSOR\$1ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT (HIVE\$1CURSOR\$1ERROR：JsonParseException：非預期的輸入結束：預期為 OBJECT 的關閉標記)。如需詳細資訊，請參閱 GitHub 上 OpenX SerDe 文件中的 [JSON 資料檔案](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files)。

1. 在 Athena 主控台中執行查詢來註冊 `gd_logs` 資料表。查詢完成時，您就可以從 Athena 查詢問題清單。

## 查詢範例
<a name="querying-guardduty-examples"></a>

下列範例說明如何從 Athena 查詢 GuardDuty 問題清單。

**Example – DNS 資料外洩**  
下列查詢會傳回可能透過 DNS 查詢外洩資料之 Amazon EC2 執行個體的相關資訊。  

```
SELECT
    title,
    severity,
    type,
    id AS FindingID,
    accountid,
    region,
    createdat,
    updatedat,
    json_extract_scalar(service, '$.count') AS Count,
    json_extract_scalar(resource, '$.instancedetails.instanceid') AS InstanceID,
    json_extract_scalar(service, '$.action.actiontype') AS DNS_ActionType,
    json_extract_scalar(service, '$.action.dnsrequestaction.domain') AS DomainName,
    json_extract_scalar(service, '$.action.dnsrequestaction.protocol') AS protocol,
    json_extract_scalar(service, '$.action.dnsrequestaction.blocked') AS blocked
FROM gd_logs
WHERE type = 'Trojan:EC2/DNSDataExfiltration'
ORDER BY severity DESC
```

**Example – 未經授權的 IAM 使用者存取**  
下列查詢會傳回所有區域的 IAM 委託人的所有 `UnauthorizedAccess:IAMUser` 問題清單類型。  

```
SELECT title,
         severity,
         type,
         id,
         accountid,
         region,
         createdat,
         updatedat,
         json_extract_scalar(service, '$.count') AS Count, 
         json_extract_scalar(resource, '$.accesskeydetails.username') AS IAMPrincipal, 
         json_extract_scalar(service,'$.action.awsapicallaction.api') AS APIActionCalled
FROM gd_logs
WHERE type LIKE '%UnauthorizedAccess:IAMUser%' 
ORDER BY severity desc;
```

## 查詢 GuardDuty 問題清單的秘訣
<a name="querying-guardduty-tips"></a>

當您建立查詢時，請記住以下幾點。
+ 若要從巢狀 JSON 欄位中提取資料，請使用 Presto `json_extract` 或 `json_extract_scalar` 函數。如需詳細資訊，請參閱[從字串擷取 JSON 資料](extracting-data-from-JSON.md)。
+ 確保 JSON 欄位中的所有字元都是小寫。
+  如需下載查詢結果的相關資訊，請參閱[使用 Athena 主控台下載查詢結果檔案](saving-query-results.md)。

# 查詢 AWS Network Firewall 日誌
<a name="querying-network-firewall-logs"></a>

AWS Network Firewall 是一項受管服務，可用來部署 Amazon Virtual Private Cloud 執行個體的基本網路保護。 與 搭配 AWS Network Firewall 運作 AWS Firewall Manager ，讓您可以根據 AWS Network Firewall 規則建置政策，然後將這些政策集中套用至您的 VPCs和帳戶。如需 的詳細資訊 AWS Network Firewall，請參閱 [AWS Network Firewall](https://aws.amazon.com/network-firewall/)。

您可以為轉送至防火牆具狀態規則引擎的流量設定 AWS Network Firewall 記錄。記錄功能提供詳細的網路流量資訊，包括有狀態引擎接收封包的時間、詳細的封包資訊，以及對封包採取的任何有狀態規則動作。日誌會發佈至您已設定的日誌目的地，其中您可以擷取並檢視它們。如需詳細資訊，請參閱《AWS Network Firewall 開發人員指南》**中的[記錄來自 AWS Network Firewall的網路流量](https://docs.aws.amazon.com/network-firewall/latest/developerguide/firewall-logging.html)。

**Topics**
+ [建立並查詢提醒日誌的資料表](querying-network-firewall-logs-sample-alert-logs-table.md)
+ [建立並查詢 Netflow 日誌的資料表](querying-network-firewall-logs-sample-netflow-logs-table.md)

# 建立並查詢提醒日誌的資料表
<a name="querying-network-firewall-logs-sample-alert-logs-table"></a>

1. 修改下列範例 DDL 陳述式，以符合提醒日誌的結構。您可能需要更新陳述式，以加入最新版本日誌的資料欄。如需詳細資訊，請參閱《AWS Network Firewall 開發人員指南》**中的[防火牆日誌內容](https://docs.aws.amazon.com/network-firewall/latest/developerguide/firewall-logging.html#firewall-logging-contents)。

   ```
   CREATE EXTERNAL TABLE network_firewall_alert_logs (
     firewall_name string,
     availability_zone string,
     event_timestamp string,
     event struct<
       timestamp:string,
       flow_id:bigint,
       event_type:string,
       src_ip:string,
       src_port:int,
       dest_ip:string,
       dest_port:int,
       proto:string,
       app_proto:string,
       sni:string,
       tls_inspected:boolean,
       tls_error:struct<
         error_message:string>,
       revocation_check:struct<
         leaf_cert_fpr:string,
         status:string,
         action:string>,
       alert:struct<
         alert_id:string,
         alert_type:string,
         action:string,
         signature_id:int,
         rev:int,
         signature:string,
         category:string,
         severity:int,
         rule_name:string,
         alert_name:string,
         alert_severity:string,
         alert_description:string,
         file_name:string,
         file_hash:string,
         packet_capture:string,
         reference_links:array<string>
       >, 
       src_country:string, 
       dest_country:string, 
       src_hostname:string, 
       dest_hostname:string, 
       user_agent:string, 
       url:string
      >
   )
    ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
    LOCATION 's3://amzn-s3-demo-bucket/path_to_alert_logs_folder/';
   ```

1. 修改 `LOCATION` 子句，以在 Amazon S3 中指定日誌的資料夾。

1. 在 Athena 查詢編輯器中，執行 `CREATE TABLE` 查詢。查詢完成之後，Athena 會註冊 `network_firewall_alert_logs` 資料表，讓其所指向的資料可供您查詢。

## 查詢範例
<a name="querying-network-firewall-logs-alert-log-sample-query"></a>

本節中的範例提醒日誌查詢會篩選執行 TLS 檢查且提醒嚴重等級為 2 或更高級別的事件。

查詢會使用別名來建立輸出資料欄標題，以顯示資料欄所屬的 `struct`。例如，`event.alert.category` 欄位的資料欄標題是 `event_alert_category` 而不只是 `category`。若要進一步自訂資料欄名稱，您可以依照您的偏好設定修改別名。例如，您可以使用底線或其他分隔符號來分隔 `struct` 名稱和欄位名稱。

請記得根據您的資料表定義和查詢結果中要包含的欄位來修改資料欄名稱和 `struct` 參考。

```
SELECT 
  firewall_name,
  availability_zone,
  event_timestamp,
  event.timestamp AS event_timestamp,
  event.flow_id AS event_flow_id,
  event.event_type AS event_type,
  event.src_ip AS event_src_ip,
  event.src_port AS event_src_port,
  event.dest_ip AS event_dest_ip,
  event.dest_port AS event_dest_port,
  event.proto AS event_protol,
  event.app_proto AS event_app_proto,
  event.sni AS event_sni,
  event.tls_inspected AS event_tls_inspected,
  event.tls_error.error_message AS event_tls_error_message,
  event.revocation_check.leaf_cert_fpr AS event_revocation_leaf_cert,
  event.revocation_check.status AS event_revocation_check_status,
  event.revocation_check.action AS event_revocation_check_action,
  event.alert.alert_id AS event_alert_alert_id,
  event.alert.alert_type AS event_alert_alert_type,
  event.alert.action AS event_alert_action,
  event.alert.signature_id AS event_alert_signature_id,
  event.alert.rev AS event_alert_rev,
  event.alert.signature AS event_alert_signature,
  event.alert.category AS event_alert_category,
  event.alert.severity AS event_alert_severity,
  event.alert.rule_name AS event_alert_rule_name,
  event.alert.alert_name AS event_alert_alert_name,
  event.alert.alert_severity AS event_alert_alert_severity,
  event.alert.alert_description AS event_alert_alert_description,
  event.alert.file_name AS event_alert_file_name,
  event.alert.file_hash AS event_alert_file_hash,
  event.alert.packet_capture AS event_alert_packet_capture,
  event.alert.reference_links AS event_alert_reference_links,
  event.src_country AS event_src_country,
  event.dest_country AS event_dest_country,
  event.src_hostname AS event_src_hostname,
  event.dest_hostname AS event_dest_hostname,
  event.user_agent AS event_user_agent,
  event.url AS event_url
FROM 
  network_firewall_alert_logs 
WHERE 
  event.alert.severity >= 2
  AND event.tls_inspected = true 
LIMIT 10;
```

# 建立並查詢 Netflow 日誌的資料表
<a name="querying-network-firewall-logs-sample-netflow-logs-table"></a>

1. 修改下列範例 DDL 陳述式，以符合 Netflow 日誌的結構。您可能需要更新陳述式，以加入最新版本日誌的資料欄。如需詳細資訊，請參閱《AWS Network Firewall 開發人員指南》**中的[防火牆日誌內容](https://docs.aws.amazon.com/network-firewall/latest/developerguide/firewall-logging.html#firewall-logging-contents)。

   ```
   CREATE EXTERNAL TABLE network_firewall_netflow_logs (
     firewall_name string,
     availability_zone string,
     event_timestamp string,
     event struct<
       timestamp:string,
       flow_id:bigint,
       event_type:string,
       src_ip:string,
       src_port:int,
       dest_ip:string,
       dest_port:int,
       proto:string,
       app_proto:string,
       tls_inspected:boolean,
       netflow:struct<
         pkts:int,
         bytes:bigint,
         start:string,
         `end`:string,
         age:int,
         min_ttl:int,
         max_ttl:int,
         tcp_flags:struct<
           syn:boolean,
           fin:boolean,
           rst:boolean,
           psh:boolean,
           ack:boolean,
           urg:boolean
           >
         >
       >
   )
   ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
   LOCATION 's3://amzn-s3-demo-bucket/path_to_netflow_logs_folder/';
   ```

1. 修改 `LOCATION` 子句，以在 Amazon S3 中指定日誌的資料夾。

1. 在 Athena 查詢編輯器中，執行 `CREATE TABLE` 查詢。查詢完成之後，Athena 會註冊 `network_firewall_netflow_logs` 資料表，讓其所指向的資料可供您查詢。

## 查詢範例
<a name="querying-network-firewall-logs-netflow-log-sample-query"></a>

本節中的範例 Netflow 日誌查詢會篩選執行 TLS 檢查的事件。

查詢會使用別名來建立輸出資料欄標題，以顯示資料欄所屬的 `struct`。例如，`event.netflow.bytes` 欄位的資料欄標題是 `event_netflow_bytes` 而不只是 `bytes`。若要進一步自訂資料欄名稱，您可以依照您的偏好設定修改別名。例如，您可以使用底線或其他分隔符號來分隔 `struct` 名稱和欄位名稱。

請記得根據您的資料表定義和查詢結果中要包含的欄位來修改資料欄名稱和 `struct` 參考。

```
SELECT
  event.src_ip AS event_src_ip,
  event.dest_ip AS event_dest_ip,
  event.proto AS event_proto,
  event.app_proto AS event_app_proto,
  event.tls_inspected AS event_tls_inspected,
  event.netflow.pkts AS event_netflow_pkts,
  event.netflow.bytes AS event_netflow_bytes,
  event.netflow.tcp_flags.syn AS event_netflow_tcp_flags_syn 
FROM network_firewall_netflow_logs 
WHERE event.tls_inspected = true
```

# 查詢 Network Load Balancer 日誌
<a name="networkloadbalancer-classic-logs"></a>

使用 Athena 分析和處理 Network Load Balancer 的日誌。這些日誌會接收傳送至 Network Load Balancer 之 Transport Layer Security (TLS) 的詳細資訊。您可以使用這些存取日誌來分析流量模式和排除問題。

分析 Network Load Balancer 存取日誌之前，請對其啟用和設定，以在目的地 Amazon S3 儲存貯體中儲存。如需詳細資訊，以及有關每個 Network Load Balancer 存取日誌項目的資訊，請參閱[存取您的 Network Load Balancer 日誌](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-access-logs.html)。

**若要為 Network Load Balancer 日誌建立資料表**

1. 複製下列 DDL 陳述式，並將其貼到 Athena 主控台。檢查 Network Load Balancer 日誌記錄的[語法](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-access-logs.html#access-log-file-format)。視需要更新陳述式，以包含與日誌記錄對應的資料欄和 regex。

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS nlb_tls_logs (
               type string,
               version string,
               time string,
               elb string,
               listener_id string,
               client_ip string,
               client_port int,
               target_ip string,
               target_port int,
               tcp_connection_time_ms double,
               tls_handshake_time_ms double,
               received_bytes bigint,
               sent_bytes bigint,
               incoming_tls_alert int,
               cert_arn string,
               certificate_serial string,
               tls_cipher_suite string,
               tls_protocol_version string,
               tls_named_group string,
               domain_name string,
               alpn_fe_protocol string,
               alpn_be_protocol string,
               alpn_client_preference_list string,
               tls_connection_creation_time string
               )
               ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
               WITH SERDEPROPERTIES (
               'serialization.format' = '1',
               'input.regex' = 
               '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*):([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-0-9]*) ([-0-9]*) ([-0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?'
               )
               LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/AWS_account_ID/elasticloadbalancing/region';
   ```

1. 修改 `LOCATION` Amazon S3 儲存貯體，以指定您的 Network Load Balancer 日誌的目的地。

1. 在 Athena 主控台中執行查詢。查詢完成之後，Athena 會註冊 `nlb_tls_logs` 資料表，讓其中的資料可供您查詢。

## 查詢範例
<a name="query-nlb-example"></a>

若要查看憑證使用的次數，請使用類似此範例的查詢：

```
SELECT count(*) AS 
         ct,
         cert_arn
FROM "nlb_tls_logs"
GROUP BY  cert_arn;
```

下列查詢顯示使用早於 TLS 1.3 版本的使用者數量：

```
SELECT tls_protocol_version,
         COUNT(tls_protocol_version) AS 
         num_connections,
         client_ip
FROM "nlb_tls_logs"
WHERE tls_protocol_version < 'tlsv13'
GROUP BY tls_protocol_version, client_ip;
```

使用下列查詢，來識別需要很長 TLS 交握時間的連接：

```
SELECT *
FROM "nlb_tls_logs"
ORDER BY  tls_handshake_time_ms DESC 
LIMIT 10;
```

使用下列查詢可以識別和計算在過去 30 天內交涉的 TLS 通訊協定版本和密碼套件。

```
SELECT tls_cipher_suite,
         tls_protocol_version,
         COUNT(*) AS ct
FROM "nlb_tls_logs"
WHERE from_iso8601_timestamp(time) > current_timestamp - interval '30' day
        AND NOT tls_protocol_version = '-'
GROUP BY tls_cipher_suite, tls_protocol_version
ORDER BY ct DESC;
```

# 查詢 Amazon Route 53 Resolver 查詢日誌
<a name="querying-r53-resolver-logs"></a>

您可以為 Amazon Route 53 Resolver 查詢日誌建立 Athena 資料表，並從 Athena 查詢它們。

Route 53 Resolver 查詢記錄功能用於記錄資源在 VPC 內所做的 DNS 查詢、使用傳入解析程式端點的內部部署資源、使用遞迴 DNS 解析之傳出解析程式端點的查詢，以及使用 Route 53 Resolver DNS 防火牆規則封鎖、允許或監控網域清單的查詢。如需有關 Resolver 查詢記錄的詳細資訊，請參閱《Amazon Route 53 開發人員指南》**中的 [Resolver 查詢記錄](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-query-logs.html)。如需有關日誌中各欄位的資訊，請參閱《Amazon Route 53 開發人員指南》**中的[在 Resolver 查詢日誌中出現的值](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-query-logs-format.html)。

**Topics**
+ [建立 Resolver 查詢日誌的資料表](querying-r53-resolver-logs-creating-the-table.md)
+ [使用分割區投影](querying-r53-resolver-logs-partitioning-example.md)
+ [查詢範例](querying-r53-resolver-logs-example-queries.md)

# 建立 Resolver 查詢日誌的資料表
<a name="querying-r53-resolver-logs-creating-the-table"></a>

您可以使用 Athena 主控台中的查詢編輯器，建立並查詢 Route 53 Resolver 查詢日誌的資料表。

**若要建立並查詢 Route 53 Resolver 查詢日誌的 Athena 資料表**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在 Athena 查詢編輯器中，輸入以下 `CREATE TABLE` 陳述式。使用對應於 Amazon S3 中 Resolver 日誌位置的值取代 `LOCATION` 子句值。

   ```
   CREATE EXTERNAL TABLE r53_rlogs (
     version string,
     account_id string,
     region string,
     vpc_id string,
     query_timestamp string,
     query_name string,
     query_type string,
     query_class
       string,
     rcode string,
     answers array<
       struct<
         Rdata: string,
         Type: string,
         Class: string>
       >,
     srcaddr string,
     srcport int,
     transport string,
     srcids struct<
       instance: string,
       resolver_endpoint: string
       >,
     firewall_rule_action string,
     firewall_rule_group_id string,
     firewall_domain_list_id string
    )
        
   ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
   LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/aws_account_id/vpcdnsquerylogs/{vpc-id}/'
   ```

   由於 Resolver 查詢日誌資料是 JSON 格式，CREATE TABLE 陳述式會使用 [JSON SerDe 程式庫](json-serde.md)分析資料。
**注意**  
SerDe 預期每筆 JSON 文件都以單行文字表示，而且沒有行終止字元分隔記錄中的欄位。如果 JSON 文字是美化過的列印格式，則在建立資料表後嘗試在其中查詢時可能會收到下列錯誤訊息：HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object (HIVE\$1CURSOR\$1ERROR：資料列不是有效的 JSON 物件) 或 HIVE\$1CURSOR\$1ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT (HIVE\$1CURSOR\$1ERROR：JsonParseException：非預期的輸入結束：預期為 OBJECT 的關閉標記)。如需詳細資訊，請參閱 GitHub 上 OpenX SerDe 文件中的 [JSON 資料檔案](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files)。

1. 選擇 **Run query** (執行查詢)。該陳述式會建立名為 `r53_rlogs` 的 Athena 資料表，其資料欄表示 Resolver 日誌資料中的各欄位。

1. 在 Athena 主控台查詢編輯器中，執行以下查詢，以確認您的資料表已建立。

   ```
   SELECT * FROM "r53_rlogs" LIMIT 10
   ```

# 使用分割區投影
<a name="querying-r53-resolver-logs-partitioning-example"></a>

下列範例顯示使用分割區投影並依據 vpc 和日期分割的 Resolver 查詢日誌 `CREATE TABLE` 陳述式。如需有關分割區投影的詳細資訊，請參閱[透過 Amazon Athena 使用分割區投影](partition-projection.md)。

```
CREATE EXTERNAL TABLE r53_rlogs (
  version string,
  account_id string,
  region string,
  vpc_id string,
  query_timestamp string,
  query_name string,
  query_type string,
  query_class string,
  rcode string,
  answers array<
    struct<
      Rdata: string,
      Type: string,
      Class: string>
    >,
  srcaddr string,
  srcport int,
  transport string,
  srcids struct<
    instance: string,
    resolver_endpoint: string
    >,
  firewall_rule_action string,
  firewall_rule_group_id string,
  firewall_domain_list_id string
)
PARTITIONED BY (
`date` string,
`vpc` string
)
ROW FORMAT SERDE      'org.openx.data.jsonserde.JsonSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT          'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION              's3://amzn-s3-demo-bucket/route53-query-logging/AWSLogs/aws_account_id/vpcdnsquerylogs/'
TBLPROPERTIES(
'projection.enabled' = 'true',
'projection.vpc.type' = 'enum',
'projection.vpc.values' = 'vpc-6446ae02',
'projection.date.type' = 'date',
'projection.date.range' = '2023/06/26,NOW',
'projection.date.format' = 'yyyy/MM/dd',
'projection.date.interval' = '1',
'projection.date.interval.unit' = 'DAYS',
'storage.location.template' = 's3://amzn-s3-demo-bucket/route53-query-logging/AWSLogs/aws_account_id/vpcdnsquerylogs/${vpc}/${date}/'
)
```

# 查詢範例
<a name="querying-r53-resolver-logs-example-queries"></a>

以下範例顯示您可以從 Athena 對 Resolver 查詢日誌執行的部分查詢。

## 範例 1 – 以遞減的 query\$1timestamp 順序查詢日誌
<a name="querying-r53-resolver-logs-example-1-query-logs-in-descending-query_timestamp-order"></a>

以下查詢以遞減的 `query_timestamp` 順序顯示日誌結果。

```
SELECT * FROM "r53_rlogs"
ORDER BY query_timestamp DESC
```

## 範例 2 – 在指定的開始和結束時間內查詢日誌
<a name="querying-r53-resolver-logs-example-2-query-logs-within-specified-start-and-end-times"></a>

以下查詢會查詢 2020 年 9 月 24 日午夜到早上 8 點之間的日誌。根據您的需求替換開始和結束時間。

```
SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode
FROM "r53_rlogs"
WHERE (parse_datetime(query_timestamp,'yyyy-MM-dd''T''HH:mm:ss''Z')
     BETWEEN parse_datetime('2020-09-24-00:00:00','yyyy-MM-dd-HH:mm:ss') 
     AND parse_datetime('2020-09-24-00:08:00','yyyy-MM-dd-HH:mm:ss'))
ORDER BY query_timestamp DESC
```

## 範例 3 – 根據指定的 DNS 查詢名稱模式查詢日誌
<a name="querying-r53-resolver-logs-example-3-query-logs-based-on-a-specified-dns-query-name-pattern"></a>

以下查詢會選取其查詢名稱包括 "example.com" 字串的記錄。

```
SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode, answers
FROM "r53_rlogs"
WHERE query_name LIKE '%example.com%'
ORDER BY query_timestamp DESC
```

## 範例 4 – 查詢無答案的日誌請求
<a name="querying-r53-resolver-logs-example-4-query-log-requests-with-no-answer"></a>

以下查詢會選取請求未收到答案的日誌項目。

```
SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode, answers
FROM "r53_rlogs"
WHERE cardinality(answers) = 0
```

## 範例 5 – 查詢有特定答案的日誌
<a name="querying-r53-resolver-logs-example-5-query-logs-with-a-specific-answer"></a>

以下查詢會顯示其中的 `answer.Rdata` 值有指定 IP 地址的日誌。

```
SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode, answer.Rdata
FROM "r53_rlogs"
CROSS JOIN UNNEST(r53_rlogs.answers) as st(answer)
WHERE answer.Rdata='203.0.113.16';
```

# 查詢 Amazon SES 事件日誌
<a name="querying-ses-logs"></a>

您可以使用 Amazon Athena 來查詢 [Amazon Simple Email Service](https://aws.amazon.com/ses/) (Amazon SES) 事件日誌。

Amazon SES 是一種電子郵件平台，提供便利且符合經濟效益的方式，讓您能使用自有的電子郵件地址和網域傳送及接收電子郵件。您可以使用事件、指標和統計資料，以細微的程度監控 Amazon SES 傳送活動。

依據您定義的特徵，您可以將 Amazon SES 事件發布至 [Amazon CloudWatch](https://aws.amazon.com/cloudwatch/)、[Amazon Data Firehose](https://aws.amazon.com/kinesis/data-firehose/) 或 [Amazon Simple Notification Service](https://aws.amazon.com/sns/)。將資訊存放在 Amazon S3 之後，您就能從 Amazon Athena 進行查詢。

如需 Amazon SES 日誌的範例 Athena `CREATE TABLE`陳述式，包括如何在 Amazon SES 事件日誌資料中建立檢視和扁平化巢狀陣列的步驟，請參閱 AWS 部落格文章中的「使用 Amazon Athena 查詢 SES 事件日誌」使用 Analytics Services 分析 Amazon SES 事件資料。 [ Amazon SES AWS](https://aws.amazon.com/blogs/messaging-and-targeting/analyzing-amazon-ses-event-data-with-aws-analytics-services/)

# 查詢 Amazon VPC 流程日誌
<a name="vpc-flow-logs"></a>

Amazon Virtual Private Cloud 流量日誌擷取傳入和傳出 VPC 中網路界面之 IP 流量的相關資訊。使用日誌來調查網路流量模式，並識別整個 VPC 網路所遭受的威脅和風險。

若要查詢 Amazon VPC 流程日誌，您有下列兩種選擇：

****
+ **Amazon VPC 主控台** – 使用 Amazon VPC 主控台中的 Athena 整合功能來產生 CloudFormation 範本，以建立具有分割的 Athena 資料庫、工作群組和流程日誌資料表。此範本也會建立一組[預先定義流程日誌查詢](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs-athena.html#predefined-queries)，您可以使用其取得關於流經 VPC 流量的可行見解。

  如需有關此方法的詳細資訊，請參閱《Amazon VPC 使用者指南》**中的[使用 Amazon Athena 查詢流程日誌](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs-athena.html)。
+ **Amazon Athena 主控台** – 直接在 Athena 主控台中建立資料表和查詢。如需詳細資訊，請繼續閱讀此頁內容。

在 Athena 中開始查詢日誌之前，[請啟用 VPC 流程日誌](https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html)，並將它們設定為儲存到您的 Amazon S3 儲存貯體。建立日誌之後，讓它們執行幾分鐘以收集一些資料。日誌是以 Athena 可讓您直接查詢的 GZIP 壓縮格式建立。

建立 VPC 流程日誌時，若您想要指定要在流程日誌中傳回的欄位以及欄位出現的順序，請使用自訂格式。如需有關流程日誌記錄的詳細資訊，請參閱《Amazon VPC 使用者指南》**中的[流程日誌記錄](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html#flow-log-records)。

## 考量和限制
<a name="vpc-flow-logs-common-considerations"></a>

在 Athena 中為 Amazon VPC 流程日誌建立資料表時，請記住以下幾點：
+ 預設情況下，在 Athena 中，Parquet 將會依名稱存取欄。如需詳細資訊，請參閱[處理結構描述更新](handling-schema-updates-chapter.md)。
+ 使用流程日誌記錄中的名稱作為 Athena 中的資料欄名稱。Athena 結構描述中的資料欄名稱應與 Amazon VPC 流程日誌中的欄位名稱完全相符，但有以下差異：
  + 在 Athena 資料欄名稱中，將 Amazon VPC 日誌欄位名稱中的連字號替換為底線。如需有關 Athena 中資料庫名稱、資料表名稱和資料欄名稱可接受字元的資訊，請參閱 [為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)。
  + 透過反引號將流程日誌記錄名稱逸出為 Athena 中的[保留關鍵字](reserved-words.md)。
+ VPC 流程日誌是 AWS 帳戶 特定的。當您將日誌檔案發布到 Amazon S3 時，Amazon VPC 在 Amazon S3 中建立的路徑會包含用來建立流量日誌的 AWS 帳戶 的 ID。如需詳細資訊，請參閱《Amazon VPC 使用者指南》**中的[發布流量日誌至 Amazon S3](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs-s3.html)。

**Topics**
+ [考量和限制](#vpc-flow-logs-common-considerations)
+ [建立 Amazon VPC 流程日誌的資料表並進行查詢](vpc-flow-logs-create-table-statement.md)
+ [以 Apache Parquet 格式為流程日誌建立資料表](vpc-flow-logs-parquet.md)
+ [使用分割區投影為 Amazon VPC 流程日誌建立和查詢資料表](vpc-flow-logs-partition-projection.md)
+ [使用分割區投影，以 Apache Parquet 格式為流程日誌建立資料表](vpc-flow-logs-partition-projection-parquet-example.md)
+ [其他資源](query-examples-vpc-logs-additional-resources.md)

# 建立 Amazon VPC 流程日誌的資料表並進行查詢
<a name="vpc-flow-logs-create-table-statement"></a>

以下程序會建立 Amazon VPC 流程日誌的 Amazon VPC 資料表。當您使用自訂格式建立流程日誌時，需要建立資料表，其欄位符合您在建立流程日誌時指定的欄位，而順序與您指定它們的順序相同。

**為 Amazon VPC 流量日誌建立 Athena 資料表**

1. 在 Athena 主控台查詢編輯器中輸入類似下列的 DDL 陳述式，遵循 [考量和限制](vpc-flow-logs.md#vpc-flow-logs-common-considerations) 區段中的準則。陳述式範例會建立擁有 Amazon VPC 流程日誌版本 2 至 5 (如[流程日誌記錄](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html#flow-log-records)所記載) 之資料欄的資料表。如果您使用不同組的資料欄或資料欄順序，請據此修改陳述式。

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS `vpc_flow_logs` (
     version int,
     account_id string,
     interface_id string,
     srcaddr string,
     dstaddr string,
     srcport int,
     dstport int,
     protocol bigint,
     packets bigint,
     bytes bigint,
     start bigint,
     `end` bigint,
     action string,
     log_status string,
     vpc_id string,
     subnet_id string,
     instance_id string,
     tcp_flags int,
     type string,
     pkt_srcaddr string,
     pkt_dstaddr string,
     region string,
     az_id string,
     sublocation_type string,
     sublocation_id string,
     pkt_src_aws_service string,
     pkt_dst_aws_service string,
     flow_direction string,
     traffic_path int
   )
   PARTITIONED BY (`date` date)
   ROW FORMAT DELIMITED
   FIELDS TERMINATED BY ' '
   LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/'
   TBLPROPERTIES ("skip.header.line.count"="1");
   ```

   請注意以下重點：
   + 該查詢指定 `ROW FORMAT DELIMITED`，且省略不指定 SerDe。這表示該查詢會使用 [適用於 CSV、TSV 和自訂分隔檔案的 Lazy Simple SerDe](lazy-simple-serde.md)。在這個查詢中，欄位以空格結尾。
   + `PARTITIONED BY` 子句使用 `date` 類型。這樣就可以在查詢中使用數學運算子來選取特定日期之前或之後的項目。
**注意**  
因為 `date` 是 DDL 陳述式中保留的關鍵字，它會溢出反引號字元。如需詳細資訊，請參閱[在查詢中逸出預留關鍵字](reserved-words.md)。
   + 針對具有不同自訂格式的 VPC 流程日誌，請修改欄位，使其符合您建立流程日誌時指定的欄位。

1. 修改 `LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/'` 來指向包含日誌資料的 Amazon S3 儲存貯體。

1. 在 Athena 主控台中執行查詢。查詢完成之後，Athena 會註冊 `vpc_flow_logs` 資料表，讓其中的資料可供您發出查詢。

1. 建立能夠讀取資料的分割區，如下列查詢範例所示。這個查詢針對指定的日期建立單一分割區。視需要將預留位置換成日期和位置。
**注意**  
這個查詢針對您指定的日期，只建立單一分割區。若要自動執行程序，請使用指令碼以執行此查詢和依此針對 `year/month/day` 建立分割區，或使用指定[分割區投影](vpc-flow-logs-partition-projection.md)的 `CREATE TABLE` 陳述式。

   ```
   ALTER TABLE vpc_flow_logs
   ADD PARTITION (`date`='YYYY-MM-dd')
   LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/YYYY/MM/dd';
   ```

## vpc\$1flow\$1logs 資料表的查詢範例
<a name="query-examples-vpc-logs"></a>

使用 Athena 主控台中的查詢編輯器在您建立的資料表上執行 SQL 陳述式。您可以儲存查詢、檢視先前的查詢，或以 CSV 格式下載查詢結果。在下列範例中，將 `vpc_flow_logs` 替換為您的資料表名稱。根據自己的需求修改欄值和其他變數。

下列範例查詢會列出指定日期的最多 100 個流程日誌。

```
SELECT * 
FROM vpc_flow_logs 
WHERE date = DATE('2020-05-04') 
LIMIT 100;
```

以下查詢列出所有拒絕的 TCP 連線，並使用新建立的日期新分割欄 `date`，以從中擷取發生這些事件是星期幾。

```
SELECT day_of_week(date) AS
  day,
  date,
  interface_id,
  srcaddr,
  action,
  protocol
FROM vpc_flow_logs
WHERE action = 'REJECT' AND protocol = 6
LIMIT 100;
```

若要查看您的哪一個伺服器接收最多的 HTTPS 請求，請使用下列查詢。它計算 HTTPS 連接埠 443 所接收的封包數、依目的地 IP 地址分組，然後傳回上週的前 10 個。

```
SELECT SUM(packets) AS
  packetcount,
  dstaddr
FROM vpc_flow_logs
WHERE dstport = 443 AND date > current_date - interval '7' day
GROUP BY dstaddr
ORDER BY packetcount DESC
LIMIT 10;
```

# 以 Apache Parquet 格式為流程日誌建立資料表
<a name="vpc-flow-logs-parquet"></a>

以下程序會以 Parquet 格式建立 Amazon VPC 流程日誌的 Amazon VPC 資料表。

**為 Amazon VPC 流量日誌以 Parquet 格式建立 Athena 資料表**

1. 在 Athena 主控台查詢編輯器中輸入類似下列的 DDL 陳述式，遵循 [考量和限制](vpc-flow-logs.md#vpc-flow-logs-common-considerations) 區段中的準則。陳述式範例會建立擁有 Amazon VPC 流程日誌版本 2 至 5 (如 Parquet 格式、Hive 每小時已分割的[流程日誌記錄](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html#flow-log-records)所記載) 之資料欄的資料表。如果您沒有小時分割區，請從 `PARTITIONED BY` 子句中移除 `hour`。

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS vpc_flow_logs_parquet (
     version int,
     account_id string,
     interface_id string,
     srcaddr string,
     dstaddr string,
     srcport int,
     dstport int,
     protocol bigint,
     packets bigint,
     bytes bigint,
     start bigint,
     `end` bigint,
     action string,
     log_status string,
     vpc_id string,
     subnet_id string,
     instance_id string,
     tcp_flags int,
     type string,
     pkt_srcaddr string,
     pkt_dstaddr string,
     region string,
     az_id string,
     sublocation_type string,
     sublocation_id string,
     pkt_src_aws_service string,
     pkt_dst_aws_service string,
     flow_direction string,
     traffic_path int
   )
   PARTITIONED BY (
     `aws-account-id` string,
     `aws-service` string,
     `aws-region` string,
     `year` string, 
     `month` string, 
     `day` string,
     `hour` string
   )
   ROW FORMAT SERDE 
     'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
   STORED AS INPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
   OUTPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
   LOCATION
     's3://amzn-s3-demo-bucket/prefix/AWSLogs/'
   TBLPROPERTIES (
     'EXTERNAL'='true', 
     'skip.header.line.count'='1'
     )
   ```

1. 修改 `LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/'` 來指向包含日誌資料的 Amazon S3 路徑。

1. 在 Athena 主控台中執行查詢。

1. 如果您的資料採用 Hive 相容的格式，請在 Athena 主控台中執行以下命令來更新和載入中繼存放區中的 Hive 分割區。查詢完成後，您可以在 `vpc_flow_logs_parquet` 資料表中查詢資料。

   ```
   MSCK REPAIR TABLE vpc_flow_logs_parquet
   ```

   如果您沒有使用 Hive 相容的資料，請執行 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 來載入分割區。

如需有關使用 Athena 查詢 Parquet 格式的 Amazon VPC 流程日誌的詳細資訊，請參閱 *AWS 大數據部落格*中的[使用 Apache Parquet 格式的 VPC 流程日誌最佳化效能並降低網路分析成本](https://aws.amazon.com/blogs/big-data/optimize-performance-and-reduce-costs-for-network-analytics-with-vpc-flow-logs-in-apache-parquet-format/)。

# 使用分割區投影為 Amazon VPC 流程日誌建立和查詢資料表
<a name="vpc-flow-logs-partition-projection"></a>

使用如下 `CREATE TABLE` 陳述句，以建立資料表、分割資料表，並使用[分割區投影](partition-projection.md)自動填入分割區。將範例中的資料表名稱 `test_table_vpclogs` 替換為您的資料表名稱。編輯 `LOCATION` 子句以指定包含 Amazon VPC 日誌資料的 Amazon S3 儲存貯體。

以下 `CREATE TABLE` 陳述式適用於以非 Hive 樣式分割格式交付的 VPC 流程日誌。此範例允許多帳戶彙總。如果您要將多個帳戶的 VPC 流程日誌集中到一個 Amazon S3 儲存貯體，則必須在 Amazon S3 路徑中輸入帳戶 ID。

```
CREATE EXTERNAL TABLE IF NOT EXISTS test_table_vpclogs (
  version int,
  account_id string,
  interface_id string,
  srcaddr string,
  dstaddr string,
  srcport int,
  dstport int,
  protocol bigint,
  packets bigint,
  bytes bigint,
  start bigint,
  `end` bigint,
  action string,
  log_status string,
  vpc_id string,
  subnet_id string,
  instance_id string,
  tcp_flags int,
  type string,
  pkt_srcaddr string,
  pkt_dstaddr string,
  az_id string,
  sublocation_type string,
  sublocation_id string,
  pkt_src_aws_service string,
  pkt_dst_aws_service string,
  flow_direction string,
  traffic_path int
)
PARTITIONED BY (accid string, region string, day string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION '$LOCATION_OF_LOGS'
TBLPROPERTIES
(
"skip.header.line.count"="1",
"projection.enabled" = "true",
"projection.accid.type" = "enum",
"projection.accid.values" = "$ACCID_1,$ACCID_2",
"projection.region.type" = "enum",
"projection.region.values" = "$REGION_1,$REGION_2,$REGION_3",
"projection.day.type" = "date",
"projection.day.range" = "$START_RANGE,NOW",
"projection.day.format" = "yyyy/MM/dd",
"storage.location.template" = "s3://amzn-s3-demo-bucket/AWSLogs/${accid}/vpcflowlogs/${region}/${day}"
)
```

## test\$1table\$1vpclogs 的查詢範例
<a name="query-examples-vpc-logs-pp"></a>

下列查詢範例會查詢由前面 `CREATE TABLE` 陳述式所建立的 `test_table_vpclogs`。將查詢中的 `test_table_vpclogs` 替換為您自己的資料表名稱。根據自己的需求修改欄值和其他變數。

若要在指定時段內依時間順序傳回前 100 個存取日誌項目，請執行如下查詢。

```
SELECT *
FROM test_table_vpclogs
WHERE day >= '2021/02/01' AND day < '2021/02/28'
ORDER BY day ASC
LIMIT 100
```

若要查看哪個伺服器在指定時段內接收前十個 HTTP 封包，請執行如下查詢。查詢計算 HTTPS 連接埠 443 所接收的封包數、依目的地 IP 地址分組，然後傳回上週的前 10 個查詢。

```
SELECT SUM(packets) AS packetcount, 
       dstaddr
FROM test_table_vpclogs
WHERE dstport = 443
  AND day >= '2021/03/01'
  AND day < '2021/03/31'
GROUP BY dstaddr
ORDER BY packetcount DESC
LIMIT 10
```

若要傳回在指定時段內建立的日誌，請執行如下查詢。

```
SELECT interface_id,
       srcaddr,
       action,
       protocol,
       to_iso8601(from_unixtime(start)) AS start_time,
       to_iso8601(from_unixtime("end")) AS end_time
FROM test_table_vpclogs
WHERE DAY >= '2021/04/01'
  AND DAY < '2021/04/30'
```

若要傳回指定時段之間的來源 IP 地址的存取日誌，請執行如下查詢。

```
SELECT *
FROM test_table_vpclogs
WHERE srcaddr = '10.117.1.22'
  AND day >= '2021/02/01'
  AND day < '2021/02/28'
```

若要列出拒絕的 TCP 連接，請執行如下查詢。

```
SELECT day,
       interface_id,
       srcaddr,
       action,
       protocol
FROM test_table_vpclogs
WHERE action = 'REJECT' AND protocol = 6 AND day >= '2021/02/01' AND day < '2021/02/28'
LIMIT 10
```

若要傳回以 `10.117` 開頭的 IP 地址範圍的存取日誌，請執行如下查詢。

```
SELECT *
FROM test_table_vpclogs
WHERE split_part(srcaddr,'.', 1)='10'
  AND split_part(srcaddr,'.', 2) ='117'
```

若要傳回特定時間範圍之間的目的地 IP 地址的存取日誌，請執行如下查詢。

```
SELECT *
FROM test_table_vpclogs
WHERE dstaddr = '10.0.1.14'
  AND day >= '2021/01/01'
  AND day < '2021/01/31'
```

# 使用分割區投影，以 Apache Parquet 格式為流程日誌建立資料表
<a name="vpc-flow-logs-partition-projection-parquet-example"></a>

下列 VPC 流程日誌的資料分割投影 `CREATE TABLE` 陳述式採用 Apache Parquet 格式，與 Hive 不相容，並按小時和日期而非按日期進行分割。將範例中的資料表名稱 `test_table_vpclogs_parquet` 替換為您的資料表名稱。編輯 `LOCATION` 子句以指定包含 Amazon VPC 日誌資料的 Amazon S3 儲存貯體。

```
CREATE EXTERNAL TABLE IF NOT EXISTS test_table_vpclogs_parquet (
  version int,
  account_id string,
  interface_id string,
  srcaddr string,
  dstaddr string,
  srcport int,
  dstport int,
  protocol bigint,
  packets bigint,
  bytes bigint,
  start bigint,
  `end` bigint,
  action string,
  log_status string,
  vpc_id string,
  subnet_id string,
  instance_id string,
  tcp_flags int,
  type string,
  pkt_srcaddr string,
  pkt_dstaddr string,
  az_id string,
  sublocation_type string,
  sublocation_id string,
  pkt_src_aws_service string,
  pkt_dst_aws_service string,
  flow_direction string,
  traffic_path int
)
PARTITIONED BY (region string, date string, hour string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/'
TBLPROPERTIES (
"EXTERNAL"="true",
"skip.header.line.count" = "1",
"projection.enabled" = "true",
"projection.region.type" = "enum",
"projection.region.values" = "us-east-1,us-west-2,ap-south-1,eu-west-1",
"projection.date.type" = "date",
"projection.date.range" = "2021/01/01,NOW",
"projection.date.format" = "yyyy/MM/dd",
"projection.hour.type" = "integer",
"projection.hour.range" = "00,23",
"projection.hour.digits" = "2",
"storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/AWSLogs/${account_id}/vpcflowlogs/${region}/${date}/${hour}"
)
```

# 其他資源
<a name="query-examples-vpc-logs-additional-resources"></a>

如需有關使用 Athena 分析 VPC 流程日誌的詳細資訊，請參閱以下 AWS 大數據部落格文章。
+ [使用點選式 Amazon Athena 整合分析 VPC 流程日誌](https://aws.amazon.com/blogs/networking-and-content-delivery/analyze-vpc-flow-logs-with-point-and-click-amazon-athena-integration/) 
+ [使用 Amazon Athena 和 Quick 分析 VPC 流程日誌](https://aws.amazon.com/blogs/big-data/analyzing-vpc-flow-logs-using-amazon-athena-and-amazon-quicksight/)
+ [使用 Apache Parquet 格式的 VPC 流程日誌，最佳化效能並降低網路分析成本](https://aws.amazon.com/blogs/big-data/optimize-performance-and-reduce-costs-for-network-analytics-with-vpc-flow-logs-in-apache-parquet-format/)

# 查詢 AWS WAF 日誌
<a name="waf-logs"></a>

AWS WAF 是一種 Web 應用程式防火牆，可讓您監控和控制受保護 Web 應用程式從用戶端收到的 HTTP 和 HTTPS 請求。您可以透過在 Web 存取控制清單 (ACL) 中設定規則來定義如何處理 AWS WAF Web 請求。然後，您可以透過將 Web ACL 與 Web 應用程式建立關聯來保護 Web 應用程式。您可以使用 保護的 Web 應用程式資源範例 AWS WAF 包括 Amazon CloudFront 分佈、Amazon API Gateway REST APIs 和 Application Load Balancer。如需 的詳細資訊 AWS WAF，請參閱《 *AWS WAF 開發人員指南*[AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html)》中的 。

AWS WAF 日誌包含 Web ACL 所分析流量的相關資訊，例如從您的 AWS 資源 AWS WAF 接收請求的時間、請求的詳細資訊，以及每個請求相符之規則的動作。

您可以設定 AWS WAF Web ACL 將日誌發佈到多個目的地之一，您可以在其中查詢和檢視它們。如需有關設定 Web ACL 記錄和 AWS WAF 日誌內容的詳細資訊，請參閱*AWS WAF 《 開發人員指南*》中的[記錄 AWS WAF Web ACL 流量](https://docs.aws.amazon.com/waf/latest/developerguide/logging.html)。

如需有關如何使用 Athena 分析 AWS WAF 日誌以深入了解威脅偵測和潛在安全攻擊的資訊，請參閱 AWS 網路與內容交付部落格文章[如何使用 Amazon Athena 查詢來分析 AWS WAF 日誌並提供威脅偵測所需的可見性](https://aws.amazon.com/blogs/networking-and-content-delivery/how-to-use-amazon-athena-queries-to-analyze-aws-waf-logs-and-provide-the-visibility-needed-for-threat-detection/)。

如需如何將 AWS WAF 日誌彙總到中央資料湖儲存庫並使用 Athena 查詢日誌的範例，請參閱 AWS 大數據部落格文章[使用 OpenSearch Service、Amazon Athena 和 Quick 分析 AWS WAF 日誌](https://aws.amazon.com/blogs/big-data/analyzing-aws-waf-logs-with-amazon-es-amazon-athena-and-amazon-quicksight/)。

本主題提供分割區投影、手動分割以及不使用任何分割的範例 `CREATE TABLE` 陳述式。

**注意**  
所以本主題中的 `CREATE TABLE` 陳述式可同時用於 v1 和 v2 AWS WAF 日誌。在 v1 中，`webaclid` 欄位含有一個 ID。在 v2 中，`webaclid` 欄位含有一個完整的 ARN。此 `CREATE TABLE` 陳述式藉由使用 `string` 資料類型，以不可知的方式處理此內容。

**Topics**
+ [使用分割區投影在 Athena 中建立 AWS WAF S3 日誌的資料表](create-waf-table-partition-projection.md)
+ [使用手動分割區在 Athena 中建立 AWS WAF S3 日誌的資料表](create-waf-table-manual-partition.md)
+ [建立 AWS WAF 日誌的資料表而不分割](create-waf-table.md)
+ [AWS WAF 日誌的範例查詢](query-examples-waf-logs.md)

# 使用分割區投影在 Athena 中建立 AWS WAF S3 日誌的資料表
<a name="create-waf-table-partition-projection"></a>

由於 AWS WAF 日誌具有已知的結構，您可以預先指定其分割區配置，因此您可以使用 Athena 分割區[投影功能來減少查詢執行時間並自動化分割區](partition-projection.md)管理。分割區投影會在新增資料時自動新增分割區。因此您無需使用 `ALTER TABLE ADD PARTITION` 手動新增分割區。

下列範例`CREATE TABLE`陳述式會自動在 AWS WAF 指定日期到四個不同 AWS 區域的 日誌上使用分割區投影。本範例中的 `PARTITION BY` 子句按區域和日期進行分割，但您可以根據自己的要求進行修改。視需要修改欄位，以符合您的日誌輸出。在 `LOCATION`和 `storage.location.template`子句中，將 *amzn-s3-demo-bucket* 和 *AWS\$1ACCOUNT\$1NUMBER* 預留位置取代為可識別 AWS WAF 日誌 Amazon S3 儲存貯體位置的值。對於 `projection.day.range`，請用您要使用的開始日期取代 *2021*/*01*/*01*。成功執行查詢之後，您可以查詢資料表。您無須執行 `ALTER TABLE ADD PARTITION` 就能載入分割區。

```
CREATE EXTERNAL TABLE `waf_logs_partition_projection`(
  `timestamp` bigint, 
  `formatversion` int, 
  `webaclid` string, 
  `terminatingruleid` string, 
  `terminatingruletype` string, 
  `action` string, 
  `terminatingrulematchdetails` array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>, 
  `httpsourcename` string, 
  `httpsourceid` string, 
  `rulegrouplist` array<struct<rulegroupid:string,terminatingrule:struct<ruleid:string,action:string,rulematchdetails:array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>>,nonterminatingmatchingrules:array<struct<ruleid:string,action:string,overriddenaction:string,rulematchdetails:array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>,challengeresponse:struct<responsecode:string,solvetimestamp:string>,captcharesponse:struct<responsecode:string,solvetimestamp:string>>>,excludedrules:string>>, 
  `ratebasedrulelist` array<struct<ratebasedruleid:string,limitkey:string,maxrateallowed:int>>, 
  `nonterminatingmatchingrules` array<struct<ruleid:string,action:string,rulematchdetails:array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>,challengeresponse:struct<responsecode:string,solvetimestamp:string>,captcharesponse:struct<responsecode:string,solvetimestamp:string>>>, 
  `requestheadersinserted` array<struct<name:string,value:string>>, 
  `responsecodesent` string, 
  `httprequest` struct<clientip:string,country:string,headers:array<struct<name:string,value:string>>,uri:string,args:string,httpversion:string,httpmethod:string,requestid:string,fragment:string,scheme:string,host:string>,
  `labels` array<struct<name:string>>, 
  `captcharesponse` struct<responsecode:string,solvetimestamp:string,failurereason:string>, 
  `challengeresponse` struct<responsecode:string,solvetimestamp:string,failurereason:string>, 
  `ja3fingerprint` string, 
  `ja4fingerprint` string, 
  `oversizefields` string, 
  `requestbodysize` int, 
  `requestbodysizeinspectedbywaf` int)
  PARTITIONED BY ( 
   `log_time` string)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_NUMBER/WAFLogs/cloudfront/testui/'
TBLPROPERTIES (
 'projection.enabled'='true',
  'projection.log_time.format'='yyyy/MM/dd/HH/mm',
  'projection.log_time.interval'='1',
  'projection.log_time.interval.unit'='minutes',
  'projection.log_time.range'='2025/01/01/00/00,NOW',
  'projection.log_time.type'='date',
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_NUMBER/WAFLogs/cloudfront/testui/${log_time}')
```

**注意**  
範例中 `LOCATION`子句中的路徑格式是標準格式，但可能會根據您實作的 AWS WAF 組態而有所不同。例如，下列範例 AWS WAF 日誌路徑適用於 CloudFront 分佈：  

```
s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_NUMBER/WAFLogs/cloudfront/cloudfronyt/2025/01/01/00/00/
```
如果您在建立或查詢 AWS WAF 日誌資料表時遇到問題，請確認日誌資料或[聯絡人 支援](https://console.aws.amazon.com/support/home/)的位置。

如需有關分割區投影的詳細資訊，請參閱[透過 Amazon Athena 使用分割區投影](partition-projection.md)。

# 使用手動分割區在 Athena 中建立 AWS WAF S3 日誌的資料表
<a name="create-waf-table-manual-partition"></a>

本節說明如何使用手動分割區為 AWS WAF 日誌建立資料表。

在 `LOCATION`和 `storage.location.template`子句中，將 *amzn-s3-demo-bucket* 和 *AWS\$1ACCOUNT\$1NUMBER* 預留位置取代為可識別 AWS WAF 日誌 Amazon S3 儲存貯體位置的值。

```
CREATE EXTERNAL TABLE `waf_logs_manual_partition`(
  `timestamp` bigint, 
  `formatversion` int, 
  `webaclid` string, 
  `terminatingruleid` string, 
  `terminatingruletype` string, 
  `action` string, 
  `terminatingrulematchdetails` array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>, 
  `httpsourcename` string, 
  `httpsourceid` string, 
  `rulegrouplist` array<struct<rulegroupid:string,terminatingrule:struct<ruleid:string,action:string,rulematchdetails:array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>>,nonterminatingmatchingrules:array<struct<ruleid:string,action:string,overriddenaction:string,rulematchdetails:array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>,challengeresponse:struct<responsecode:string,solvetimestamp:string>,captcharesponse:struct<responsecode:string,solvetimestamp:string>>>,excludedrules:string>>, 
  `ratebasedrulelist` array<struct<ratebasedruleid:string,limitkey:string,maxrateallowed:int>>, 
  `nonterminatingmatchingrules` array<struct<ruleid:string,action:string,rulematchdetails:array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>,challengeresponse:struct<responsecode:string,solvetimestamp:string>,captcharesponse:struct<responsecode:string,solvetimestamp:string>>>, 
  `requestheadersinserted` array<struct<name:string,value:string>>, 
  `responsecodesent` string, 
  `httprequest` struct<clientip:string,country:string,headers:array<struct<name:string,value:string>>,uri:string,args:string,httpversion:string,httpmethod:string,requestid:string,fragment:string,scheme:string,host:string>, 
  `labels` array<struct<name:string>>, 
  `captcharesponse` struct<responsecode:string,solvetimestamp:string,failurereason:string>, 
  `challengeresponse` struct<responsecode:string,solvetimestamp:string,failurereason:string>, 
  `ja3fingerprint` string, 
  `ja4fingerprint` string, 
  `oversizefields` string, 
  `requestbodysize` int, 
  `requestbodysizeinspectedbywaf` int)
  PARTITIONED BY ( `year` string, `month` string, `day` string, `hour` string, `min` string)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_NUMBER/WAFLogs/cloudfront/webacl/'
```

# 建立 AWS WAF 日誌的資料表而不分割
<a name="create-waf-table"></a>

本節說明如何為 AWS WAF 日誌建立資料表，而無需分割或分割投影。

**注意**  
出於效能和成本考量，我們不建議使用非分割結構描述進行查詢。如需詳細資訊，請參閱 AWS 大數據部落格中的 [Amazon Athena 的前 10 個效能調校秘訣](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/)。

**建立 AWS WAF 資料表**

1. 複製下列 DDL 陳述式，並將其貼到 Athena 主控台。視需要修改欄位，以符合您的日誌輸出。修改 Amazon S3 儲存貯體的 `LOCATION` 以與存放日誌的儲存貯體相對應。

   此查詢會使用 [OpenX JSON SerDe](openx-json-serde.md)。
**注意**  
SerDe 預期每筆 JSON 文件都以單行文字表示，而且沒有行終止字元分隔記錄中的欄位。如果 JSON 文字是美化過的列印格式，則在建立資料表後嘗試在其中查詢時可能會收到下列錯誤訊息：HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object (HIVE\$1CURSOR\$1ERROR：資料列不是有效的 JSON 物件) 或 HIVE\$1CURSOR\$1ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT (HIVE\$1CURSOR\$1ERROR：JsonParseException：非預期的輸入結束：預期為 OBJECT 的關閉標記)。如需詳細資訊，請參閱 GitHub 上 OpenX SerDe 文件中的 [JSON 資料檔案](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files)。

   ```
   CREATE EXTERNAL TABLE `waf_logs`(
     `timestamp` bigint,
     `formatversion` int,
     `webaclid` string,
     `terminatingruleid` string,
     `terminatingruletype` string,
     `action` string,
     `terminatingrulematchdetails` array <
                                       struct <
                                           conditiontype: string,
                                           sensitivitylevel: string,
                                           location: string,
                                           matcheddata: array < string >
                                             >
                                        >,
     `httpsourcename` string,
     `httpsourceid` string,
     `rulegrouplist` array <
                         struct <
                             rulegroupid: string,
                             terminatingrule: struct <
                                                 ruleid: string,
                                                 action: string,
                                                 rulematchdetails: array <
                                                                      struct <
                                                                          conditiontype: string,
                                                                          sensitivitylevel: string,
                                                                          location: string,
                                                                          matcheddata: array < string >
                                                                             >
                                                                       >
                                                   >,
                             nonterminatingmatchingrules: array <
                                                                 struct <
                                                                     ruleid: string,
                                                                     action: string,
                                                                     overriddenaction: string,
                                                                     rulematchdetails: array <
                                                                                          struct <
                                                                                              conditiontype: string,
                                                                                              sensitivitylevel: string,
                                                                                              location: string,
                                                                                              matcheddata: array < string >
                                                                                                 >
                                                                      >,
                                                                     challengeresponse: struct <
                                                                               responsecode: string,
                                                                               solvetimestamp: string
                                                                                 >,
                                                                     captcharesponse: struct <
                                                                               responsecode: string,
                                                                               solvetimestamp: string
                                                                                 >
                                                                       >
                                                                >,
                             excludedrules: string
                               >
                          >,
   `ratebasedrulelist` array <
                            struct <
                                ratebasedruleid: string,
                                limitkey: string,
                                maxrateallowed: int
                                  >
                             >,
     `nonterminatingmatchingrules` array <
                                       struct <
                                           ruleid: string,
                                           action: string,
                                           rulematchdetails: array <
                                                                struct <
                                                                    conditiontype: string,
                                                                    sensitivitylevel: string,
                                                                    location: string,
                                                                    matcheddata: array < string >
                                                                       >
                                                                >,
                                           challengeresponse: struct <
                                                               responsecode: string,
                                                               solvetimestamp: string
                                                                >,
                                           captcharesponse: struct <
                                                               responsecode: string,
                                                               solvetimestamp: string
                                                                >
                                             >
                                        >,
     `requestheadersinserted` array <
                                   struct <
                                       name: string,
                                       value: string
                                         >
                                    >,
     `responsecodesent` string,
     `httprequest` struct <
                       clientip: string,
                       country: string,
                       headers: array <
                                   struct <
                                       name: string,
                                       value: string
                                         >
                                    >,
                       uri: string,
                       args: string,
                       httpversion: string,
                       httpmethod: string,
                       requestid: string
                         >,
     `labels` array <
                  struct <
                      name: string
                        >
                   >,
     `captcharesponse` struct <
                           responsecode: string,
                           solvetimestamp: string,
                           failureReason: string
                             >,
     `challengeresponse` struct <
                           responsecode: string,
                           solvetimestamp: string,
                           failureReason: string
                           >,
     `ja3Fingerprint` string,
     `oversizefields` string,
     `requestbodysize` int,
     `requestbodysizeinspectedbywaf` int
   )
   ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
   STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
   OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION 's3://amzn-s3-demo-bucket/prefix/'
   ```

1. 在 Athena 主控台查詢編輯器中執行 `CREATE EXTERNAL TABLE` 陳述式。這會註冊 `waf_logs` 資料表，並讓其中的資料可用於從 Athena 進行查詢。

# AWS WAF 日誌的範例查詢
<a name="query-examples-waf-logs"></a>

本節中有許多範例查詢使用先前建立的分割區投影資料表。請根據您的需求修改範例中的資料表名稱、資料欄值及其他變數。若要改善查詢的效能並降低成本，請在篩選條件中新增分割區資料欄。

**Topics**
+ [計數推薦網站、IP 位址或相符規則](query-examples-waf-logs-count.md)
+ [使用日期和時間的查詢](query-examples-waf-logs-date-time.md)
+ [查詢封鎖的請求或地址](query-examples-waf-logs-blocked-requests.md)

# 計數推薦網站、IP 位址或相符規則
<a name="query-examples-waf-logs-count"></a>

本節中的範例會查詢感興趣的日誌項目計數。
+ [Count the number of referrers that contain a specified term](#waf-example-count-referrers-with-specified-term)
+ [Count all matched IP addresses in the last 10 days that have matched excluded rules](#waf-example-count-matched-ip-addresses)
+ [Group all counted managed rules by the number of times matched](#waf-example-group-managed-rules-by-times-matched)
+ [Group all counted custom rules by number of times matched](#waf-example-group-custom-rules-by-times-matched)

**Example – 計算包含指定字詞的 Referrer 數量**  
以下查詢會計算在指定的日期範圍內包含 "amazon" 一詞的 Referrer 數量。  

```
WITH test_dataset AS 
  (SELECT header FROM waf_logs
    CROSS JOIN UNNEST(httprequest.headers) AS t(header) WHERE "date" >= '2021/03/01'
    AND "date" < '2021/03/31')
SELECT COUNT(*) referer_count 
FROM test_dataset 
WHERE LOWER(header.name)='referer' AND header.value LIKE '%amazon%'
```

**Example – 計算過去 10 天內符合排除規則的所有相符 IP 地址**  
以下查詢會計算過去 10 天內 IP 地址符合規則群組中排除規則的次數。  

```
WITH test_dataset AS 
  (SELECT * FROM waf_logs 
    CROSS JOIN UNNEST(rulegrouplist) AS t(allrulegroups))
SELECT 
  COUNT(*) AS count, 
  "httprequest"."clientip", 
  "allrulegroups"."excludedrules",
  "allrulegroups"."ruleGroupId"
FROM test_dataset 
WHERE allrulegroups.excludedrules IS NOT NULL AND from_unixtime(timestamp/1000) > now() - interval '10' day
GROUP BY "httprequest"."clientip", "allrulegroups"."ruleGroupId", "allrulegroups"."excludedrules"
ORDER BY count DESC
```

**Example – 依相符的次數對所有計數的受管規則進行分組**  
如果您在 2022 年 10 月 27 日之前將規則群組規則動作設定為 Web ACL 組態中的計數，則 會將 Web ACL JSON 中的覆寫 AWS WAF 儲存為 `excludedRules`。現在，將規則覆寫為計數的 JSON 設定位於 `ruleActionOverrides` 設定中。如需詳細資訊，請參閱《*AWS WAF 開發人員指南*》中的[規則群組中的動作覆寫](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-rule-group-override-options.html)。若要從新的日誌結構擷取「計數」模式下的受管規則，請查詢 `ruleGroupList` 區段中的 `nonTerminatingMatchingRules` 而非 `excludedRules` 欄位，如下列範例所示。  

```
SELECT
 count(*) AS count,
 httpsourceid,
 httprequest.clientip,
 t.rulegroupid, 
 t.nonTerminatingMatchingRules
FROM "waf_logs" 
CROSS JOIN UNNEST(rulegrouplist) AS t(t) 
WHERE action <> 'BLOCK' AND cardinality(t.nonTerminatingMatchingRules) > 0 
GROUP BY t.nonTerminatingMatchingRules, action, httpsourceid, httprequest.clientip, t.rulegroupid 
ORDER BY "count" DESC 
Limit 50
```

**Example – 依相符的次數對所有計數的自訂規則進行分組**  
下列查詢會依符合的次數，將所有計數的自訂規則分組。  

```
SELECT
  count(*) AS count,
         httpsourceid,
         httprequest.clientip,
         t.ruleid,
         t.action
FROM "waf_logs" 
CROSS JOIN UNNEST(nonterminatingmatchingrules) AS t(t) 
WHERE action <> 'BLOCK' AND cardinality(nonTerminatingMatchingRules) > 0 
GROUP BY t.ruleid, t.action, httpsourceid, httprequest.clientip 
ORDER BY "count" DESC
Limit 50
```

如需有關自訂規則和受管規則群組的日誌位置的資訊，請參閱《*AWS WAF 開發人員指南*》中的[監控和調校](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-testing-activities.html)。

# 使用日期和時間的查詢
<a name="query-examples-waf-logs-date-time"></a>

本節中的範例包括使用日期和時間值的查詢。
+ [Return the timestamp field in human-readable ISO 8601 format](#waf-example-return-human-readable-timestamp)
+ [Return records from the last 24 hours](#waf-example-return-records-last-24-hours)
+ [Return records for a specified date range and IP address](#waf-example-return-records-date-range-and-ip)
+ [For a specified date range, count the number of IP addresses in five minute intervals](#waf-example-count-ip-addresses-in-date-range)
+ [Count the number of X-Forwarded-For IP in the last 10 days](#waf-example-count-x-forwarded-for-ip)

**Example – 以人類看得懂的 ISO 8601 格式傳回時間戳記欄位**  
以下查詢會使用 `from_unixtime` 和 `to_iso8601` 函數，以人類看得懂的 ISO 8601 格式傳回 `timestamp` 欄位 (例如 `2019-12-13T23:40:12.000Z`，而非 `1576280412771`) 查詢也會傳回 HTTP 來源名稱、來源 ID 和請求。  

```
SELECT to_iso8601(from_unixtime(timestamp / 1000)) as time_ISO_8601,
       httpsourcename,
       httpsourceid,
       httprequest
FROM waf_logs
LIMIT 10;
```

**Example – 傳回過去 24 小時的記錄**  
以下查詢會使用 `WHERE` 子句中的篩選條件，傳回過去 24 小時記錄的 HTTP 來源名稱、HTTP 來源 ID 和 HTTP 請求欄位。  

```
SELECT to_iso8601(from_unixtime(timestamp/1000)) AS time_ISO_8601, 
       httpsourcename, 
       httpsourceid, 
       httprequest 
FROM waf_logs
WHERE from_unixtime(timestamp/1000) > now() - interval '1' day
LIMIT 10;
```

**Example – 傳回指定日期範圍和 IP 地址的記錄**  
以下查詢會列出指定用戶端 IP 地址的指定日期範圍內的記錄。  

```
SELECT * 
FROM waf_logs 
WHERE httprequest.clientip='53.21.198.66' AND "date" >= '2021/03/01' AND "date" < '2021/03/31'
```

**Example – 如果是指定的日期範圍，則會計算每隔五分鐘的 IP 地址數量**  
以下查詢會針對特定日期範圍，計算每隔五分鐘的 IP 地址數量。  

```
WITH test_dataset AS 
  (SELECT 
     format_datetime(from_unixtime((timestamp/1000) - ((minute(from_unixtime(timestamp / 1000))%5) * 60)),'yyyy-MM-dd HH:mm') AS five_minutes_ts,
     "httprequest"."clientip" 
     FROM waf_logs 
     WHERE "date" >= '2021/03/01' AND "date" < '2021/03/31')
SELECT five_minutes_ts,"clientip",count(*) ip_count 
FROM test_dataset 
GROUP BY five_minutes_ts,"clientip"
```

**Example – 計算過去 10 天內的 X-Forwarded-For IP 數量**  
以下查詢會篩選請求標頭，並計算過去 10 天內的 X-Forwarded-For IP 數量。  

```
WITH test_dataset AS
  (SELECT header
   FROM waf_logs
   CROSS JOIN UNNEST (httprequest.headers) AS t(header)
   WHERE from_unixtime("timestamp"/1000) > now() - interval '10' DAY) 
SELECT header.value AS ip,
       count(*) AS COUNT 
FROM test_dataset 
WHERE header.name='X-Forwarded-For' 
GROUP BY header.value 
ORDER BY COUNT DESC
```

如需有關日期和時間函數的詳細資訊，請參閱 Trino 文件中的 [Date and time functions and operators](https://trino.io/docs/current/functions/datetime.html) (日期和時間函數和運算子)。

# 查詢封鎖的請求或地址
<a name="query-examples-waf-logs-blocked-requests"></a>

本節中的範例會查詢封鎖的請求或地址。
+ [Extract the top 100 IP addresses blocked by a specified rule type](#waf-example-extract-top-100-blocked-ip-by-rule)
+ [Count the number of times a request from a specified country has been blocked](#waf-example-count-request-blocks-from-country)
+ [Count the number of times a request has been blocked, grouping by specific attributes](#waf-example-count-request-blocks-by-attribute)
+ [Count the number of times a specific terminating rule ID has been matched](#waf-example-count-terminating-rule-id-matches)
+ [Retrieve the top 100 IP addresses blocked during a specified date range](#waf-example-top-100-ip-addresses-blocked-for-date-range)

**Example – 擷取遭到指定規則類型封鎖的前 100 個 IP 地址**  
以下查詢會擷取並計算在指定日期範圍內，已遭到 `RATE_BASED` 終止規則封鎖的前 100 個 IP 地址。  

```
SELECT COUNT(httpRequest.clientIp) as count,
httpRequest.clientIp
FROM waf_logs
WHERE terminatingruletype='RATE_BASED' AND action='BLOCK' and "date" >= '2021/03/01'
AND "date" < '2021/03/31'
GROUP BY httpRequest.clientIp
ORDER BY count DESC
LIMIT 100
```

**Example – 計算來自指定國家/地區遭到封鎖的請求次數**  
以下查詢會計算來自愛爾蘭 (IE) 的 IP 地址，並遭 `RATE_BASED` 終止規則封鎖的請求次數。  

```
SELECT 
  COUNT(httpRequest.country) as count, 
  httpRequest.country 
FROM waf_logs
WHERE 
  terminatingruletype='RATE_BASED' AND 
  httpRequest.country='IE'
GROUP BY httpRequest.country
ORDER BY count
LIMIT 100;
```

**Example – 計算遭封鎖的請求次數 (依特定屬性分組)**  
以下查詢會計算遭封鎖的請求次數，並以 WebACL、RuleId、ClientIP 和 HTTP Request URI 分組。  

```
SELECT 
  COUNT(*) AS count,
  webaclid,
  terminatingruleid,
  httprequest.clientip,
  httprequest.uri
FROM waf_logs
WHERE action='BLOCK'
GROUP BY webaclid, terminatingruleid, httprequest.clientip, httprequest.uri
ORDER BY count DESC
LIMIT 100;
```

**Example – 計算與特定終止規則 ID 相符的次數。**  
以下查詢會計算與特定終止規則 ID (`WHERE terminatingruleid='e9dd190d-7a43-4c06-bcea-409613d9506e'`) 相符的次數。查詢接著會以 WebACL、Action、ClientIP 和 HTTP Request URI 將結果分組。  

```
SELECT 
  COUNT(*) AS count,
  webaclid,
  action,
  httprequest.clientip,
  httprequest.uri
FROM waf_logs
WHERE terminatingruleid='e9dd190d-7a43-4c06-bcea-409613d9506e'
GROUP BY webaclid, action, httprequest.clientip, httprequest.uri
ORDER BY count DESC
LIMIT 100;
```

**Example – 擷取指定日期範圍內遭到封鎖的前 100 個 IP 地址**  
以下查詢會擷取在指定日期範圍內，已遭到封鎖的前 100 個 IP 地址。該查詢也會列出 IP 地址遭到封鎖的次數。  

```
SELECT "httprequest"."clientip", "count"(*) "ipcount", "httprequest"."country"
FROM waf_logs
WHERE "action" = 'BLOCK' and "date" >= '2021/03/01'
AND "date" < '2021/03/31'
GROUP BY "httprequest"."clientip", "httprequest"."country"
ORDER BY "ipcount" DESC limit 100
```

如需有關查詢 Amazon S3 日誌的資訊，請參閱下列主題：
+  AWS 知識中心中的[如何使用 Athena 分析 Amazon S3 伺服器存取日誌？](https://aws.amazon.com/premiumsupport/knowledge-center/analyze-logs-athena/)
+ 《Amazon Simple Storage Service 使用者指南》中的[使用 Amazon Athena 查詢請求的 Amazon S3 存取日誌](https://docs.aws.amazon.com/AmazonS3/latest/dev/using-s3-access-logs-to-identify-requests.html#querying-s3-access-logs-for-requests)
+ 《Amazon Simple Storage Service 使用者指南》中的[使用 AWS CloudTrail 識別 Amazon S3 請求](https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudtrail-request-identification.html)

# 查詢 Amazon S3 中存放的 Web 伺服器日誌
<a name="querying-web-server-logs"></a>

您可以使用 Athena 查詢存放在 Amazon S3 中的 Web 伺服器日誌。本節主題說明如何在 Athena 中建立資料表，以查詢各種格式的 Web 伺服器日誌。

**Topics**
+ [查詢存放在 Amazon S3 中的 Apache 日誌](querying-apache-logs.md)
+ [查詢存放在 Amazon S3 中的網際網路資訊伺服器 (IIS) 日誌](querying-iis-logs.md)

# 查詢存放在 Amazon S3 中的 Apache 日誌
<a name="querying-apache-logs"></a>

您可以使用 Amazon Athena 查詢存放在 Amazon S3 帳戶中的 [Apache HTTP Server 日誌檔案](https://httpd.apache.org/docs/2.4/logs.html)。本主題說明如何建立資料表結構描述，以查詢一般日誌格式的 Apache [存取日誌](https://httpd.apache.org/docs/2.4/logs.html#accesslog)檔案。

一般日誌格式的欄位包括用戶端 IP 地址、用戶端 ID、使用者 ID、請求接收的時間戳記、用戶端請求的文字、伺服器狀態碼，以及傳回給用戶端之物件的大小。

以下資料範例顯示 Apache 的一般日誌組態。

```
198.51.100.7 - Li [10/Oct/2019:13:55:36 -0700] "GET /logo.gif HTTP/1.0" 200 232
198.51.100.14 - Jorge [24/Nov/2019:10:49:52 -0700] "GET /index.html HTTP/1.1" 200 2165
198.51.100.22 - Mateo [27/Dec/2019:11:38:12 -0700] "GET /about.html HTTP/1.1" 200 1287
198.51.100.9 - Nikki [11/Jan/2020:11:40:11 -0700] "GET /image.png HTTP/1.1" 404 230
198.51.100.2 - Ana [15/Feb/2019:10:12:22 -0700] "GET /favicon.ico HTTP/1.1" 404 30
198.51.100.13 - Saanvi [14/Mar/2019:11:40:33 -0700] "GET /intro.html HTTP/1.1" 200 1608
198.51.100.11 - Xiulan [22/Apr/2019:10:51:34 -0700] "GET /group/index.html HTTP/1.1" 200 1344
```

## 在 Athena for Apache 日誌中建立資料表
<a name="querying-apache-logs-creating-a-table-in-athena"></a>

查詢 Amazon S3 中存放的 Apache 日誌之前，必須為 Athena 建立資料表結構描述才能讀取日誌資料。若要建立 Apache 記錄的 Athena 資料表，您可以使用 [Grok SerDe](grok-serde.md)。如需有關使用 Grok SerDe 的詳細資訊，請參閱《AWS Glue 開發人員指南》**中的[撰寫 Grok 自訂分類器](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#custom-classifier-grok)。

**若要在 Athena 中為 Apache Web 伺服器日誌建立資料表**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 將下列 DDL 陳述式貼上至 Athena 查詢編輯器。修改 `LOCATION 's3://amzn-s3-demo-bucket/apache-log-folder/'` 中的值來指向 Amazon S3 中的 Apache 日誌。

   ```
   CREATE EXTERNAL TABLE apache_logs (
     client_ip string,
     client_id string,
     user_id string,
     request_received_time string,
     client_request string,
     server_status string,
     returned_obj_size string
     )
   ROW FORMAT SERDE
      'com.amazonaws.glue.serde.GrokSerDe'
   WITH SERDEPROPERTIES (
      'input.format'='^%{IPV4:client_ip} %{DATA:client_id} %{USERNAME:user_id} %{GREEDYDATA:request_received_time} %{QUOTEDSTRING:client_request} %{DATA:server_status} %{DATA: returned_obj_size}$'
      )
   STORED AS INPUTFORMAT
      'org.apache.hadoop.mapred.TextInputFormat'
   OUTPUTFORMAT
      'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
      's3://amzn-s3-demo-bucket/apache-log-folder/';
   ```

1. 在 Athena 主控台中執行查詢來註冊 `apache_logs` 資料表。查詢完成時，您就可以從 Athena 查詢日誌了。

### 查詢範例
<a name="querying-apache-logs-example-select-queries"></a>

**Example – 篩選 404 錯誤**  
下列查詢範例會從 `apache_logs` 資料表選取請求接收的時間、用戶端請求的文字，以及伺服器狀態碼。`WHERE` 子句會篩選 HTTP 狀態碼 `404` (找不到頁面)。  

```
SELECT request_received_time, client_request, server_status
FROM apache_logs
WHERE server_status = '404'
```
下圖顯示 Athena 查詢編輯器中查詢的結果。  

![\[從 Athena 為 HTTP 404 項目查詢 Apache 日誌。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-apache-logs-1.png)


**Example – 篩選成功的請求**  
下列查詢範例會選取使用者 ID、請求接收時間、用戶端請求的文字，以及 `apache_logs` 資料表中的伺服器狀態碼。HTTP 狀態碼 `200` 的 `WHERE` 子句篩選條件 (成功)。  

```
SELECT user_id, request_received_time, client_request, server_status
FROM apache_logs
WHERE server_status = '200'
```
下圖顯示 Athena 查詢編輯器中查詢的結果。  

![\[從 Athena 為 HTTP 200 項目查詢 Apache 日誌。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-apache-logs-2.png)


**Example – 依時間戳記篩選**  
下列範例會查詢要求接收時間大於指定時間戳記的記錄。  

```
SELECT * FROM apache_logs WHERE request_received_time > 10/Oct/2023:00:00:00
```

# 查詢存放在 Amazon S3 中的網際網路資訊伺服器 (IIS) 日誌
<a name="querying-iis-logs"></a>

您可以使用 Amazon Athena 查詢存放在您的 Amazon S3 帳戶中的 Microsoft Internet Information Services (IIS) Web 伺服器日誌。雖然 IIS 使用[各種](https://docs.microsoft.com/en-us/previous-versions/iis/6.0-sdk/ms525807(v%3Dvs.90))日誌檔案格式，本主題將說明如何建立資料表結構描述，以從 Athena 查詢 W3C 擴充和 IIS 日誌檔案格式。

因為 W3C 擴充和 IIS 日誌檔案格式使用單一字元分隔符號 (分別為空格和逗號)，而且沒有以引號括住值，所以您可以使用 [LazySimpleSerDe](lazy-simple-serde.md) 為他們建立 Athena 資料表。

**Topics**
+ [查詢 W3C 擴充日誌檔案格式](querying-iis-logs-w3c-extended-log-file-format.md)
+ [查詢 IIS 日誌檔案格式](querying-iis-logs-iis-log-file-format.md)
+ [查詢 NCSA 日誌檔案格式](querying-iis-logs-ncsa-log-file-format.md)

# 查詢 W3C 擴充日誌檔案格式
<a name="querying-iis-logs-w3c-extended-log-file-format"></a>

[W3C 擴充](https://docs.microsoft.com/en-us/windows/win32/http/w3c-logging)日誌檔案資料格式具有以空格分隔的欄位。W3C 擴充日誌中顯示的欄位是由 Web 伺服器管理員決定，管理員可選擇要包含哪些日誌欄位。下列日誌資料範例具有 `date, time`、`c-ip`、`s-ip`、`cs-method`、`cs-uri-stem`、`sc-status`、`sc-bytes`、`cs-bytes`、`time-taken` 以及 `cs-version`。

```
2020-01-19 22:48:39 203.0.113.5 198.51.100.2 GET /default.html 200 540 524 157 HTTP/1.0
2020-01-19 22:49:40 203.0.113.10 198.51.100.12 GET /index.html 200 420 324 164 HTTP/1.0
2020-01-19 22:50:12 203.0.113.12 198.51.100.4 GET /image.gif 200 324 320 358 HTTP/1.0
2020-01-19 22:51:44 203.0.113.15 198.51.100.16 GET /faq.html 200 330 324 288 HTTP/1.0
```

## 在 Athena 中為 W3C 擴充日誌建立資料表
<a name="querying-iis-logs-creating-a-table-in-athena-for-w3c-extended-logs"></a>

在查詢 W3C 擴充日誌之前，您必須建立資料表結構描述，以便讓 Athena 可以讀取日誌資料。

**若要在 Athena 中為 W3C 擴充日誌建立資料表**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 將如下所示的 DDL 陳述式貼上至 Athena 主控台，並注意下列幾點：

   1. 新增或移除範例中的資料欄，以對應至您要查詢的日誌欄位。

   1. W3C 擴充日誌檔案格式中的資料欄名稱包含連字號 (`-`)。然而，按照 [Athena 命名慣例](tables-databases-columns-names.md)，範例 `CREATE TABLE` 陳述式會用底線 (`_`) 替換連字號。

   1. 若要指定空格分隔符號，請使用 `FIELDS TERMINATED BY ' '`。

   1. 修改 `LOCATION 's3://amzn-s3-demo-bucket/w3c-log-folder/'` 中的值，以指向 Amazon S3 中的 W3C 擴充日誌。

   ```
   CREATE EXTERNAL TABLE `iis_w3c_logs`( 
     date_col string, 
     time_col string, 
     c_ip string,
     s_ip string,
     cs_method string, 
     cs_uri_stem string, 
     sc_status string,
     sc_bytes string,
     cs_bytes string,
     time_taken string,
     cs_version string
     ) 
   ROW FORMAT DELIMITED  
     FIELDS TERMINATED BY ' '  
   STORED AS INPUTFORMAT  
     'org.apache.hadoop.mapred.TextInputFormat'  
   OUTPUTFORMAT  
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
   LOCATION   's3://amzn-s3-demo-bucket/w3c-log-folder/'
   ```

1. 在 Athena 主控台中執行查詢來註冊 `iis_w3c_logs` 資料表。查詢完成時，您就可以從 Athena 查詢日誌了。

## W3C 擴充日誌選取查詢範例
<a name="querying-iis-logs-example-w3c-extended-log-select-query"></a>

下面的查詢範例會從資料表 `iis_w3c_logs` 中選取日期、時間、請求目標以及請求所花費的時間。`WHERE` 子句篩選 HTTP 方法為 `GET` 且 HTTP 狀態碼為 `200` (成功) 的案例。

```
SELECT date_col, time_col, cs_uri_stem, time_taken
FROM iis_w3c_logs
WHERE cs_method = 'GET' AND sc_status = '200'
```

下圖顯示 Athena 查詢編輯器中查詢的結果。

![\[Athena 中存放在 Amazon S3 中 W3C 擴充日誌檔案的查詢結果範例。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-iis-logs-1.png)


## 合併日期和時間欄位
<a name="querying-iis-logs-example-w3c-extended-log-combining-date-and-time"></a>

以空格分隔的 `date` 和 `time` 欄位是日誌來源資料中的單獨項目，您可以根據需要將它們合併成時間戳記。使用 [SELECT](select.md) 或 [CREATE TABLE AS SELECT](create-table-as.md) 查詢中的 [concat()](https://prestodb.io/docs/current/functions/string.html#concat) 和 [date\$1parse()](https://prestodb.io/docs/current/functions/datetime.html#date_parse) 函式，串連並轉換日期和時間資料欄為時間戳記格式。下列範例使用 CTAS 查詢來建立包含 `derived_timestamp` 資料欄的新資料表。

```
CREATE TABLE iis_w3c_logs_w_timestamp AS
SELECT 
  date_parse(concat(date_col,' ', time_col),'%Y-%m-%d %H:%i:%s') as derived_timestamp, 
  c_ip, 
  s_ip, 
  cs_method, 
  cs_uri_stem, 
  sc_status, 
  sc_bytes, 
  cs_bytes, 
  time_taken, 
  cs_version
FROM iis_w3c_logs
```

建立資料表之後，您就可以直接查詢新的時間戳記資料欄，如下例所示。

```
SELECT derived_timestamp, cs_uri_stem, time_taken
FROM iis_w3c_logs_w_timestamp
WHERE cs_method = 'GET' AND sc_status = '200'
```

下圖顯示查詢的結果。

![\[包含衍生時間戳記資料欄的資料表上的 W3C 擴充日誌檔案查詢結果。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-iis-logs-1a.png)


# 查詢 IIS 日誌檔案格式
<a name="querying-iis-logs-iis-log-file-format"></a>

與 W3C 擴充格式不同，[IIS 日誌檔案格式](https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc728311(v%3dws.10))具有固定的欄位集，並包含逗號作為分隔符號。LazySimpleSerDe 將逗號作為分隔符號，並將逗號後的空格作為下一個欄位的開頭。

以下範例會以 IIS 日誌檔案格式顯示資料範例。

```
203.0.113.15, -, 2020-02-24, 22:48:38, W3SVC2, SERVER5, 198.51.100.4, 254, 501, 488, 200, 0, GET, /index.htm, -, 
203.0.113.4, -, 2020-02-24, 22:48:39, W3SVC2, SERVER6, 198.51.100.6, 147, 411, 388, 200, 0, GET, /about.html, -, 
203.0.113.11, -, 2020-02-24, 22:48:40, W3SVC2, SERVER7, 198.51.100.18, 170, 531, 468, 200, 0, GET, /image.png, -, 
203.0.113.8, -, 2020-02-24, 22:48:41, W3SVC2, SERVER8, 198.51.100.14, 125, 711, 868, 200, 0, GET, /intro.htm, -,
```

## 在 Athena 中為 IIS 日誌檔案建立資料表
<a name="querying-iis-logs-creating-a-table-in-athena-for-iis-log-files"></a>

若要在 Amazon S3 中查詢 IIS 日誌檔案格式日誌，請先建立資料表結構描述，以便讓 Athena 可以讀取日誌資料。

**若要在 Athena 中為 IIS 日誌檔案格式日誌建立資料表**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 將下列 DDL 陳述式貼上至 Athena 主控台，並注意下列幾點：

   1. 若要指定逗號分隔符號，請使用 `FIELDS TERMINATED BY ','`。

   1. 修改 LOCATION 's3://amzn-s3-demo-bucket/*iis-log-file-folder*/' 中的值，以指向 Amazon S3 中的 IIS 日誌格式日誌檔案。

   ```
   CREATE EXTERNAL TABLE `iis_format_logs`(
   client_ip_address string,
   user_name string,
   request_date string,
   request_time string,
   service_and_instance string,
   server_name string,
   server_ip_address string,
   time_taken_millisec string,
   client_bytes_sent string,
   server_bytes_sent string,
   service_status_code string,
   windows_status_code string,
   request_type string,
   target_of_operation string,
   script_parameters string
      )
   ROW FORMAT DELIMITED
     FIELDS TERMINATED BY ','
   STORED AS INPUTFORMAT
     'org.apache.hadoop.mapred.TextInputFormat'
   OUTPUTFORMAT
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
     's3://amzn-s3-demo-bucket/iis-log-file-folder/'
   ```

1. 在 Athena 主控台中執行查詢來註冊 `iis_format_logs` 資料表。查詢完成時，您就可以從 Athena 查詢日誌了。

## IIS 日誌格式選取查詢範例
<a name="querying-iis-logs-example-iis-log-format-select-query"></a>

下列查詢範例從資料表 `iis_format_logs` 中選取請求日期、請求時間、請求目標和以毫秒為單位的花費時間。`WHERE` 子句篩選請求類型為 `GET` 且 HTTP 狀態碼為 `200` (成功) 的案例。在查詢中，請注意 `' GET'` 和 `' 200'` 中需要有前置空格，才能使查詢成功。

```
SELECT request_date, request_time, target_of_operation, time_taken_millisec
FROM iis_format_logs
WHERE request_type = ' GET' AND service_status_code = ' 200'
```

下圖顯示範例資料的查詢結果。

![\[Athena 中存放在 Amazon S3 中 IIS 日誌檔案格式日誌檔案的查詢結果範例。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-iis-logs-2.png)


# 查詢 NCSA 日誌檔案格式
<a name="querying-iis-logs-ncsa-log-file-format"></a>

IIS 也會使用 [NCSA 記錄](https://docs.microsoft.com/en-us/windows/win32/http/ncsa-logging)格式，該格式擁有以空格分隔的 ASCII 文字格式的、固定數量的欄位。該結構類似於 Apache 存取日誌所用的一般日誌格式。NCSA 一般日誌資料格式的欄位包括用戶端 IP 地址、用戶端 ID (通常不會使用)、網域\$1使用者 ID、請求接收的時間戳記、用戶端請求的文字、伺服器狀態碼，以及傳回給用戶端之物件的大小。

下列範例會顯示 NCSA 一般日誌格式的資料，如為 IIS 所記錄之內容。

```
198.51.100.7 - ExampleCorp\Li [10/Oct/2019:13:55:36 -0700] "GET /logo.gif HTTP/1.0" 200 232
198.51.100.14 - AnyCompany\Jorge [24/Nov/2019:10:49:52 -0700] "GET /index.html HTTP/1.1" 200 2165
198.51.100.22 - ExampleCorp\Mateo [27/Dec/2019:11:38:12 -0700] "GET /about.html HTTP/1.1" 200 1287
198.51.100.9 - AnyCompany\Nikki [11/Jan/2020:11:40:11 -0700] "GET /image.png HTTP/1.1" 404 230
198.51.100.2 - ExampleCorp\Ana [15/Feb/2019:10:12:22 -0700] "GET /favicon.ico HTTP/1.1" 404 30
198.51.100.13 - AnyCompany\Saanvi [14/Mar/2019:11:40:33 -0700] "GET /intro.html HTTP/1.1" 200 1608
198.51.100.11 - ExampleCorp\Xiulan [22/Apr/2019:10:51:34 -0700] "GET /group/index.html HTTP/1.1" 200 1344
```

## 在 Athena 中為 IIS NCSA 日誌建立資料表
<a name="querying-iis-logs-ncsa-creating-a-table-in-athena"></a>

對於 `CREATE TABLE` 陳述式，您可以使用 [Grok SerDe](grok-serde.md) 和類似於 [Apache Web 伺服器日誌](querying-apache-logs.md)模式的 grok 模式。與 Apache 日誌不同，grok 模式將 `%{DATA:user_id}` (而不是 `%{USERNAME:user_id}`) 用於第三個欄位，以考慮反斜線在 `domain\user_id` 中的存在。如需有關使用 Grok SerDe 的詳細資訊，請參閱《AWS Glue 開發人員指南》**中的[撰寫 Grok 自訂分類器](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#custom-classifier-grok)。

**若要在 Athena 中為 IIS NCSA Web 伺服器日誌建立資料表**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 將下列 DDL 陳述式貼上至 Athena 查詢編輯器。修改 `LOCATION 's3://amzn-s3-demo-bucket/iis-ncsa-logs/'` 中的值，以指向 Amazon S3 中的 IIS NCSA 日誌。

   ```
   CREATE EXTERNAL TABLE iis_ncsa_logs(
     client_ip string,
     client_id string,
     user_id string,
     request_received_time string,
     client_request string,
     server_status string,
     returned_obj_size string
     )
   ROW FORMAT SERDE
      'com.amazonaws.glue.serde.GrokSerDe'
   WITH SERDEPROPERTIES (
      'input.format'='^%{IPV4:client_ip} %{DATA:client_id} %{DATA:user_id} %{GREEDYDATA:request_received_time} %{QUOTEDSTRING:client_request} %{DATA:server_status} %{DATA: returned_obj_size}$'
      )
   STORED AS INPUTFORMAT
      'org.apache.hadoop.mapred.TextInputFormat'
   OUTPUTFORMAT
      'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
      's3://amzn-s3-demo-bucket/iis-ncsa-logs/';
   ```

1. 在 Athena 主控台中執行查詢來註冊 `iis_ncsa_logs` 資料表。查詢完成時，您就可以從 Athena 查詢日誌了。

## IIS NCSA 日誌的選取查詢範例
<a name="querying-iis-logs-ncsa-example-select-queries"></a>

**Example – 篩選 404 錯誤**  
下列查詢範例會從 `iis_ncsa_logs` 資料表選取請求接收的時間、用戶端請求的文字，以及伺服器狀態碼。`WHERE` 子句會篩選 HTTP 狀態碼 `404` (找不到頁面)。  

```
SELECT request_received_time, client_request, server_status
FROM iis_ncsa_logs
WHERE server_status = '404'
```
下圖顯示 Athena 查詢編輯器中查詢的結果。  

![\[從 Athena 為 HTTP 404 項目查詢 IIS NCSA 日誌。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-iis-logs-3.png)


**Example – 篩選來自特定網域的成功請求**  
下列查詢範例會選取使用者 ID、請求接收時間、用戶端請求的文字，以及 `iis_ncsa_logs` 資料表中的伺服器狀態碼。`WHERE` 子句篩選來自 `200` 網域中使用者的包含 HTTP 狀態碼 `AnyCompany` (成功) 的請求。  

```
SELECT user_id, request_received_time, client_request, server_status
FROM iis_ncsa_logs
WHERE server_status = '200' AND user_id LIKE 'AnyCompany%'
```
下圖顯示 Athena 查詢編輯器中查詢的結果。  

![\[從 Athena 為 HTTP 200 項目查詢 IIS NCSA 日誌。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-iis-logs-4.png)


# 使用 Athena ACID 交易
<a name="acid-transactions"></a>

「ACID 交易」一詞是指一組可確保資料庫交易中資料完整性的屬性 ([不可分割性](https://en.wikipedia.org/wiki/Atomicity_(database_systems))、[一致性](https://en.wikipedia.org/wiki/Consistency_(database_systems))、[隔離](https://en.wikipedia.org/wiki/Isolation_(database_systems))和[耐久性](https://en.wikipedia.org/wiki/Durability_(database_systems)))。ACID 交易可讓多位使用者以原子方式同時可靠地新增和刪除 Amazon S3 物件，同時透過維持對資料湖查詢的讀取一致性來隔離任何現有查詢。Athena ACID 交易為 Athena SQL 資料處理語言 (DML) 新增對插入、刪除、更新和時間歷程操作的單一資料表支援。您和多個並行使用者可以使用 Athena ACID 交易，對 Amazon S3 資料進行可靠的資料列層級修改。Athena 交易會自動管理鎖定語義和協調，並且不需要自訂記錄鎖定解決方案。

Athena ACID 交易和熟悉的 SQL 語法可簡化您的業務和法規資料的更新。例如，若要回應資料清除請求，您可以執行 SQL `DELETE` 操作。若要進行手動記錄更正，您可以使用單一 `UPDATE` 陳述式。若要復原最近刪除的資料，您可以使用 `SELECT` 陳述式發佈時間歷程查詢。

因為它們是建立在共用資料表格式上，Athena ACID 交易與其他服務和引擎相容，例如 [Amazon EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-what-is-emr.html) 和 [Apache Spark](https://spark.apache.org/) 也支援共用資料表格式。

Athena 交易可透過 Athena 主控台、API 操作以及 ODBC 和 JDBC 驅動程式取得。

**Topics**
+ [查詢 Linux Foundation Delta Lake 資料表](delta-lake-tables.md)
+ [查詢 Apache Hudi 資料集](querying-hudi.md)
+ [查詢 Apache Iceberg 資料表](querying-iceberg.md)

# 查詢 Linux Foundation Delta Lake 資料表
<a name="delta-lake-tables"></a>

Linux Foundation [Delta Lake](https://delta.io/) 是用於大數據分析的資料表格式。您可以使用 Amazon Athena 直接讀取存放在 Amazon S3 中的 Delta Lake 資料表，而無需產生清單檔案或執行 `MSCK REPAIR` 陳述式。

Delta Lake 格式會儲存每個資料檔案中每個資料欄的最小值和最大值。Athena 實作會利用這項資訊來啟用述詞上的檔案略過功能，從而排除不需要的檔案。

## 考量和限制
<a name="delta-lake-tables-considerations-and-limitations"></a>

Athena 中的 Delta Lake 支援具有下列考量事項和限制：
+ **僅限目錄的資料表 AWS Glue ** – 僅透過向 註冊的資料表支援原生 Delta Lake 支援 AWS Glue。如果有已在其他中繼存放區註冊的 Delta Lake 資料表，則您仍然可以保留並將其視為您的主要中繼存放區。由於 Delta Lake 中繼資料存放在檔案系統 （例如，在 Amazon S3 中） 而非中繼存放區中，Athena 只需要 中的位置屬性， AWS Glue 即可從 Delta Lake 資料表讀取。
+ **V3 engine only** (僅限 V3 引擎) – 只有 Athena 引擎版本 3 才支援 Delta Lake 查詢。您必須確定您建立的工作群組設定為使用 Athena 引擎版本 3。
+ **No time travel support** (不支援時間歷程) – 不支援使用 Delta Lake 時間歷程功能的查詢。
+ **Read only** (唯讀) – 不支援寫入 `UPDATE`、`INSERT` 或 `DELETE` 等 DML 陳述式。
+ **Lake Formation 支援** – Lake Formation 可用於結構描述與 AWS Glue同步的 Delta Lake 資料表。如需詳細資訊，請參閱《 *AWS Lake Formation 開發人員指南*》中的[使用 AWS Lake Formation 搭配 Amazon Athena](https://docs.aws.amazon.com/lake-formation/latest/dg/athena-lf.html) 和[設定 Delta Lake 資料表的許可](https://docs.aws.amazon.com/lake-formation/latest/dg/set-up-delta-table.html)。
+ **Limited DDL support** (有限的 DDL 支援) – 支援下列 DDL 陳述式：`CREATE EXTERNAL TABLE`、`SHOW COLUMNS`、`SHOW TBLPROPERTIES`、`SHOW PARTITIONS`、`SHOW CREATE TABLE` 和 `DESCRIBE`。如需有關使用 `CREATE EXTERNAL TABLE` 陳述式的詳細資訊，請參閱 [Delta Lake 資料表入門](delta-lake-tables-getting-started.md) 一節。
+ **略過不支援的 Amazon Glacier 物件** – 如果 Linux Foundation Delta Lake 資料表中的物件位於 Amazon Glacier 儲存類別中，則將 `read_restored_glacier_objects` 資料表屬性設定為 `false` 是無效的。

  例如，假設您發出下列命令：

  ```
  ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')
  ```

  對於 Iceberg 和 Delta Lake 資料表，此命令會產生錯誤不支援的資料表屬性索引鍵：read\$1restored\$1glacier\$1objects。對於 Hudi 資料表，`ALTER TABLE` 命令不會產生錯誤，但是 Amazon Glacier 物件仍不會略過。在 `ALTER TABLE` 命令繼續傳回所有物件之後執行 `SELECT` 查詢。
+ **加密資料表** – Athena 不支援原生讀取 CSE-KMS 加密的 Delta Lake 資料表。這包括 SELECT 陳述式和 DDL 陳述式。

### Delta Lake 版本控制和 Athena
<a name="delta-lake-tables-versioning"></a>

Athena 不使用 Delta Lake 文件中列出的[版本控制](https://docs.delta.io/latest/releases.html)。若要判斷您的 Delta Lake 資料表是否會與 Athena 相容，請考慮下列兩個特性：
+ **讀取器版本 ** – 每個 Delta Lake 資料表都有讀取器版本。目前，這是介於 1 到 3 之間的數字。如果查詢包含具有 Athena 不支援之讀取器版本的資料表，則將會失敗。
+ **資料表功能** – 每個 Delta Lake 資料表也可以宣告一組讀取器/寫入器功能。由於 Athena 對 Delta Lake 的支援是唯讀，因此資料表寫入器功能的相容性不適用。不過，對具有不支援的資料表讀取器功能的資料表進行查詢，也將會失敗。

下列資料表會顯示 Athena 支援的 Delta Lake 讀取器版本和 Delta Lake 資料表讀取器功能。


****  

| 查詢類型 | 支援的讀取器版本 | 支援的讀取器功能 | 
| --- | --- | --- | 
| DQL (SELECT statements) | <= 3 | [資料欄映射](https://docs.delta.io/latest/delta-column-mapping.html)、[timestampNtz](https://github.com/delta-io/delta/blob/master/PROTOCOL.md#timestamp-without-timezone-timestampntz)、[刪除向量](https://docs.delta.io/latest/delta-deletion-vectors.html) | 
| DDL | <= 1 | 不適用。讀取器功能只能在讀取器版本為 2 或更高版本時宣告。 | 
+ 如需有關 Delta Lake 資料表的功能清單，請參閱 GitHub.com 上[資料表功能中的有效功能名稱](https://github.com/delta-io/delta/blob/master/PROTOCOL.md#valid-feature-names-in-table-features)
+ 如需依通訊協定版本列出的 Delta Lake 功能清單，請參閱 GitHub.com 上的[依通訊協定版本列出的功能](https://docs.delta.io/latest/versioning.html#features-by-protocol-version)。

若要在 Athena 中建立讀取器版本大於 1 的 Delta Lake 資料表，請參閱 [同步處理 Delta Lake 中繼資料](delta-lake-tables-syncing-metadata.md)。

**Topics**
+ [考量和限制](#delta-lake-tables-considerations-and-limitations)
+ [支援的資料欄資料類型](delta-lake-tables-supported-data-types-columns.md)
+ [Delta Lake 資料表入門](delta-lake-tables-getting-started.md)
+ [使用 SQL 查詢 Delta Lake 資料表](delta-lake-tables-querying.md)
+ [同步處理 Delta Lake 中繼資料](delta-lake-tables-syncing-metadata.md)
+ [其他資源](delta-lake-tables-additional-resources.md)

# 支援的資料欄資料類型
<a name="delta-lake-tables-supported-data-types-columns"></a>

本節說明非分割區和分割區資料欄支援的資料類型。

## 支援的非分割區資料欄資料類型
<a name="delta-lake-tables-supported-data-types-non-partition-columns"></a>

對於非分割區資料欄，支援 Athena 支援的所有資料類型，除了 `CHAR` 之外 (Delta Lake 通訊協定本身不支援 `CHAR`)。支援的資料類型包括：

```
boolean
tinyint
smallint
integer
bigint
double
float
decimal
varchar
string
binary
date
timestamp
array
map
struct
```

## 支援的分割區資料欄資料類型
<a name="delta-lake-tables-supported-data-types-partition-columns"></a>

對於分割區資料欄，Athena 支援具有下列資料類型的資料表：

```
boolean
integer
smallint
tinyint
bigint
decimal
float
double
date
timestamp
varchar
```

如需有關 Athena 中資料類型的詳細資訊，請參閱 [Amazon Athena 中的資料類型](data-types.md)。

# Delta Lake 資料表入門
<a name="delta-lake-tables-getting-started"></a>

若要查詢，您的 Delta Lake 資料表必須存在於其中 AWS Glue。如果您的資料表位於 Amazon S3 中，但未位於 中 AWS Glue，請使用下列語法執行`CREATE EXTERNAL TABLE`陳述式。如果您的資料表已存在於 AWS Glue （例如，因為您使用 Apache Spark 或其他引擎搭配 AWS Glue)，您可以略過此步驟。請注意忽略的資料欄定義、SerdE 程式庫和其他資料表屬性。與傳統 Hive 資料表不同，Delta Lake 資料表中繼資料會從 Delta Lake 交易日誌推斷並直接同步至 AWS Glue。

```
CREATE EXTERNAL TABLE
  [db_name.]table_name
  LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
  TBLPROPERTIES ('table_type' = 'DELTA')
```

**注意**  
此陳述式與已啟用請求者支付的 S3 儲存貯體不相容。如果您想要針對已啟用請求者支付的 S3 儲存貯體建立 Delta Lake 資料表，請遵循 [同步處理 Delta Lake 中繼資料](delta-lake-tables-syncing-metadata.md) 中的說明和 DDL 陳述式。
對於 Delta Lake 資料表，不允許包含超過 `LOCATION` 和 `table_type` 屬性的 `CREATE TABLE` 陳述式。

# 使用 SQL 查詢 Delta Lake 資料表
<a name="delta-lake-tables-querying"></a>

若要查詢 Delta Lake 資料表，請使用標準 SQL `SELECT` 語法：

```
[ WITH with_query [, ...] ]SELECT [ ALL | DISTINCT ] select_expression [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]
[ HAVING condition ]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST] [, ...] ]
[ OFFSET count [ ROW | ROWS ] ]
[ LIMIT [ count | ALL ] ]
```

如需有關 `SELECT` 語法的詳細資訊，請參閱 Athena 文件中的 [SELECT](select.md)。

Delta Lake 格式會儲存每個資料檔案中每個資料欄的最小值和最大值。Athena 會利用這項資訊來啟用述詞上的檔案略過功能，從而排除不需要的檔案。

# 同步處理 Delta Lake 中繼資料
<a name="delta-lake-tables-syncing-metadata"></a>

 AWS Glue 如果您使用 Athena 建立 Delta Lake 資料表，Athena 會將資料表中繼資料，包括結構描述、分割區資料欄和資料表屬性同步至 。隨著時間流逝，此中繼資料可能會遺失與交易日誌中基礎資料表中繼資料的同步處理。要讓資料表保持最新，您可以選擇下列其中一個選項：
+ 使用 Delta Lake 資料表的 AWS Glue 爬蟲程式。如需詳細資訊，請參閱 *AWS 大數據部落格*中的[介紹原生 Delta Lake 資料表支援與 AWS Glue 爬蟲程式](https://aws.amazon.com/blogs/big-data/introducing-native-delta-lake-table-support-with-aws-glue-crawlers/)，以及《 AWS Glue 開發人員指南》中的[排程 AWS Glue 爬蟲程式](https://docs.aws.amazon.com/glue/latest/dg/schedule-crawler.html)。
+ 在 Athena 捨棄並重新建立資料表。
+ 使用 SDK、CLI 或 AWS Glue 主控台手動更新 中的結構描述 AWS Glue。

請注意，下列功能需要您的 AWS Glue 結構描述一律具有與交易日誌相同的結構描述：
+ Lake Formation
+ 檢視
+ 資料列與資料欄篩選

如果您的工作流程不需要任何此功能，而且您不想維持此相容性，則可以在 Athena 中使用 `CREATE TABLE` DDL，然後在 AWS Glue中新增 Amazon S3 路徑做為 SerdE 參數。

## 使用 Athena 和 AWS Glue 主控台建立 Delta Lake 資料表
<a name="delta-lake-tables-syncing-metadata-console"></a>

您可以使用下列程序，使用 Athena 和 AWS Glue 主控台建立 Delta Lake 資料表。

**使用 Athena 和 AWS Glue 主控台建立 Delta Lake 資料表**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在 Athena 查詢編輯器中，使用下列 DDL 建立您的 Delta Lake 資料表。請注意，使用此方法時，`TBLPROPERTIES` 的值必須是 `'spark.sql.sources.provider' = 'delta'` 而不是 `'table_type' = 'delta'`。

   請注意，當您使用 Apache Spark (Athena for Apache Spark) 或大多數其他引擎來建立資料表時，將插入此相同的結構描述 (具有名為 `col` 的類型 `array<string>` 的單一資料欄)。

   ```
   CREATE EXTERNAL TABLE
      [db_name.]table_name(col array<string>)
      LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
      TBLPROPERTIES ('spark.sql.sources.provider' = 'delta')
   ```

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

1. 在導覽窗格中，選擇**資料目錄**、**資料表**。

1. 在資料表清單中，選擇資料表的連結。

1. 在資料表的頁面上，選擇**動作**、**編輯資料表**。

1. 在 **Serde 參數**區段中，新增索引鍵 **path** 與值 **s3://amzn-s3-demo-bucket/*your-folder*/**。

1. 選擇**儲存**。

## 使用 建立 Delta Lake 資料表 AWS CLI
<a name="delta-lake-tables-syncing-metadata-cli"></a>

若要使用 建立 Delta Lake 資料表 AWS CLI，請輸入如下所示的命令。

```
aws glue create-table --database-name dbname \
    --table-input '{"Name" : "tablename", "StorageDescriptor":{
            "Columns" : [
                {
                    "Name": "col",
                    "Type": "array<string>"
                }
            ],
            "Location" : "s3://amzn-s3-demo-bucket/<prefix>/",
            "SerdeInfo" : {
                "Parameters" : {
                    "serialization.format" : "1",
                    "path" : "s3://amzn-s3-demo-bucket/<prefix>/"
                }
            }
        },
        "PartitionKeys": [],
        "TableType": "EXTERNAL_TABLE",
        "Parameters": {
            "EXTERNAL": "TRUE",
            "spark.sql.sources.provider": "delta"
        }
    }'
```

# 其他資源
<a name="delta-lake-tables-additional-resources"></a>

如需搭配 使用 Delta Lake 資料表 AWS Glue 和搭配 Athena 查詢它們的討論，請參閱 *AWS 大數據部落格中的*[使用開放原始碼 Delta Lake 處理 UPSERT 資料操作 AWS Glue](https://aws.amazon.com/blogs/big-data/handle-upsert-data-operations-using-open-source-delta-lake-and-aws-glue/)。

# 查詢 Apache Hudi 資料集
<a name="querying-hudi"></a>

[https://hudi.incubator.apache.org/](https://hudi.incubator.apache.org/) 是一個開源資料管理架構，可簡化增量資料的處理。記錄級的插入、更新、更新插入和刪除動作會得到更細微的處理，從而減少開銷。`Upsert` 是指將記錄插入現有資料集 (如果記錄尚不存在)，或者更新記錄 (如果記錄存在) 的能力。

Hudi 處理資料插入和更新事件，而不會建立許多可能會導致分析效能問題的小型檔案。Apache Hudi 會自動追蹤變更和合併檔案，以便檔案保持在最佳的大小。如此可避免建置自訂解決方案，這些解決方案用來監控許多小型檔案並將其重新寫入較少的大型檔案。

Hudi 資料集適用於以下使用案例：
+ 遵守隱私權規定，例如[一般資料保護規範](https://en.wikipedia.org/wiki/General_Data_Protection_Regulation) (歐盟《一般資料保護規範》(GDPR)) 及[加州消費者隱私法](https://en.wikipedia.org/wiki/California_Consumer_Privacy_Act) (CCPA)，這些法規會強制執行使用者移除個人資訊或變更其資料使用方式的權利。
+ 處理來自感應器和其他物聯網 (IoT) 裝置的串流資料，這些資料需要特定的資料插入和更新事件。
+ 實作[變更資料擷取 (CDC) 系統](https://en.wikipedia.org/wiki/Change_data_capture)。

Hudi 資料集可以是以下類型之一：
+ **寫入時複製 (CoW)** – 資料會以單欄式格式 (Parquet) 存放，每次更新都會在寫入期間建立新版本的檔案。
+ **讀取時合併 (MoR)** – 資料的存放是使用單欄式 (Parquet) 和以資料行為基礎 (Avro) 格式的組合。更新會記錄到以資料行為基礎的 `delta` 檔案，並視需要壓縮以建立新版本的單欄式檔案。

使用 CoW 資料集，每次有記錄進行更新時，包含記錄的檔案就會以更新的值重寫。若使用 MoR 資料集，每次有更新時，Hudi 只會寫入已變更之記錄的資料行。MoR 更適合較少讀取，而寫入或變更較繁重的工作負載。CoW 更適合資料變更較不頻繁，而讀取作業較為繁重的工作負載。

Hudi 提供三個可用於資料存取的查詢類型：
+ **快照查詢** – 查詢會查看截至給定遞交或壓縮動作的資料表的最新快照。對於 MoR 資料表，快照查詢會公開資料表的最新狀態，方法是合併查詢時最新檔案切片的基底和 delta 檔案。
+ **增量查詢** – 查詢只會看到自給定的遞交/壓縮以來在資料表中寫入的新資料。這會有效地提供變更串流，以啟用增量資料管道。
+ **讀取最佳化查詢** – 對於 MoR 資料表，查詢會看到壓縮的最新資料。對於 CoW 資料表，查詢會看到遞交的最新資料。

下表顯示每個資料表類型可能的 Hudi 查詢類型。


| 資料表類型 | 可能的 Hudi 查詢類型 | 
| --- | --- | 
| 寫入時複製 | 快照、增量 | 
| 讀取時合併 | 快照、增量、讀取最佳化 | 

如需有關資料表和查詢類型之間取捨的詳細資訊，請參閱 Apache Hudi 文件中的[資料表和查詢類型](https://hudi.apache.org/docs/table_types/)。

## Hudi 術語變更：檢視現在是查詢
<a name="querying-hudi-hudi-dataset-table-types-terminology"></a>

從 Apache Hudi 0.5.1 版本開始，以前的檢視現在稱為稱為查詢。下表摘要列出新舊術語之間的變更。


| 舊術語 | 新術語 | 
| --- | --- | 
|  CoW：讀取最佳化檢視 MoR：即時檢視  |  快照查詢  | 
| 增量檢視 | 增量查詢 | 
| MoR 讀取最佳化檢視 | 讀取最佳化查詢 | 

**Topics**
+ [Hudi 術語變更：檢視現在是查詢](#querying-hudi-hudi-dataset-table-types-terminology)
+ [考量和限制](querying-hudi-in-athena-considerations-and-limitations.md)
+ [寫入時複製 (CoW) 建立資料表範例](querying-hudi-copy-on-write-create-table-examples.md)
+ [讀取時合併 (MoR) 建立資料表範例](querying-hudi-merge-on-read-create-table-examples.md)
+ [使用 Hudi 中繼資料以提升效能](querying-hudi-metadata-table.md)
+ [其他資源](querying-hudi-additional-resources.md)

# 考量和限制
<a name="querying-hudi-in-athena-considerations-and-limitations"></a>

當您使用 Athena 讀取 Apache Hudi 資料表時，請考慮下列幾點。
+ **讀取和寫入操作** – Athena 可以讀取壓縮的 Hudi 資料集，但無法寫入 Hudi 資料。
+ **Hudi 版本** – Athena 支援 Hudi 版本 0.14.0 （預設） 和 0.15.0。Athena 無法保證與使用較新版本 Hudi 建立之資料表的讀取相容性。如需有關 Hudi 功能和版本控制的詳細資訊，請參閱 Apache 網站上的 [Hudi 文件](https://hudi.apache.org/)。請注意，Athena 上的 Hudi 連接器 0.15.0 版不支援引導資料表。若要使用 Hudi 連接器的 0.15.0，請設定下列資料表屬性：

  ```
  ALTER TABLE table_name SET TBLPROPERTIES ('athena_enable_native_hudi_connector_implementation' = 'true')
  ```
+ **跨帳戶查詢** – Hudi 連接器的 0.15.0 版不支援跨帳戶查詢。
+ **查詢類型** – 目前，Athena 支援快照查詢和讀取最佳化查詢，但不支援增量查詢。在 MoR 資料表上，所有公開給讀取最佳化查詢的資料均經過壓縮。這可提供良好的效能，但不包含最新的 delta 遞交。快照查詢包含最新資料，但會產生一些運算開銷，這使得這些查詢的效能較為不佳。如需有關資料表和查詢類型之間取捨的詳細資訊，請參閱 Apache Hudi 文件中的[資料表和查詢類型](https://hudi.apache.org/docs/table_types/)。
+ **增量查詢** – Athena 不支援增量查詢。
+ **CTAS** – Athena 不支援對 Hudi 資料執行 [CTAS](ctas.md) 或 [INSERT INTO](insert-into.md)。如果您希望 Athena 提供寫入 Hudi 資料集的支援，請將意見回饋傳送至 athena-feedback@amazon.com。

  如需有關寫入 Hudi 資料的詳細資訊，請參閱下列資源：
  + 《[Amazon EMR 版本指南](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/)》中的[使用 Hudi 資料集](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hudi-work-with-dataset.html)。
  + Apache Hudi 文件中的[寫入資料](https://hudi.apache.org/docs/0.8.0/writing_data.html)。
+ **MSCK REPAIR TABLE** – 不支援在 Athena 中對 Hudi 資料表使用 MSCK REPAIR TABLE。如果您需要載入未在 中建立的 Hudi 資料表 AWS Glue，請使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。
+ **略過不支援的 Amazon Glacier 物件** – 如果 Apache Hudi 資料表中的物件位於 Amazon Glacier 儲存類別中，則將 `read_restored_glacier_objects` 資料表屬性設定為 `false` 是無效的。

  例如，假設您發出下列命令：

  ```
  ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')
  ```

  對於 Iceberg 和 Delta Lake 資料表，此命令會產生錯誤不支援的資料表屬性索引鍵：read\$1restored\$1glacier\$1objects。對於 Hudi 資料表，`ALTER TABLE` 命令不會產生錯誤，但是 Amazon Glacier 物件仍不會略過。在 `ALTER TABLE` 命令繼續傳回所有物件之後執行 `SELECT` 查詢。
+ **時間戳記查詢** – 目前，嘗試讀取 Hudi 即時資料表中的時間戳記資料欄的查詢可能會失敗，也可能會產生空白結果。此限制僅適用於讀取時間戳記資料欄的查詢。僅包含相同資料表中非時間戳記資料欄的查詢會成功。

  失敗的查詢會傳回類似下列瑣所示的訊息：

  GENERIC\$1INTERNAL\$1ERROR：類別 org.apache.hadoop.io.ArrayWritable 無法轉換為類別 org.apache.hadoop.hive.serde2.io.TimestampWritableV2 (org.apache.hadoop.io.ArrayWritable 和 org.apache.hadoop.hive.serde2.io.TimestampWritableV2 位於載入器 io.trino.server.PluginClassLoader @75c67992 的未命名模組中）
+ **0.15.0 Hudi Connector 上的 Lake Formation 許可** – 此限制僅適用於透過將資料表屬性設定為 來選擇使用原生 Hudi 連接器 (0.15.0 版） `athena_enable_native_hudi_connector_implementation` 時`true`。根據預設，Athena 使用 Hudi 連接器 0.14.0 版，這不需要此額外許可。若要查詢 Lake Formation 保護的資料表，您必須將 Lake Formation 許可授予資料表的資料位置和`.hoodie`中繼資料目錄。例如，如果您的 Hudi 資料表位於 `s3://bucket/hudi-table/`，您必須註冊並授予許可給 Lake Formation `s3://bucket/hudi-table/.hoodie/`中的 `s3://bucket/hudi-table/`和 。`.hoodie` 目錄包含 Athena 在查詢規劃期間需要讀取的中繼資料檔案 （例如 `hoodie.properties`)。如果沒有`.hoodie`目錄的許可，查詢將會失敗，並出現許可遭拒錯誤。

# 寫入時複製 (CoW) 建立資料表範例
<a name="querying-hudi-copy-on-write-create-table-examples"></a>

如果您已在 中建立 Hudi 資料表 AWS Glue，您可以直接在 Athena 中查詢它們。在 Athena 中建立分割的 Hudi 資料表時，您必須執行 `ALTER TABLE ADD PARTITION` 以在查詢前載入 Hudi 資料。

## 未分割的 CoW 資料表
<a name="querying-hudi-nonpartitioned-cow-table"></a>

以下範例在 Athena 中建立未分割的 CoW 資料表。

```
CREATE EXTERNAL TABLE `non_partition_cow`(
  `_hoodie_commit_time` string,
  `_hoodie_commit_seqno` string,
  `_hoodie_record_key` string,
  `_hoodie_partition_path` string,
  `_hoodie_file_name` string,
  `event_id` string,
  `event_time` string,
  `event_name` string,
  `event_guests` int,
  `event_type` string)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
  'org.apache.hudi.hadoop.HoodieParquetInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/folder/non_partition_cow/'
```

## 分割的 CoW 資料表
<a name="querying-hudi-partitioned-cow-table"></a>

以下範例在 Athena 中建立分割的 CoW 資料表。

```
CREATE EXTERNAL TABLE `partition_cow`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int)
PARTITIONED BY ( 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.HoodieParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' 
LOCATION
  's3://amzn-s3-demo-bucket/folder/partition_cow/'
```

以下 `ALTER TABLE ADD PARTITION` 範例會將兩個分割區新增至範例 `partition_cow` 資料表。

```
ALTER TABLE partition_cow ADD
  PARTITION (event_type = 'one') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_cow/one/' 
  PARTITION (event_type = 'two') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_cow/two/'
```

# 讀取時合併 (MoR) 建立資料表範例
<a name="querying-hudi-merge-on-read-create-table-examples"></a>

Hudi 在 MoR 的中繼存放區中建立兩個資料表，一個為用於快照查詢的資料表，另一個為用於讀取最佳化查詢的資料表。這兩個資料表都可供查詢。在 0.5.1 之前的 Hudi 版本中，讀取最佳化查詢的資料表具有您在建立資料表時指定的名稱。從版本 Hudi 0.5.1 開始，資料表名稱的字尾預設為 `_ro`。快照查詢的資料表名稱是您指定的附有 `_rt` 的名稱。

## 讀取時的未分割合併 (MoR) 資料表
<a name="querying-hudi-nonpartitioned-merge-on-read-table"></a>

以下範例在 Athena 中建立未分割的 MoR 資料表，用於讀取最佳化查詢。請注意，讀取最佳化查詢使用輸入格式 `HoodieParquetInputFormat`。

```
CREATE EXTERNAL TABLE `nonpartition_mor`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int, 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.HoodieParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' 
LOCATION
  's3://amzn-s3-demo-bucket/folder/nonpartition_mor/'
```

下列範例會在 Athena 中建立用於快照查詢的未分割 MoR 資料表。對於快照查詢，請使用輸入格式 `HoodieParquetRealtimeInputFormat`。

```
CREATE EXTERNAL TABLE `nonpartition_mor_rt`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int, 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.realtime.HoodieParquetRealtimeInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' 
LOCATION
  's3://amzn-s3-demo-bucket/folder/nonpartition_mor/'
```

## 讀取時分割合併 (MoR) 資料表
<a name="querying-hudi-partitioned-merge-on-read-table"></a>

下列範例會在 Athena 中建立用於讀取最佳化查詢的分割 MoR 資料表。

```
CREATE EXTERNAL TABLE `partition_mor`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int)
PARTITIONED BY ( 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.HoodieParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/folder/partition_mor/'
```

以下 `ALTER TABLE ADD PARTITION` 範例會將兩個分割區新增至範例 `partition_mor` 資料表。

```
ALTER TABLE partition_mor ADD
  PARTITION (event_type = 'one') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_mor/one/'
  PARTITION (event_type = 'two') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_mor/two/'
```

下列範例會在 Athena 中建立用於快照查詢的分割 MoR 資料表。

```
CREATE EXTERNAL TABLE `partition_mor_rt`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int)
PARTITIONED BY ( 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.realtime.HoodieParquetRealtimeInputFormat'
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/folder/partition_mor/'
```

同樣地，以下 `ALTER TABLE ADD PARTITION` 範例會將兩個分割區新增至範例 `partition_mor_rt` 資料表。

```
ALTER TABLE partition_mor_rt ADD
  PARTITION (event_type = 'one') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_mor/one/'
  PARTITION (event_type = 'two') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_mor/two/'
```

# 使用 Hudi 中繼資料以提升效能
<a name="querying-hudi-metadata-table"></a>

Apache Hudi 有一個[中繼資料表](https://hudi.apache.org/docs/next/metadata/)，其中包含索引功能，以改善效能，例如檔案列出、使用資料欄統計數字略過資料以及基於 Bloom 篩選條件的索引。

在這些功能中，Athena 目前僅支援檔案列出索引。檔案列出索引可從維護分割區到檔案映射的索引中擷取資訊，進而消除諸如「清單檔案」之類的檔案系統呼叫。這樣就不需要遞迴列出資料表路徑下的每個分割區來查看檔案系統。當您處理大型資料集時，此索引會大幅縮短在寫入和查詢期間取得檔案清單時所產生的延遲。它還可以避免瓶頸，例如 Amazon S3 `LIST` 呼叫上的請求限制限流。

**注意**  
Athena 目前不支援資料略過或 Bloom 篩選索引。

## 啟用 Hudi 中繼資料表
<a name="querying-hudi-metadata-table-enabling-the-hudi-metadata-table"></a>

依預設，以中繼資料表為基礎的檔案清單已停用。若要啟用 Hudi 中繼資料表和相關檔案清單功能，請將 `hudi.metadata-listing-enabled` 資料表屬性設定為 `TRUE`。

**範例**  
下列 `ALTER TABLE SET TBLPROPERTIES` 範例會啟用範例 `partition_cow` 資料表上的中繼資料表。

```
ALTER TABLE partition_cow SET TBLPROPERTIES('hudi.metadata-listing-enabled'='TRUE')
```

## 使用引導程序產生的中繼資料
<a name="querying-hudi-hudi-dataset-table-types-bootstrap"></a>

從 Apache Hudi 版本 0.6.0 開始，引導操作功能可為現有 Parquet 資料集提供更好的效能。引導操作不會重寫資料集，而是只能產生中繼資料，使資料集保持在原位。

您可以使用 Athena，透過引導操作對資料表執行查詢，就像以 Amazon S3 中之資料為基礎的其他資料表一樣。在 `CREATE TABLE` 陳述式中，請在 `LOCATION` 子句中指定 Hudi 資料表路徑。

如需有關在 Amazon EMR 中使用引導操作建立 Hudi 資料表的詳細資訊，請參閱 AWS 大數據部落格中的文章 [Apache Hudi 提供的新功能](https://aws.amazon.com/blogs/big-data/new-features-from-apache-hudi-available-in-amazon-emr/)。

# 其他資源
<a name="querying-hudi-additional-resources"></a>

如需搭配使用 Apache Hudi 與 Athena 的其他資源，請參閱下列資源。

## 影片
<a name="querying-hudi-videos"></a>

下列影片顯示如何使用 Amazon Athena，查詢基於 Amazon S3 的資料湖中已經過讀取最佳化的 Apache Hudi 資料集。

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


## 部落格文章
<a name="querying-hudi-big-data-blogs"></a>

下列 AWS 大數據部落格文章包含如何搭配 Athena 使用 Apache Hudi 的說明。
+ [使用 AWS 資料交換無縫共用 Apache Hudi 資料集](https://aws.amazon.com/blogs/big-data/use-aws-data-exchange-to-seamlessly-share-apache-hudi-datasets/) 
+ [使用 Amazon Kinesis AWS DMS、使用 Quick AWS Glue 串流 ETL 和資料視覺化，建立以 Apache Hudi 為基礎的near-real-time交易資料湖](https://aws.amazon.com/blogs/big-data/create-an-apache-hudi-based-near-real-time-transactional-data-lake-using-aws-dms-amazon-kinesis-aws-glue-streaming-etl-and-data-visualization-using-amazon-quicksight/) 
+ 如需有關使用 AWS Glue 自訂連接器和 AWS Glue 2.0 任務來建立您可以使用 Athena 查詢的 Apache Hudi 資料表的資訊，請參閱[使用 AWS Glue 自訂連接器寫入 Apache Hudi 資料表](https://aws.amazon.com/blogs/big-data/writing-to-apache-hudi-tables-using-aws-glue-connector/)。
+ 如需使用 Apache Hudi AWS Glue和 Amazon Athena 為資料湖建置資料處理架構的文章，請參閱[使用 AWS Glue 和 Apache Hudi 簡化資料湖中的操作資料處理](https://aws.amazon.com/blogs/big-data/simplify-operational-data-processing-in-data-lakes-using-aws-glue-and-apache-hudi/)。

# 查詢 Apache Iceberg 資料表
<a name="querying-iceberg"></a>

您可以使用 Athena 在 Apache Iceberg 資料表上執行讀取、時間歷程、寫入和 DDL 查詢。

[Apache Iceberg](https://iceberg.apache.org/) 是開放式的資料表格式，專用於非常大型的分析資料集。Iceberg 以管理資料表的方式來管理大量的檔案集合並支援新型的分析資料湖操作，如記錄層級的插入、更新、刪除和時間歷程查詢。Iceberg 規格可讓資料表的結構描述和分割區等變化順暢無礙，並專為最佳化 Amazon S3 的使用所設計。Iceberg 也有助於在並行寫入的情況下保證資料的正確性。

如需 Apache Iceberg 的相關詳細資訊，請參閱 [https://iceberg.apache.org/](https://iceberg.apache.org/)。

## 考量和限制
<a name="querying-iceberg-considerations-and-limitations"></a>

Athena 對 Iceberg 資料表的支援有以下考量事項和限制：
+ **Iceberg 版本支援** – Athena 支援 Apache Iceberg 1.4.2 版。
+ **向 Lake Formation 註冊的資料表** – Athena 目前不支援對向 Lake Formation 註冊的 Iceberg 資料表進行 DDL 操作。
+ **針對資訊結構描述的查詢** – 查詢 Iceberg 資料表的資訊結構描述時，Athena 會使用 S3 中繼資料作為資料欄中繼資料的事實來源。這表示資料欄資訊衍生自基礎 S3 檔案，而不是目錄中繼資料。此行為不同於其他資料表格式，其中目錄中繼資料可能是資料欄資訊的主要來源。
+ ** AWS Glue 僅限目錄的資料表** – Athena 僅支援根據開放原始碼黏附 AWS Glue 目錄實作所定義的規格，針對目錄建立的 Iceberg 資料表。 [https://iceberg.apache.org/docs/latest/aws/#glue-catalog](https://iceberg.apache.org/docs/latest/aws/#glue-catalog)
+ ** AWS Glue 僅支援資料表鎖定** – 與支援外掛程式自訂鎖定的開放原始碼 Glue 目錄實作不同，Athena 僅支援 AWS Glue 樂觀鎖定。使用 Athena 修改具有任何其他鎖定實作的 Iceberg 資料表將導致潛在的資料遺失和交易中斷。
+ **支援的檔案格式** – Athena 引擎版本 3 支援下列 Iceberg 檔案格式。
  + Parquet
  + ORC
  + Avro
+ **Iceberg 受限制的中繼資料** – Lake Formation 不會評估 Iceberg 中繼資料資料表。因此，如果基本資料表上有任何 Lake Formation 資料列或儲存格篩選條件，或者您沒有檢視基本資料表中所有資料欄的許可，則 Iceberg 中繼資料資料表會受到限制。在這種情況下，當您查詢 `$partitions`、`$files`、`$manifests` 和 `$snapshots` Iceberg 中繼資料表時，它會失敗並收到 `AccessDeniedException` 錯誤。此外，中繼資料欄 `$path` 具有相同的 Lake Formation 限制，並在查詢選取時會失敗。無論 Lake Formation 篩選條件為何，都可以查詢所有其他中繼資料資料表。如需詳細資訊，請參閱[中繼資料資料表](https://trino.io/docs/current/connector/iceberg.html#metadata-tables)。
+ **Iceberg v2 資料表** – Athena 只能建立及操作 Iceberg v2 資料表。有關 v1 和 v2 資料表之間的區別，請參閱 Apache Iceberg 文件中的[格式版本變更](https://iceberg.apache.org/spec/#appendix-e-format-version-changes)。
+ **顯示不含時區的時間類型** – 以世界協調時間 (UTC) 顯示不含時區類型的時間和時間戳記。如果在時間資料欄的篩選條件表達式中未指定時區，則使用世界協調時間 (UTC)。
+ **與時間戳記相關的資料精確度** – 雖然 Iceberg 支持時間戳記資料類型的精度達到微秒，但 Athena 僅在讀取和寫入的時間戳記中支持達毫秒的精度。針對在手動壓縮操作過程中重寫的時間相關資料欄中的資料，Athena 僅保留毫秒精度。
+ **不支援的操作** – Iceberg 資料表不支援以下 Athena 操作。
  + [ALTER TABLE SET LOCATION](alter-table-set-location.md)
+ **Views** (檢視) – 使用 `CREATE VIEW` 建立 Athena 檢視，如 [使用檢視](views.md) 中所述。如果您有興趣使用 [Iceberg 檢視規格](https://github.com/apache/iceberg/blob/master/format/view-spec.md)來建立檢視，請聯絡 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)。
+ ** AWS Lake Formation中不支援 TTF 管理命令** – 雖然您可以使用 Lake Formation 來管理 TransactionTable Formats (TTF) 的讀取存取許可，例如 Apache Iceberg、Apache Hudi 和 Linux Foundation Delta Lake，但您無法使用 Lake Formation 來管理操作的許可，例如使用這些資料表格式的 `VACUUM`、`MERGE`、`UPDATE` 或 `OPTIMIZE`。如需 Lake Formation 與 Athena 整合的詳細資訊，請參閱《 *AWS Lake Formation 開發人員指南*》中的[搭配使用 AWS Lake Formation 與 Amazon Athena](https://docs.aws.amazon.com/lake-formation/latest/dg/athena-lf.html)。
+ **依巢狀欄位分割** – 不支援依巢狀欄位分割。嘗試這樣做會產生訊息 NOT\$1SUPPORTED：不支援依巢狀欄位分割：*column\$1name*.*nested\$1field\$1name*。
+ **略過不支援的 Amazon Glacier 物件** – 如果 Apache Iceberg 資料表中的物件位於 Amazon Glacier 儲存類別中，則將 `read_restored_glacier_objects` 資料表屬性設定為 `false` 是無效的。

  例如，假設您發出下列命令：

  ```
  ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')
  ```

  對於 Iceberg 和 Delta Lake 資料表，此命令會產生錯誤不支援的資料表屬性索引鍵：read\$1restored\$1glacier\$1objects。對於 Hudi 資料表，`ALTER TABLE` 命令不會產生錯誤，但是 Amazon Glacier 物件仍不會略過。在 `ALTER TABLE` 命令繼續傳回所有物件之後執行 `SELECT` 查詢。

如果您希望 Athena 支援特定功能，請將意見回饋傳送至 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)。

**Topics**
+ [考量和限制](#querying-iceberg-considerations-and-limitations)
+ [建立 Iceberg 資料表](querying-iceberg-creating-tables.md)
+ [查詢 Iceberg 資料表資料](querying-iceberg-table-data.md)
+ [執行時間歷程和版本歷程查詢](querying-iceberg-time-travel-and-version-travel-queries.md)
+ [更新 Iceberg 資料表資料](querying-iceberg-updating-iceberg-table-data.md)
+ [管理 Iceberg 資料表](querying-iceberg-managing-tables.md)
+ [演進 Iceberg 資料表結構描述](querying-iceberg-evolving-table-schema.md)
+ [在 Iceberg 資料表上執行其他 DDL 操作](querying-iceberg-additional-operations.md)
+ [最佳化 Iceberg 資料表](querying-iceberg-data-optimization.md)
+ [查詢 AWS Glue Data Catalog 具體化視觀表](querying-iceberg-gdc-mv.md)
+ [Athena 中 Iceberg 資料表支援的資料類型](querying-iceberg-supported-data-types.md)
+ [其他資源](querying-iceberg-additional-resources.md)

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

若要建立 Iceberg 資料表以在 Athena 中使用，您可以使用此頁面所述的`CREATE TABLE`陳述式，也可以使用 AWS Glue 爬蟲程式。

## 使用 CREATE TABLE 陳述式
<a name="querying-iceberg-creating-tables-query-editor"></a>

Athena 可建立 Iceberg V2 資料表。有關 v1 和 v2 資料表之間的區別，請參閱 Apache Iceberg 文件中的[格式版本變更](https://iceberg.apache.org/spec/#appendix-e-format-version-changes)。

Athena `CREATE TABLE` 建立一個不含資料的 Iceberg 資料表。如果資料表使用 [Iceberg 開放原始碼 glue 目錄](https://iceberg.apache.org/docs/latest/aws/#glue-catalog)，您可以直接從外部系統 (如 Apache Spark) 查詢資料表。您不必建立外部資料表。

**警告**  
執行 `CREATE EXTERNAL TABLE` 會導致錯誤訊息 External keyword not supported for table type ICEBERG (資料表類型 ICEBERG 不支援外部關鍵字)。

若要在 Athena 中建立 Iceberg 資料表，請在 `TBLPROPERTIES` 子句中將 `'table_type'` 資料表屬性設定成 `'ICEBERG'`，如下列語法摘要所示。

```
CREATE TABLE
  [db_name.]table_name (col_name data_type [COMMENT col_comment] [, ...] )
  [PARTITIONED BY (col_name | transform, ... )]
  LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
  TBLPROPERTIES ( 'table_type' ='ICEBERG' [, property_name=property_value] )
```

如需有關您可在 Iceberg 資料表中查詢之資料類型的資訊，請參閱 [Athena 中 Iceberg 資料表支援的資料類型](querying-iceberg-supported-data-types.md)。

### 使用分割區
<a name="querying-iceberg-partitioning"></a>

若要建立含有分割區的 Iceberg 資料表，請使用 `PARTITIONED BY` 語法。必須先在資料欄聲明中宣告要分割的資料欄。`PARTITIONED BY` 子句中不能包括資料欄類型。您也可以使用 `CREATE TABLE` 語法來定義[分割區轉換](https://iceberg.apache.org/spec/#partition-transforms)。若要指定分割時要使用的多個資料欄，請使用逗號 (`,`) 字元來分隔資料欄，如下列範例所示。

```
CREATE TABLE iceberg_table (id bigint, data string, category string)
  PARTITIONED BY (category, bucket(16, id))
  LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
  TBLPROPERTIES ( 'table_type' = 'ICEBERG' )
```

下表顯示可用的分割區轉換函數。


****  

| 函式 | Description | 支援的類型 | 
| --- | --- | --- | 
| year(ts) | 按年分割區 | date, timestamp | 
| month(ts) | 按月分割區 | date, timestamp | 
| day(ts)  | 按日分割區 | date, timestamp | 
| hour(ts) | 按小時分割區 | timestamp | 
| bucket(N, col) | 按雜湊值模組 N 儲存貯體分割區。這與 Hive 資料表的雜湊儲存貯體具有相同的概念。 | int, long, decimal, date, timestamp, string, binary  | 
| truncate(L, col) | 按截斷至 L 的值分割區 | int, long, decimal, string | 

Athena 支援 Iceberg 的隱藏分割。如需詳細資訊，請參閱 Apache Iceberg 文件中的 [Iceberg 隱藏分割](https://iceberg.apache.org/docs/latest/partitioning/#icebergs-hidden-partitioning)。

### 指定資料表屬性
<a name="querying-iceberg-table-properties"></a>

本節說明可在 `CREATE TABLE` 陳述式的 `TBLPROPERTIES` 子句中指定為鍵值對的資料表屬性。Athena 僅允許使用預先定義之資料表屬性清單中的鍵值對來建立或更改 Iceberg 資料表。下表顯示您可指定的資料表屬性。如需有關壓縮選項的詳細資訊，請參閱本文件中的 [最佳化 Iceberg 資料表](querying-iceberg-data-optimization.md)。如果您希望 Athena 支援特定的開放原始碼資料表組態屬性，請將意見回饋傳送至 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)。

***format***


****  

|  |  | 
| --- |--- |
| Description | 檔案資料格式 | 
| 允許的屬性值 | 支援的檔案格式和壓縮組合會隨 Athena 引擎版本而異。如需詳細資訊，請參閱[使用 Iceberg 資料表壓縮](compression-support-iceberg.md)。 | 
| 預設值 | parquet | 

***write\$1compression***


****  

|  |  | 
| --- |--- |
| Description | 檔案壓縮轉碼器 | 
| 允許的屬性值 | 支援的檔案格式和壓縮組合會隨 Athena 引擎版本而異。如需詳細資訊，請參閱[使用 Iceberg 資料表壓縮](compression-support-iceberg.md)。 | 
| 預設值 |  預設寫入壓縮會隨 Athena 引擎版本而異。如需詳細資訊，請參閱[使用 Iceberg 資料表壓縮](compression-support-iceberg.md)。  | 

***optimize\$1rewrite\$1data\$1file\$1threshold***


****  

|  |  | 
| --- |--- |
| Description | 資料最佳化的專用組態。如果需要最佳化的資料檔案少於指定的閾值，則不會重寫這些檔案。這允許累積更多的資料檔案，從而產生更接近目標大小的檔案，並略過不必要的運算以節省成本。 | 
| 允許的屬性值 | 正數。必須小於 50。 | 
| 預設值 | 5 | 

***optimize\$1rewrite\$1delete\$1file\$1threshold***


****  

|  |  | 
| --- |--- |
| Description | 資料最佳化的專用組態。如果與資料檔案關聯的刪除檔案少於閾值，則不會重寫資料檔案。這允許為每個資料檔案累積更多的刪除檔案，從而節省成本。 | 
| 允許的屬性值 | 正數。必須小於 50。 | 
| 預設值 | 2 | 

***vacuum\$1min\$1snapshots\$1to\$1keep***


****  

|  |  | 
| --- |--- |
| Description |  要保留在資料表主要分支上的快照數目下限。 此值優先於 `vacuum_max_snapshot_age_seconds` 屬性。如果最小剩餘快照早於 `vacuum_max_snapshot_age_seconds` 指定的期限，則會保留快照，且會忽略 `vacuum_max_snapshot_age_seconds` 的值。  | 
| 允許的屬性值 | 正數。 | 
| 預設值 | 1 | 

***vacuum\$1max\$1snapshot\$1age\$1seconds***


****  

|  |  | 
| --- |--- |
| Description | 要在主分支上保留的快照最長期限。如果由 vacuum\$1min\$1snapshots\$1to\$1keep 指定的剩餘最小快照早於指定的期限，則會忽略此值。此資料表行為屬性可與 Apache Iceberg 組態中的 history.expire.max-snapshot-age-ms 屬性相對應。 | 
| 允許的屬性值 | 正數。 | 
| 預設值 | 432,000 秒 (5 天) | 

***vacuum\$1max\$1metadata\$1files\$1to\$1keep***


****  

|  |  | 
| --- |--- |
| Description | 要在資料表的主要分支上保留的先前中繼資料檔案數目上限。 | 
| 允許的屬性值 | 正數。 | 
| 預設值 | 100 | 

***write\$1data\$1path\$1enabled***


****  

|  |  | 
| --- |--- |
| Description | 設為 時true，會使用 write.data.path 屬性建立 Iceberg 資料表，而不是已取代的 write.object-storage.path 屬性。使用此選項可確保與 Iceberg 1.9.0 和更新版本相容，後者不再支援已棄用屬性。 | 
| 允許的屬性值 | true, false | 
| 預設值 | false | 

### CREATE TABLE 陳述式範例
<a name="querying-iceberg-example-create-table-statement"></a>

下列範例會建立具有三個資料欄的 Iceberg 資料表。

```
CREATE TABLE iceberg_table (
  id int,
  data string,
  category string) 
PARTITIONED BY (category, bucket(16,id)) 
LOCATION 's3://amzn-s3-demo-bucket/iceberg-folder' 
TBLPROPERTIES (
  'table_type'='ICEBERG',
  'format'='parquet',
  'write_compression'='snappy',
  'optimize_rewrite_delete_file_threshold'='10'
)
```

## 使用 CREATE TABLE AS SELECT (CTAS)
<a name="querying-iceberg-creating-tables-ctas"></a>

如需使用 `CREATE TABLE AS` 陳述式建立 Iceberg 資料表的相關資訊，請參閱 [CREATE TABLE AS](create-table-as.md)，特別注意 [CTAS 資料表屬性](create-table-as.md#ctas-table-properties) 一節。

## 使用 AWS Glue 爬蟲程式
<a name="querying-iceberg-creating-tables-crawler"></a>

您可以使用 AWS Glue 爬蟲程式自動將 Iceberg 資料表註冊到 AWS Glue Data Catalog。如果您想要從另一個 Iceberg 目錄遷移，您可以建立和排程 AWS Glue 爬蟲程式，並提供 Iceberg 資料表所在的 Amazon S3 路徑。您可以指定 AWS Glue 爬蟲程式可周遊的 Amazon S3 路徑的深度上限。排程 AWS Glue 爬蟲程式之後，爬蟲程式會擷取結構描述資訊，並在每次執行時 AWS Glue Data Catalog 以結構描述變更更新 。 AWS Glue 爬蟲程式支援跨快照合併結構描述，並更新 中的最新中繼資料檔案位置 AWS Glue Data Catalog。如需詳細資訊，請參閱 [中的資料目錄和爬蟲程式 AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/catalog-and-crawler.html)。

# 查詢 Iceberg 資料表資料
<a name="querying-iceberg-table-data"></a>

若要查詢 Iceberg 資料集，請使用標準 `SELECT` 陳述式，如下所示。查詢會遵循 Apache Iceberg [V2 格式規格](https://iceberg.apache.org/spec/#format-versioning)並在兩方位置執行讀取時合併且刪除相同項目。

```
SELECT * FROM [db_name.]table_name [WHERE predicate]
```

為了盡量縮短查詢時間，所有述詞都會被推送到資料所在的位置。

如需有關時間歷程和版本歷程查詢的資訊，請參閱 [執行時間歷程和版本歷程查詢](querying-iceberg-time-travel-and-version-travel-queries.md)。

## 使用 Iceberg 資料表建立和查詢檢視
<a name="querying-iceberg-views"></a>

若要在 Iceberg 資料表上建立和查詢 Athena 檢視，請遵循 [使用檢視](views.md) 中所述使用 `CREATE VIEW` 檢視。

範例：

```
CREATE VIEW view1 AS SELECT * FROM iceberg_table
```

```
SELECT * FROM view1 
```

如果您有興趣使用 [Iceberg 檢視規格](https://github.com/apache/iceberg/blob/master/format/view-spec.md)來建立檢視，請聯絡 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)。

## 查詢 Iceberg 資料表中繼資料
<a name="querying-iceberg-table-metadata"></a>

在 `SELECT` 查詢中，您可以在 *table\$1name* 之後使用下列屬性來查詢 Iceberg 資料表中繼資料：
+ **\$1files** – 顯示資料表的目前資料檔案。
+ **\$1manifests** – 顯示資料表的目前檔案清單檔案。
+ **\$1history** – 顯示資料表的歷程記錄。
+ **\$1partitions** – 顯示資料表的目前分割區。
+ **\$1snapshots** – 顯示資料表的快照。
+ **\$1refs** – 顯示資料表的參考。

### 範例
<a name="querying-iceberg-table-metadata-syntax"></a>

下列陳述式會列出 Iceberg 資料表的檔案。

```
SELECT * FROM "dbname"."tablename$files"
```

下列陳述式會列出 Iceberg 資料表的清單檔案。

```
SELECT * FROM "dbname"."tablename$manifests" 
```

下列陳述式會顯示 Iceberg 資料表的歷程記錄。

```
SELECT * FROM "dbname"."tablename$history"
```

下列範例會顯示 Iceberg 資料表的分割區。

```
SELECT * FROM "dbname"."tablename$partitions" 
```

下列範例會列出 Iceberg 資料表的快照。

```
SELECT * FROM "dbname"."tablename$snapshots" 
```

下列範例會顯示 Iceberg 資料表的參考。

```
SELECT * FROM "dbname"."tablename$refs" 
```

## 使用 Lake Formation 精細存取控制
<a name="querying-iceberg-working-with-lf-fgac"></a>

Athena 引擎版本 3 支援 Lake Formation 與 Iceberg 資料表的精細存取控制，包括資料欄層級和資料列層級的安全存取控制。此存取控制適用於時間歷程查詢及已執行結構描述演變的資料表。如需詳細資訊，請參閱[Lake Formation 精細存取控制和 Athena 工作群組](lf-athena-limitations.md#lf-athena-limitations-fine-grained-access-control)。

如果您在 Athena 外部建立了 Iceberg 資料表，則請使用 [Apache Iceberg SDK](https://iceberg.apache.org/releases/) 版本 0.13.0 或更高版本，以便將您的 Iceberg 資料表資料欄資訊填入 AWS Glue Data Catalog。如果您的 Iceberg 資料表不包含 中的資料欄資訊 AWS Glue，您可以使用 Athena [ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md)陳述式或最新的 Iceberg SDK 來修正資料表並更新其中的資料欄資訊 AWS Glue。

# 執行時間歷程和版本歷程查詢
<a name="querying-iceberg-time-travel-and-version-travel-queries"></a>

每個 Apache Iceberg 資料表都會有一份其所含 Amazon S3 物件的版本資訊清單。使用過往的版本資訊清單可查詢時間歷程和版本歷程。

Athena 中的時間歷程查詢可在 Simple Storage Service (Amazon S3) 中查詢截至某個指定日期和時間的資料，歷程資料會統一顯示成一個快照。Athena 中的版本歷程查詢可在 Simple Storage Service (Amazon S3) 中查詢截至某個指定快照 ID 的歷程資料。

## 時間歷程查詢
<a name="querying-iceberg-time-travel-queries"></a>

若要執行時間歷程查詢，請在 `SELECT` 陳述式的資料表名稱後加上 `FOR TIMESTAMP AS OF timestamp`，如下列範例所示。

```
SELECT * FROM iceberg_table FOR TIMESTAMP AS OF timestamp
```

進行歷程查詢時所要指定的系統時間是時間戳記或含時區的時間戳記。如果沒有指定時間，則 Athena 會假設該值為世界協調時間 (UTC) 的時間戳記。

下列時間歷程查詢範例會選擇指定日期和時間的 CloudTrail 資料。

```
SELECT * FROM iceberg_table FOR TIMESTAMP AS OF TIMESTAMP '2020-01-01 10:00:00 UTC'
```

```
SELECT * FROM iceberg_table FOR TIMESTAMP AS OF (current_timestamp - interval '1' day)
```

## 版本歷程查詢
<a name="querying-iceberg-version-travel-queries"></a>

若要執行版本歷程查詢 (即查看指定版本統一顯示的快照)，請在 `SELECT` 陳述式中的資料表名稱後加上 `FOR VERSION AS OF version`，如下列範例所示。

```
SELECT * FROM [db_name.]table_name FOR VERSION AS OF version         
```

*版本*參數是與 Iceberg 資料表版本相關的 `bigint` 快照 ID。

下列範例的版本歷程查詢會選擇指定版本的資料。

```
SELECT * FROM iceberg_table FOR VERSION AS OF 949530903748831860
```

**注意**  
Athena 引擎版本 2 版中的 `FOR SYSTEM_TIME AS OF` 和 `FOR SYSTEM_VERSION AS OF` 子句已由 Athena 引擎版本 3 中的 `FOR TIMESTAMP AS OF` and `FOR VERSION AS OF` 子句取代。

### 擷取快照 ID
<a name="querying-iceberg-table-snapshot-id"></a>

您可以使用 Iceberg 提供的 Java [SnapshotUtil](https://iceberg.apache.org/javadoc/1.6.0/org/apache/iceberg/util/SnapshotUtil.html) 類別來擷取 Iceberg 快照 ID，如下列範例所示。

```
import org.apache.iceberg.Table;
import org.apache.iceberg.aws.glue.GlueCatalog;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.util.SnapshotUtil;

import java.text.SimpleDateFormat;
import java.util.Date;

Catalog catalog = new GlueCatalog();

Map<String, String> properties = new HashMap<String, String>();
properties.put("warehouse", "s3://amzn-s3-demo-bucket/my-folder");
catalog.initialize("my_catalog", properties);

Date date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse("2022/01/01 00:00:00");
long millis = date.getTime();

TableIdentifier name = TableIdentifier.of("db", "table");
Table table = catalog.loadTable(name);
long oldestSnapshotIdAfter2022 = SnapshotUtil.oldestAncestorAfter(table, millis);
```

## 結合時間和版本歷程
<a name="querying-iceberg-combining-time-and-version-travel"></a>

您可在同一查詢中使用時間歷程查詢和版本歷程查詢語法來指定不同的時間和版本控制條件，如下列範例所示。

```
SELECT table1.*, table2.* FROM 
  [db_name.]table_name FOR TIMESTAMP AS OF (current_timestamp - interval '1' day) AS table1 
  FULL JOIN 
  [db_name.]table_name FOR VERSION AS OF 5487432386996890161 AS table2 
  ON table1.ts = table2.ts 
  WHERE (table1.id IS NULL OR table2.id IS NULL)
```

# 更新 Iceberg 資料表資料
<a name="querying-iceberg-updating-iceberg-table-data"></a>

您可以使用 `INSERT`、`UPDATE` 和 `DELETE` 查詢，直接在 Athena 上管理 Iceberg 資料表資料。每次資料管理異動都會產生新的快照，使用時間歷程查詢可查詢此快照。`UPDATE` 和 `DELETE` 陳述式遵循 Iceberg v2 格式的資料列級[位置刪除](https://iceberg.apache.org/spec/#position-delete-files)規格，並強制執行快照隔離。

**注意**  
Athena SQL 目前不支援寫入時複製方法。無論指定的資料表屬性為何，`UPDATE`、`MERGE INTO` 和 `DELETE FROM` 操作一律使用讀取時合併方法和位置刪除。如果您已設定資料表屬性 (例如 `write.update.mode`、`write.merge.mode` 及/或 `write.delete.mode` 以使用寫入時複製)，則您的查詢不會失敗，因為 Athena 會忽略它們並繼續使用讀取時合併。

使用以下命令對 Iceberg 資料表執行資料管理操作。

**Topics**
+ [INSERT INTO](querying-iceberg-insert-into.md)
+ [DELETE](querying-iceberg-delete.md)
+ [UPDATE](querying-iceberg-update.md)
+ [合併為](querying-iceberg-merge-into.md)

# INSERT INTO
<a name="querying-iceberg-insert-into"></a>

將資料插入 Iceberg 資料表。Athena Iceberg `INSERT INTO` 的收費與目前針對外部 Hive 資料表的 `INSERT INTO` 查詢相同，即按掃描的資料量收費。若要將資料插入 Iceberg 資料表，請使用以下語法，其中*查詢*可能是 `VALUES (val1, val2, ...)` 或 `SELECT (col1, col2, …) FROM [db_name.]table_name WHERE predicate`。如需有關 SQL 語法和語意的詳細資訊，則請參閱 [INSERT INTO](insert-into.md)。

```
INSERT INTO [db_name.]table_name [(col1, col2, …)] query
```

下列範例會將值插入資料表 `iceberg_table` 中。

```
INSERT INTO iceberg_table VALUES (1,'a','c1')
```

```
INSERT INTO iceberg_table (col1, col2, ...) VALUES (val1, val2, ...)
```

```
INSERT INTO iceberg_table SELECT * FROM another_table
```

# DELETE
<a name="querying-iceberg-delete"></a>

Athena Iceberg `DELETE` 將 Iceberg 位置刪除檔案寫入資料表。這稱為讀取時合併刪除。與寫入時複製刪除不同，讀取時合併刪除效率更高，因為它不會重寫檔案資料。當 Athena 讀取 Iceberg 資料時，它將 Iceberg 位置刪除檔案與資料檔案合併，以產生資料表的最新檢視。若要刪除這些位置刪除檔案，您可以執行[重寫資料壓縮動作](querying-iceberg-data-optimization.md#querying-iceberg-data-optimization-rewrite-data-action)。`DELETE` 操作將按掃描的資料量計費。如需語法，請參閱[DELETE](delete-statement.md)。

下列範例會刪除 `iceberg_table` 中 `category` 值為 `c3` 的資料列。

```
DELETE FROM iceberg_table WHERE category='c3'
```

# UPDATE
<a name="querying-iceberg-update"></a>

Athena Iceberg `UPDATE` 將 Iceberg 位置刪除檔案和最新更新的資料列寫為相同交易中的資料檔案。`UPDATE` 可以想象為 `INSERT INTO` 和 `DELETE`。`UPDATE` 操作將按掃描的資料量計費。如需語法，請參閱[UPDATE](update-statement.md)。

下列範例會更新資料表 `iceberg_table` 中的指定值。

```
UPDATE iceberg_table SET category='c2' WHERE category='c1'
```

# 合併為
<a name="querying-iceberg-merge-into"></a>

有條件地更新、刪除資料列或將其插入至 Iceberg 資料表。單一陳述式可以組合更新、刪除和插入動作。如需語法，請參閱[合併為](merge-into-statement.md)。

**注意**  
`MERGE INTO` 是交易型的並且僅由 Athena 引擎版本 3 中的 Apache Iceberg 資料表支援。

下列範例會從來源資料表 `s` 中的資料表 `t` 刪除所有客戶。

```
MERGE INTO accounts t USING monthly_accounts_update s
ON t.customer = s.customer
WHEN MATCHED
THEN DELETE
```

下列範例會使用來源資料表 `s` 中的客戶資訊更新目標資料表 `t`。對於資料表 `s` 中具有相符客戶資料列之資料表 `t` 中的客戶資料列，此範例會在資料表 t 中遞增購買項目。如果資料表 `t` 與資料表 `s` 中的客戶資料列不相符，則該範例會將客戶資料列從資料表 `s` 插入到資料表 `t` 中。

```
MERGE INTO accounts t USING monthly_accounts_update s
    ON (t.customer = s.customer)
    WHEN MATCHED
        THEN UPDATE SET purchases = s.purchases + t.purchases
    WHEN NOT MATCHED
        THEN INSERT (customer, purchases, address)
              VALUES(s.customer, s.purchases, s.address)
```

下列範例會使用來源資料表 `s` 中的資訊偶爾更新目標資料表 `t`。此範例會刪除來源地址為森特維爾的任何相符的目標資料列。對於所有其他相符的資料列，此範例會新增來源購買項目，並將目標地址設定為來源地址。如果目標資料表中沒有相符項目，則範例會從來源資料表插入資料列。

```
MERGE INTO accounts t USING monthly_accounts_update s
    ON (t.customer = s.customer)
    WHEN MATCHED AND s.address = 'Centreville'
        THEN DELETE
    WHEN MATCHED
        THEN UPDATE
            SET purchases = s.purchases + t.purchases, address = s.address
    WHEN NOT MATCHED
        THEN INSERT (customer, purchases, address)
              VALUES(s.customer, s.purchases, s.address)
```

# 管理 Iceberg 資料表
<a name="querying-iceberg-managing-tables"></a>

Athena 支援 Iceberg 資料表的以下資料表 DDL 操作。

**Topics**
+ [ALTER TABLE RENAME](querying-iceberg-alter-table-rename.md)
+ [ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md)
+ [ALTER TABLE UNSET TBLPROPERTIES](querying-iceberg-alter-table-unset-properties.md)
+ [DESCRIBE](querying-iceberg-describe-table.md)
+ [DROP TABLE](querying-iceberg-drop-table.md)
+ [SHOW CREATE TABLE](querying-iceberg-show-create-table.md)
+ [SHOW TBLPROPERTIES](querying-iceberg-show-table-properties.md)

# ALTER TABLE RENAME
<a name="querying-iceberg-alter-table-rename"></a>

重新命名資料表。

由於 Iceberg 資料表的資料表中繼資料存放在 Amazon S3 中，因此您可以更新 Iceberg 受管資料表的資料庫和資料表名稱，而不會影響基礎資料表資訊。

## 概要
<a name="querying-iceberg-alter-table-rename-synopsis"></a>

```
ALTER TABLE [db_name.]table_name RENAME TO [new_db_name.]new_table_name
```

## 範例
<a name="querying-iceberg-alter-table-rename-example"></a>

```
ALTER TABLE my_db.my_table RENAME TO my_db2.my_table2
```

# ALTER TABLE SET TBLPROPERTIES
<a name="querying-iceberg-alter-table-set-properties"></a>

新增 Iceberg 資料表的屬性並設定他們的指定值。

根據 [Iceberg 規格](https://iceberg.apache.org/#spec/#table-metadata-fields)，資料表屬性會儲存在 Iceberg 資料表中繼資料檔案中，而不是儲存在 AWS Glue中。Athena 不接受自訂資料表屬性。有關允許使用的鍵值對，請參閱 [指定資料表屬性](querying-iceberg-creating-tables.md#querying-iceberg-table-properties) 部分。您也可以使用 `ALTER TABLE SET TBLPROPERTIES`和 `ALTER TABLE UNSET TBLPROPERTIES` 來設定或移除 `write.data.path`和 `write.object-storage.path` Iceberg 資料表屬性。如果您希望 Athena 支援特定的開放原始碼資料表組態屬性，請將意見回饋傳送至 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)。

## 概要
<a name="querying-iceberg-alter-table-set-properties-synopsis"></a>

```
ALTER TABLE [db_name.]table_name SET TBLPROPERTIES ('property_name' = 'property_value' [ , ... ])
```

## 範例
<a name="querying-iceberg-alter-table-set-properties-example"></a>

```
ALTER TABLE iceberg_table SET TBLPROPERTIES (
  'format'='parquet',
  'write_compression'='snappy',
  'optimize_rewrite_delete_file_threshold'='10'
)
```

下列範例會在現有的 Iceberg 資料表上設定 `write.data.path` 屬性。

```
ALTER TABLE iceberg_table SET TBLPROPERTIES (
  'write.data.path'='s3://amzn-s3-demo-bucket/your-folder/data'
)
```

# ALTER TABLE UNSET TBLPROPERTIES
<a name="querying-iceberg-alter-table-unset-properties"></a>

捨棄 Iceberg 資料表的現有屬性。

## 概要
<a name="querying-iceberg-alter-table-unset-properties-synopsis"></a>

```
ALTER TABLE [db_name.]table_name UNSET TBLPROPERTIES ('property_name' [ , ... ])
```

## 範例
<a name="querying-iceberg-alter-table-unset-properties-example"></a>

```
ALTER TABLE iceberg_table UNSET TBLPROPERTIES ('write_compression')
```

下列範例會從 Iceberg 資料表移除 `write.data.path` 屬性。

```
ALTER TABLE iceberg_table UNSET TBLPROPERTIES ('write.data.path')
```

# DESCRIBE
<a name="querying-iceberg-describe-table"></a>

描述資料表資訊。

## 概要
<a name="querying-iceberg-describe-table-synopsis"></a>

```
DESCRIBE [FORMATTED] [db_name.]table_name
```

當指定 `FORMATTED` 選項時，輸出會顯示資料表位置和屬性等其他資訊。

## 範例
<a name="querying-iceberg-describe-table-example"></a>

```
DESCRIBE iceberg_table
```

# DROP TABLE
<a name="querying-iceberg-drop-table"></a>

捨棄 Iceberg 資料表。

**警告**  
因為 Iceberg 資料表在 Athena 中被視為受管資料表，因此捨棄 Iceberg 資料表也會刪除資料表中的所有資料。

## 概要
<a name="querying-iceberg-drop-table-synopsis"></a>

```
DROP TABLE [IF EXISTS] [db_name.]table_name
```

## 範例
<a name="querying-iceberg-drop-table-example"></a>

```
DROP TABLE iceberg_table
```

# SHOW CREATE TABLE
<a name="querying-iceberg-show-create-table"></a>

顯示可用於在 Athena 中重新建立 Iceberg 資料表的 `CREATE TABLE` DDL 陳述式。如果 Athena 無法重現資料表結構 (例如，由於在資料表中指定了自訂資料表屬性)，則會擲回 UNSUPPORTED (不受支援的) 錯誤。

## 概要
<a name="querying-iceberg-show-create-table-synopsis"></a>

```
SHOW CREATE TABLE [db_name.]table_name
```

## 範例
<a name="querying-iceberg-show-create-table-example"></a>

```
SHOW CREATE TABLE iceberg_table
```

# SHOW TBLPROPERTIES
<a name="querying-iceberg-show-table-properties"></a>

顯示 Iceberg 資料表的一個或多個資料表屬性。僅顯示 Athena 支援的資料表屬性。

## 概要
<a name="querying-iceberg-show-table-properties-synopsis"></a>

```
SHOW TBLPROPERTIES [db_name.]table_name [('property_name')]
```

## 範例
<a name="querying-iceberg-show-table-properties-example"></a>

```
SHOW TBLPROPERTIES iceberg_table
```

# 演進 Iceberg 資料表結構描述
<a name="querying-iceberg-evolving-table-schema"></a>

Iceberg 結構描述更新只會變更中繼資料。執行結構描述更新時，不會更改任何資料檔案。

Iceberg 格式支持以下結構描述的變化：
+ **Add** – 在資料表或巢狀 `struct` 中新增資料欄。
+ **Drop** – 在資料表或巢狀 `struct` 中移除現有的資料欄。
+ **Rename** – 重新命名巢狀 `struct` 中現有的資料欄或欄位。
+ **Reorder** – 變更資料欄的順序。
+  **Type promotion** – 增加可用的資料欄、`struct` 欄位、`map` 鍵、`map` 值或 `list` 元素類型。目前，Iceberg 資料表會支援以下情況：
  + 整數到大整數
  + float 到 double
  + 增加十進制類型的精度

您可以使用本節中的 DDL 陳述式來修改 Iceberg 資料表結構描述。

**Topics**
+ [ALTER TABLE ADD COLUMNS](querying-iceberg-alter-table-add-columns.md)
+ [ALTER TABLE DROP COLUMN](querying-iceberg-alter-table-drop-column.md)
+ [ALTER TABLE CHANGE COLUMN](querying-iceberg-alter-table-change-column.md)
+ [SHOW COLUMNS](querying-iceberg-show-columns.md)

# ALTER TABLE ADD COLUMNS
<a name="querying-iceberg-alter-table-add-columns"></a>

在現有資料表中新增一或多個資料欄。

## 概要
<a name="querying-iceberg-alter-table-add-columns-synopsis"></a>

```
ALTER TABLE [db_name.]table_name ADD COLUMNS (col_name data_type [,...])
```

## 範例
<a name="querying-iceberg-alter-table-add-columns-example"></a>

下列範例會將 `string` 類型的 `comment` 資料欄新增至 Iceberg 資料表。

```
ALTER TABLE iceberg_table ADD COLUMNS (comment string)
```

下列範例會將 `struct` 類型的 `point` 資料欄新增至 Iceberg 資料表。

```
ALTER TABLE iceberg_table 
ADD COLUMNS (point struct<x: double, y: double>)
```

下列範例會將結構的陣列 `points` 資料欄新增至 Iceberg 資料表。

```
ALTER TABLE iceberg_table 
ADD COLUMNS (points array<struct<x: double, y: double>>)
```

# ALTER TABLE DROP COLUMN
<a name="querying-iceberg-alter-table-drop-column"></a>

捨棄 Iceberg 資料表的資料欄。

## 概要
<a name="querying-iceberg-alter-table-drop-column-synopsis"></a>

```
ALTER TABLE [db_name.]table_name DROP COLUMN col_name
```

## 範例
<a name="querying-iceberg-alter-table-drop-column-example"></a>

```
ALTER TABLE iceberg_table DROP COLUMN userid
```

# ALTER TABLE CHANGE COLUMN
<a name="querying-iceberg-alter-table-change-column"></a>

變更 Iceberg 資料表中資料欄的名稱、類型、順序或註解。

**注意**  
不支援 `ALTER TABLE REPLACE COLUMNS`。由於 `REPLACE COLUMNS` 會刪除所有資料欄，然後新增新的資料欄，則不支援 Iceberg。`CHANGE COLUMN` 是結構描述變化的偏好語法。

## 概要
<a name="querying-iceberg-alter-table-change-column-synopsis"></a>

```
ALTER TABLE [db_name.]table_name
  CHANGE [COLUMN] col_old_name col_new_name column_type 
  [COMMENT col_comment] [FIRST|AFTER column_name]
```

## 範例
<a name="querying-iceberg-alter-table-change-column-example"></a>

```
ALTER TABLE iceberg_table CHANGE comment blog_comment string AFTER id
```

# SHOW COLUMNS
<a name="querying-iceberg-show-columns"></a>

顯示資料表中的資料欄。

## 概要
<a name="querying-iceberg-show-columns-synopsis"></a>

```
SHOW COLUMNS (FROM|IN) [db_name.]table_name
```

## 範例
<a name="querying-iceberg-alter-table-change-column-example"></a>

```
SHOW COLUMNS FROM iceberg_table
```

# 在 Iceberg 資料表上執行其他 DDL 操作
<a name="querying-iceberg-additional-operations"></a>

除了 [演進 Iceberg 資料表結構描述](querying-iceberg-evolving-table-schema.md) 中所述的結構描述演變操作之外，您也可以在 Athena 中的 Apache Iceberg 資料表上執行下列 DDL 操作。

## 資料庫層級操作
<a name="querying-iceberg-additional-operations-database-level-operations"></a>

當您搭配使用 [DROP DATABASE](drop-database.md) 與 `CASCADE` 選項時，則任何 Iceberg 資料表資料也會被刪除。以下 DDL 操作對 Iceberg 資料表沒有影響。
+ [CREATE DATABASE](create-database.md)
+ [ALTER DATABASE SET DBPROPERTIES](alter-database-set-dbproperties.md)
+ [SHOW DATABASES](show-databases.md)
+ [SHOW TABLES](show-tables.md)
+ [SHOW VIEWS](show-views.md)

## 分割區相關操作
<a name="querying-iceberg-additional-operations-partition-related-operations"></a>

因為 Iceberg 資料表使用[隱藏的分割](https://iceberg.apache.org/docs/latest/partitioning/#icebergs-hidden-partitioning)，您不必直接使用實體分割區。因此，Athena 中的 Iceberg 資料表不支援以下與分割區相關的 DDL 操作：
+ [SHOW PARTITIONS](show-partitions.md)
+ [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)
+ [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)
+ [ALTER TABLE RENAME PARTITION](alter-table-rename-partition.md)

如果您希望查看 Athena 中的 Iceberg [分割區演變](https://iceberg.apache.org/docs/latest/evolution/#partition-evolution)，請將意見回饋傳送至 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)。

## 卸載 Iceberg 資料表
<a name="querying-iceberg-additional-operations-unload-iceberg-table"></a>

Iceberg 資料表可以卸載至 Amazon S3 上資料夾中的檔案。如需相關資訊，請參閱[UNLOAD](unload.md)。

## MSCK REPAIR
<a name="querying-iceberg-additional-operations-msck-repair"></a>

由於 Iceberg 資料表會追蹤資料表配置資訊，因此不必也不支援像使用 Hive 資料表那樣執行 [MSCK REPAIR TABLE](msck-repair-table.md)。

# 最佳化 Iceberg 資料表
<a name="querying-iceberg-data-optimization"></a>

Athena 提供多種最佳化功能，可改善 Apache Iceberg 資料表上的查詢效能。隨著資料累積，由於檔案處理開銷增加，以及套用儲存在 Iceberg 刪除檔案中的資料列層級刪除的運算成本增加，查詢效率可能會降低。為了解決這些挑戰，Athena 支援手動壓縮和清空運算子，以最佳化資料表結構。Athena 也使用 Iceberg 統計資料來啟用成本型查詢最佳化和 Parquet 資料欄索引，以便在查詢執行期間精確刪除資料。這些功能可共同運作，以減少查詢執行時間、將資料掃描降至最低，並降低成本。本主題說明如何使用這些最佳化功能來維護 Iceberg 資料表上的高效能查詢。

## OPTIMIZE
<a name="querying-iceberg-data-optimization-rewrite-data-action"></a>

`OPTIMIZE table REWRITE DATA` 壓縮動作會根據相關 delete 檔案的大小和數量，將資料檔案重寫成更好的版面配置。如需有關語法和資料表屬性的詳細資訊，則請參閱 [OPTIMIZE](optimize-statement.md)。

### 範例
<a name="querying-iceberg-data-optimization-example"></a>

下列範例將 delete 檔案合併到資料檔案中，並產生接近目標檔案大小的檔案，其中 `category` 的值是 `c1`。

```
OPTIMIZE iceberg_table REWRITE DATA USING BIN_PACK
  WHERE category = 'c1'
```

## VACUUM
<a name="querying-iceberg-vacuum"></a>

`VACUUM` 會執行[快照過期](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots)和[孤立檔案移除](https://iceberg.apache.org/docs/latest/spark-procedures/#remove_orphan_files)。這些動作會減少中繼資料大小，並移除不在目前資料表狀態的檔案，這些檔案也早於為資料表指定的保留期間。如需有關語法的詳細資訊，則請參閱 [VACUUM](vacuum-statement.md)。

### 範例
<a name="querying-iceberg-vacuum-example"></a>

下列範例會使用資料表屬性來將資料表 `iceberg_table` 設定為保留最近三天的資料，然後使用 `VACUUM` 將舊快照集設為過期，並從資料表中移除孤立檔案。

```
ALTER TABLE iceberg_table SET TBLPROPERTIES (
  'vacuum_max_snapshot_age_seconds'='259200'
)

VACUUM iceberg_table
```

## 使用 Iceberg 資料表統計資料
<a name="querying-iceberg-data-optimization-statistics"></a>

Athena 的成本型最佳化工具使用 Iceberg 統計資料來產生最佳查詢計劃。為您的 Iceberg 資料表產生統計資料後，Athena 會自動使用此資訊來做出有關聯結排序、篩選條件和彙總行為的智慧型決策，通常可改善查詢效能並降低成本。

當您使用 S3 Tables 時，預設會開啟 Iceberg 統計資料。對於其他 Iceberg 資料表，Athena 會使用資料表屬性`use_iceberg_statistics`來判斷是否利用統計資料進行成本型最佳化。若要開始使用，請參閱*AWS Glue 《 使用者指南*》中的[使用資料欄統計資料最佳化查詢效能](https://docs.aws.amazon.com//glue/latest/dg/column-statistics.html)，或使用 [Athena 主控台](https://docs.aws.amazon.com/athena/latest/ug/cost-based-optimizer.html)在 Iceberg 資料表上產生隨需統計資料。

## 使用 Parquet 資料欄索引
<a name="querying-iceberg-data-optimization-parquet-column-indexing"></a>

Parquet 資料欄索引除了資料列群組層級統計資料之外，還利用頁面層級的最小/最大統計資料，讓 Athena 能夠在查詢執行期間執行更精確的資料刪除。這可讓 Athena 略過資料列群組中不必要的頁面，大幅減少掃描的資料量並改善查詢效能。它最適合對排序資料欄使用選擇性篩選條件述詞的查詢，改善執行時間和資料掃描效率，同時減少 Athena 從 Amazon S3 讀取所需的資料量。

如果基礎 Parquet 檔案中存在資料欄索引，則 Athena 預設會將 Parquet 資料欄索引與 S3 Tables 搭配使用。對於其他 Iceberg 資料表，Athena 會使用 `use_iceberg_parquet_column_index` 屬性來決定是否使用 Parquet 檔案中的資料欄索引。使用 AWS Glue 主控台或 `UpdateTable` API 設定此資料表屬性。

# 查詢 AWS Glue Data Catalog 具體化視觀表
<a name="querying-iceberg-gdc-mv"></a>

Athena 可讓您查詢 AWS Glue Data Catalog 具體化視觀表。Glue Data Catalog 具體化檢視會將 SQL 查詢的預先計算結果儲存為 Apache Iceberg 資料表。

當您在 Amazon EMR 中使用 Apache Spark 建立 Glue Data Catalog 具體化視觀表時 AWS Glue，視觀表定義和中繼資料會存放在 AWS Glue Data Catalog 中。預先計算的結果會儲存為 Amazon S3 中的 Apache Iceberg 資料表。您可以使用標準 SQL `SELECT`陳述式從 Athena 查詢這些具體化視觀表，就像查詢一般 Iceberg 資料表一樣。

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

在 Athena 中查詢具體化視觀表之前，請確定下列事項：
+ 具體化視觀表存在於 AWS Glue 資料目錄中，並使用 Apache Spark (Amazon EMR 7.12.0 版或更新版本，或 5.1 AWS Glue 版或更新版本） 建立
+ 若要在 Athena 中查詢具體化視觀表，您需要下列 AWS Lake Formation 許可：
  + `SELECT` 具體化檢視的 許可
  + `DESCRIBE` 具體化檢視的 許可
  + 存取存放具體化檢視資料的基礎 Amazon S3 位置
+ 具體化視觀表的基礎資料存放在 Amazon S3 Table 儲存貯體或 Amazon S3 一般用途儲存貯體中
+ 您可以存取包含具體化檢視的 AWS Glue Data Catalog 資料庫
+ 對於存放在 Amazon S3 Tables 儲存貯體中的具體化視觀表，請確保您的 IAM 角色具有存取 S3 Tables 目錄的必要許可。

## 考量和限制
<a name="querying-iceberg-gdc-mv-considerations"></a>
+ Athena 不支援具體化視觀表的下列操作：`ALTER`、`CREATE MATERIALIZED VIEW`、`REFRESH MATERIALIZED VIEW`、`DROP``INSERT`、、`UPDATE`、`MERGE``DELETE`、`OPTIMIZE`、、`VACUUM`、。若要建立具體化視觀表，請在 Amazon EMR 或 中使用 Apache Spark AWS Glue。重新整理操作必須透過 AWS Glue Data Catalog API 或 Apache Spark 執行。使用 Apache Spark 修改具體化視觀表。

## 查詢具體化視觀表
<a name="querying-iceberg-gdc-mv-operations"></a>

Athena 將具體化視觀表視為讀取操作的標準 Iceberg 資料表，可讓您存取預先運算的資料，而不需要特殊語法或組態變更。

若要在 Athena 中查詢具體化視觀表，請使用標準`SELECT`陳述式：

```
SELECT * FROM my_database.sales_summary_mv;
```

您可以套用篩選條件、彙總和聯結，就像使用一般資料表一樣：

```
SELECT
  region,
  SUM(total_sales) as sales_total
FROM my_database.sales_summary_mv
WHERE year = 2025
GROUP BY region
ORDER BY sales_total DESC;
```

## 受支援的操作
<a name="querying-iceberg-gdc-mv-supported"></a>

Athena 支援具體化視觀表的下列操作：
+ `SELECT` 查詢 - 使用標準 SQL `SELECT`陳述式從具體化視觀表讀取資料
+ `DESCRIBE` - 檢視具體化視觀表的結構描述和中繼資料
+ `SHOW TABLES` - 列出具體化視觀表以及資料庫中的其他資料表
+ `JOIN` 操作 - 將具體化視觀表與其他資料表或視觀表聯結
+ 篩選和彙總 - 套用`WHERE`子句`GROUP BY`、 和彙總函數

# Athena 中 Iceberg 資料表支援的資料類型
<a name="querying-iceberg-supported-data-types"></a>

Athena 可以查詢包含下列資料類型的 Iceberg 資料表：

```
binary
boolean
date
decimal
double
float
int
list
long
map
string
struct
timestamp without time zone
```

如需有關 Iceberg 資料表類型的詳細資訊，請參閱 Apache 文件中的 [Iceberg 結構描述頁](https://iceberg.apache.org/docs/latest/schemas/)。

下表顯示 Athena 資料類型與 Iceberg 資料表資料類型之間的關係。


****  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/querying-iceberg-supported-data-types.html)

如需有關 Athena 中資料類型的詳細資訊，請參閱[Amazon Athena 中的資料類型](data-types.md)。

# 其他資源
<a name="querying-iceberg-additional-resources"></a>

以下文章位於 AWS 規範性指導文件中。
+ [使用 Amazon Athena SQL 處理 Apache Iceberg 資料表](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/iceberg-athena.html) 

如需有關搭配使用 Athena 與 Apache Iceberg 資料表的深度文章，請參閱 *AWS 大數據部落格*中的下列文章。
+ [搭配使用 Apache Iceberg 與 Amazon DynamoDB 和 Amazon Athena，實作無伺服器 CDC 程序](https://aws.amazon.com/blogs/big-data/implement-a-serverless-cdc-process-with-apache-iceberg-using-amazon-dynamodb-and-amazon-athena/) 
+ [搭配使用 Amazon Athena 與 Apache Iceberg，加速交易資料湖上的資料科學特徵工程](https://aws.amazon.com/blogs/big-data/accelerate-data-science-feature-engineering-on-transactional-data-lakes-using-amazon-athena-with-apache-iceberg/) 
+ [使用 Amazon Athena、Amazon EMR 和 建置 Apache Iceberg 資料湖 AWS Glue](https://aws.amazon.com/blogs/big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/) 
+ [使用 Amazon Athena 和 Apache Iceberg 執行資料湖中的 upsert](https://aws.amazon.com/blogs/big-data/perform-upserts-in-a-data-lake-using-amazon-athena-and-apache-iceberg/) 
+ [使用 Apache Iceberg 建置交易資料湖 AWS Glue，並使用 和 Amazon Athena AWS Lake Formation 建立跨帳戶資料共用](https://aws.amazon.com/blogs/big-data/build-a-transactional-data-lake-using-apache-iceberg-aws-glue-and-cross-account-data-shares-using-aws-lake-formation-and-amazon-athena/) 
+ [在資料湖中使用 Apache Iceberg 來支援增量資料處理](https://aws.amazon.com/blogs/big-data/use-apache-iceberg-in-a-data-lake-to-support-incremental-data-processing/) 
+ [建置即時 GDPR 對齊的 Apache Iceberg 資料湖](https://aws.amazon.com/blogs/big-data/build-a-real-time-gdpr-aligned-apache-iceberg-data-lake/) 
+ [使用 Apache Iceberg 和 自動將關聯式來源複寫到交易資料湖 AWS Glue](https://aws.amazon.com/blogs/big-data/automate-replication-of-relational-sources-into-a-transactional-data-lake-with-apache-iceberg-and-aws-glue/) 
+ [使用 Amazon Athena 與 Apache Iceberg 資料表互動，並使用 跨帳戶微調許可 AWS Lake Formation](https://aws.amazon.com/blogs/big-data/interact-with-apache-iceberg-tables-using-amazon-athena-and-cross-account-fine-grained-permissions-using-aws-lake-formation/) 
+ [使用 Apache Iceberg、Amazon EMR Serverless 和 Amazon Athena 建置無伺服器交易資料湖](https://aws.amazon.com/blogs/big-data/build-a-serverless-transactional-data-lake-with-apache-iceberg-amazon-emr-serverless-and-amazon-athena/) 

# Amazon Athena 安全性
<a name="security"></a>

的雲端安全性 AWS 是最高優先順序。身為 AWS 客戶，您可以受益於資料中心和網路架構，這些架構專為滿足最安全敏感組織的需求而建置。

安全性是 AWS 與您之間的共同責任。[‬共同責任模型‭](https://aws.amazon.com/compliance/shared-responsibility-model/)‬ 將此描述為雲端*‬的‭*‬安全和雲端*‬內*‬的安全：
+ **雲端的安全性** – AWS 負責保護在 Cloud AWS 服務 中執行的 AWS 基礎設施。 AWS 也為您提供可安全使用的服務。第三方稽核人員定期檢測及驗證安全的效率也是我們 [AWS 合規計劃](https://aws.amazon.com/compliance/programs/)的一部分。若要進一步了解適用於 Athena 的合規計劃，請參閱[合規計劃範圍內的AWS 服務](https://aws.amazon.com/compliance/services-in-scope/)。
+ **雲端的安全性** – 您的責任取決於您使用 AWS 服務 的 。您也必須對其他因素負責，包括資料的敏感度、您組織的需求和適用的法律及法規。

本文件協助您了解如何在使用 Amazon Athena 時套用共同的責任模型。下列主題說明如何設定 Athena 以滿足您的安全與合規目標。您也將了解如何使用其他 AWS 服務 來協助您監控和保護 Athena 資源。

**Topics**
+ [Athena 中的資料保護](security-data-protection.md)
+ [Athena 中的 Identity and Access Management](security-iam-athena.md)
+ [記錄並監控 Athena](security-logging-monitoring.md)
+ [的合規驗證](security-compliance-validation.md)
+ [Athena 中的復原功能](security-resilience.md)
+ [Athena 中的基礎設施安全](security-infrastructure.md)
+ [Athena 中的組態與漏洞分析](security-vulnerability-management.md)
+ [使用 Athena 查詢向 註冊的資料 AWS Lake Formation](security-athena-lake-formation.md)

# Athena 中的資料保護
<a name="security-data-protection"></a>

 AWS [共同責任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)適用於 中的資料保護。如此模型所述， AWS 負責保護執行所有 的全域基礎設施 AWS 雲端。您負責維護在此基礎設施上託管內容的控制權。您也同時負責所使用 AWS 服務 的安全組態和管理任務。如需資料隱私權的詳細資訊，請參閱[資料隱私權常見問答集](https://aws.amazon.com/compliance/data-privacy-faq/)。如需有關歐洲資料保護的相關資訊，請參閱*AWS 安全性部落格*上的[AWS 共同責任模型和 GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 部落格文章。

基於資料保護目的，我們建議您保護 AWS 帳戶 登入資料，並使用 AWS IAM Identity Center 或 AWS Identity and Access Management (IAM) 設定個別使用者。如此一來，每個使用者都只會獲得授與完成其任務所必須的許可。我們也建議您採用下列方式保護資料：
+ 每個帳戶均要使用多重要素驗證 (MFA)。
+ 使用 SSL/TLS 與 AWS 資源通訊。我們需要 TLS 1.2 並建議使用 TLS 1.3。
+ 使用 設定 API 和使用者活動記錄 AWS CloudTrail。如需有關使用 CloudTrail 追蹤擷取 AWS 活動的資訊，請參閱*AWS CloudTrail 《 使用者指南*》中的[使用 CloudTrail 追蹤](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)。
+ 使用 AWS 加密解決方案，以及其中的所有預設安全控制 AWS 服務。
+ 使用進階的受管安全服務 (例如 Amazon Macie)，協助探索和保護儲存在 Amazon S3 的敏感資料。
+ 如果您在 AWS 透過命令列界面或 API 存取 時需要 FIPS 140-3 驗證的密碼編譯模組，請使用 FIPS 端點。如需有關 FIPS 和 FIPS 端點的更多相關資訊，請參閱[聯邦資訊處理標準 (FIPS) 140-3](https://aws.amazon.com/compliance/fips/)。

我們強烈建議您絕對不要將客戶的電子郵件地址等機密或敏感資訊，放在標籤或自由格式的文字欄位中，例如**名稱**欄位。這包括當您使用 或使用主控台、API AWS CLI或其他 AWS 服務 AWS SDKs 時。您在標籤或自由格式文字欄位中輸入的任何資料都可能用於計費或診斷日誌。如果您提供外部伺服器的 URL，我們強烈建議請勿在驗證您對該伺服器請求的 URL 中包含憑證資訊。

作為額外的安全步驟，您也能使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia) 全域條件內容索引鍵來限制僅能有從 Athena 進行的請求。如需詳細資訊，請參閱[針對 Athena 使用 CalledVia 內容索引鍵](security-iam-athena-calledvia.md)。

## 保護多種資料類型
<a name="security-data-protection-types-of-data"></a>

使用 Athena 建立資料庫和資料表時，涉及多種類型的資料。這些資料類型包括存放在 Amazon S3 中的來源資料、執行查詢時建立之資料庫和資料表的中繼資料，或用於探索資料、查詢結果資料和查詢歷史記錄的 AWS Glue 爬蟲程式。本節討論每個類型的資料，並提供如何保護它的相關指導。
+ **來源資料** – 您將資料庫和資料表的資料存放在 Amazon S3 中，而且 Athena 不會修改它。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的 [Amazon S3 中的資料保護](https://docs.aws.amazon.com/AmazonS3/latest/userguide/DataDurability.html)。您可以控制來源資料的存取，並可在 Simple Storage Service (Amazon S3) 中將其加密。您可以使用 Athena，[根據 Simple Storage Service (Amazon S3) 中的加密資料集建立資料表](creating-tables-based-on-encrypted-datasets-in-s3.md)。
+ **Database and table metadata (schema)** (資料庫和資料表中繼資料 (結構描述)) – Athena 使用讀取時定義結構描述的技術，也就是在 Athena 執行查詢時，您的資料表定義會套用至您在 Simple Storage Service (Amazon S3) 中的資料。您定義的所有結構描述都會自動儲存，除非您確實將其刪除。在 Athena 中，您可以使用 DDL 陳述式來修改資料目錄中繼資料。您也可以刪除資料表定義和結構描述，不會影響存放在 Simple Storage Service (Amazon S3) 中的基礎資料。您在 Athena 中使用之資料庫和資料表的中繼資料會存放在 AWS Glue Data Catalog中。

  您可以使用 AWS Glue Data Catalog AWS Identity and Access Management (IAM) [定義在 中註冊的資料庫和資料表的精細存取政策](fine-grained-access-to-glue-resources.md)。您也可以[加密 AWS Glue Data Catalog的中繼資料](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html)。如果您加密中繼資料，請使用[加密中繼資料的許可](encryption.md#glue-encryption)進行存取。
+ **查詢結果和查詢歷史記錄，包括儲存的查詢** – 查詢結果存放在 Simple Storage Service (Amazon S3) 中您可以選擇來全域指定，或針對每個工作群組指定的位置。如果未指定，Athena 會在每個案例中使用預設位置。您可以控制 Simple Storage Service (Amazon S3) 儲存貯體的存取，而您可在這些儲存貯體中存放查詢結果和已儲存的查詢。此外，您還可以選擇加密您存放在 Simple Storage Service (Amazon S3) 中的查詢結果。您的使用者必須擁有適當的許可，才能存取 Simple Storage Service (Amazon S3) 位置和解密檔案。如需詳細資訊，請參閱本文件的[加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)。

  Athena 會將查詢歷史記錄保留 45 天。您可以使用 Athena APIs、主控台和 來[檢視查詢歷史記錄](queries-viewing-history.md) AWS CLI。若要存放查詢超過 45 天，請將其儲存。若要保護對已儲存查詢的存取權限，請在 Athena 中[使用工作群組](workgroups-manage-queries-control-costs.md)，限制僅有權檢視已儲存查詢的使用者可存取這些查詢。

**Topics**
+ [保護多種資料類型](#security-data-protection-types-of-data)
+ [靜態加密](encryption.md)
+ [傳輸中加密](encryption-in-transit.md)
+ [金鑰管理](key-management.md)
+ [網際網路流量隱私權](internetwork-traffic-privacy.md)

# 靜態加密
<a name="encryption"></a>

您可以在 Amazon Athena 中，針對同一區域和有限數量區域的 Simple Storage Service (Amazon S3) 中的加密資料執行查詢。您也可以加密 Amazon S3 中的查詢結果和 AWS Glue Data Catalog 中的資料。

您可以加密 Athena 中的以下資產：
+ Simple Storage Service (Amazon S3) 中所有查詢的結果，Athena 會將其存放在稱為 Simple Storage Service (Amazon S3) 結果位置的位置。您可以加密存放在 Simple Storage Service (Amazon S3) 中的查詢結果，而不論 Simple Storage Service (Amazon S3) 中的基礎資料集是否加密。如需相關資訊，請參閱[加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)。
+ Data Catalog 中的 AWS Glue 資料。如需相關資訊，請參閱[AWS Glue Data Catalog 中加密中繼資料的許可](#glue-encryption)。

**注意**  
當您使用 Athena 讀取加密資料表時，Athena 會使用為資料表資料指定的加密選項，而不是針對查詢結果的加密選項。如果針對查詢結果和資料表資料設定不同的加密方法或金鑰，則 Athena 讀取資料表資料時，不會使用用於加密或解密查詢結果的加密選項和金鑰。  
不過，如果您使用 Athena 將資料插入具有加密資料的資料表，Athena 會使用為查詢結果指定的加密組態來加密插入的資料。例如，如果您為查詢結果指定`CSE_KMS`加密，Athena 會使用您用於查詢結果加密的相同 AWS KMS 金鑰 ID，以使用 加密插入的資料表資料`CSE_KMS`。

**Topics**
+ [支援的 Amazon S3 加密選項](#encryption-options-S3-and-Athena)
+ [Amazon S3 中加密資料的許可](#permissions-for-encrypting-and-decrypting-data)
+ [AWS Glue Data Catalog 中加密中繼資料的許可](#glue-encryption)
+ [從 CSE-KMS 移轉至 SSE-KMS](migrating-csekms-ssekms.md)
+ [加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)
+ [根據 Amazon S3 中加密的資料集建立資料表](creating-tables-based-on-encrypted-datasets-in-s3.md)

## 支援的 Amazon S3 加密選項
<a name="encryption-options-S3-and-Athena"></a>

Athena 支援下列 Simple Storage Service (Amazon S3) 中資料集和查詢結果的加密選項。


| 加密類型 | Description | 跨區域支援 | 
| --- | --- | --- | 
| [SSE-S3 (SSE-S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html) | 使用 Simple Storage Service (Amazon S3) 受管金鑰的伺服器端加密 (SSE)。 | 是 | 
| [SSE-KMS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html) (建議) | 使用 AWS Key Management Service 客戶受管金鑰的伺服器端加密 (SSE)。 | 是 | 
| [CSE-KMS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html#client-side-encryption-kms-managed-master-key-intro) |  使用 AWS KMS 客戶受管金鑰的用戶端加密 (CSE)。在 Athena 中，此選項要求您使用 `CREATE TABLE`陳述式搭配指定 `'has_encrypted_data'='true'`或 `'encryption_option'='CSE_KMS'` 的 `TBLPROPERTIES` 子句`'kms_key'='kms_key_arn'`。如需詳細資訊，請參閱[根據 Amazon S3 中加密的資料集建立資料表](creating-tables-based-on-encrypted-datasets-in-s3.md)。  | 否 | 

如需使用 Amazon S3 AWS KMS 加密的詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[什麼是 AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 和 [Amazon Simple Storage Service (Amazon S3) 如何使用 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html) 。如需有關搭配 Athena 使用 SSE-KMS 或 CSE-KMS 的詳細資訊，請參閱 *AWS 大數據部落格*的[啟動：Amazon Athena 新增對查詢加密資料的支援](https://aws.amazon.com/blogs/aws/launch-amazon-athena-adds-support-for-querying-encrypted-data/)。

### 加密建議
<a name="encryption-recommendation"></a>

當您使用客戶受管 KMS 金鑰加密和解密資料表資料和查詢結果時，我們建議您使用 SSE-KMS 加密，而非 SSE-S3 或 CSE-KMS 加密方法。SSE-KMS 實現了控制、簡單性和效能的平衡，因此當您使用受管 KMS 金鑰進行資料加密時，建議使用此方法。

**與 SSE-S3 相比，SSE-KMS 的優勢**
+ SSE-KMS 可讓您指定和管理自己的金鑰，以便增強控制。您可以定義金鑰政策、監督金鑰生命週期，以及監控金鑰用量。

**與 CSE-KMS 相比，SSE-KMS 的優勢**
+ CSE-KMS 需要持續維護 S3 加密用戶端，而與此不同的是，SSE-KMS 不需要額外的基礎設施來加密和解密資料。
+ 由於加密演算法不斷發展演進，CSE-KMS 可能會面臨新舊 S3 加密用戶端之間的相容性問題，而 SSE-KMS 則可避免這一問題。
+ 在加密和解密程序期間，為進行金鑰擷取，SSE-KMS 對 KMS 服務發出的 API 呼叫較少，因此相較於 CSE-KMS，可提供更好的效能。

### 不支援的選項
<a name="encryption-unsupported-options"></a>

不支援下列加密選項：
+ 使用客戶提供金鑰的 SSE (SSE-C)。
+ 使用用戶端受管金鑰的用戶端加密。
+ 非對稱金鑰。

若要比較 Amazon S3 加密選項，請參閱《Amazon Simple Storage Service 使用者指南》**中的[使用加密保護資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingEncryption.html)。

### 用戶端加密工具
<a name="encryption-client-side-tools"></a>

 對於用戶端加密，請注意有兩種工具可用：
+ [Amazon S3 加密用戶端](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3EncryptionClient.html) – 這只會為 Amazon S3 加密資料，並由 Athena 支援。
+ [AWS Encryption SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html) – 開發套件可用於跨任何地方加密資料， AWS 但 Athena 不支援。

這些工具不相容，而且使用一個工具加密的資料無法由另一個工具解密。Athena 僅直接支援 Simple Storage Service (Amazon S3) 加密用戶端。如果您使用軟體開發套件來加密資料，您可以從 Athena 執行查詢，但資料會以加密文字傳回。

如果您想要使用 Athena 來查詢已使用 AWS Encryption 軟體開發套件加密的資料，您必須先下載並解密資料，然後使用 Simple Storage Service (Amazon S3) 加密用戶端再次加密資料。

## Amazon S3 中加密資料的許可
<a name="permissions-for-encrypting-and-decrypting-data"></a>

根據您在 Amazon S3 中使用的加密類型，您可能需要針對在 Athena 中使用的政策新增許可 (也稱為「允許」動作)：
+ **SSE-S3** – 如果您使用 SSE-S3 進行加密，Athena 使用者在他們的政策中不需要額外的許可。有適當 Simple Storage Service (Amazon S3) 位置和 Athena 動作的適當 Simple Storage Service (Amazon S3) 許可即已足夠。如需有關允許適當 Athena 和 Simple Storage Service (Amazon S3) 許可的政策的詳細資訊，請參閱[AWS Amazon Athena 的 受管政策](security-iam-awsmanpol.md)和[透過 Athena 控制 Amazon S3 的存取權](s3-permissions.md)。
+ **AWS KMS** – 如果您使用 AWS KMS 進行加密，除了 Athena 和 Amazon S3 許可之外，還必須允許 Athena 使用者執行特定 AWS KMS 動作。您可以透過編輯用於在 Amazon S3 中加密資料的客戶自管金鑰的金鑰政策，來允許這些動作。若要將金鑰使用者新增至適當的 AWS KMS 金鑰政策，您可以使用位於 https：//[https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms) 的 AWS KMS 主控台。如需如何將使用者新增至 AWS KMS 金鑰政策的資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[允許金鑰使用者使用客戶受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users)。
**注意**  
進階金鑰政策管理員可以調整金鑰政策。`kms:Decrypt` 是允許 Athena 使用者使用加密的資料集的最低允許動作。若要使用加密的查詢結果，允許的最低動作為 `kms:GenerateDataKey` 和 `kms:Decrypt`。

  使用 Athena 以大量使用 加密的物件查詢 Amazon S3 中的資料集時 AWS KMS， AWS KMS 可能會調節查詢結果。當存在大量小型物件時，這種情況更有可能發生。Athena 會退回重試請求，但仍可能發生調節錯誤。如果您正在使用大量加密物件且遭遇此問題，一個方法是啟用 Simple Storage Service (Amazon S3) 儲存貯體金鑰以減少對 KMS 的呼叫次數。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[使用 Amazon S3 儲存貯體金鑰降低 SSE-KMS 的成本](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-key.html)。另一種方式是提高您 AWS KMS的服務配額。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[配額](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html#requests-per-second)。

如需有關搭配 Athena 使用 Simple Storage Service (Amazon S3) 時許可的疑難排解資訊，請參閱[對 Athena 中的問題進行疑難排解](troubleshooting-athena.md) 主題的 [許可](troubleshooting-athena.md#troubleshooting-athena-permissions) 一節。

## AWS Glue Data Catalog 中加密中繼資料的許可
<a name="glue-encryption"></a>

如果您在 [中加密中繼資料 AWS Glue Data Catalog](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html)，則必須將 `"kms:GenerateDataKey"`、 `"kms:Decrypt"`和 `"kms:Encrypt"`動作新增至您用於存取 Athena 的政策。如需相關資訊，請參閱[在 中設定從 Athena 到加密中繼資料的存取權 AWS Glue Data Catalog](access-encrypted-data-glue-data-catalog.md)。

# 從 CSE-KMS 移轉至 SSE-KMS
<a name="migrating-csekms-ssekms"></a>

您可以透過兩種方式來指定 CSE-KMS 加密：在工作群組查詢結果加密組態期間以及用戶端設定中。如需詳細資訊，請參閱[加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)。在移轉程序期間，請務必稽核讀取和寫入 CSE-KMS 資料的現有工作流程、識別已設定 CSE-KMS 的工作群組，以及找到透過用戶端參數設定 CSE-KMS 的執行個體。

## 更新工作群組查詢結果加密設定
<a name="migrating-updating-workgroup-query-results-encryption"></a>

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

**在 Athena 主控台中更新加密設定**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) 開啟 Athena 主控台。

1. 在 Athena 主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在 **Workgroups** (工作群組) 頁面上，選取您要編輯的工作群組的按鈕。

1. 選擇 **Actions** (動作)、**Edit** (編輯)。

1. 開啟**查詢結果組態**，然後選擇**加密查詢結果**。

1. 對於**加密類型**區段，選擇 **SSE\$1KMS** 加密選項。

1. 在**選擇不同的 AWS KMS 金鑰 (進階)** 下，輸入您的 KMS 金鑰。

1. 選擇**儲存變更**。更新的工作群組會出現在 **Workgroups** (工作群組) 頁面上的清單。

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

執行下列命令，將工作群組中的查詢結果加密組態更新為 SSE-KMS。

```
aws athena update-work-group \
    --work-group "my-workgroup" \
    --configuration-updates '{
        "ResultConfigurationUpdates": {
            "EncryptionConfiguration": {
                "EncryptionOption": "SSE_KMS",
                "KmsKey": "<my-kms-key>"
            }
        }
    }'
```

------

## 更新用戶端查詢結果加密設定
<a name="migrating-updating-clientside-query-results-encryption"></a>

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

要將查詢結果加密的用戶端設定從 CSE-KMS 更新為 SSE-KMS，請參閱 [加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)。

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

您只能使用 `start-query-execution` 命令在用戶端設定中指定查詢結果加密組態。如果您執行此 CLI 命令，並使用 CSE-KMS 覆寫您在工作群組中指定的查詢結果加密組態，請變更命令以使用 `SSE_KMS` 加密查詢結果，如下所示。

```
aws athena start-query-execution \
    --query-string "SELECT * FROM <my-table>;" \
    --query-execution-context "Database=<my-database>,Catalog=<my-catalog>" \
    --result-configuration '{
        "EncryptionConfiguration": {
            "EncryptionOption": "SSE_KMS",
            "KmsKey": "<my-kms-key>"
        }
    }' \
    --work-group "<my-workgroup>"
```

------

**注意**  
更新工作群組或用戶端設定後，您透過寫入查詢插入的任何新資料都會使用 SSE-KMS 加密而不是 CSE-KMS。這是因為查詢結果加密組態也適用於新插入的資料表資料。Athena 查詢結果、中繼資料和資訊清單檔案也會使用 SSE-KMS 進行加密。
即使混合使用了 CSE-KMS 加密物件和 SSE-S3/SSE-KMS 物件，Athena 仍然可以讀取具有 `has_encrypted_data` 資料表屬性的資料表。

# 將 CSE-KMS 資料表資料轉換為 SSE-KMS
<a name="convert-csekms-table-ssekms"></a>

如果您的工作流程目前使用 CSE-KMS 來進行資料表資料加密，則請依照下列步驟轉換至 SSE-KMS。

## 先決條件
<a name="convert-csekms-table-ssekms-preq"></a>

如果您仍然使用 CSE-KMS 工作群組或用戶端設定寫入資料，則請遵循 [從 CSE-KMS 移轉至 SSE-KMS](migrating-csekms-ssekms.md) 中的步驟，將其更新為 SSE-KMS。這可避免在移轉程序期間從可能寫入資料表的任何其他工作流程中新增新的 CSE-KMS 加密資料。

## 資料遷移
<a name="convert-csekms-table-ssekms-migrat"></a>

1. 檢查資料表是否已將 `has_encrypted_data` 屬性設定為 `true`。此屬性會指定該資料表可能包含 CSE-KMS 加密資料。不過，請務必注意，即使資料表上沒有任何實際 CSE-KMS 加密資料，也可能存在此屬性。

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

   1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) 開啟 Athena 主控台。

   1. 選擇**啟動查詢編輯器**。

   1. 在編輯器左側的**資料庫**下，選擇您要查詢的資料庫。

   1. 在查詢編輯器中，執行下列查詢以查看 `has_encrypted_data table` 屬性所設定的值。

      ```
      SHOW TBLPROPERTIES <table_name>('has_encrypted_data');
      ```

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

   啟動 Athena 查詢，其中會顯示資料表上 `has_encrypted_data` 屬性的值，如下列範例所示。

   ```
   aws athena start-query-execution \
       --query-string "SHOW TBLPROPERTIES <table-name>('has_encrypted_data');" \
       --work-group "<my-workgroup>"
   ```

   擷取查詢結果，以檢查資料表的 `has_encrypted_data` 資料表屬性的值，如下列範例所示。

   ```
   aws athena get-query-results --query-execution-id <query-execution-id-from-previous-step>
   ```

------

1. 適用於資料表中的每個 CSE-KMS 加密物件。

   1. 使用 S3 加密用戶端從 S3 下載物件並將其解密。以下是 AWS Java SDK V2 的範例。

      **匯入**

      ```
      import software.amazon.awssdk.core.ResponseInputStream;
      import software.amazon.awssdk.services.s3.model.GetObjectRequest;
      import software.amazon.awssdk.services.s3.model.GetObjectResponse;
      import software.amazon.encryption.s3.S3EncryptionClient;
      import software.amazon.encryption.s3.materials.Keyring;
      import software.amazon.encryption.s3.materials.KmsDiscoveryKeyring;
      ```

      Code

      ```
      final Keyring kmsDiscoveryKeyRing = KmsDiscoveryKeyring.builder()
              .enableLegacyWrappingAlgorithms(true)
              .build();
      final S3EncryptionClient s3EncryptionClient = S3EncryptionClient.builder()
              .enableLegacyUnauthenticatedModes(true)
              .keyring(kmsDiscoveryKeyRing)
              .build();
      
      GetObjectRequest getObjectRequest = GetObjectRequest.builder()
              .bucket("amzn-s3-demo-bucket")
              .key("<my-key>")
              .build();
      
      ResponseInputStream<GetObjectResponse> s3Object = s3EncryptionClient.getObject(getObjectRequest);
      ```

   1. 以相同的名稱和 SSE-KMS 加密的方式，將物件上傳至 S3。以下是 AWS Java SDK V2 的範例。

      **匯入**

      ```
      import software.amazon.awssdk.core.ResponseInputStream;
      import software.amazon.awssdk.core.sync.RequestBody;
      import software.amazon.awssdk.services.s3.S3Client;
      import software.amazon.awssdk.services.s3.model.PutObjectRequest;
      import software.amazon.awssdk.services.s3.model.ServerSideEncryption;
      ```

      **Code**

      ```
      final S3Client s3Client = S3Client.builder()
              .build();
                  
      PutObjectRequest putObjectRequest = PutObjectRequest.builder()
              .bucket("amzn-s3-demo-bucket")
              .key("<my-key>")
              .serverSideEncryption(ServerSideEncryption.AWS_KMS)
              .ssekmsKeyId("<my-kms-key>")
              .build();
      
      s3Client.putObject(putObjectRequest, RequestBody.fromBytes(s3Object.readAllBytes()));
      ```

## 移轉後
<a name="convert-csekms-table-ssekms-post-migrat"></a>

成功重新加密資料表中的所有 CSE-KMS 檔案後，請執行下列步驟。

1. 從資料表中移除 `has_encrypted_data` 屬性。

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

   1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) 開啟 Athena 主控台。

   1. 選擇**啟動查詢編輯器**。

   1. 在編輯器左側的**資料庫**下，選擇您要查詢的資料庫。

   1. 在查詢編輯器中，為您的資料表執行下列查詢。

      ```
      ALTER TABLE <database-name>.<table-name> UNSET TBLPROPERTIES ('has_encrypted_data')
      ```

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

   執行下列命令，從資料表移除 `has_encrypted_data` 屬性。

   ```
   aws athena start-query-execution \
       --query-string "ALTER TABLE <database-name>.<table-name> UNSET TBLPROPERTIES ('has_encrypted_data');" \
       --work-group "<my-workgroup>"
   ```

------

1. 更新工作流程以使用基本 S3 用戶端而非 S3 加密用戶端，然後為資料寫入指定 SSE-KMS 加密。

# 加密 Amazon S3 中存放的 Athena 查詢結果
<a name="encrypting-query-results-stored-in-s3"></a>

您使用 Athena 主控台或在使用 JDBC 或 ODBC 時設定查詢結果加密。工作群組可讓您強制加密查詢結果。

**注意**  
加密查詢結果時，Athena 會加密查詢寫入的所有物件。這包括陳述式 (例如 `INSERT INTO`、`UPDATE`) 的結果，以及採用 Iceberg 或其他格式的資料查詢。

在主控台中，您透過兩種方式設定查詢結果的加密設定：
+ **用戶端設定** – 當您使用主控台的 **Settings** (設定) 或 API 操作指出您想要加密查詢結果時，這稱為使用用戶端設定。用戶端設定包括查詢結果的位置和加密。如果您指定這些設定，就會派上用場，除非被群組設定所覆寫。
+ **工作群組設定** – 當您[建立或編輯工作群組](creating-workgroups.md)，並選取 **Override client-side settings** (覆寫用戶端設定) 欄位時，在此工作群組中執行的所有查詢會使用工作群組加密和查詢結果位置設定。如需詳細資訊，請參閱[Override client-side settings (覆寫用戶端設定)](workgroups-settings-override.md)。

**若要使用主控台加密存放在 Simple Storage Service (Amazon S3) 中的查詢結果**
**重要**  
如果您的工作群組選取 **Override client-side settings** (覆寫用戶端設定) 欄位，則工作群組中的所有查詢均會使用工作群組設定。不會使用在 Athena 主控台中的**設定**索引標籤上指定，或由 API 操作與 JDBC 和 ODBC 驅動器指定的加密組態和查詢結果位置。如需詳細資訊，請參閱[Override client-side settings (覆寫用戶端設定)](workgroups-settings-override.md)。

1. 在 Athena 主控台中，選擇 **Settings** (設定)。  
![\[Athena 查詢編輯器的設定索引標籤。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/settings.png)

1. 選擇**管理**。

1. 針對 **Location of query result** (查詢結果的位置)，輸入或選擇 Simple Storage Service (Amazon S3) 路徑。這是儲存查詢結果的 Simple Storage Service (Amazon S3) 位置。

1. 選擇 **Encrypt query results** (加密查詢結果)。  
![\[Athena 主控台管理設定頁面上的加密查詢結果選項。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/encrypt-query-results.png)

1. 對於 **Encryption type** (加密類型)，選擇 **CSE-KMS**、**SSE-KMS** 或 **SSE-S3**。在這三個中，**CSE-KMS** 提供了最高級別的加密，而 **SSE-S3** 是最低的。

1. 如果您選擇 **SSE-KMS** 或 **CSE-KMS**，請指定 AWS KMS 金鑰。
   + 針對**選擇 AWS KMS 金鑰**，如果您的帳戶可存取現有的 AWS KMS 客戶受管金鑰，請選擇其別名或輸入 AWS KMS 金鑰 ARN。
   +  如果您的帳戶無法存取現有的客戶受管金鑰，請選擇**建立 AWS KMS 金鑰**，然後開啟[AWS KMS 主控台](https://console.aws.amazon.com/kms)。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[建立金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。
**注意**  
Athena 僅支援用於讀取和寫入資料的對稱金鑰。

1. 返回 Athena 主控台，選擇您透過別名或 ARN 建立的索引鍵。

1. 選擇**儲存**。

## 使用 JDBC 或 ODBC 時加密 Athena 查詢結果
<a name="encrypting-query-results-stored-in-s3-jdbc-odbc"></a>

如果您使用 ODBC 或 JDBC 驅動器連接，您需設定驅動器選項，以指定要使用的加密類型，以及 Amazon S3 臨時目錄位置。若要設定 JDBC 或 ODBC 驅動器，以使用 Athena 支援的任何加密通訊協定來加密您的查詢結果，請參閱 [使用 ODBC 和 JDBC 驅動器連接至 Amazon Athena](athena-bi-tools-jdbc-odbc.md)。

# 根據 Amazon S3 中加密的資料集建立資料表
<a name="creating-tables-based-on-encrypted-datasets-in-s3"></a>

Athena 可以讀取和寫入基礎資料集為 SSE-S3、SSE-KMS 或 CSE-KMS 加密的資料表。根據用於資料表資料的加密選項和執行的查詢類型，您可能需要指定一些額外的資料表屬性，才能讀取和寫入加密的資料。

## 讀取 SSE-S3/SSE-KMS 加密資料表
<a name="reading-sse-s3-sse-kms-encrypted-tables"></a>

建立資料表時不需要指定其他資料表屬性，即可讀取 SSE-S3/SSE-KMS 加密資料集。Amazon S3 會自動處理 SSE 物件的解密。

## 讀取 CSE-KMS 加密資料表
<a name="reading-cse-kms-encrypted-tables"></a>

可以指定兩組不同的資料表屬性，以便 Athena 讀取 CSE-KMS 加密資料集。
+ 使用 `encryption_option`和 `kms_key` 資料表屬性 （建議）
+ 使用`has_encrypted_data`資料表屬性

**重要**  
如果您使用 Amazon EMR 搭配 EMRFS 上傳 CSE-KMS 加密 Parquet 檔案，您必須將 `fs.s3n.multipart.uploads.enabled`設定為 來停用分段上傳`false`。如果您不執行此操作，則 Athena 無法判斷 Parquet 檔案長度，並且會發生 **HIVE\$1CANNOT\$1OPEN\$1SPLIT** 錯誤。如需詳細資訊，請參閱《Amazon EMR 管理指南》**中的[設定適用於 Amazon S3 的分段上傳](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-upload-s3.html#Config_Multipart)。

### 使用 encryption\$1option 和 kms\$1key 資料表屬性
<a name="using-encryption-option-and-kms-key-table-properties"></a>

在 [CREATE TABLE](create-table.md) 陳述式中，使用指定 `encryption_option='CSE_KMS'`和 的`TBLPROPERTIES`子句`kms_key='aws_kms_key_arn'`，如下列範例所示。

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/folder_with_my_encrypted_data/'
TBLPROPERTIES (
    'encryption_option' = 'CSE_KMS',
    'kms_key' = 'arn:aws:kms:us-east-1:012345678901:key/my_kms_key')
```

設定這些屬性時，
+ Athena 可以讀取 V1, V2 或 V3 Amazon S3 加密用戶端建立的 CSE-KMS 加密物件。
+ Athena 將使用 中的 AWS KMS 金鑰`kms_key`來解密 CSE-KMS 資料。如果任何物件使用不同的 AWS KMS 金鑰加密，查詢將會失敗。
+ Athena 仍然可以讀取 SSE-S3 和 SSE-KMS 加密物件，但不建議混合伺服器端和用戶端加密物件。

### 使用 has\$1encrypted\$1data 資料表屬性
<a name="using-has-encrypted-data-table-property"></a>

在 [CREATE TABLE](create-table.md) 陳述式中，請使用指定 `has_encrypted_data='true'` 的 `TBLPROPERTIES` 子句，如以下範例所示。

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/folder_with_my_encrypted_data/'
TBLPROPERTIES (
    'has_encrypted_data' = 'true')
```

指定 has\$1encrypted\$1data 資料表屬性時，
+ Athena 只能讀取 V1 Amazon S3 加密用戶端建立的 CSE-KMS 加密物件。
+ Athena 會推斷用於從物件中繼資料加密 CSE-KMS 物件的 AWS KMS 金鑰，然後使用該金鑰解密物件。
+ Athena 仍然可以讀取 SSE-S3 和 SSE-KMS 加密物件，但不建議混合伺服器端和用戶端加密物件。

**注意**  
當 `kms_key` `encryption_option`和 與 一起指定時`has_encrypted_data`， `encryption_option`和 `kms_key`資料表屬性會優先，且`has_encrypted_data`會被忽略。

當您使用 Athena 主控台使用[表單建立資料表](data-sources-glue-manual-table.md)並指定資料表位置時，請選取**加密的資料集**選項，將 `has_encrypted_data='true'` 屬性新增至資料表。

![\[在新增資料表表格中選取 Encrypted data set (加密的資料集)\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/add-table-form-encrypted-option.png)


在 Athena 主控台的資料表清單中，具有 的 CSE-KMS 加密資料表`has_encrypted_data='true'`會顯示金鑰形狀圖示。

![\[已加密資料表圖示\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/tables-list-encrypted-table-icon.png)


## 寫入 SSE-S3/SSE-KMS/CSE-KMS 加密資料
<a name="writing-sse-s3-sse-kms-cse-kms-encrypted-data"></a>

根據預設，新插入的資料檔案將使用 Athena 工作群組中指定的查詢結果的加密組態進行加密。為了使用與查詢結果的加密組態不同的加密組態來寫入資料表資料，您必須新增一些額外的資料表屬性。

在 [CREATE TABLE](create-table.md) 陳述式中，使用指定 `encryption_option='SSE_S3 | SSE_KMS | CSE_KMS'`和 的`TBLPROPERTIES`子句`kms_key='aws_kms_key_arn'`，如下列範例所示。

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/folder_with_my_encrypted_data/'
TBLPROPERTIES (
    'encryption_option' = 'SSE_KMS',
    'kms_key' = 'arn:aws:kms:us-east-1:012345678901:key/my_kms_key')
```

所有新插入的資料都會使用資料表屬性指定的加密組態來加密，而不是使用工作群組中查詢的加密組態。

## 考量事項與限制
<a name="considerations-and-limitations"></a>

寫入和讀取加密的資料集時，請考慮下列事項。
+ `has_encrypted_data`、 `encryption_option`和 `kms_key`資料表屬性只能與 Hive 資料表搭配使用。
+ 使用 CSE-KMS 加密資料建立資料表時，建議您確保所有資料都使用相同的 AWS KMS 金鑰加密。
+ 使用 CSE-KMS 加密資料建立資料表時，建議您確保所有資料都經過 CSE-KMS 加密，而且不會混合non-CSE-KMS 和 CSE-KMS 加密物件。

# 傳輸中加密
<a name="encryption-in-transit"></a>

除了在 Simple Storage Service (Amazon S3) 中加密靜態資料外，Amazon Athena 還會在 Athena 與 Simple Storage Service (Amazon S3) 之間，以及 Athena 與存取它的客戶應用程式之間，對傳輸中資料使用 Transport Layer Security (TLS) 加密。

您應該使用 Simple Storage Service (Amazon S3) 儲存貯體 IAM 政策上的 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean)，僅允許透過 HTTPS (TLS) 進行加密連線。

串流至 JDBC 或 ODBC 用戶端的查詢結果會使用 TLS 來加密。如需最新版 JDBC 和 ODBC 驅動程式及其文件的詳細資訊，請參閱[使用 JDBC 連接到 Amazon Athena](connect-with-jdbc.md)和[使用 ODBC 連接到 Amazon Athena](connect-with-odbc.md)。

對於 Athena 聯合資料來源連接器，支援使用 TLS 加密進行傳輸中加密取決於各個連接器。如需相關資訊，請參閱個別[資料來源連接器](connectors-available.md)的文件。

# 金鑰管理
<a name="key-management"></a>

Amazon Athena 支援 AWS Key Management Service (AWS KMS) 加密 Amazon S3 和 Athena 查詢結果中的資料集。 AWS KMS 使用客戶受管金鑰來加密 Amazon S3 物件，並依賴[信封加密](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)。

在 中 AWS KMS，您可以執行下列動作：
+  [建立金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) 
+  [為新的客戶自管金鑰匯入您自己的金鑰材料](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html) 

**注意**  
Athena 僅支援用於讀取和寫入資料的對稱金鑰。

如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[什麼是 AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)，以及 [Amazon Simple Storage Service 如何使用 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html)。若要檢視您帳戶中為您 AWS 建立和管理的金鑰，請在導覽窗格中選擇**AWS 受管金鑰**。

如果您要上傳或存取 SSE-KMS 加密的物件，請使用 AWS Signature 第 4 版來提高安全性。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[指定請求身分驗證中的簽章版本](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingAWSSDK.html#specify-signature-version)。

如果 Athena 工作負載會加密大量資料，您可以使用 Amazon S3 儲存貯體金鑰來降低成本。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[使用 Amazon S3 儲存貯體金鑰降低 SSE-KMS 的成本](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-key.html)。

# 網際網路流量隱私權
<a name="internetwork-traffic-privacy"></a>

同時保護 Athena 與內部部署應用程式之間的流量，以及 Athena 與 Simple Storage Service (Amazon S3) 之間的流量。Athena 與其他 服務之間的流量，例如 AWS Glue 和 AWS Key Management Service，預設會使用 HTTPS。
+ **對於 Athena 與內部部署用戶端和應用程式之間的流量**，串流至 JDBC 或 ODBC 用戶端的查詢結果會使用 Transport Layer Security (TLS) 來加密。

  您可以在私有網路與 AWS之間使用其中一個連線選項：
  + Site-to-Site Site-to-Site VPN 連接。如需詳細資訊，請參閱《 Site-to-Site VPN使用者指南》[https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)中的*什麼是 Site-to-Site VPN AWS Site-to-Site VPN *。
  +  Direct Connect 連線。如需詳細資訊，請參閱《Direct Connect 使用者指南》**中的[什麼是 Direct Connect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)。
+ **對於 Athena 和 Simple Storage Service (Amazon S3) 儲存貯體之間的流量**，Transport Layer Security (TLS) 會在 Athena 和 Simple Storage Service (Amazon S3) 之間，以及在 Athena 和存取該物件的客戶應用程式之間加密傳輸中的物件，且您應使用 Simple Storage Service (Amazon S3) 儲存貯體 IAM 政策上的 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean)，僅允許透過 HTTPS (TLS) 的加密連線。儘管 Athena 目前使用公有端點存取 Amazon S3 儲存貯體中的資料，但這並不意味著資料會周遊公有網際網路。Athena 和 Amazon S3 之間的所有流量都會透過 AWS 網路路由，並使用 TLS 加密。
+ **合規計劃** – Amazon Athena 符合多個 AWS 合規計劃，包括 SOC、PCI、FedRAMP 等。如需詳細資訊，請參閱[合規計劃的AWS 服務 範圍](https://aws.amazon.com/compliance/services-in-scope/)。

# Athena 中的 Identity and Access Management
<a name="security-iam-athena"></a>

Amazon Athena 使用 [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 政策來限制對 Athena 操作的存取。如需 Athena 許可的完整清單，請參閱《服務授權參考》**中的[適用於 Amazon Athena 的動作、資源和條件金鑰](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html)。

每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱*《IAM 使用者指南》*中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

執行 Athena 查詢所需的許可包括以下項目：
+ Amazon S3 位置，用來存放要查詢的基礎資料。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的 [Amazon S3 中的 Identity and Access Management](https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html)。
+ 存放在 中的中繼資料和資源 AWS Glue Data Catalog，例如資料庫和資料表，包括加密中繼資料的其他動作。如需詳細資訊，請參閱《AWS Glue 開發人員指南》**中的[設定 AWS Glue的 IAM 許可](https://docs.aws.amazon.com/glue/latest/dg/getting-started-access.html)以及[設定 AWS Glue中的加密](https://docs.aws.amazon.com/glue/latest/dg/set-up-encryption.html)。
+ Athena API 動作。如需 Athena 中的 API 動作清單，請參閱《Amazon Athena API 參考》**中的[動作](https://docs.aws.amazon.com/athena/latest/APIReference/API_Operations.html)。

以下主題會提供有關 Athena 特定區域許可的詳細資訊。

**Topics**
+ [AWS 受管政策](security-iam-awsmanpol.md)
+ [資料周邊](data-perimeters.md)
+ [透過 JDBC 和 ODBC 連接存取](policy-actions.md)
+ [透過 Athena 控制 Amazon S3 的存取權](s3-permissions.md)
+ [跨帳戶存取 S3 儲存貯體](cross-account-permissions.md)
+ [存取 中的資料庫和資料表 AWS Glue](fine-grained-access-to-glue-resources.md)
+ [跨帳戶存取 AWS Glue 資料目錄](security-iam-cross-account-glue-catalog-access.md)
+ [存取 Data Catalog 中的加密中繼資料](access-encrypted-data-glue-data-catalog.md)
+ [存取工作群組和標籤](workgroups-access.md)
+ [使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md)
+ [啟用 IAM Identity Center 的工作群組](workgroups-identity-center.md)
+ [設定最低加密](workgroups-minimum-encryption.md)
+ [設定存取預備陳述式](security-iam-athena-prepared-statements.md)
+ [使用 CalledVia 內容索引鍵](security-iam-athena-calledvia.md)
+ [允許存取外部 Hive 中繼存放區的 Athena 資料連接器](hive-metastore-iam-access.md)
+ [允許 Lambda 函數存取外部 Hive 中繼存放區](hive-metastore-iam-access-lambda.md)
+ [建立連接器和 Athena 目錄所需的許可](athena-catalog-access.md)
+ [允許存取 Athena 聯合查詢](federated-query-iam-access.md)
+ [允許存取 UDF](udf-iam-access.md)
+ [允許使用 Athena 存取機器學習](machine-learning-iam-access.md)
+ [啟用對 Athena API 的聯合存取](access-federation-saml.md)

# AWS Amazon Athena 的 受管政策
<a name="security-iam-awsmanpol"></a>

 AWS 受管政策是由 AWS AWS 受管政策建立和管理的獨立政策旨在為許多常用案例提供許可，以便您可以開始將許可指派給使用者、群組和角色。

請記住， AWS 受管政策可能不會授予特定使用案例的最低權限許可，因為這些許可可供所有 AWS 客戶使用。我們建議您定義特定於使用案例的[客戶管理政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)，以便進一步減少許可。

您無法變更 AWS 受管政策中定義的許可。如果 AWS 更新 AWS 受管政策中定義的許可，則更新會影響政策連接的所有主體身分 （使用者、群組和角色）。 AWS 服務 當新的 啟動或新的 API 操作可用於現有 服務時， AWS 最有可能更新 AWS 受管政策。

如需詳細資訊，請參閱 *IAM 使用者指南*中的 [AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

## 在搭配 Athena 使用受管政策時的考量事項
<a name="managed-policies-considerations"></a>

受管政策不但易於使用，且會隨著服務的演進，自動更新以具有所需動作。在搭配 Athena 使用受管政策時，請記得以下幾點：
+ 若要使用 AWS Identity and Access Management (IAM)，為您自己或其他使用者允許或拒絕 Amazon Athena 服務動作，請將身分型政策連接到委託人，例如使用者或群組。
+ 每個身分型政策由陳述式組成，這些陳述式定義了允許或拒絕的動作。如需有關將政策連接到使用者的詳細資訊和逐步說明，請參閱《IAM 使用者指南》**中的[連接受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#attach-managed-policy-console)。如需動作的清單，請參閱《[Amazon Athena API 參考](https://docs.aws.amazon.com/athena/latest/APIReference/)》。
+  *客戶受管*和*內嵌*的身分型政策，可讓您在政策中指定更詳細的 Athena 動作來微調存取。我們建議您以 `AmazonAthenaFullAccess` 政策做為起點，然後允許或拒絕 [Amazon Athena API 參考](https://docs.aws.amazon.com/athena/latest/APIReference/)中列出的特定動作。如需內嵌政策的詳細資訊，請參閱《IAM 使用者指南》**中的[受管政策和內嵌政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html)。
+ 如果您也有使用 JDBC 連接的委託人，您必須向您的應用程式提供 JDBC 驅動程式登入資料。如需詳細資訊，請參閱[透過 JDBC 和 ODBC 連接控制存取](policy-actions.md)。
+ 如果您已加密 AWS Glue Data Catalog，您必須在 Athena 的身分型 IAM 政策中指定其他動作。如需詳細資訊，請參閱[在 中設定從 Athena 到加密中繼資料的存取權 AWS Glue Data Catalog](access-encrypted-data-glue-data-catalog.md)。
+ 如果您建立和使用工作群組，請確保您的政策包含對群組動作的相關存取。如需詳細資訊，請參閱[使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md)和[工作群組政策範例](example-policies-workgroup.md)。

## AWS 受管政策：AmazonAthenaFullAccess
<a name="amazonathenafullaccess-managed-policy"></a>

`AmazonAthenaFullAccess` 受管政策會授予 Athena 的完整存取權。

若要提供存取權，請新增許可到您的使用者、群組或角色：
+ 中的使用者和群組 AWS IAM Identity Center：

  建立權限合集。請按照《*AWS IAM Identity Center 使用者指南*》中的[建立權限合集](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)說明進行操作。
+ 透過身分提供者在 IAM 中管理的使用者：

  建立聯合身分的角色。遵循《*IAM 使用者指南*》的[為第三方身分提供者 (聯合) 建立角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html)中的指示。
+ IAM 使用者：
  + 建立您的使用者可擔任的角色。請按照《*IAM 使用者指南*》的[為 IAM 使用者建立角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)中的指示。
  + (不建議) 將政策直接附加至使用者，或將使用者新增至使用者群組。請遵循《IAM 使用者指南》**的[新增許可到使用者 (主控台)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)中的指示。

### 許可群組
<a name="amazonathenafullaccess-managed-policy-groupings"></a>

`AmazonAthenaFullAccess` 政策會分組為以下許可集。
+ **`athena`** – 允許委託人存取 Athena 資源。
+ **`glue`** – 允許主體存取 AWS Glue 目錄、資料庫、資料表和分割區。這是必要的，以便委託人可以搭配 Athena 使用 AWS Glue Data Catalog。
+ **`s3`** – 允許委託人寫入和讀取來自 Simple Storage Service (Amazon S3) 的查詢結果，讀取位於 Simple Storage Service (Amazon S3) 中的公開可用 Athena 資料範例，並列出儲存貯體。委託人需要此許可才能使用 Athena 以與 Simple Storage Service (Amazon S3) 搭配運作。
+ **`sns`** – 允許委託人列出 Amazon SNS 主題並取得主題屬性。這可讓委託人將 Amazon SNS 主題搭配 Athena 使用，以用於監控和提醒用途。
+ **`cloudwatch`** – 允許委託人建立、讀取和刪除 CloudWatch 警示。如需詳細資訊，請參閱[使用 CloudWatch 和 EventBridge 來監控查詢和控制成本](workgroups-control-limits.md)。
+ **`lakeformation`** – 允許委託人要求臨時憑證，以存取位於向 Lake Formation 註冊的資料湖位置中的資料。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的[基礎資料存取控制](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-underlying-data.html)。
+ **`datazone`** – 允許主體列出 Amazon DataZone 專案、網域和環境。如需有關在 Athena 中使用 DataZone 的詳細資訊，請參閱 [在 Athena 中使用 Amazon DataZone](datazone-using.md)。
+ **`pricing`** – 提供 的存取權 AWS 帳單與成本管理。如需詳細資訊，請參閱《AWS 帳單與成本管理 API 參考》**中的 [GetProducts](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_GetProducts.html)。

若要檢視此政策的許可，請參閱《 AWS 受管政策參考》中的 [AmazonAthenaFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html)。

**注意**  
您必須明確允許存取服務擁有的 Amazon S3 儲存貯體，以存放範例查詢和範例資料集。如需詳細資訊，請參閱[資料周邊](data-perimeters.md)。

## AWS 受管政策：AWSQuicksightAthenaAccess
<a name="awsquicksightathenaaccess-managed-policy"></a>

`AWSQuicksightAthenaAccess` 會授予 Quick 與 Athena 整合所需的動作存取權。您可將 `AWSQuicksightAthenaAccess` 政策連接到 IAM 身分。僅將此政策連接到使用 Quick with Athena 的委託人。此政策包含的 Athena 動作，有些已被取代且未包含在目前的公有 API 中，或是僅用於 JDBC 和 ODBC 驅動程式。

### 許可群組
<a name="awsquicksightathenaaccess-managed-policy-groupings"></a>

`AWSQuicksightAthenaAccess` 政策會分組為以下許可集。
+ **`athena`** – 允許委託人在 Athena 資源上執行查詢。
+ **`glue`** – 允許主體存取 AWS Glue 目錄、資料庫、資料表和分割區。這是必要的，以便委託人可以搭配 Athena 使用 AWS Glue Data Catalog。
+ **`s3`** – 允許委託人從 Simple Storage Service (Amazon S3) 寫入和讀取查詢結果。
+ **`lakeformation`** – 允許委託人要求臨時憑證，以存取位於向 Lake Formation 註冊的資料湖位置中的資料。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的[基礎資料存取控制](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-underlying-data.html)。

若要檢視此政策的許可，請參閱《 AWS 受管政策參考》中的 [AWSQuicksightAthenaAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSQuicksightAthenaAccess.html)。

## AWS 受管政策的 Athena 更新
<a name="managed-policies-updates"></a>

檢視自此服務開始追蹤這些變更以來，Athena AWS 受管政策更新的詳細資訊。


| 變更 | 描述 | Date | 
| --- | --- | --- | 
| [AWSQuicksightAthenaAccess](#awsquicksightathenaaccess-managed-policy) – 現有政策的更新 | 新增了 glue:GetCatalog 和 glue:GetCatalogs 許可，讓 Athena 使用者能夠存取 SageMaker AI Lakehouse 目錄。 | 2025 年 1 月 2 日 | 
| [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 更新現有政策 | 新增了 glue:GetCatalog 和 glue:GetCatalogs 許可，讓 Athena 使用者能夠存取 SageMaker AI Lakehouse 目錄。 | 2025 年 1 月 2 日 | 
| [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 更新現有政策 |  讓 Athena 使用公開記載 AWS Glue 的 `GetCatalogImportStatus` API 擷取目錄匯入狀態。  | 2024 年 6 月 18 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 更新現有政策  |  新增 `datazone:ListDomains`、`datazone:ListProjects`、和 `datazone:ListAccountEnvironments` 許可，讓 Athena 使用者能夠使用 Amazon DataZone 網域、專案和環境。如需詳細資訊，請參閱[在 Athena 中使用 Amazon DataZone](datazone-using.md)。  | 2024 年 1 月 3 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 更新現有政策  |  新增 `glue:StartColumnStatisticsTaskRun`、 `glue:GetColumnStatisticsTaskRun`和 `glue:GetColumnStatisticsTaskRuns`許可，讓 Athena 有權呼叫 AWS Glue 來擷取成本型最佳化工具功能的統計資料。如需詳細資訊，請參閱[使用成本型最佳化工具](cost-based-optimizer.md)。  | 2024 年 1 月 3 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 更新現有政策  |  Athena 已新增 `pricing:GetProducts`，以提供對 AWS 帳單與成本管理的存取。如需詳細資訊，請參閱《AWS 帳單與成本管理 API 參考》**中的 [GetProducts](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_GetProducts.html)。  | 2023 年 1 月 25 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) – 更新現有政策  |  Athena 新增了 `cloudwatch:GetMetricData` 以擷取 CloudWatch 指標值。如需詳細資訊，請參閱《Amazon CloudWatch API 參考**》中的 [GetMetricData](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_GetMetricData.html)。  | 2022 年 11 月 14 日 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) 和 [AWSQuicksightAthenaAccess](#awsquicksightathenaaccess-managed-policy) - 現有政策的更新  |  Athena 新增了 `s3:PutBucketPublicAccessBlock`，以封鎖對 Athena 建立的儲存貯體的公開存取。  | 2021 年 7 月 7 日 | 
|  Athena 已開始追蹤變更  |  Athena 開始追蹤其 AWS 受管政策的變更。  | 2021 年 7 月 7 日 | 

# 資料周邊
<a name="data-perimeters"></a>

[資料周邊](https://aws.amazon.com/identity/data-perimeters-on-aws/)是 AWS 環境中的一組許可護欄，用於協助確保只有您信任的身分才能從預期的網路存取信任的資源。

Amazon Athena 使用服務擁有的 Amazon S3 儲存貯體來存放範例查詢和範例資料集。如果您使用資料周邊來控制環境中的存取，您必須明確允許存取這些服務擁有的資源，才能使用對應的 Athena 功能。

 下表列出 Athena 需要存取的 Amazon S3 儲存貯體 ARN、所需的許可、Athena 使用的身分，以及依賴 S3 儲存貯體的功能。若要允許存取，請將儲存貯體 ARN `<region>`中的 取代為實際 ， AWS 區域 並允許根據您的 Amazon S3 存取控制列出此儲存貯體。


**Athena 使用的資料周邊**  

| 資源 ARN | 所需的許可 | 用於存取的身分 | 存取案例 | 
| --- | --- | --- | --- | 
|  arn:aws:s3:::athena-examples-<region>  | s3:GetObjects3:ListBucket | 存取 Athena 的 IAM 主體。 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/data-perimeters.html)  | 

# 透過 JDBC 和 ODBC 連接控制存取
<a name="policy-actions"></a>

若要存取 AWS 服務 和 資源，例如 Athena 和 Amazon S3 儲存貯體，請將 JDBC 或 ODBC 驅動程式憑證提供給應用程式。如果您使用的是 JDBC 或 ODBC 驅動程式，請確保 IAM 許可政策包括 [AWS 受管政策：AWSQuicksightAthenaAccess](security-iam-awsmanpol.md#awsquicksightathenaaccess-managed-policy) 中列出的所有動作。

每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱*《IAM 使用者指南》*中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

## 身分驗證方法
<a name="security-jdbc-odbc-access-authentication"></a>

Athena JDBC 和 ODBC 驅動程式支援 SAML 2.0 型身分驗證，包括以下身分提供者：
+ Active Directory Federation Services (AD FS)
+ Azure Active Directory (AD)
+ Okta 
+ PingFederate

如需詳細資訊，請參閱各個驅動程式的安裝和組態指南，可從 [JDBC](connect-with-jdbc.md) 和 [ODBC](connect-with-odbc.md) 驅動程式頁面下載 PDF 格式的指南。如需其他相關資訊，請參閱以下內容：
+ [啟用對 Athena API 的聯合存取](access-federation-saml.md)
+ [使用 Lake Formation 和 JDBC 或 ODBC 驅動器對 Athena 進行聯合存取](security-athena-lake-formation-jdbc.md)
+  [使用 ODBC、SAML 2.0 和 Okta 身分提供者設定單一登入](okta-saml-sso.md)

如需最新版 JDBC 和 ODBC 驅動程式及其文件的詳細資訊，請參閱[使用 JDBC 連接到 Amazon Athena](connect-with-jdbc.md)和[使用 ODBC 連接到 Amazon Athena](connect-with-odbc.md)。

# 透過 Athena 控制 Amazon S3 的存取權
<a name="s3-permissions"></a>

您可以使用身分型政策、儲存貯體資源政策、存取點政策或上述政策的任何組合，授予對 Amazon S3 位置的存取權。當演員與 Athena 互動時，其許可會傳遞給 Athena，進而確定 Athena 可以存取的內容。這表示使用者必須擁有存取 Amazon S3 儲存貯體的許可，才能向 Athena 查詢這些儲存貯體。

每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

請注意，對 Amazon S3 的請求來自 Athena 的私有 IPv4 位址，而不是 `aws:SourceIp` 中指定的來源 IP。因此，您無法使用 `aws:SourceIp` 條件來拒絕存取指定 IAM 政策中的 Amazon S3 動作。此外，您也無法根據 `aws:SourceVpc` 或 `aws:SourceVpce` 條件索引鍵限制或允許存取 Amazon S3 資源。

**注意**  
使用 IAM Identity Center 身分驗證的 Athena 工作群組，需要將 S3 Access Grants 設定為使用受信任的身分傳播身分。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的 [S3 Access Grants 和目錄身分](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-directory-ids.html)。

**Topics**
+ [身分型政策](#s3-permissions-identity-based-policies)
+ [儲存貯體資源政策](#s3-permissions-bucket-resource-policies)
+ [存取點政策](#s3-permissions-aliases)
+ [CalledVia 內容索引鍵](#s3-permissions-calledvia)
+ [其他資源](#s3-permissions-additional-resources)

## 使用身分型政策來控制 Amazon S3 儲存貯體的存取權
<a name="s3-permissions-identity-based-policies"></a>

以身分為基礎的政策會連接至 IAM 使用者、群組或角色。這些政策可讓您指定該身分可以執行哪些動作 (其許可)。您可以使用身分型政策來控制 Amazon S3 儲存貯體的存取權。

下列身分型政策允許對特定 Amazon S3 儲存貯體中的物件進行 `Read` 和 `Write` 存取。若要使用此政策，請將*斜體預留位置文字*取代為您自己的值。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ListObjectsInBucket",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        },
        {
            "Sid": "AllObjectActions",
            "Effect": "Allow",
            "Action": "s3:*Object",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ]
        }
    ]
}
```

------

## 使用儲存貯體資源政策來控制 Amazon S3 儲存貯體的存取權
<a name="s3-permissions-bucket-resource-policies"></a>

您可以使用 Amazon S3 儲存貯體政策，以確保安全地存取儲存貯體中的物件，以便只有具有適當許可的使用者才能存取它們。如需有關建立 Amazon S3 政策的指南，請參閱《Amazon S3 使用者指南**》中的[使用 Amazon S3 主控台新增儲存貯體政策](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)。

下列範例許可政策會限制使用者只能讀取具有 `environment: production` 索引標籤金鑰和值的物件。此範例政策會使用 `s3:ExistingObjectTag` 條件金鑰來指定索引標籤金鑰和值。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/JohnDoe"
            },
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/environment": "production"
                }
            }
        }
    ]
}
```

------

如需更多儲存貯體政策範例，請參閱《Amazon S3 使用者指南**》中的 [Amazon S3 儲存貯體政策範例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)。

## 使用 Amazon S3 Access Points，以更精確地控制儲存貯體存取
<a name="s3-permissions-aliases"></a>

如果您在 Amazon S3 儲存貯體中具有共用的資料集，則維護負責管理數百個使用案例存取的單一儲存貯體政策可能十分具有挑戰性。

Amazon S3 儲存貯體存取點、政策和別名有助於解決此問題。儲存貯體可有多個存取點，每個存取點都有一個以不同方式控制儲存貯體存取的政策。

Amazon S3 會對您建立的每個存取點產生代表存取點的別名。由於別名採用 Amazon S3 儲存貯體名稱格式，您可以在 Athena 的 `CREATE TABLE` 陳述式 `LOCATION` 子句中使用該別名。接著，會由別名所代表的存取點政策來控制 Athena 對儲存貯體的存取。

如需詳細資訊，請參閱《Amazon S3 使用者指南》**中的 [在 Amazon S3 中指定資料表位置](tables-location-format.md) 和[使用存取點](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html)。

## 使用 CalledVia 內容索引鍵，僅允許從 Athena 呼叫其他服務
<a name="s3-permissions-calledvia"></a>

為了提升安全性，您可以使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia) 全域條件內容索引鍵。`aws:CalledVia` 條件索引鍵包含允許呼叫其他服務的服務清單。例如， AWS Lambda 只有在`InvokeFunction`呼叫來自 Athena 時，您才能允許呼叫 ，方法是指定`aws:CalledVia`內容金鑰`athena.amazonaws.com`的 Athena 服務主體名稱。如需詳細資訊，請參閱[針對 Athena 使用 CalledVia 內容索引鍵](security-iam-athena-calledvia.md)。

## 其他資源
<a name="s3-permissions-additional-resources"></a>

如需有關如何授予 Amazon S3 存取權的詳細資訊和範例，請參閱以下資源：
+ 《Amazon S3 使用者指南》**中的[範例演練：管理存取](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access.html)。
+ [如何在 知識中心提供 Amazon S3 儲存貯體中物件的跨帳戶存取權？](https://aws.amazon.com/premiumsupport/knowledge-center/cross-account-access-s3/)。 AWS 
+ [設定 Athena 中的 Amazon S3 儲存貯體跨帳戶存取權](cross-account-permissions.md).

# 設定 Athena 中的 Amazon S3 儲存貯體跨帳戶存取權
<a name="cross-account-permissions"></a>

常見的 Amazon Athena 案例是將存取權授予非儲存貯體擁有者帳戶中的使用者，讓他們可以執行查詢。在這種情況下，使用儲存貯體政策來授予存取權。

**注意**  
如需有關從 Athena 跨帳戶存取 AWS Glue 資料目錄的資訊，請參閱 [設定 AWS Glue 資料目錄的跨帳戶存取](security-iam-cross-account-glue-catalog-access.md)。

以下範例儲存貯體政策由儲存貯體擁有者建立並套用至 `s3://amzn-s3-demo-bucket` 儲存貯體，會將存取權授予 `123456789123` 帳戶 (不同帳戶) 中的所有使用者。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Id": "MyPolicyID",
   "Statement": [
      {
          "Sid": "MyStatementSid",
          "Effect": "Allow",
          "Principal": {
             "AWS": "arn:aws:iam::123456789123:root"
          },
          "Action": [
             "s3:GetBucketLocation",
             "s3:GetObject",
             "s3:ListBucket",
             "s3:ListBucketMultipartUploads",
             "s3:ListMultipartUploadParts",
             "s3:AbortMultipartUpload"
          ],
          "Resource": [
             "arn:aws:s3:::amzn-s3-demo-bucket",
             "arn:aws:s3:::amzn-s3-demo-bucket/*"
          ]
       }
    ]
 }
```

------

若要將存取權授予帳戶中的特定使用者，將 `Principal` 索引鍵取代為指定該使用者而非 `root` 的索引鍵。例如，針對使用者描述檔 `Dave`，請使用 `arn:aws:iam::123456789123:user/Dave`。

## 設定使用自訂 AWS KMS 金鑰加密之儲存貯體的跨帳戶存取權
<a name="cross-account-permissions-kms"></a>

如果您有使用 custom AWS Key Management Service (AWS KMS) 金鑰加密的 Amazon S3 儲存貯體，您可能需要將存取權授予其他 Amazon Web Services 帳戶的使用者。

將帳戶 A AWS KMS中 加密儲存貯體的存取權授予帳戶 B 中的使用者需要下列許可：
+ 帳戶 A 中的儲存貯體政策必須授與帳戶 B 所擔任的角色的存取權。
+ 帳戶 A 中的 AWS KMS 金鑰政策必須授予帳戶 B 中使用者所擔任角色的存取權。
+ 帳戶 B 擔任的 AWS Identity and Access Management (IAM) 角色必須同時授予帳戶 A 中儲存貯體和金鑰的存取權。

下列程序說明如何授與這些許可。

**將帳戶 A 中儲存貯體的存取權授與帳戶 B 中的使用者**
+ 從帳戶 A，[檢閱 S3 儲存貯體政策](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)，並確認有允許透過帳戶 B 的帳戶 ID 存取的陳述式。

  例如，下列儲存貯體政策會允許 `s3:GetObject` 存取帳戶 ID `111122223333`：

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

****  

  ```
  {
    "Id": "ExamplePolicy1",
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "ExampleStmt1",
        "Action": [
          "s3:GetObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
        "Principal": {
          "AWS": [
            "111122223333"
          ]
        }
      }
    ]
  }
  ```

------

**從帳戶 a 中的 AWS KMS 金鑰政策，將存取權授予帳戶 b 中的使用者**

1. 在帳戶 A 的 AWS KMS 金鑰政策中，將帳戶 B 所擔任的角色許可授予下列動作：
   +  `kms:Encrypt` 
   +  `kms:Decrypt` 
   +  `kms:ReEncrypt*` 
   +  `kms:GenerateDataKey*` 
   +  `kms:DescribeKey` 

   下列範例僅會將金鑰存取權授予一個 IAM 角色。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowUseOfTheKey",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111122223333:role/role_name"
               },
               "Action": [
                   "kms:Encrypt",
                   "kms:Decrypt",
                   "kms:ReEncrypt*",
                   "kms:GenerateDataKey*",
                   "kms:DescribeKey"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 從帳戶 A，[使用政策檢視檢閱金鑰 AWS 管理主控台 政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-policy-view)。

1. 在金鑰政策中，確認下列陳述式將帳戶 B 列為主體。

   ```
   "Sid": "Allow use of the key" 
   ```

1. 如果 `"Sid": "Allow use of the key"` 陳述式不存在，請執行下列步驟：

   1. [使用主控台預設檢視](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-default-view)切換以檢視金鑰政策。

   1.  將帳戶 B 的帳戶 ID 新增為具有金鑰存取權的外部帳戶。

**若要透過帳戶 B 所擔任的 IAM 角色授予帳戶 A 中儲存貯體和金鑰的存取權**

1. 從帳戶 B 中，開啟位於 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在帳戶 B 中開啟與使用者關聯的 IAM 角色。

1. 檢閱套用至 IAM 角色的許可政策清單。

1. 確定已套用會授與儲存貯體存取權的政策。

   下列範例陳述式會授予 IAM 角色 `amzn-s3-demo-bucket` 儲存貯體上的 `s3:GetObject` 和 `s3:PutObject` 操作的存取權：

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

****  

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

------

1. 確定已套用會授予金鑰存取權的政策。
**注意**  
如果帳戶 B 所擔任的 IAM 角色已經具有[管理員存取權](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html)，則您不需要透過使用者 IAM 政策授予金鑰存取權。

   下列陳述式範例會授予 IAM 角色使用金鑰 `arn:aws:kms:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd` 的存取權。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ExampleStmt3",
         "Action": [
           "kms:Decrypt",
           "kms:DescribeKey",
           "kms:Encrypt",
           "kms:GenerateDataKey",
           "kms:ReEncrypt*"
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:kms:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
       }
     ]
   }
   ```

------

## 設定對儲存貯體物件的跨帳戶存取權
<a name="cross-account-permissions-objects"></a>

由帳戶 (帳戶 C) (而非儲存貯體擁有的帳戶 (帳戶 A)) 上傳的物件，可能需要可授與查詢帳戶 (帳戶 B) 讀取權限的明確物件層級 ACL。為了避免此需求，帳戶 C 應該先負責帳戶 A 中的角色，才能在儲存貯體中放置物件。如需詳細資訊，請參閱[如何提供 Amazon S3 儲存貯體中物件的跨帳戶存取權？](https://aws.amazon.com/premiumsupport/knowledge-center/cross-account-access-s3/)。

# 在 中設定資料庫和資料表的存取權 AWS Glue Data Catalog
<a name="fine-grained-access-to-glue-resources"></a>

如果您將 AWS Glue Data Catalog 與 Amazon Athena 搭配使用，您可以為 Athena 中使用的資料庫和資料表 Data Catalog 物件定義資源層級政策。

**注意**  
本主題討論了資料庫和資料表層級安全性。如需有關資料欄、資料列和儲存格層級安全性的資訊，請參閱 [Lake Formation 中的資料篩選和儲存格層級安全性](https://docs.aws.amazon.com/lake-formation/latest/dg/data-filtering.html)。

您可以定義 IAM 身分型政策中的資源層級許可。

**重要**  
本節討論 IAM 身分型政策中的資源層級許可。這些不同於資源型政策。如需有關相關差異的詳細資訊，請參閱《IAM 使用者指南》**中的[身分型政策和資源型政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)。

請參閱以下主題以了解這些任務：


| 執行此任務 | 參閱以下主題 | 
| --- | --- | 
| 建立 IAM 政策來定義資源的存取權 | 《IAM 使用者指南》中的[建立 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。 | 
| 了解 中使用的 IAM 身分型政策 AWS Glue | 《AWS Glue 開發人員指南》中的[身分型政策 (IAM 政策)](https://docs.aws.amazon.com/glue/latest/dg/using-identity-based-policies.html)。 | 

 **本節內容** 
+  [限制](#access-to-glue-resources-limitations) 
+  [根據 設定目錄和資料庫的 AWS Glue 存取權 AWS 區域](#full-access-to-default-db-per-region) 
+  [關於 中資料表分割區和版本的存取控制 AWS Glue](#access-to-glue-resources-table-partitions-and-versions) 
+  [資料庫和資料表層級許可的範例](#examples-fine-grained-table-database-policies) 

## 限制
<a name="access-to-glue-resources-limitations"></a>

當您使用 和 Athena 的資料庫 AWS Glue Data Catalog 和資料表層級存取控制時，請考慮下列限制：
+ 啟用 IAM Identity Center 的 Athena 工作群組需要將 Lake Formation 設定為使用 IAM Identity Center 身分。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的[整合 IAM Identity Center](https://docs.aws.amazon.com/lake-formation/latest/dg/identity-center-integration.html)。
+ 您可以限制只能存取資料庫和資料表。這些控制項適用於資料表層級。您不能限制存取資料表中個別分割區。如需詳細資訊，請參閱[關於 中資料表分割區和版本的存取控制 AWS Glue](#access-to-glue-resources-table-partitions-and-versions)。
+  AWS Glue Data Catalog 包含下列資源：`CATALOG`、`TABLE`、 `DATABASE`和 `FUNCTION`。
**注意**  
從此清單中，Athena 和 之間的常見資源 AWS Glue Data Catalog 是`CATALOG`每個帳戶的 `DATABASE`、 `TABLE`和 。 `Function` 是特定的 AWS Glue。對於 Athena 中的刪除動作，您必須包含 AWS Glue 動作的許可。請參閱 [資料庫和資料表層級許可的範例](#examples-fine-grained-table-database-policies)。

  其階層如下：`CATALOG` 是每個帳戶中所有 `DATABASES` 的上階，而每個 `DATABASE` 是它的所有 `TABLES` 和 `FUNCTIONS` 的上階。例如，在帳戶中目錄裡的 `db` 資料庫中名為 `table_test` 的資料表，它的上階是帳戶中的 `db` 和目錄。對 `db` 資料庫來說，它的上階是帳戶中的目錄，而它的子代是資料表和函數。如需有關資源階層架構的詳細資訊，請參閱《AWS Glue 開發人員指南》**中的[資料目錄中的 ARN 清單](https://docs.aws.amazon.com/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns)。
+ 對於資源的任何非刪除 Athena 動作，例如 `CREATE DATABASE`、`CREATE TABLE`、`SHOW DATABASE`、`SHOW TABLE` 或 `ALTER TABLE`，您需要許可，才能對資源 (資料表或資料庫) 以及資料目錄中資源的所有上階呼叫此動作。例如，對於表格，其上階為其所屬的資料庫，以及帳戶的目錄。對於資料庫，其上階為帳戶的目錄。請參閱 [資料庫和資料表層級許可的範例](#examples-fine-grained-table-database-policies)。
+ 對於 Athena 中的刪除動作，例如 `DROP DATABASE` 或 `DROP TABLE`，您也需要許可，才能對資料型錄中資源的所有上階和下階呼叫刪除動作。例如，若要刪除資料庫，您需要資料庫，目錄 (即其上階)，以及所有表格和使用者定義函數 (即其下階) 的許可。表格沒有下階。若要執行 `DROP TABLE`，您需要許可，才能對表格、其所屬資料庫，以及目錄執行此動作。請參閱 [資料庫和資料表層級許可的範例](#examples-fine-grained-table-database-policies)。

## 根據 設定目錄和資料庫的 AWS Glue 存取權 AWS 區域
<a name="full-access-to-default-db-per-region"></a>

若要讓 Athena 使用 AWS Glue， AWS 區域 需要一個政策，授予 AWS Glue Data Catalog 您 帳戶中每個 的資料庫和 存取權。若要建立資料庫，還需要 `CreateDatabase` 許可。在下列範例政策中，將 AWS 區域、 AWS 帳戶 ID 和 資料庫名稱取代為您自己的名稱。

```
{
   "Sid": "DatabasePermissions",
   "Effect": "Allow",
   "Action": [
      "glue:GetDatabase", 
      "glue:GetDatabases",
      "glue:CreateDatabase"
   ],
   "Resource": [
     "arn:aws:glue:us-east-1:123456789012:catalog",
     "arn:aws:glue:us-east-1:123456789012:database/default"
   ]
}
```

## 關於 中資料表分割區和版本的存取控制 AWS Glue
<a name="access-to-glue-resources-table-partitions-and-versions"></a>

在 中 AWS Glue，資料表可以有分割區和版本。資料表版本和分割區不會被視為 中的獨立資源 AWS Glue。授予資料表和資料表上階資源的存取權，便可得到資料表版本和分割區的存取權。

基於存取控制之目的，以下存取許可適用：
+ 控制適用於資料表層級。您可以限制只能存取資料庫和資料表。例如，如果允許存取有分割區的資料表，則此存取權會套用到資料表中的所有分割區。您不能限制存取資料表中個別分割區。
**重要**  
若要在分割區 AWS Glue 上執行動作，目錄、資料庫和資料表層級需要分割區動作的許可。存取資料表內的分割區並不足夠。例如，若要在資料庫 `myDB` 中對資料表 `myTable` 執行 `GetPartitions`，您必須授予目錄、`myDB` 資料庫和 `myTable` 資源的 `glue:GetPartitions` 許可。
+ 存取控制不適用於資料表版本。與分割區一樣，透過存取資料表 AWS Glue 上 中的資料表版本 APIs 和資料表前代來授予對資料表舊版的存取權。

如需 AWS Glue 動作許可的相關資訊，請參閱《 *AWS Glue 開發人員指南*》中的 [AWS Glue API 許可：動作和資源參考](https://docs.aws.amazon.com/glue/latest/dg/api-permissions-reference.html)。

## 資料庫和資料表層級許可的範例
<a name="examples-fine-grained-table-database-policies"></a>

下列資料表列出了 IAM 身分型政策範例，這些政策允許對 Athena 中的資料庫和資料表進行存取。我們建議您從這些範例開始，並根據您的需要調整它們，來允許或拒絕對特定資料庫和資料表的特定動作。

這些範例包括存取資料庫和目錄，以便 Athena 和 AWS Glue 可以一起運作。對於多個 AWS 區域，請包含每個資料庫和目錄的類似政策，每個區域一行。

在此範例中，將 `example_db` 資料庫和 `test` 資料表名稱取代為您自己的資料庫和資料表名稱。


| DDL 陳述式 | IAM 存取政策授予資源存取權的範例 | 
| --- | --- | 
| ALTER DATABASE | 可讓您修改 example\$1db 資料庫的屬性。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:UpdateDatabase"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />}</pre> | 
| CREATE DATABASE | 可讓您建立名為 example\$1db 的資料庫。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:CreateDatabase"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />}<br /></pre> | 
| CREATE TABLE | 可讓您在 example\$1db 資料庫中建立名為 test 的資料表。<pre>{<br />   "Sid": "DatabasePermissions",<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:GetDatabases"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />},<br />{<br />   "Sid": "TablePermissions",<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetTables",<br />      "glue:GetTable",<br />      "glue:GetPartitions",<br />      "glue:CreateTable"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db",<br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />   ]<br />}</pre> | 
| DROP DATABASE | 可讓您捨棄 example\$1db 資料庫，包括其中的所有資料表。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:DeleteDatabase",<br />      "glue:GetTables", <br />      "glue:GetTable", <br />      "glue:DeleteTable" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/*", <br />     "arn:aws:glue:us-east-1:123456789012:userDefinedFunction/example_db/*"<br />   ]<br /> }</pre> | 
| DROP TABLE | 可讓您捨棄 example\$1db 資料庫中名為 test 的分割資料表。如果您的資料表沒有分割區，請勿包含分割動作。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetTable",<br />      "glue:DeleteTable", <br />      "glue:GetPartitions",<br />      "glue:GetPartition",<br />      "glue:DeletePartition" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />   ]<br /> }</pre> | 
| MSCK REPAIR TABLE | 允許您在將 Hive 相容分割區新增至 example\$1db 資料庫中名為 test 的資料表後更新目錄中繼資料。<pre>{<br />    "Effect": "Allow",<br />    "Action": [<br />        "glue:GetDatabase",<br />        "glue:CreateDatabase",<br />        "glue:GetTable",<br />        "glue:GetPartitions",<br />        "glue:GetPartition",<br />        "glue:BatchCreatePartition"<br />    ],<br />    "Resource": [<br />      "arn:aws:glue:us-east-1:123456789012:catalog",<br />      "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />      "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />    ]<br />}</pre> | 
| SHOW DATABASES | 可讓您列出 AWS Glue Data Catalog中的所有資料庫。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetDatabases" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/*"<br />   ]<br /> }</pre> | 
| SHOW TABLES | 可讓您列出 example\$1db 資料庫中的所有資料表。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetTables"    <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db",  <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/*"<br />   ]<br />}</pre> | 

# 設定 AWS Glue 資料目錄的跨帳戶存取
<a name="security-iam-cross-account-glue-catalog-access"></a>

您可以使用 Athena 的跨帳戶 AWS Glue 目錄功能，從非您自己的帳戶註冊 AWS Glue 目錄。在您設定 AWS Glue 所需的 IAM 許可，並註冊目錄作為 Athena [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html) 資源後，您可以使用 Athena 來執行跨帳戶查詢。如需使用 Athena 主控台以從其他帳戶註冊目錄的相關資訊，請參閱[從另一個帳戶註冊 Data Catalog](data-sources-glue-cross-account.md)。

如需 中跨帳戶存取的詳細資訊 AWS Glue，請參閱《 *AWS Glue 開發人員指南*》中的[授予跨帳戶存取](https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html)。

## 開始之前
<a name="security-iam-cross-account-glue-catalog-access-before-you-start"></a>

由於此功能會使用現有的 Athena `DataCatalog` 資源 API 和功能，以啟用跨帳戶存取，因此建議您先閱讀以下資源再開始使用：
+ [連線至資料來源](work-with-data-stores.md) - 包含搭配、 AWS Glue Hive 或 Lambda 資料目錄來源使用 Athena 的主題。
+ [資料目錄範例政策](datacatalogs-example-policies.md) - 說明如何撰寫控制資料目錄存取的政策。
+ [AWS CLI 搭配 Hive 中繼存放區使用](datastores-hive-cli.md) - 示範如何 AWS CLI 搭配 Hive 中繼存放區使用 ，但包含適用於其他資料來源的使用案例。

## 考量和限制
<a name="security-iam-cross-account-glue-catalog-access-considerations-and-limitations"></a>

目前，Athena 跨帳戶 AWS Glue 目錄存取有下列限制：
+ 此功能僅適用於支援 Athena 引擎版本 2 或更新版本 AWS 區域 的 。如需有關 Athena 引擎版本的資訊，請參閱[Athena 引擎版本控制](engine-versions.md)。若要升級工作群組的引擎版本，請參閱[變更 Athena 引擎版本](engine-versions-changing.md)。
+ 當您 AWS Glue Data Catalog 在帳戶中註冊另一個帳戶的 時，您建立的區域`DataCatalog`資源只會連結到該特定區域中另一個帳戶的資料。
+ 目前不支援包含跨帳戶 AWS Glue 目錄的 `CREATE VIEW` 陳述式。
+ 使用 AWS 受管金鑰加密的目錄無法跨帳戶查詢。對於要跨帳戶查詢的目錄，請改用客戶自管金鑰 (`KMS_CMK`)。如需客戶受管金鑰與 AWS 受管金鑰之間的差異資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[客戶金鑰和 AWS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-mgmt                     )。

## 開始使用
<a name="security-iam-cross-account-glue-catalog-getting-started"></a>

在下列案例中，「借用者」帳戶 (666666666666) 想要執行`SELECT`查詢，其參照屬於「擁有者」帳戶 (999999999999) 的 AWS Glue 目錄，如下列範例所示：

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

在下列程序中，步驟 1a 和 1b 顯示如何讓借用者帳戶從借用者和擁有者端存取擁有者帳戶 AWS Glue 的資源。該範例授予對資料庫 `tpch1000` 和資料表 `customer` 的存取權。變更這些範例名稱以符合您的需求。

### 步驟 1a：建立具有政策的借用者角色，以存取擁有者 AWS Glue 的資源
<a name="security-iam-cross-account-glue-catalog-access-step-1a"></a>

若要使用存取擁有者帳戶 AWS Glue 資源的政策建立借用者帳戶角色，您可以使用 AWS Identity and Access Management (IAM) 主控台或 [IAM API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_Operations.html)。以下為使用 IAM 主控台的程序。

**建立借用者角色和政策以存取擁有者帳戶 AWS Glue 的資源**

1. 從借用者帳戶登入位於 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格中，展開**存取管理**，然後選擇**政策**。

1. 選擇**建立政策**。

1. 對於**政策編輯器**，選擇 **JSON**。

1. 在政策編輯器中，輸入以下政策，然後根據您的需求進行修改：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "glue:*",
               "Resource": [
                   "arn:aws:glue:us-east-1:999999999999:catalog",
                   "arn:aws:glue:us-east-1:999999999999:database/tpch1000",
                   "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer"
               ]
           }
       ]
   }
   ```

------

1. 選擇**下一步**。

1. 在**檢閱和建立**頁面上，針對**政策名稱**，輸入該政策的名稱 (例如 **CrossGluePolicyForBorrowerRole**)。

1. 選擇**建立政策**。

1. 在導覽窗格中，選擇 **Roles** (角色)。

1. 選擇 **Create Role** (建立角色)。

1. 在**選取可信實體**頁面中，選擇 **AWS 帳戶**，然後選擇**下一步**。

1. 在**新增許可**頁面上的搜尋方塊中，輸入您建立的政策的名稱 (例如 **CrossGluePolicyForBorrowerRole**)。

1. 選取政策名稱旁的核取方塊，然後選擇**下一步**。

1. 在 **Name, review, and create** (名稱，檢閱和建立) 頁面上，針對 **Role name** (角色名稱) 輸入角色的名稱 (例如 **CrossGlueBorrowerRole**)。

1. 選擇建**立角色**。

### 步驟 1b：建立擁有者政策，將 AWS Glue 存取權授予借用者
<a name="security-iam-cross-account-glue-catalog-access-step-1b"></a>

若要將來自擁有者帳戶 (999999999999) 的 AWS Glue 存取權授予借款人的角色，您可以使用 AWS Glue 主控台或 AWS Glue [PutResourcePolicy](https://docs.aws.amazon.com/glue/latest/webapi/API_PutResourcePolicy.html) API 操作。下列程序使用 AWS Glue 主控台。

**從擁有者授予對借用者帳戶的 AWS Glue 存取權**

1. 從擁有者帳戶登入 AWS Glue 主控台，網址為 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 在導覽窗格中，展開**資料目錄**，然後選擇**目錄設定**。

1. 在 **Permissions** (許可) 方塊中，輸入如下所示的政策。針對 *rolename*，輸入借用者在步驟 1a 中建立的角色 (例如 **CrossGlueBorrowerRole**)。如果您想要增加許可範圍，可以將萬用字元 `*` 用於資料庫和資料表資源類型。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::666666666666:user/username",
                       "arn:aws:iam::666666666666:role/rolename"
                   ]
               },
               "Action": "glue:*",
               "Resource": [
                   "arn:aws:glue:us-east-1:999999999999:catalog",
                   "arn:aws:glue:us-east-1:999999999999:database/tpch1000",
                   "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer"
               ]
           }
       ]
   }
   ```

------

完成後，我們建議您使用 [AWS Glue API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api.html)，進行一些跨帳戶呼叫測試，以確認已按您的預期設定許可。

### 步驟 2：借用者註冊 AWS Glue Data Catalog 屬於擁有者帳戶的
<a name="security-iam-cross-account-glue-catalog-access-step-2"></a>

下列程序說明如何使用 Athena 主控台，在擁有者 Amazon Web Services 帳戶中設定 AWS Glue Data Catalog 作為資料來源。如需使用 API 操作 (而不是主控台) 註冊型錄的相關資訊，請參閱[(選用) 使用 API 註冊屬於擁有者帳戶的 Athena 資料目錄](#security-iam-cross-account-glue-catalog-access-step-2-api)。

**註冊 AWS Glue Data Catalog 屬於另一個帳戶的**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 展開**管理**，然後選擇**資料來源**。

1. 在右上角，選擇 **Create data source** (建立資料來源)。

1. 在**選擇資料來源**頁面上，針對**資料來源**，選取 **S3 - AWS Glue Data Catalog**，然後選擇**下一步**。

1. 在 **Enter data source details** (輸入資料來源詳細資訊) 頁面上的 **AWS Glue Data Catalog** 區段，針對**選擇 AWS Glue Data Catalog**，在另一個帳户選擇 **AWS Glue Data Catalog **。

1. 在 **Data source details** (資料來源詳細資訊) 輸入以下資訊：
   + **Data source name** (資料來源名稱) – 輸入您希望在 SQL 查詢中使用的名稱，以參考其他帳戶中的資料目錄。
   + **Description** (描述) – (選填) 輸入其他帳戶裡資料目錄的描述。
   + **Catalog ID** (目錄 ID) – 輸入資料目錄所屬帳戶的 12 位數 Amazon Web Services 帳戶 ID。Amazon Web Services 帳戶 ID 即為目錄 ID。

1. (選用) 展開**標籤**，然後輸入您希望與資料來源建立關聯的鍵值對。如需標籤的詳細資訊，請參閱[標記 Athena 資源](tags.md)。

1. 選擇**下一步**。

1. 在 **Review and create** (檢閱並建立) 頁面上，檢閱您提供的資訊，然後選擇 **Create data source** (建立資料來源)。**Data source details** (資料來源詳細資訊) 頁面列出了註冊資料型錄的資料庫和標籤。

1. 選擇**資料來源和目錄**。您註冊的資料型錄列於 **Data Source Name** (資料來源名稱) 資料欄。

1. 若要檢視或編輯資料型錄的相關資訊，請選擇型錄，然後選擇 **Actions** (動作)、**Edit** (編輯)。

1. 若要刪除新資料型錄，請選擇型錄，然後選擇 **Actions** (動作)、**Delete** (刪除)。

### 步驟 3：借用者提交查詢
<a name="security-iam-cross-account-glue-catalog-access-step-4"></a>

借用者會提交使用 *catalog*.*database*.*table* 語法來參考目錄的查詢，如下列範例所示：

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

除了使用完整語法之外，借用者也可以透過依上下文在 [QueryExecutionContext](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecutionContext.html) 中傳遞以指定目錄。

## (選用) 設定其他 Amazon S3 許可
<a name="security-iam-cross-account-glue-catalog-access-additional-s3-permissions"></a>
+ 如果借用者帳戶使用 Athena 查詢，以將新資料寫入擁有者帳戶的資料表，則擁有者不會自動存取 Amazon S3 中的此資料，即使該資料表存在於擁有者帳戶中亦同。這是因為除非進行另外設定，否則借用者即為 Amazon S3 中資訊的物件擁有者。若要授予擁有者對資料的存取權，請將物件的許可設定為其他步驟。
+ 某些跨帳戶 DDL 操作，如 [MSCK REPAIR TABLE](msck-repair-table.md) 會需要 Amazon S3 許可。例如，如果借用者帳戶正在對擁有者帳戶中的資料表執行跨帳戶 `MSCK REPAIR` 操作，而借用者資料在擁有者帳戶 S3 儲存貯體中，則該儲存貯體必須授予借用者所擔任的角色許可，才能成功查詢。

如需有關授予儲存貯體許可的資訊，請參閱*《Amazon Simple Storage Service 使用者指南》*中的[如何設定 ACL 儲存貯體許可？](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/set-bucket-permissions.html)。

## (選用) 動態使用目錄
<a name="security-iam-cross-account-glue-catalog-access-dynamic-catalogs"></a>

在某些情況下，您可能想要在不進行必要步驟註冊的情況下，對跨帳戶 AWS Glue 目錄快速執行測試。如果已如本文件前述，正確設定所需的 IAM 和 Amazon S3 許可，您便可以動態執行跨帳戶查詢，而無需建立 `DataCatalog` 資源物件。

若要在未註冊的情況下明確參考目錄，請使用以下範例中的語法：

```
SELECT * FROM "glue:arn:aws:glue:us-east-1:999999999999:catalog".tpch1000.customer
```

使用格式「`glue:<arn>`」，其中 `<arn>` 為您要使用的 [AWS Glue Data Catalog ARN](https://docs.aws.amazon.com/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns)。在此範例中，Athena 使用此語法動態指向帳戶 999999999999 AWS Glue 的資料目錄，就好像您已另外為其建立`DataCatalog`物件一樣。

### 使用動態目錄的注意事項
<a name="security-iam-cross-account-glue-catalog-access-notes-dynamic-catalogs"></a>

使用動態目錄時，請記住以下幾點。
+ 使用動態目錄會需要您通常用於 Athena 資料目錄 API 操作的 IAM 許可。主要差異在於資料目錄資源名稱會遵循 `glue:*` 命名慣例。
+ 目錄 ARN 必須與正在執行的查詢屬於同一區域。
+ 在 DML 查詢或檢視中使用動態目錄時，請以逸出的雙引號 (`\"`) 括住該目錄。在 DDL 查詢中使用動態目錄時，請使用反引號字元 (```) 括住該目錄。

## (選用) 使用 API 註冊屬於擁有者帳戶的 Athena 資料目錄
<a name="security-iam-cross-account-glue-catalog-access-step-2-api"></a>

可以使用 API 操作來註冊屬於擁有者帳户的資料型錄，而不是使用步驟 2 中所述的 Athena 主控台。

Athena [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html) 資源的建立者必須具有必要許可，才可執行 Athena [CreateDataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateDataCatalog.html) API 操作。依您的需求而定，可能會需要存取其他 API 操作。如需詳細資訊，請參閱[資料目錄範例政策](datacatalogs-example-policies.md)。

下列`CreateDataCatalog`請求內文會註冊 AWS Glue 目錄以進行跨帳戶存取：

```
# Example CreateDataCatalog request to register a cross-account Glue catalog:
{
    "Description": "Cross-account Glue catalog",
    "Name": "ownerCatalog",
    "Parameters": {"catalog-id" : "999999999999"  # Owner's account ID
    },
    "Type": "GLUE"
}
```

以下範本程式碼會使用 Java 用戶端來建立 `DataCatalog` 物件。

```
# Sample code to create the DataCatalog through Java client
CreateDataCatalogRequest request = new CreateDataCatalogRequest()
    .withName("ownerCatalog")
    .withType(DataCatalogType.GLUE)
    .withParameters(ImmutableMap.of("catalog-id", "999999999999"));

athenaClient.createDataCatalog(request);
```

在這些步驟之後，借用者應會在呼叫 [ListDataCatalogs](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListDataCatalogs.html) API 操作時看到 `ownerCatalog`。

## 其他資源
<a name="security-iam-cross-account-glue-catalog-access-additional-resources"></a>
+ [從另一個帳戶註冊 Data Catalog](data-sources-glue-cross-account.md)
+ 《 *AWS 規範指引模式*指南》中的[AWS Glue Data Catalog 使用 Amazon Athena 設定共用 的跨帳戶存取權](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena.html)。
+ *AWS 大數據部落格*中的[使用 Amazon Athena AWS Glue Data Catalog查詢跨帳戶](https://aws.amazon.com/blogs/big-data/query-cross-account-aws-glue-data-catalogs-using-amazon-athena/) 
+ 《*AWS Glue 開發人員指南*》中的[授予跨帳戶存取權](https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html) 

# 在 中設定從 Athena 到加密中繼資料的存取權 AWS Glue Data Catalog
<a name="access-encrypted-data-glue-data-catalog"></a>

如果您 AWS Glue Data Catalog 搭配 Amazon Athena 使用 ，您可以使用 AWS Glue Data Catalog AWS Glue 主控台或 API 在 中啟用加密。如需相關資訊，請參閱《AWS Glue 開發人員指南》**中的[加密您的資料目錄](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html)。

如果 AWS Glue Data Catalog 已加密，您必須將下列動作新增至用於存取 Athena 的所有政策：

每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

# 設定存取工作群組和標籤
<a name="workgroups-access"></a>

工作群組是由 Athena 管理的資源。因此，如果您的工作群組政策使用的動作接受 `workgroup` 做為輸入，您必須指定工作群組的 ARN，如下所示，其中 `workgroup-name` 是工作群組的名稱：

```
"Resource": [arn:aws:athena:region:AWSAcctID:workgroup/workgroup-name]
```

例如，在 Amazon Web Services 帳戶 `123456789012` 的 `us-west-2` 區域中，對於名為 `test_workgroup` 的工作群組，使用以下 ARN 將工作群組指定為資源：

```
"Resource":["arn:aws:athena:us-east-2:123456789012:workgroup/test_workgroup"]
```

若要存取啟用受信任身分傳播 (TIP) 的工作群組，IAM Identity Center 使用者必須指派給 Athena [GetWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetWorkGroup.html) API 動作回應所傳回的 `IdentityCenterApplicationArn`。
+ 如需工作群組政策的清單，請參閱[工作群組政策範例](example-policies-workgroup.md)。
+ 如需工作群組的標籤型政策清單，請參閱[使用標籤型 IAM 存取控制政策](tags-access-control.md)。
+ 如需有關為工作群組建立 IAM 政策的詳細資訊，請參閱[使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md)。
+ 如需 Amazon Athena 動作的完整清單，請參閱《[Amazon Athena API 參考](https://docs.aws.amazon.com/athena/latest/APIReference/)》中的 API 動作名稱。
+ 如需有關 IAM 政策的詳細資訊，請參閱《IAM 使用者指南》**中的[使用視覺化編輯器來建立政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor)。

每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

# 使用 IAM 政策來控制工作群組存取
<a name="workgroups-iam-policy"></a>

若要控制對工作群組的存取，請使用資源層級 IAM 許可或以身分為基礎的 IAM 政策。每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

**注意**  
若要存取啟用受信任身分傳播的工作群組，IAM Identity Center 使用者必須指派給 Athena [GetWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetWorkGroup.html) API 動作回應所傳回的 `IdentityCenterApplicationArn`。

下列程序專用於 Athena。

如需 IAM 特定的資訊，請參閱本節最後列出的連結。如需範例 JSON 工作群組政策的相關資訊，請參閱[工作群組政策範例](example-policies-workgroup.md)。

**若要在 IAM 主控台中使用視覺化編輯器來建立工作群組政策**

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

1. 在左邊的導覽窗格中，選擇 **Policies** (政策)，然後選擇 **Create policy** (建立政策)。

1. 在 **Visual editor** (視覺化編輯器) 標籤上，選擇 **Choose a service** (選擇一項服務)。接著選擇 Athena 以新增到政策。

1. 選擇 **Select actions** (選取動作)，然後選擇要新增到政策的動作。視覺化編輯器會顯示 Athena 中可用的動作。如需詳細資訊，請參閱《服務授權參考》**中的 [Amazon Athena 的動作、資源和條件索引鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html)。

1. 選擇 **add actions** (新增動作) 來輸入特定動作，或使用萬用字元 (\$1) 來指定多個動作。

   預設情況下，您建立的政策允許執行選擇的操作。對於 Athena 中的 `workgroup` 資源，如果您選擇的一個或多個動作支援資源層級許可，則編輯器會列出 `workgroup` 資源。

1. 選擇 **Resources** (資源) 來為您的政策指定工作群組。如需 JSON 工作群組政策的範例，請參閱[工作群組政策範例](example-policies-workgroup.md)。

1. 如下所示指定 `workgroup` 資源：

   ```
   arn:aws:athena:<region>:<user-account>:workgroup/<workgroup-name>
   ```

1. 選擇 **Review policy** (檢閱政策)，然後為您正在建立的政策輸入 **Name** (名稱) 與 **Description** (描述) (選用)。檢閱政策摘要來確認您已授予想要的許可。

1. 選擇 **Create policy** (建立政策) 儲存您的新政策。

1. 將此基於身分的政策連接到使用者、群組或角色。

如需詳細資訊，請參閱《服務授權參考》**與《IAM 使用者指南》**中的下列主題：
+  [Amazon Athena 的操作、資料和條件索引鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html) 
+  [使用視覺化編輯器來建立政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor) 
+  [新增和移除 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html) 
+  [控制資源的存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_controlling.html#access_controlling-resources) 

如需 JSON 工作群組政策的範例，請參閱[工作群組政策範例](example-policies-workgroup.md)。

如需 Amazon Athena 動作的完整清單，請參閱《[Amazon Athena API 參考](https://docs.aws.amazon.com/athena/latest/APIReference/)》中的 API 動作名稱。

# 工作群組政策範例
<a name="example-policies-workgroup"></a>

本節包含可讓您在工作群組上用來啟用各種動作的政策範例。每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱*《IAM 使用者指南》*中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

工作群組是由 Athena 管理的 IAM 資源。因此，如果您的工作群組政策使用的動作接受 `workgroup` 做為輸入，您必須指定工作群組的 ARN，如下所示：

```
"Resource": [arn:aws:athena:<region>:<user-account>:workgroup/<workgroup-name>]
```

其中 `<workgroup-name>` 為工作群組的名稱。例如，假設工作群組名為 `test_workgroup`，請如下所示將它指定為資源：

```
"Resource": ["arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"]
```

如需 Amazon Athena 動作的完整清單，請參閱《[Amazon Athena API 參考](https://docs.aws.amazon.com/athena/latest/APIReference/)》中的 API 動作名稱。如需有關 IAM 政策的詳細資訊，請參閱《IAM 使用者指南》**中的[使用視覺化編輯器來建立政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor)。如需有關為工作群組建立 IAM 政策的詳細資訊，請參閱[使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md)。
+  [Example policy for full access to all workgroups](#example1-full-access-all-wkgs) 
+  [Example policy for full access to a specified workgroup](#example2-full-access-this-wkg) 
+  [Example policy for running queries in a specified workgroup](#example3-user-access) 
+  [Example policy for running queries in the primary workgroup](#example4-run-in-primary-access) 
+  [Example policy for management operations on a specified workgroup](#example5-manage-wkgs-access) 
+  [Example policy for listing workgroups](#example6-list-all-wkgs-access) 
+  [Example policy for running and stopping queries in a specific workgroup](#example7-run-queries-access) 
+  [Example policy for working with named queries in a specific workgroup](#example8-named-queries-access) 
+  [Example policy for working with Spark notebooks](#example9-spark-workgroup) 

**Example 適用於完整存取所有工作群組的政策範例**  
以下政策允許完整存取帳戶中可能存在的所有工作群組資源。對於您的帳戶中必須為所有其他使用者來管理工作群組的那些使用者，我們建議您使用此政策。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

**Example 適用於完整存取指定工作群組的政策範例**  
以下政策允許完整存取名為 `workgroupA` 的單一特定的工作群組資源。對於能夠完全控制特定群組的使用者，您可以使用此政策。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListEngineVersions",
                "athena:ListWorkGroups",
                "athena:ListDataCatalogs",
                "athena:ListDatabases",
                "athena:GetDatabase",
                "athena:ListTableMetadata",
                "athena:GetTableMetadata"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:BatchGetQueryExecution",
                "athena:GetQueryExecution",
                "athena:ListQueryExecutions",
                "athena:StartQueryExecution",
                "athena:StopQueryExecution",
                "athena:GetQueryResults",
                "athena:GetQueryResultsStream",
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:BatchGetNamedQuery",
                "athena:ListNamedQueries",
                "athena:DeleteNamedQuery",
                "athena:CreatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:ListPreparedStatements",
                "athena:UpdatePreparedStatement",
                "athena:DeletePreparedStatement"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:DeleteWorkGroup",
                "athena:UpdateWorkGroup",
                "athena:GetWorkGroup",
                "athena:CreateWorkGroup"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA"
            ]
        }
    ]
}
```

**Example 適用於在指定的工作群組中執行查詢的政策範例**  
在以下政策中，允許使用者在指定的 `workgroupA` 中執行查詢並檢視查詢。不允許使用者對工作群組本身執行管理任務，例如更新或刪除。請注意，範例政策並未將使用者限制於僅此工作群組或拒絕存取其他工作群組。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
       {
            "Effect": "Allow",
            "Action": [
                "athena:ListEngineVersions",
                "athena:ListWorkGroups",
                "athena:ListDataCatalogs",
                "athena:ListDatabases",
                "athena:GetDatabase",
                "athena:ListTableMetadata",
                "athena:GetTableMetadata"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:GetWorkGroup", 
                "athena:BatchGetQueryExecution",
                "athena:GetQueryExecution",
                "athena:ListQueryExecutions",
                "athena:StartQueryExecution",
                "athena:StopQueryExecution",
                "athena:GetQueryResults",
                "athena:GetQueryResultsStream",
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:BatchGetNamedQuery",
                "athena:ListNamedQueries",
                "athena:DeleteNamedQuery",
                "athena:CreatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:ListPreparedStatements",
                "athena:UpdatePreparedStatement",
                "athena:DeletePreparedStatement"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA"
            ]
        }
    ]
}
```

**Example 適用於在主要工作群組中執行查詢的政策範例**  
您可以修改上述範例，以允許特定使用者也在主要工作群組中執行查詢。  
對於以其他方式設定為在指定的工作群組中執行查詢的所有使用者，我們建議您新增主要工作群組資源。為了以防其指定的工作群組遭到刪除或停用，將此資源新增到其工作群組使用者政策非常有用。在這種情況下，他們可以在主要工作群組中繼續執行查詢。
若要允許您帳戶中的使用者在主要工作群組中執行查詢，請將包含主要工作群組 ARN 的行新增到 [Example policy for running queries in a specified workgroup](#example3-user-access) 的資源區段，如以下範例所示。  

```
arn:aws:athena:us-east-1:123456789012:workgroup/primary"
```

**Example 適用於在指定的工作群組上執行管理操作的政策範例**  
在以下政策中，允許使用者建立、刪除、取得詳細資訊和更新工作群組 `test_workgroup`。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListEngineVersions"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:CreateWorkGroup",
                "athena:GetWorkGroup",
                "athena:DeleteWorkGroup",
                "athena:UpdateWorkGroup"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"
            ]
        }
    ]
}
```

**Example 適用於列出工作群組的政策範例**  
以下政策可讓所有使用者列出所有工作群組：    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListWorkGroups"
            ],
            "Resource": "*"
        }
    ]
}
```

**Example 適用於在特定工作群組中執行和停止查詢的政策範例**  
在這個政策中，允許使用者在工作群組中執行查詢：    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "athena:StopQueryExecution"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"
            ]
        }
    ]
}
```

**Example 適用於在特定工作群組中處理具名查詢的政策範例**  
在以下政策中，使用者有許可在指定的工作群組中建立、刪除具名查詢及取得其相關資訊：    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:DeleteNamedQuery"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"            ]
        }
    ]
}
```

**Example 使用 Athena 中的 Spark 筆記本的範例政策**  
使用類似下列所示的政策來使用 Athena 中的 Spark 筆記本。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCreatingWorkGroupWithDefaults",
            "Action": [
                "athena:CreateWorkGroup",
                "s3:CreateBucket",
                "iam:CreateRole",
                "iam:CreatePolicy",
                "iam:AttachRolePolicy",
                "s3:GetBucketLocation",
                "athena:ImportNotebook"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/Demo*",
                "arn:aws:s3:::123456789012-us-east-1-athena-results-bucket-*",
                "arn:aws:iam::123456789012:role/service-role/AWSAthenaSparkExecutionRole-*",
                "arn:aws:iam::123456789012:policy/service-role/AWSAthenaSparkRolePolicy-*"
            ]
        },
        {
            "Sid": "AllowRunningCalculations",
            "Action": [
                "athena:ListWorkGroups",
                "athena:GetWorkGroup",
                "athena:StartSession",
                "athena:CreateNotebook",
                "athena:ListNotebookMetadata",
                "athena:ListNotebookSessions",
                "athena:GetSessionStatus",
                "athena:GetSession",
                "athena:GetNotebookMetadata",
                "athena:CreatePresignedNotebookUrl"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:athena:us-east-1:123456789012:workgroup/Demo*"
        },
        {
            "Sid": "AllowListWorkGroupAndEngineVersions",
            "Action": [
                "athena:ListWorkGroups",
                "athena:ListEngineVersions"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

# 使用啟用 IAM Identity Center 的 Athena 工作群組
<a name="workgroups-identity-center"></a>

[信任的身分傳播](https://docs.aws.amazon.com//singlesignon/latest/userguide/trustedidentitypropagation-overview.html)是一項 AWS IAM Identity Center 功能，連線的管理員 AWS 服務 可以使用此功能來授予和稽核服務資料的存取權。存取此資料是根據使用者屬性，例如群組關聯。設定信任的身分傳播需要連線的管理員 AWS 服務 與 IAM Identity Center 管理員之間的協同合作。如需詳細資訊，請參閱[先決條件和考量](https://docs.aws.amazon.com//singlesignon/latest/userguide/trustedidentitypropagation-overall-prerequisites.html)。

使用 [IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)，您可管理員工身分 (也稱為員工使用者) 的登入安全性。IAM Identity Center 提供一個位置，您可以在其中建立或連接人力資源使用者，並集中管理其所有 AWS 帳戶和應用程式的存取權。您可使用多帳戶許可，將對 AWS 帳戶的存取權指派給這些使用者。您可使用應用程式指派功能，來指派使用者對啟用 IAM Identity Center 的應用程式、雲端應用程式和客戶安全性聲明標記語言 (SAML 2.0) 應用程式的存取權。如需詳細資訊，請參閱《AWS IAM Identity Center 使用者指南》**中的[跨應用程式的受信任身分傳播](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation.html)。

EMR Studio 和 SageMaker Unified Studio 均提供 Athena SQL 對可信身分傳播的支援。每個平台都為搭配使用 TIP 和 Athena 提供了特定介面。

在 EMR Studio 中搭配使用 Athena SQL 與 IAM Identity Center 身分時，您有兩個工作群組選項：
+ **一般工作群組** – 不需要使用者/群組指派。
+ **啟用 IAM Identity Center 的工作群組** – 需要透過 IAM Identity Center 主控台或 API 指派使用者/群組。

對於這兩個選項，您可以在已啟用 IAM Identity Center 的 EMR Studio 中使用 Athena SQL 介面來執行查詢。

## 考量和限制
<a name="workgroups-identity-center-considerations-and-limitations"></a>

當您搭配使用可信身分傳播與 Amazon Athena 時，請考慮下列幾點：
+ 建立工作群組之後，無法變更工作群組的身分驗證方法。
  + 無法修改現有的 Athena SQL 工作群組來支援啟用了 IAM Identity Center 的工作群組。現有的 Athena SQL 工作群組可以將身分資訊傳播到下游服務。
  + 無法修改啟用了 IAM Identity Center 的工作群組，來支援資源層級 IAM 許可或以 Identity Center 為基礎的 IAM 政策。
+ 若要存取啟用可信身分傳播的工作群組，IAM Identity Center 使用者必須指派給 Athena [GetWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetWorkGroup.html) API 動作回應所傳回的 `IdentityCenterApplicationArn`。
+ Amazon S3 存取授權必須設定為使用可信身分傳播身分。如需詳細資訊，請參閱《Amazon S3 使用者指南》**中的 [S3 Access Grants 和公司目錄身分](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-directory-ids.html)。
+ 啟用 IAM Identity Center 的 Athena 工作群組需要將 Lake Formation 設定為使用 IAM Identity Center 身分。如需組態資訊，請參閱《AWS Lake Formation 開發人員指南》**中的[整合 IAM Identity Center](https://docs.aws.amazon.com/lake-formation/latest/dg/identity-center-integration.html)。
+ 依預設，在啟用 IAM Identity Center 的工作群組中，查詢會在 30 分鐘後逾時。您可請求增加查詢逾時，但在可信身分傳播工作群組中，可執行的查詢上限為一小時。
+ 在可信身分傳播工作群組中，使用者或群組權利變更可能需要最多一小時才會生效。
+ 使用可信身分傳播的 Athena 工作群組中的查詢，無法直接從 Athena 主控台執行。必須從啟用了 IAM Identity Center 的 EMR Studio 中的 Athena 介面執行。如需有關在 EMR Studio 中使用 Athena 的詳細資訊，請參閱《Amazon EMR 管理指南》**中的在 [ EMR Studio 中使用 Amazon Athena SQL 編輯器](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-athena.html)。
+ 受信任身分傳播與下列 Athena 功能不相容。
  + 啟用 IAM Identity Center 的工作群組的 `aws:CalledVia` 內容索引鍵。
  + Athena for Spark 工作群組。
  + 對 Athena API 的聯合存取。
  + 使用 Lake Formation 以及 Athena JDBC 和 ODBC 驅動程式對 Athena 進行聯合存取。
+ 您只能在下列情況下搭配 Athena 使用受信任身分傳播 AWS 區域：
  + `us-east-2` – 美國東部 (俄亥俄)
  + `us-east-1` – 美國東部 (維吉尼亞北部)
  + `us-west-1` – 美國西部 (加利佛尼亞北部)
  + `us-west-2` – 美國西部 (奧勒岡)
  + `af-south-1` – 非洲 (開普敦)
  + `ap-east-1` – 亞太區域 (香港)
  + `ap-southeast-3` – 亞太區域 (雅加達)
  + `ap-south-1` – 亞太區域 (孟買)
  + `ap-northeast-3` – 亞太區域 (大阪)
  + `ap-northeast-2` – 亞太區域 (首爾)
  + `ap-southeast-1` – 亞太區域 (新加坡)
  + `ap-southeast-2` – 亞太區域 (雪梨)
  + `ap-northeast-1` – 亞太區域 (東京)
  + `ca-central-1` – 加拿大 (中部)
  + `eu-central-1` – 歐洲 (法蘭克福)
  + `eu-central-2` – 歐洲 (蘇黎世)
  + `eu-west-1` – 歐洲 (愛爾蘭)
  + `eu-west-2` – 歐洲 (倫敦)
  + `eu-south-1` – 歐洲 (米蘭)
  + `eu-west-3` – 歐洲 (巴黎)
  + `eu-north-1` – 歐洲 (斯德哥爾摩)
  + `me-south-1` – 中東 (巴林)
  + `sa-east-1` – 南美洲 (聖保羅)

## 所需的許可
<a name="workgroups-identity-center-required-permissions"></a>

若管理員 IAM 使用者在 Athena 主控台中建立啟用了 IAM Identity Center 的工作群組，必須附加下列政策。
+ `AmazonAthenaFullAccess` 受管政策。如需詳細資訊，請參閱[AWS 受管政策：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)。
+ 下列內嵌政策允許 IAM 和 IAM Identity Center 的以下動作：

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

****  

  ```
  { "Version":"2012-10-17",		 	 	  "Statement": [ { "Action": [ "iam:createRole",
      "iam:CreatePolicy", "iam:AttachRolePolicy", "iam:ListRoles", "identitystore:ListUsers",
      "identitystore:ListGroups", "identitystore:CreateUser", "identitystore:CreateGroup",
      "sso:ListInstances", "sso:CreateInstance", "sso:DeleteInstance", "sso:ListTrustedTokenIssuers",
      "sso:DescribeTrustedTokenIssuer", "sso:ListApplicationAssignments",
      "sso:DescribeRegisteredRegions", "sso:GetManagedApplicationInstance",
      "sso:GetSharedSsoConfiguration", "sso:PutApplicationAssignmentConfiguration",
      "sso:CreateApplication", "sso:DeleteApplication", "sso:PutApplicationGrant",
      "sso:PutApplicationAuthenticationMethod", "sso:PutApplicationAccessScope",
      "sso:ListDirectoryAssociations", "sso:CreateApplicationAssignment",
      "sso:DeleteApplicationAssignment", "organizations:ListDelegatedAdministrators",
      "organizations:DescribeAccount", "organizations:DescribeOrganization",
      "organizations:CreateOrganization", "sso-directory:SearchUsers", "sso-directory:SearchGroups",
      "sso-directory:CreateUser" ], "Effect": "Allow", "Resource": [ "*" ] }, { "Action": [
      "iam:PassRole" ], "Effect": "Allow", "Resource": [
          "arn:aws:iam::111122223333:role/service-role/AWSAthenaSQLRole-*"
      ] } ] }
  ```

------

## 建立啟用 IAM Identity Center 的 Athena 工作群組
<a name="workgroups-identity-center-creating-an-identity-center-enabled-athena-workgroup"></a>

下列程序顯示與建立啟用 IAM Identity Center 的 Athena 工作群組相關的步驟和選項。如需 Athena 工作群組可用的其他組態選項的說明，請參閱 [建立工作群組](creating-workgroups.md)。

**在 Athena 主控台中建立啟用 SSO 的工作群組**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在 Athena 主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在 **Workgroups** (工作群組) 頁面中，請選擇 **Create workgroup** (建立工作群組)。

1. 在**建立工作群組**頁面上，針對**工作群組名稱**，輸入工作群組的名稱。

1. 針對**分析引擎**，使用 **Athena SQL** 預設值。

1. 針對**身分驗證**，選擇 **IAM Identity Center**。

1. 針對 **IAM Identity Center 存取的服務角色**，選擇現有的服務角色，或建立新的服務角色。

   Athena 需要許可，才能代表您存取 IAM Identity Center。Athena 需要服務角色，才能執行此操作。服務角色是您管理的 IAM 角色，可授權 AWS 服務代表您存取其他 AWS 服務。若要查詢聯合目錄或執行 UDF，請使用對應的 Lambda 許可更新服務角色。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[建立角色以將許可委派給 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

1. 展開**查詢結果組態**，然後針對**查詢結果的位置**輸入或選擇 Amazon S3 路徑。

1. (選用) 選擇**加密查詢結果**。依預設，可支援 SSE-S3。若要搭配查詢結果位置使用 SSE-KMS 和 CSE-KMS，請從 Amazon S3 存取授權向 **IAM Identity Center 的服務角色**提供授權。如需詳細資訊，請參閱[範例角色政策](#workgroups-identity-center-access-grant-location-sample-role-policy)。

1. (選用) 選擇**建立以使用者身分為基礎的 S3 字首**。

   當您建立啟用 IAM Identity Center 的工作群組時，預設會選取**啟用 S3 Access Grants** 選項。您可使用 Amazon S3 Access Grants，來控制對 Amazon S3 中 Athena 查詢結果位置 (字首) 的存取權。如需有關 Amazon S3 Access Grants 的詳細資訊，請參閱[使用 Amazon S3 Access Grants 管理存取權](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants.html)。

   在使用 IAM Identity Center 身分驗證的 Athena 工作群組中，您可建立由 Amazon S3 Access Grants 管控的以身分為基礎的查詢結果位置。藉助這些以使用者身分為基礎的 Amazon S3 字首，Athena 工作群組中的使用者可將查詢結果與相同工作群組中的其他使用者隔離。

   啟用使用者字首選項時，Athena 會將使用者 ID 做為 Amazon S3 路徑字首附加至工作群組的查詢結果輸出位置 (例如 `s3://amzn-s3-demo-bucket/${user_id}`)。若要使用此功能，您必須將 Access Grants 設定為僅允許使用者存取具有 `user_id` 字首的位置。如需限制存取 Athena 查詢結果的 Amazon S3 存取授權位置角色政策的範例，請參閱 [範例角色政策](#workgroups-identity-center-access-grant-location-sample-role-policy)。
**注意**  
選取使用者身分 S3 字首選項，會自動啟用工作群組的「覆寫用戶端設定」選項，如下一個步驟所述。「覆寫用戶端設定」選項是使用者身分字首功能的必要條件。

1. 展開**設定**，然後確認選取**覆寫用戶端設定**。

   如果選取**覆寫用戶端設定**，則會在工作群組層級，強制工作群組中所有用戶端執行工作群組設定。如需詳細資訊，請參閱[Override client-side settings (覆寫用戶端設定)](workgroups-settings-override.md)。

1. (選用) 如 [建立工作群組](creating-workgroups.md) 中所述，進行需要的任何其他組態設定。

1. 選擇**建立工作群組**。

1. 使用 Athena 主控台的**工作群組**區段，將 IAM Identity Center 目錄中的使用者或群組指派給啟用 IAM Identity Center 的 Athena 工作群組。

## 範例角色政策
<a name="workgroups-identity-center-access-grant-location-sample-role-policy"></a>

下列範例說明要連接至 Amazon S3 存取授權位置的角色的政策，以限制對 Athena 查詢結果的存取權。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "s3:*"
            ],
            "Condition": {
                "ArnNotEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringNotEquals": {
                    "aws:ResourceAccount": "111122223333"
                }
            },
            "Effect": "Deny",
            "Resource": "*",
            "Sid": "ExplicitDenyS3"
        },
        {
            "Action": [
                "kms:*"
            ],
            "Effect": "Deny",
            "NotResource": "arn:aws:kms:us-east-1:111122223333:key/${keyid}",
            "Sid": "ExplictDenyKMS"
        },
        {
            "Action": [
                "s3:ListMultipartUploadParts",
                "s3:GetObject"
            ],
            "Condition": {
                "ArnEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringEquals": {
                    "aws:ResourceAccount": "111122223333"
                }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::ATHENA-QUERY-RESULT-LOCATION/${identitystore:UserId}/*",
            "Sid": "ObjectLevelReadPermissions"
        },
        {
            "Action": [
                "s3:PutObject",
                "s3:AbortMultipartUpload"
            ],
            "Condition": {
                "ArnEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringEquals": {
                "aws:ResourceAccount": "111122223333"
                }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::ATHENA-QUERY-RESULT-LOCATION/${identitystore:UserId}/*",
            "Sid": "ObjectLevelWritePermissions"
        },
        {
            "Action": "s3:ListBucket",
            "Condition": {
                "ArnEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringEquals": {
                    "aws:ResourceAccount": "111122223333"
                },
                "StringLikeIfExists": {
                    "s3:prefix": [
                        "${identitystore:UserId}",
                        "${identitystore:UserId}/*"
                    ]
                }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::ATHENA-QUERY-RESULT-LOCATION",
            "Sid": "BucketLevelReadPermissions"
        },
        {
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/${keyid}",
            "Sid": "KMSPermissions"
        }
    ]
}
```

------

# 為工作群組設定最低加密
<a name="workgroups-minimum-encryption"></a>

身為 Athena SQL 工作群組的管理員，您可以在 Amazon S3 對工作群組的所有查詢結果強制執行最低層級的加密。您可以使用此功能，確保查詢結果絕不會儲存在處於未加密狀態的 Amazon S3 儲存貯體中。

若使用者位於啟用最低加密的工作群組中，則當其提交查詢時，只能將加密設定為您設定的最低層級，或將加密設定為較高層級 (如果有的話)。Athena 會在使用者執行查詢時，指定的層級或工作群組中設定的層級加密查詢結果。

以下為可用的層級：
+ **基本** – 使用 Amazon S3 受管金鑰 (SSE-S3) 的 Amazon S3 伺服器端加密 (**SSE\$1S3**)。
+ **中級** – 使用 KMS 受管金鑰的伺服器端加密 (**SSE\$1KMS**)。
+ **進階** – 使用 KMS 受管金鑰的用戶端加密 (**CSE\$1KMS**)。

## 考量和限制
<a name="workgroups-minimum-encryption-considerations-and-limitations"></a>
+ 最低加密功能不適用於已啟用 Apache Spark 的工作群組。
+ 只有當工作群組未啟用**[覆寫用戶端設定](https://docs.aws.amazon.com/athena/latest/ug/workgroups-settings-override.html)**選項時，最低加密功能才能正常運作。
+ 如果工作群組已啟用**覆寫用戶端設定**選項，則會採用工作群組加密設定，且最低加密設定不會造成任何影響。
+ 啟用此功能無需付費。

## 為工作群組啟用最低加密
<a name="workgroups-minimum-encryption-enabling"></a>

您可以在建立或更新工作群組時，為 Athena SQL 工作群組的查詢結果啟用最低加密層級。若要這樣做，您可以使用 Athena 主控台、Athena API 或 AWS CLI。

### 使用 Athena 主控台啟用最低加密
<a name="workgroups-minimum-encryption-enabling-using-the-athena-console"></a>

若要開始使用 Athena 主控台建立或編輯工作群組，請參閱[建立工作群組](https://docs.aws.amazon.com/athena/latest/ug/workgroups-create-update-delete.html#creating-workgroups)或[編輯工作群組](https://docs.aws.amazon.com/athena/latest/ug/workgroups-create-update-delete.html#editing-workgroups)。設定工作群組時，請使用下列步驟來啟用最低加密。

**若要為工作群組查詢結果設定最低加密層級**

1. 清除**覆寫用戶端設定**選項，或確認未選取該選項。

1. 選取**加密查詢結果**選項。

1. 針對**加密類型**，請選取您希望 Athena 用於工作群組查詢結果的加密方法 (**SSE\$1S3**、**SSE\$1KMS** 或 **CSE\$1KMS**)。這些加密類型對應至基本、中級和進階安全層級。

1. 若要針對所有使用者強制執行您選擇作為最低加密層級的加密方法，請選取**將 *encryption\$1method* 設定為最低加密**。

   選取此選項時，資料表會顯示，當您選擇的加密類型變為最低時，使用者將允許的加密階層和加密層級。

1. 建立工作群組或更新工作群組組態後，請選擇**建立工作群組**或**儲存變更**。

### 使用 Athena API 或 AWS CLI 啟用最低加密
<a name="workgroups-minimum-encryption-enabling-using-the-athena-api-or-cli"></a>

當您使用 [CreateWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateWorkGroup.html) 或 [UpdateWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_UpdateWorkGroup.html) API 建立或更新 Athena SQL 工作群組時，請將 [EnforceWorkGroupConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroupConfiguration.html#athena-Type-WorkGroupConfiguration-EnforceWorkGroupConfiguration) 設定為 `false`、將 [EnableMinimumEncryptionConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroupConfiguration.html#athena-Type-WorkGroupConfiguration-EnableMinimumEncryptionConfiguration) 設定為 `true`，並使用 [EncryptionOption](https://docs.aws.amazon.com/athena/latest/APIReference/API_EncryptionConfiguration.html#athena-Type-EncryptionConfiguration-EncryptionOption) 來指定加密類型。

在 中 AWS CLI，使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/create-work-group.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/create-work-group.html)或 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/update-work-group.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/update-work-group.html)命令搭配 `--configuration`或 `--configuration-updates` 參數，並指定與 API 對應的選項。

# 設定存取預備陳述式
<a name="security-iam-athena-prepared-statements"></a>

本主題涵蓋 中預備陳述式的 IAM 許可 Amazon Athena。每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

如需有關預備陳述式的詳細資訊，請參閱[使用參數化查詢](querying-with-prepared-statements.md)。

建立、管理和執行預備陳述式時，需要下列 IAM 許可。

```
athena:CreatePreparedStatement
athena:UpdatePreparedStatement
athena:GetPreparedStatement
athena:ListPreparedStatements
athena:DeletePreparedStatement
```

如以下資料表所示方式使用這些許可。


****  

| 若要執行此作業 | 使用這些許可 | 
| --- | --- | 
| 執行 PREPARE 查詢 | athena:StartQueryExecution athena:CreatePreparedStatement | 
| 重新執行 PREPARE 查詢以更新現有的預備陳述式 | athena:StartQueryExecution athena:UpdatePreparedStatement | 
| 執行 EXECUTE 查詢 | athena:StartQueryExecution athena:GetPreparedStatement | 
| 執行 DEALLOCATE PREPARE 查詢 | athena:StartQueryExecution athena:DeletePreparedStatement | 

## 範例
<a name="security-iam-athena-prepared-statements-example"></a>

以下 IAM 政策範例授予許可，以在指定的帳戶 ID 和工作群組上管理和執行預備陳述式。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "athena:CreatePreparedStatement",
                "athena:UpdatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:DeletePreparedStatement",
                "athena:ListPreparedStatements"
            ],
            "Resource": [
                "arn:aws:athena:*:111122223333:workgroup/<workgroup-name>"
            ]
        }
    ]
}
```

------

# 針對 Athena 使用 CalledVia 內容索引鍵
<a name="security-iam-athena-calledvia"></a>

當[委託](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-principal)人向 提出[請求](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-request)時 AWS， 會將請求資訊 AWS 收集到評估和授權請求的*請求內容*中。您可以使用 JSON 政策的 `Condition` 元素，來比較請求內容中的鍵和您在政策中指定的鍵值。*全域條件內容索引鍵*為帶有 `aws:` 字首的條件索引鍵。

## 關於 aws:CalledVia 內容索引鍵
<a name="security-iam-athena-calledvia-the-awscalledvia-context-key"></a>

您可以使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia) 全域條件內容索引鍵，以將政策中的服務與代表 IAM 主體 (使用者或角色) 提出請求的服務進行比較。當委託人向 提出請求時 AWS 服務，該服務可能會使用委託人的登入資料向其他 服務提出後續請求。`aws:CalledVia` 鍵包含代表主體提出請求的鏈結中，每個服務的排序清單。

透過指定`aws:CalledVia`內容金鑰的服務主體名稱，您可以將內容金鑰設為 AWS 服務特定。例如，您可以使用 `aws:CalledVia` 條件索引鍵來限制僅能有從 Athena 進行的請求。若要搭配 Athena 使用政策中的 `aws:CalledVia` 條件索引鍵，您需指定 Athena 服務主體名稱 `athena.amazonaws.com`，如下列範例所示。

```
 ...
    "Condition": {
        "ForAnyValue:StringEquals": { 
            "aws:CalledVia": "athena.amazonaws.com"
        }
    }
...
```

您可以使用 `aws:CalledVia` 內容索引鍵，以確保如果呼叫者從 Athena 呼叫資源，則其僅能存取一項資源 (如 Lambda 函數)。

**注意**  
`aws:CalledVia` 內容索引鍵與受信任的身分傳播功能不相容。

## 新增 CalledVia 內容索引鍵，以存取 Lambda 函式
<a name="security-iam-athena-calledvia-example-policy-to-add-an-optional-calledvia-context-key-for-fine-grained-access-to-a-lambda-function"></a>

Athena 要求呼叫者需具有 `lambda:InvokeFunction` 許可，以呼叫與查詢相關聯的 Lambda 函數。下列陳述式指定使用者只能從 Athena 調用 Lambda 函式。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-1:111122223333:function:OneAthenaLambdaFunction",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:CalledVia": "athena.amazonaws.com"
                }
            }
        }
    ]
}
```

------

以下範例會說明如何在政策中加入先前的陳述式，以允許使用者執行並讀取聯合查詢。獲准執行這些動作的主體在其執行的查詢中，可以指定與聯合資料來源相關聯的 Athena 目錄。不過，除非透過 Athena 呼叫函數，否則主體無法存取相關聯的 Lambda 函數。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0", 
            "Effect": "Allow",
            "Action": [ 
                "athena:GetWorkGroup", 
                "s3:PutObject", 
                "s3:GetObject", 
                "athena:StartQueryExecution", 
                "s3:AbortMultipartUpload",  
                "athena:StopQueryExecution", 
                "athena:GetQueryExecution", 
                "athena:GetQueryResults", 
                "s3:ListMultipartUploadParts" 
            ], 
            "Resource": [ 
                "arn:aws:athena:*:111122223333:workgroup/WorkGroupName",
                "arn:aws:s3:::MyQueryResultsBucket/*", 
                "arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillPrefix*"
            ] 
        }, 
        {
            "Sid": "VisualEditor1", 
            "Effect": "Allow", 
            "Action": "athena:ListWorkGroups", 
            "Resource": "*" 
        }, 
        {
            "Sid": "VisualEditor2", 
            "Effect": "Allow", 
            "Action": 
                [ 
                "s3:ListBucket", 
                "s3:GetBucketLocation" 
                ], 
            "Resource": "arn:aws:s3:::MyLambdaSpillBucket" 
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:OneAthenaLambdaFunction", 
                "arn:aws:lambda:*:111122223333:function:AnotherAthenaLambdaFunction"
            ], 
            "Condition": {
                "ForAnyValue:StringEquals": { 
                    "aws:CalledVia": "athena.amazonaws.com"
                }
            }
        }            
    ]
}
```

------

如需有關 `CalledVia` 條件索引鍵的詳細資訊，請參閱《IAM 使用者指南》**中的 [AWS 全域條件內容索引鍵](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

# 允許存取外部 Hive 中繼存放區的 Athena 資料連接器
<a name="hive-metastore-iam-access"></a>

本主題中的許可政策範例示範需要允許的動作，以及允許這些動作的資源。將類似的許可政策連接至 IAM 身分之前，請仔細檢查這些政策，並根據您的需求進行修改。
+  [Example Policy to Allow an IAM Principal to Query Data Using Athena Data Connector for External Hive Metastore](#hive-using-iam) 
+  [Example Policy to Allow an IAM Principal to Create an Athena Data Connector for External Hive Metastore](#hive-creating-iam) 

**Example - 允許 IAM 主體使用外部 Hive 中繼存放區的 Athena 資料連接器來查詢資料**  
除了授權完整存取 Athena 動作的 [AWS 受管政策：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)，下列政策也會連接至 IAM 委託人。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "lambda:GetFunction",
                "lambda:GetLayerVersion",
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:MyAthenaLambdaFunction",
                "arn:aws:lambda:*:111122223333:function:AnotherAthenaLambdaFunction",
                "arn:aws:lambda:*:111122223333:layer:MyAthenaLambdaLayer:*"
            ]
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": "arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillLocation"
        }
    ]
}
```


**許可說明**  

| 允許的動作 | 說明 | 
| --- | --- | 
|  <pre>"s3:GetBucketLocation",<br />"s3:GetObject",<br />"s3:ListBucket",<br />"s3:PutObject",<br />"s3:ListMultipartUploadParts",<br />"s3:AbortMultipartUpload"</pre>  |  `s3` 動作允許讀取和寫入指定為 `"arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillLocation"` 的資源，其中 *MyLambdaSpillLocation* 會識別一或多個叫用的 Lambda 函數的組態中所指定的溢出儲存貯體。只有在您使用 Lambda 層建立自訂執行時間相依性，以在部署時間減少函數成品規模時，才需要 *arn:aws:lambda:\$1:*MyAWSAcctId*:layer:*MyAthenaLambdaLayer*:\$1* 資源識別碼。最後面的 `*` 是層版本的萬用字元。  | 
|  <pre>"lambda:GetFunction",<br />"lambda:GetLayerVersion",<br />"lambda:InvokeFunction"</pre>  | 允許查詢叫用 Resource區塊中指定的 AWS Lambda 函數。例如，arn:aws:lambda:\$1:MyAWSAcctId:function:MyAthenaLambdaFunction，其中 MyAthenaLambdaFunction 會指定要叫用的 Lambda 函數的名稱。如範例所示，可以指定多個函數。 | 

**Example - 允許 IAM 主體建立外部 Hive 中繼存放區的 Athena 資料連接器**  
除了授權完整存取 Athena 動作的 [AWS 受管政策：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)，下列政策也會連接至 IAM 委託人。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:GetFunction",
                "lambda:ListFunctions",
                "lambda:GetLayerVersion",
                "lambda:InvokeFunction",
                "lambda:CreateFunction",
                "lambda:DeleteFunction",
                "lambda:PublishLayerVersion",
                "lambda:DeleteLayerVersion",
                "lambda:UpdateFunctionConfiguration",
                "lambda:PutFunctionConcurrency",
                "lambda:DeleteFunctionConcurrency"
            ],
            "Resource": "arn:aws:lambda:*:111122223333: function: MyAthenaLambdaFunctionsPrefix*"
        }
    ]
}
```
 **許可說明**   
允許查詢叫用 `Resource` 區塊中指定 AWS Lambda 函數的 AWS Lambda 函數。例如，`arn:aws:lambda:*:MyAWSAcctId:function:MyAthenaLambdaFunction`，其中 *MyAthenaLambdaFunction* 會指定要叫用的 Lambda 函數的名稱。如範例所示，可以指定多個函數。

# 允許 Lambda 函數存取外部 Hive 中繼存放區
<a name="hive-metastore-iam-access-lambda"></a>

若要在帳戶中呼叫 Lambda 函數，您必須建立具有下列許可的角色：
+ `AWSLambdaVPCAccessExecutionRole` - [AWS Lambda 執行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)許可，用於管理將您的函數連接到 VPC 的彈性網路介面。請確定您有足夠數量的網路界面和 IP 地址可用。
+ `AmazonAthenaFullAccess` - [AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 受管政策會授予 Athena 的完整存取權。
+ 允許 Lambda 函數寫入 S3 並允許 Athena 從 S3 讀取的 Amazon S3 政策。

例如，下列政策定義溢出位置 `s3:\\mybucket\spill` 的許可。

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

****  

```
{ "Version":"2012-10-17",		 	 	  "Statement": [ { "Effect": "Allow", "Action": [
    "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/spill" ] } ] }
```

------

每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

## 建立 Lambda 函式
<a name="hive-metastore-iam-access-lambda-creating-lambda-functions"></a>

若要在您的帳戶中建立 Lambda 函數，需具備函數開發許可或 `AWSLambdaFullAccess` 角色。如需詳細資訊，請參閱 [AWS Lambda身分型 IAM 政策](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html)。

由於 Athena 使用 AWS Serverless Application Repository 來建立 Lambda 函數，因此建立 Lambda 函數的超級使用者或管理員也應該具有 IAM 政策[，以允許 Athena 聯合查詢](federated-query-iam-access.md)。

## 設定目錄註冊和中繼資料 API 操作的許可
<a name="hive-metastore-iam-access-lambda-catalog-registration-and-metadata-api-operations"></a>

若要 API 存取目錄註冊和中繼資料操作，您可以使用 [AmazonAthenaFullAccess 受管政策](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)。如果您不使用 `AmazonAthenaFullAccess` 政策，請將下列 API 操作新增至您的 Athena 政策：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListDataCatalogs",
                "athena:GetDataCatalog",
                "athena:CreateDataCatalog",
                "athena:UpdateDataCatalog",
                "athena:DeleteDataCatalog",
                "athena:GetDatabase",
                "athena:ListDatabases",
                "athena:GetTableMetadata",
                "athena:ListTableMetadata"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

## 跨區域呼叫 Lambda 函式
<a name="hive-metastore-iam-access-lambda-cross-region-invocation"></a>

依預設，Athena 會叫用在相同區域中定義的 Lambda 函數。若要在執行 Athena 查詢的區域 AWS 區域 以外的 中叫用 Lambda 函數，請使用 Lambda 函數的完整 ARN。

下列範例說明了歐洲 (法蘭克福) 區域中的目錄如何在美國東部 (維吉尼亞北部) 區域中指定 Lambda 函式，以從歐洲 (法蘭克福) 區域中的 Hive 中繼存放區擷取資料。

```
arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new     
```

當您以這種方式指定完整的 ARN 時，Athena 可以在 `us-east-1` 呼叫 `external-hms-service-new` Lambda 函數，從 `eu-central-1` 擷取 Hive 中繼存放區資料。

**注意**  
目錄應該在您 AWS 區域 用來執行 Athena 查詢的相同 中註冊。

## 跨帳戶呼叫 Lambda 函式
<a name="hive-metastore-iam-access-lambda-cross-account-invocation"></a>

有時您可能需要從不同的帳戶存取 Hive 中繼存放區。例如，若要執行 Hive 中繼存放區，您可以使用與用於 Athena 查詢的帳戶不同的帳戶。不同的群組或團隊可能會在其 VPC 內使用不同的帳戶來執行 Hive 中繼存放區。或者，您可能想要存取來自不同群組或團隊的不同 Hive 中繼存放區的中繼資料。

Athena 會使用 [AWS Lambda 支援進行跨帳戶存取](https://aws.amazon.com/blogs/compute/easy-authorization-of-aws-lambda-functions/)，以啟用 Hive 中繼存放區的跨帳戶存取。

**注意**  
請注意，Athena 的跨帳戶存取通常意味著可跨帳戶存取 Amazon S3 中的中繼資料和資料。

想像下列案例：
+ 帳戶 `111122223333` 在 Athena 中的 us-east-1 上設定 Lambda 函數 `external-hms-service-new`，以存取 EMR 叢集上執行的 Hive 中繼存放區。
+ 帳戶 `111122223333` 想要允許帳戶 444455556666 存取 Hive 中繼存放區資料。

若要授予帳戶`444455556666`存取 Lambda 函數 的權限`external-hms-service-new`，帳戶`111122223333`會使用下列 AWS CLI `add-permission`命令。為了方便閱讀，命令已經過格式化處理。

```
$ aws --profile perf-test lambda add-permission
      --function-name external-hms-service-new
      --region us-east-1
      --statement-id Id-ehms-invocation2
      --action "lambda:InvokeFunction"
      --principal arn:aws:iam::444455556666:user/perf1-test
{
    "Statement": "{\"Sid\":\"Id-ehms-invocation2\",
                   \"Effect\":\"Allow\",
                   \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"},
                   \"Action\":\"lambda:InvokeFunction\",
                   \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}"
}
```

若要檢查 Lambda 許可，請使用 `get-policy` 命令，如下列範例所示。為了方便閱讀，命令已經過格式化處理。

```
$ aws --profile perf-test lambda get-policy 
      --function-name arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new 
      --region us-east-1
{
    "RevisionId": "711e93ea-9851-44c8-a09f-5f2a2829d40f",
    "Policy": "{\"Version\":\"2012-10-17\",		 	 	 
                \"Id\":\"default\",
                \"Statement\":[{\"Sid\":\"Id-ehms-invocation2\",
                                \"Effect\":\"Allow\",
                                \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"},
                                \"Action\":\"lambda:InvokeFunction\",
                                \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}]}"
}
```

新增許可後，您可以在定義目錄 `ehms` 時，在 `us-east-1` 上使用 Lambda 函數的完整 ARN，如下所示：

```
arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new
```

如需跨區域呼叫的相關資訊，請參閱本主題稍早的[跨區域呼叫 Lambda 函式](#hive-metastore-iam-access-lambda-cross-region-invocation)。

### 授予資料的跨帳戶存取權
<a name="hive-metastore-iam-access-lambda-granting-cross-account-access-to-data"></a>

在執行 Athena 查詢之前，您必須授予對 Amazon S3 中資料的跨帳戶存取。您可採用下列其中一種方式來這麼做：
+ 使用[正式使用者 ID](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html) 來更新 Amazon S3 儲存貯體的存取控制清單政策。
+ 將跨帳戶存取新增至 Amazon S3 儲存貯體政策。

例如，將下列政策新增至帳戶 `111122223333` 中的 Amazon S3 儲存貯體政策，以允許帳戶 `444455556666` 從指定的 Amazon S3 位置讀取資料。

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

****  

```
{ "Version":"2012-10-17",		 	 	  "Statement": [ { "Sid": "Stmt1234567890123", "Effect":
    "Allow", "Principal": { "AWS":
        "arn:aws:iam::444455556666:user/perf1-test"
    }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::athena-test/lambda/dataset/*" } ]
    }
```

------

**注意**  
您可能不只需要將資料的跨帳戶存取授予 Amazon S3，也需要授予 Amazon S3 溢出位置的跨帳戶存取。當回應物件的大小超過指定閾值時，您的 Lambda 函數會將額外的資料溢出到溢出位置。請參閱本主題開頭的範例政策。

在目前的範例中，將跨帳戶存取授予 `444455556666,` 後，`444455556666` 可以在自己的 `ehms` 中使用目錄 `account` 來查詢帳戶 `111122223333` 中定義的資料表。

在下列範例中，SQL Workbench 設定檔 `perf-test-1` 適用於帳戶 `444455556666`。查詢使用目錄 `ehms` 來存取 Hive 中繼存放區和帳戶 `111122223333` 中的 Amazon S3 資料。

![\[在 SQL Workbench 中跨帳戶存取 Hive 中繼存放區和 Amazon S3 資料。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/hive-metastore-iam-access-lambda-1.png)


# 建立連接器和 Athena 目錄所需的許可
<a name="athena-catalog-access"></a>

若要調用 Athena `CreateDataCatalog`，您必須建立具有下列許可的角色：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
  {
  "Sid": "ECR",
  "Effect": "Allow",
  "Action": [
  "ecr:BatchGetImage",
  "ecr:GetDownloadUrlForLayer"
  ],
  "Resource": "arn:aws:ecr:*:*:repository/*"
  },
  {
  "Effect": "Allow",
  "Action": [
  "s3:GetObject",
  "glue:TagResource",
  "glue:GetConnection",
  "glue:CreateConnection",
  "glue:DeleteConnection",
  "glue:UpdateConnection",
  "serverlessrepo:CreateCloudFormationTemplate",
  "serverlessrepo:GetCloudFormationTemplate",
  "cloudformation:CreateStack",
  "cloudformation:DeleteStack",
  "cloudformation:DescribeStacks",
  "cloudformation:CreateChangeSet",
  "cloudformation:DescribeAccountLimits",
  "cloudformation:CreateStackSet",
  "cloudformation:ValidateTemplate",
  "cloudformation:CreateUploadBucket",
  "cloudformation:DescribeStackDriftDetectionStatus",
  "cloudformation:ListExports",
  "cloudformation:ListStacks",
  "cloudformation:EstimateTemplateCost",
  "cloudformation:ListImports",
  "lambda:InvokeFunction",
  "lambda:GetFunction",
  "lambda:DeleteFunction",
  "lambda:CreateFunction",
  "lambda:TagResource",
  "lambda:ListFunctions",
  "lambda:GetAccountSettings",
  "lambda:ListEventSourceMappings",
  "lambda:ListVersionsByFunction",
  "lambda:GetFunctionConfiguration",
  "lambda:PutFunctionConcurrency",
  "lambda:UpdateFunctionConfiguration",
  "lambda:UpdateFunctionCode",
  "lambda:DeleteFunctionConcurrency",
  "lambda:RemovePermission",
  "lambda:AddPermission",
  "lambda:ListTags",
  "lambda:GetAlias",
  "lambda:GetPolicy",
  "lambda:ListAliases",
  "ec2:DescribeSecurityGroups",
  "ec2:DescribeSubnets",
  "ec2:DescribeVpcs",
  "secretsmanager:ListSecrets",
  "glue:GetCatalogs"
  ],
  "Resource": "*"
  },
  {
  "Effect": "Allow",
  "Action": [
  "iam:AttachRolePolicy",
  "iam:DetachRolePolicy",
  "iam:DeleteRolePolicy",
  "iam:PutRolePolicy",
  "iam:GetRolePolicy",
  "iam:CreateRole",
  "iam:TagRole",
  "iam:DeleteRole",
  "iam:GetRole",
  "iam:PassRole",
  "iam:ListRoles",
  "iam:ListAttachedRolePolicies",
  "iam:ListRolePolicies",
  "iam:GetPolicy",
  "iam:UpdateRole"
  ],
  "Resource": [
  "arn:aws:iam::*:role/RoleName",
  "arn:aws:iam::111122223333:policy/*"
  ]
  }
  ]
  }
```

------

# 允許存取 Athena 聯合查詢：範例政策
<a name="federated-query-iam-access"></a>

本主題中的許可政策範例示範需要允許的動作，以及允許這些動作的資源。將這些政策連接至 IAM 身分之前，請仔細檢查政策，並根據您的需求進行修改。

如需有關將政策連接至 IAM 身分的資訊，請參閱《[IAM 使用者指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/)》中的[新增和移除 IAM 身分許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。
+  [Example policy to allow an IAM principal to run and return results using Athena Federated Query](#fed-using-iam) 
+  [Example Policy to Allow an IAM Principal to Create a Data Source Connector](#fed-creating-iam) 

**Example - 允許 IAM 主體使用 Athena 聯合查詢執行並傳回結果**  
在下列以身分識別為基礎的許可政策中，允許使用者或其他 IAM 委託人需要的動作，有這些動作才能使用 Athena 聯合查詢。獲准執行這些動作的委託人在其執行的查詢中，可以指定與聯合資料來源相關聯的 Athena 目錄。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Athena",
            "Effect": "Allow",
            "Action": [
                "athena:GetDataCatalog",
                "athena:GetQueryExecution",
                "athena:GetQueryResults",
                "athena:GetWorkGroup",
                "athena:StartQueryExecution",
                "athena:StopQueryExecution"
            ],
            "Resource": [
                "arn:aws:athena:*:111122223333:workgroup/WorkgroupName",
                "arn:aws:athena:us-east-1:111122223333:datacatalog/DataCatalogName"
            ]
        },
        {
            "Sid": "ListAthenaWorkGroups",
            "Effect": "Allow",
            "Action": "athena:ListWorkGroups",
            "Resource": "*"
        },
        {
            "Sid": "Lambda",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:OneAthenaLambdaFunction",
                "arn:aws:lambda:*:111122223333:function:AnotherAthenaLambdaFunction"
            ]
        },
        {
            "Sid": "S3",
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListMultipartUploadParts",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::MyLambdaSpillBucket",
                "arn:aws:s3:::MyLambdaSpillBucket/*",
                "arn:aws:s3:::MyQueryResultsBucket",
                "arn:aws:s3:::MyQueryResultsBucket/*"
            ]
        }
    ]
}
```


**許可說明**  

| 允許的動作 | 說明 | 
| --- | --- | 
|  <pre> "athena:GetQueryExecution", <br /> "athena:GetQueryResults",<br /> "athena:GetWorkGroup",<br /> "athena:StartQueryExecution",<br /> "athena:StopQueryExecution"</pre>  |  執行聯合查詢所需的 Athena 許可。  | 
|  <pre> "athena:GetDataCatalog",<br /> "athena:GetQueryExecution,"<br /> "athena:GetQueryResults",<br /> "athena:GetWorkGroup",<br /> "athena:StartQueryExecution",<br /> "athena:StopQueryExecution"</pre>  |  執行聯合檢視查詢所需的 Athena 許可。檢視需要 `GetDataCatalog` 動作。  | 
|  <pre>"lambda:InvokeFunction"</pre>  | 允許查詢叫用 Resource 區塊中指定 AWS Lambda 函數的 AWS Lambda 函數。例如，arn:aws:lambda:\$1:MyAWSAcctId:function:MyAthenaLambdaFunction，其中 MyAthenaLambdaFunction 會指定要叫用的 Lambda 函數的名稱。如範例所示，可以指定多個函式。 | 
|  <pre>"s3:AbortMultipartUpload",<br />"s3:GetBucketLocation",<br />"s3:GetObject",<br />"s3:ListBucket",<br />"s3:ListMultipartUploadParts",<br />"s3:PutObject"</pre>  |  需要 `s3:ListBucket` 和 `s3:GetBucketLocation` 許可才能存取執行 `StartQueryExecution` 的 IAM 主體的查詢輸出儲存貯體。 `s3:PutObject`、`s3:ListMultipartUploadParts` 和 `s3:AbortMultipartUpload` 允許將查詢結果寫入 `arn:aws:s3:::MyQueryResultsBucket/*` 資源識別碼指定的查詢結果儲存貯體的所有子資料夾，其中 *MyQueryResultsBucket* 是 Athena 查詢結果儲存貯體。如需詳細資訊，請參閱[使用查詢結果和近期查詢](querying.md)。 `s3:GetObject` 針對指定為 `arn:aws:s3:::MyQueryResultsBucket` 的資源，允許讀取查詢結果和查詢歷史記錄，其中 *MyQueryResultsBucket* 是 Athena 查詢結果儲存貯體。 `s3:GetObject` 還允許從指定為 `"arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillPrefix*"` 的資源讀取，其中 *MyLambdaSpillPrefix* 是在一或多個叫用的 Lambda 函數的組態中指定。  | 

**Example - 允許 IAM 主體建立資料來源連接器**  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:ListVersionsByFunction",
                "iam:CreateRole",
                "lambda:GetFunctionConfiguration",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "lambda:PutFunctionConcurrency",
                "iam:PassRole",
                "iam:DetachRolePolicy",
                "lambda:ListTags",
                "iam:ListAttachedRolePolicies",
                "iam:DeleteRolePolicy",
                "lambda:DeleteFunction",
                "lambda:GetAlias",
                "iam:ListRolePolicies",
                "iam:GetRole",
                "iam:GetPolicy",
                "lambda:InvokeFunction",
                "lambda:GetFunction",
                "lambda:ListAliases",
                "lambda:UpdateFunctionConfiguration",
                "iam:DeleteRole",
                "lambda:UpdateFunctionCode",
                "s3:GetObject",
                "lambda:AddPermission",
                "iam:UpdateRole",
                "lambda:DeleteFunctionConcurrency",
                "lambda:RemovePermission",
                "iam:GetRolePolicy",
                "lambda:GetPolicy"
            ],
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:MyAthenaLambdaFunctionsPrefix*",
                "arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/*",
                "arn:aws:iam::*:role/RoleName",
                "arn:aws:iam::111122223333:policy/*"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateUploadBucket",
                "cloudformation:DescribeStackDriftDetectionStatus",
                "cloudformation:ListExports",
                "cloudformation:ListStacks",
                "cloudformation:ListImports",
                "lambda:ListFunctions",
                "iam:ListRoles",
                "lambda:GetAccountSettings",
                "ec2:DescribeSecurityGroups",
                "cloudformation:EstimateTemplateCost",
                "ec2:DescribeVpcs",
                "lambda:ListEventSourceMappings",
                "cloudformation:DescribeAccountLimits",
                "ec2:DescribeSubnets",
                "cloudformation:CreateStackSet",
                "cloudformation:ValidateTemplate"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "cloudformation:*",
            "Resource": [
                "arn:aws:cloudformation:*:111122223333:stack/aws-serverless-repository-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:111122223333:stack/serverlessrepo-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:*:transform/Serverless-*",
                "arn:aws:cloudformation:*:111122223333:stackset/aws-serverless-repository-MyCFStackPrefix*:*",
                "arn:aws:cloudformation:*:111122223333:stackset/serverlessrepo-MyCFStackPrefix*:*"
            ]
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "serverlessrepo:*",
            "Resource": "arn:aws:serverlessrepo:*:*:applications/*"
        },
        {
            "Sid": "ECR",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": "arn:aws:ecr:*:*:repository/*"
        }
    ]
}
```


**許可說明**  

| 允許的動作 | 說明 | 
| --- | --- | 
|  <pre>"lambda:CreateFunction",<br />"lambda:ListVersionsByFunction",<br />"lambda:GetFunctionConfiguration",<br />"lambda:PutFunctionConcurrency",<br />"lambda:ListTags",<br />"lambda:DeleteFunction",<br />"lambda:GetAlias",<br />"lambda:InvokeFunction",<br />"lambda:GetFunction",<br />"lambda:ListAliases",<br />"lambda:UpdateFunctionConfiguration",<br />"lambda:UpdateFunctionCode",<br />"lambda:AddPermission",<br />"lambda:DeleteFunctionConcurrency",<br />"lambda:RemovePermission",<br />"lambda:GetPolicy"<br />"lambda:GetAccountSettings",<br />"lambda:ListFunctions",<br />"lambda:ListEventSourceMappings",<br /></pre>  |  允許建立和管理列為資源的 Lambda 函數。在範例中，資源識別符 `arn:aws:lambda:*:MyAWSAcctId:function:MyAthenaLambdaFunctionsPrefix*` 中使用名稱字首，其中 `MyAthenaLambdaFunctionsPrefix` 是 Lambda 函式群組的名稱中使用的共同字首，因此不需要個別指定為資源。您可以指定一或多個 Lambda 函數資源。  | 
|  <pre>"s3:GetObject"</pre>  | 允許讀取資源識別符 所指定 AWS Serverless Application Repository 需要 的儲存貯體arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/\$1。此儲存貯體可能專屬於您的帳戶。 | 
|  <pre>"cloudformation:*"</pre>  |  允許建立和管理資源 指定的 CloudFormation 堆疊`MyCFStackPrefix`。這些堆疊和堆疊集是部署連接器和 UDFs AWS Serverless Application Repository 的方式。  | 
|  <pre>"serverlessrepo:*"</pre>  | 允許搜尋、檢視、發佈和更新 中由資源識別符 AWS Serverless Application Repository指定的應用程式arn:aws:serverlessrepo:\$1:\$1:applications/\$1。 | 
|  <pre>"ecr:BatchGetImage",<br />"ecr:GetDownloadUrlForLayer"</pre>  |  允許已建立的 Lambda 函式存取聯合連接器 ECR 映像。  | 

# 允許存取 Athena UDF：範例政策
<a name="udf-iam-access"></a>

本主題中的許可政策範例示範需要允許的動作，以及允許這些動作的資源。將類似的許可政策連接至 IAM 身分之前，請仔細檢查這些政策，並根據您的需求進行修改。
+  [Example Policy to Allow an IAM Principal to Run and Return Queries that Contain an Athena UDF Statement](#udf-using-iam) 
+  [Example Policy to Allow an IAM Principal to Create an Athena UDF](#udf-creating-iam) 

**Example - 允許 IAM 主體執行並傳回包含 Athena UDF 陳述式的查詢**  
在下列以身分識別為基礎的許可政策中，允許使用者或其他 IAM 委託人需要的動作，有這些動作才能執行使用 Athena UDF 陳述式的查詢。  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "lambda:InvokeFunction",
                "athena:GetQueryResults",
                "s3:ListMultipartUploadParts",
                "athena:GetWorkGroup",
                "s3:PutObject",
                "s3:GetObject",
                "s3:AbortMultipartUpload",
                "athena:StopQueryExecution",
                "athena:GetQueryExecution",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:athena:*:MyAWSAcctId:workgroup/MyAthenaWorkGroup",
                "arn:aws:s3:::MyQueryResultsBucket/*",
                "arn:aws:lambda:*:MyAWSAcctId:function:OneAthenaLambdaFunction",
                "arn:aws:lambda:*:MyAWSAcctId:function:AnotherAthenaLambdaFunction"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "athena:ListWorkGroups",
            "Resource": "*"
        }
    ]
}
```


**許可說明**  

| 允許的動作 | 說明 | 
| --- | --- | 
|  <pre>"athena:StartQueryExecution",<br /> "athena:GetQueryResults",<br /> "athena:GetWorkGroup",<br /> "athena:StopQueryExecution",<br /> "athena:GetQueryExecution",<br /></pre>  |  在 `MyAthenaWorkGroup` 工作群組中執行查詢所需的 Athena 許可。  | 
|  <pre>"s3:PutObject",<br />"s3:GetObject",<br />"s3:AbortMultipartUpload"</pre>  |  `s3:PutObject` 和 `s3:AbortMultipartUpload` 允許將查詢結果寫入 `arn:aws:s3:::MyQueryResultsBucket/*` 資源識別碼指定的查詢結果儲存貯體的所有子資料夾，其中 *MyQueryResultsBucket* 是 Athena 查詢結果儲存貯體。如需詳細資訊，請參閱[使用查詢結果和近期查詢](querying.md)。 `s3:GetObject` 針對指定為 `arn:aws:s3:::MyQueryResultsBucket` 的資源，允許讀取查詢結果和查詢歷史記錄，其中 *MyQueryResultsBucket* 是 Athena 查詢結果儲存貯體。如需詳細資訊，請參閱[使用查詢結果和近期查詢](querying.md)。 `s3:GetObject` 還允許從指定為 `"arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillPrefix*"` 的資源讀取，其中 *MyLambdaSpillPrefix* 是在一或多個叫用的 Lambda 函數的組態中指定。  | 
|  <pre>"lambda:InvokeFunction"</pre>  | 允許查詢叫用 Resource區塊中指定的 AWS Lambda 函數。例如，arn:aws:lambda:\$1:MyAWSAcctId:function:MyAthenaLambdaFunction，其中 MyAthenaLambdaFunction 會指定要叫用的 Lambda 函數的名稱。如範例所示，可以指定多個函數。 | 

**Example - 允許 IAM 主體建立 Athena UDF**  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:ListVersionsByFunction",
                "iam:CreateRole",
                "lambda:GetFunctionConfiguration",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "lambda:PutFunctionConcurrency",
                "iam:PassRole",
                "iam:DetachRolePolicy",
                "lambda:ListTags",
                "iam:ListAttachedRolePolicies",
                "iam:DeleteRolePolicy",
                "lambda:DeleteFunction",
                "lambda:GetAlias",
                "iam:ListRolePolicies",
                "iam:GetRole",
                "iam:GetPolicy",
                "lambda:InvokeFunction",
                "lambda:GetFunction",
                "lambda:ListAliases",
                "lambda:UpdateFunctionConfiguration",
                "iam:DeleteRole",
                "lambda:UpdateFunctionCode",
                "s3:GetObject",
                "lambda:AddPermission",
                "iam:UpdateRole",
                "lambda:DeleteFunctionConcurrency",
                "lambda:RemovePermission",
                "iam:GetRolePolicy",
                "lambda:GetPolicy"
            ],
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:MyAthenaLambdaFunctionsPrefix*",
                "arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/*",
                "arn:aws:iam::*:role/RoleName",
                "arn:aws:iam::111122223333:policy/*"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateUploadBucket",
                "cloudformation:DescribeStackDriftDetectionStatus",
                "cloudformation:ListExports",
                "cloudformation:ListStacks",
                "cloudformation:ListImports",
                "lambda:ListFunctions",
                "iam:ListRoles",
                "lambda:GetAccountSettings",
                "ec2:DescribeSecurityGroups",
                "cloudformation:EstimateTemplateCost",
                "ec2:DescribeVpcs",
                "lambda:ListEventSourceMappings",
                "cloudformation:DescribeAccountLimits",
                "ec2:DescribeSubnets",
                "cloudformation:CreateStackSet",
                "cloudformation:ValidateTemplate"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "cloudformation:*",
            "Resource": [
                "arn:aws:cloudformation:*:111122223333:stack/aws-serverless-repository-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:111122223333:stack/serverlessrepo-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:*:transform/Serverless-*",
                "arn:aws:cloudformation:*:111122223333:stackset/aws-serverless-repository-MyCFStackPrefix*:*",
                "arn:aws:cloudformation:*:111122223333:stackset/serverlessrepo-MyCFStackPrefix*:*"
            ]
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "serverlessrepo:*",
            "Resource": "arn:aws:serverlessrepo:*:*:applications/*"
        },
        {
            "Sid": "ECR",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": "arn:aws:ecr:*:*:repository/*"
        }
    ]
}
```


**許可說明**  

| 允許的動作 | 說明 | 
| --- | --- | 
|  <pre>"lambda:CreateFunction",<br />"lambda:ListVersionsByFunction",<br />"lambda:GetFunctionConfiguration",<br />"lambda:PutFunctionConcurrency",<br />"lambda:ListTags",<br />"lambda:DeleteFunction",<br />"lambda:GetAlias",<br />"lambda:InvokeFunction",<br />"lambda:GetFunction",<br />"lambda:ListAliases",<br />"lambda:UpdateFunctionConfiguration",<br />"lambda:UpdateFunctionCode",<br />"lambda:AddPermission",<br />"lambda:DeleteFunctionConcurrency",<br />"lambda:RemovePermission",<br />"lambda:GetPolicy"<br />"lambda:GetAccountSettings",<br />"lambda:ListFunctions",<br />"lambda:ListEventSourceMappings",<br /></pre>  |  允許建立和管理列為資源的 Lambda 函數。在該範例中，資源識別碼 `arn:aws:lambda:*:MyAWSAcctId:function:MyAthenaLambdaFunctionsPrefix*` 中使用名稱字首，其中 *MyAthenaLambdaFunctionsPrefix* 是 Lambda 函數群組的名稱中使用的共同字首，因此不需要個別指定為資源。您可以指定一或多個 Lambda 函數資源。  | 
|  <pre>"s3:GetObject"</pre>  | 允許讀取資源識別符 所指定 AWS Serverless Application Repository 需要 的儲存貯體arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/\$1。 | 
|  <pre>"cloudformation:*"</pre>  |  允許建立和管理資源 *MyCFStackPrefix* 指定的 CloudFormation 堆疊。這些堆疊和堆疊集是部署連接器和 UDFs AWS Serverless Application Repository 的方式。  | 
|  <pre>"serverlessrepo:*"</pre>  | 允許搜尋、檢視、發佈和更新 中由資源識別符 AWS Serverless Application Repository指定的應用程式arn:aws:serverlessrepo:\$1:\$1:applications/\$1。 | 

# 允許使用 Athena 存取機器學習
<a name="machine-learning-iam-access"></a>

必須允許執行 Athena 機器學習 (ML) 查詢的 IAM 主體對其使用的 Sagemaker 端點執行 `sagemaker:invokeEndpoint` 動作。在連接至使用者身分的以身分為基礎的許可政策中，加入類似下列的政策陳述式。此外，請連接 [AWS 受管政策：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)，以授權完整存取 Athena 動作，或連接已修改的內嵌政策，以允許動作子集。

在範例中，以要在查詢中使用的模型端點的一或多個 ARN，替換 `arn:aws:sagemaker:region:AWSAcctID:ModelEndpoint`。如需詳細資訊，請參閱*服務授權參考*中的 [SageMaker AI 的動作、資源和條件金鑰](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonsagemaker.html)。

```
{
            "Effect": "Allow",
            "Action": [
                "sagemaker:invokeEndpoint"
            ],
            "Resource": "arn:aws:sagemaker:us-west-2:123456789012:workteam/public-crowd/default"
}
```

每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱*《IAM 使用者指南》*中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

# 啟用對 Athena API 的聯合存取
<a name="access-federation-saml"></a>

本節討論的聯合存取，可讓組織中的使用者或用戶端應用程式呼叫 Amazon Athena API 操作。在這種情況下，組織的使用者無法直接存取 Athena。反之，您可以在 Microsoft Active Directory AWS 中管理 外部的使用者登入資料。Active Directory 支援 [SAML 2.0](https://wiki.oasis-open.org/security) (安全聲明標記語言 2.0)。

若要在此案例中驗證使用者，請使用支援 SAML.2.0 的 JDBC 或 ODBC 驅動程式，以存取 Active Directory Federation Services (ADFS) 3.0，並讓用戶端應用程式能夠呼叫 Athena API 操作。

如需 上 SAML 2.0 支援的詳細資訊 AWS，請參閱《*IAM 使用者指南*》中的[關於 SAML 2.0 聯合](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html)。

**注意**  
特定類型的身分提供者 (IdP)，即 Active Directory Federation Service (ADFS 3.0) (Windows Server 的一部分) 支援對 Athena API 的聯合存取。聯合存取與 IAM Identity Center 信任身分傳播功能不相容。透過支援 SAML 2.0 的 JDBC 或 ODBC 驅動程式版本建立存取權。如需詳細資訊，請參閱 [使用 JDBC 連接到 Amazon Athena](connect-with-jdbc.md) 及 [使用 ODBC 連接到 Amazon Athena](connect-with-odbc.md)。

**Topics**
+ [開始之前](#access-federation-before-you-begin)
+ [了解身分驗證程序](#access-federation-diagram)
+ [程序：啟用對 Athena API 的 SAML 型聯合存取](#access-federation-procedure)

## 開始之前
<a name="access-federation-before-you-begin"></a>

 開始之前，請先完成以下先決條件：
+ 在您的組織內，安裝 ADFS 3.0 並將其設定為您的 IdP。
+ 在用來存取 Athena 的用戶端上，安裝和設定最新可用版本的 JDBC 或 ODBC 驅動程式。此驅動程式必須支援與 SAML 2.0 相容的聯合身分存取。如需詳細資訊，請參閱 [使用 JDBC 連接到 Amazon Athena](connect-with-jdbc.md) 及 [使用 ODBC 連接到 Amazon Athena](connect-with-odbc.md)。

## 了解身分驗證程序
<a name="access-federation-diagram"></a>

下列圖表說明聯合存取 Athena API 的身分驗證程序。

![\[Athena API 的聯合存取圖表。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/athena-saml-based-federation.png)


1. 組織中的使用者會使用用戶端應用程式搭配 JDBC 或 ODBC 驅動程式，請求獲得組織 IdP 的身分驗證。IdP 是 ADFS 3.0。

1. IdP 根據 Active Directory (組織的身分存放區) 對使用者進行身分驗證。

1. IdP 會建構一個具有使用者相關資訊的 SAML 聲明，並將此聲明經由 JDBC 或 ODBC 驅動程式發送到用戶端應用程式。

1. JDBC 或 ODBC 驅動程式會呼叫 AWS Security Token Service [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 操作，並傳遞下列參數：
   + SAML 供應商的 ARN
   + 要擔任的角色 ARN
   + 來自 IdP 的 SAML 聲明

   如需詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html)。

1. API 透過 JDBC 或 ODBC 驅動程式傳給用戶端應用程式的回應，包含臨時安全登入資料。

1. 用戶端應用程式使用臨時安全憑證呼叫 Athena API 操作，讓您的使用者可以存取 Athena API 操作。

## 程序：啟用對 Athena API 的 SAML 型聯合存取
<a name="access-federation-procedure"></a>

此程序會在組織的 IdP 和 AWS 您的帳戶之間建立信任，以啟用對 Amazon Athena API 操作的 SAML 型聯合存取。

**若要啟用對 Athena API 的聯合存取：**

1. 在您的組織中，在您的 IdP 中註冊 AWS 為服務提供者 (SP)。這個程序稱為*依賴方信任*。如需詳細資訊，請參閱《IAM 使用者指南》**中的[使用依賴方信任設定您的 SAML 2.0 IdP](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html)。請執行以下步驟，做為此任務的一部分：

   1. 從這個 URL 取得範例 SAML 中繼資料文件：[https://signin.aws.amazon.com/static/saml-metadata.xml](https://signin.aws.amazon.com/static/saml-metadata.xml)。

   1. 在您組織的 IdP (ADFS) 中， 會產生同等的中繼資料 XML 檔案，將 IdP 描述為身分提供者 AWS。您的中繼資料檔案必須包含發行者名稱、建立日期、過期日期，以及 AWS 用於驗證組織中身分驗證回應 （聲明） 的金鑰。

1. 在 IAM 主控台中，您可以建立一個 SAML 身分提供者實體。如需詳細資訊，請參閱《IAM 使用者指南》**中的[建立 SAML 身分提供者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html)。執行以下操作，做為此步驟的一部分：

   1. 前往 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

   1. 上傳在本程序步驟 1 中 IdP (ADFS) 產生的 SAML 中繼資料文件。

1. 在 IAM 主控台中為您的 IdP 建立一或多個 IAM 角色。如需詳細資訊，請參閱《IAM 使用者指南》**中的[為第三方身分提供者 (聯合) 建立角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp.html)。執行以下操作，做為此步驟的一部分：
   + 在該角色的許可政策中，列出允許組織的使用者在 AWS中執行的動作。
   + 在角色的信任政策中，將您在此程序步驟 2 中建立的 SAML 提供者實體設定為主體。

   這會在您的組織與 之間建立信任關係 AWS。

1. 在組織的 IdP (ADFS) 中，定義可將組織中的使用者或群組映射到 IAM 角色的聲明。使用者和群組對 IAM 角色的映射也稱為*宣告規則*。請注意，組織中不同的使用者和群組可能映射到不同的 IAM 角色。

   如需有關在 ADFS 中設定映射的資訊，請參閱部落格文章：[AWS 使用 Windows Active Directory、ADFS 和 SAML 2.0 啟用 的聯合。](https://aws.amazon.com/blogs/security/enabling-federation-to-aws-using-windows-active-directory-adfs-and-saml-2-0/)

1. 安裝並設定具 SAML 2.0 支援的 JDBC 和 ODBC 驅動程式。如需詳細資訊，請參閱 [使用 JDBC 連接到 Amazon Athena](connect-with-jdbc.md) 及 [使用 ODBC 連接到 Amazon Athena](connect-with-odbc.md)。

1. 指定從您的應用程式到 JDBC 和 ODBC 驅動程式的連接字串。如需有關應用程式應使用之連線字串的資訊，請參閱《JDBC 驅動器安裝和設定指南**》中的*「使用 Active Directory Federation Services (ADFS) 憑證提供者」*，或《ODBC 驅動器安裝和設定指南**》中的類似主題，可透過 PDF 形式從 [使用 JDBC 連接到 Amazon Athena](connect-with-jdbc.md) 和 [使用 ODBC 連接到 Amazon Athena](connect-with-odbc.md) 主題中下載。

   以下是設定驅動程式連接字串的高階彙總：

   1. 在 `AwsCredentialsProviderClass configuration` 中，設定 `com.simba.athena.iamsupport.plugin.AdfsCredentialsProvider` 以表示您想要透過 ADFS IdP 使用的 SAML 2.0 身分驗證。

   1. 在 `idp_host` 提供 ADFS IdP 伺服器的主機名稱。

   1. 在 `idp_port` 提供 ADFS IdP 監聽 SAML 聲明請求的連接埠號碼。

   1. 在 `UID` 和 `PWD` 提供 AD 網域使用者登入資料。在 Windows 上使用驅動程式時，若未提供 `UID` 和 `PWD`，驅動程式會嘗試取得登入該 Windows 機器之使用者的使用者登入資料。

   1. 您可以選擇將 `ssl_insecure` 設定為 `true`。在這種情況下，驅動程式不會檢查 ADFS IdP 伺服器的 SSL 憑證真偽。如果未將 ADFS IdP 的 SSL 憑證設定為受驅動程式信任，則必須設定為 `true`。

   1. 若要啟用 Active Directory 網域使用者或群組到一個或多個 IAM 角色的映射 (如本程式庫步驟 4 中所述)，在 JDBC 或 ODBC 連接的 `preferred_role` 中，指定驅動程式連接中要擔任的 IAM 角色 (ARN)。指定 `preferred_role` 為選擇性，但如果角色不是宣告規則中列出的第一個角色，則非常有用。

   由於此程序，發生下列動作：

   1. JDBC 或 ODBC 驅動程式會呼叫 AWS STS [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API，並傳遞宣告，如[架構圖](#access-federation-diagram)的步驟 4 所示。

   1. AWS 會確保擔任角色的請求來自 SAML 提供者實體中參考的 IdP。

   1. 如果請求成功， AWS STS [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 操作會傳回一組臨時安全登入資料，您的用戶端應用程式會使用此登入資料向 Athena 提出已簽署的請求。

      您的應用程式現在已具有目前使用者相關資訊，且能以程式設計的方式存取 Athena。

# 記錄並監控 Athena
<a name="security-logging-monitoring"></a>

若要偵測事件，在事件發生時收到提醒，以及回應它們，請搭配 Amazon Athena 使用這些選項：
+ **使用 監控 Athena AWS CloudTrail** – [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)提供使用者、角色或 Athena AWS 服務 中 所採取動作的記錄。其會從 Athena 主控台擷取呼叫，並將 Athena API 操作的呼叫編碼為事件。其允許您判斷向 Athena 提出的請求、提出請求的 IP 地址、提出請求的人員、提出請求的時間，以及其他詳細資訊。如需詳細資訊，請參閱[使用 記錄 Amazon Athena API 呼叫 AWS CloudTrail](monitor-with-cloudtrail.md)。

  您也可以使用 Athena 查詢 Athena 和其他 AWS 服務的 CloudTrail 日誌檔案。如需詳細資訊，請參閱[查詢 AWS CloudTrail 日誌](cloudtrail-logs.md)。
+ **使用 CloudTrail 和 Amazon Quick 監控 Athena 使用情況** – [Amazon Quick](https://aws.amazon.com/quicksight/) 是一項全受管、雲端驅動的商業智慧服務，可讓您建立互動式儀表板，讓您的組織可以從任何裝置存取。如需使用 CloudTrail 和 Amazon Quick 監控 Athena 用量的解決方案範例，請參閱 AWS 大數據部落格文章 [Realtor.com 如何使用 AWS CloudTrail 和 Quick 監控 Amazon Athena 用量](https://aws.amazon.com/blogs/big-data/analyzing-amazon-athena-usage-by-teams-within-a-real-estate-company/)。
+ **搭配 Athena 使用 EventBridge ** – Amazon EventBridge 提供近乎即時的系統事件串流，說明 AWS 資源的變更。EventBridge 會察覺這些操作變更的發生，回應它們並視需要採取更正動作，方法為傳送訊息來回應環境、啟用功能、執行變更和擷取狀態資訊。盡可能發出事件。如需詳細資訊，請參閱 *《Amazon EventBridge 使用者指南》*中的 [Amazon EventBridge 入門](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html)。
+ **使用工作群組來區隔使用者、團隊、應用程式或工作負載，以及設定查詢限制並控制查詢成本** - 您可以檢視 Amazon CloudWatch 中的查詢相關指標，對掃描的資料量設定限制來控制查詢成本，建立閾值，以及在超過這些閾值時觸發動作，例如 Amazon SNS 警示。如需詳細資訊，請參閱[使用工作群組來控制查詢存取和成本](workgroups-manage-queries-control-costs.md)。使用資源層級 IAM 許可來控制特定群組的存取。如需詳細資訊，請參閱[使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md)及[使用 CloudWatch 和 EventBridge 來監控查詢和控制成本](workgroups-control-limits.md)。

**Topics**
+ [使用 記錄 Amazon Athena API 呼叫 AWS CloudTrail](monitor-with-cloudtrail.md)

# 使用 記錄 Amazon Athena API 呼叫 AWS CloudTrail
<a name="monitor-with-cloudtrail"></a>

Athena 已與 整合 AWS CloudTrail，此服務提供 Athena AWS 服務 中使用者、角色或 所採取動作的記錄。

CloudTrail 會擷取 Athena 的 API 呼叫當作事件。擷取的呼叫包括從 Athena 主控台進行的呼叫，以及針對 Athena API 操作的程式碼呼叫。如果您建立線索，就可以將 CloudTrail 事件持續交付到 Amazon S3 儲存貯體，包括 Athena 的事件。即使您未設定線索，依然可以透過 CloudTrail 主控台中的 **Event history ** (事件歷史記錄) 檢視最新事件。

您可以利用 CloudTrail 所收集的資訊來判斷向 Athena 發出的請求，以及發出請求的 IP 地址、人員、時間和其他詳細資訊。

若要進一步了解 CloudTrail，請參閱[《AWS CloudTrail 使用者指南》](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)。

您可以使用 Athena 從 Athena 本身和其他 查詢 CloudTrail 日誌檔案 AWS 服務。如需詳細資訊，請參閱 [查詢 AWS CloudTrail 日誌](cloudtrail-logs.md)、 [Hive JSON SerDe](hive-json-serde.md)和 AWS 大數據部落格文章 [使用 CTAS 陳述式搭配 Amazon Athena 來降低成本和改善效能](https://aws.amazon.com/blogs/big-data/using-ctas-statements-with-amazon-athena-to-reduce-cost-and-improve-performance/)，這會使用 CloudTrail 來深入了解 Athena 用量。

## 關於 CloudTrail 中的 Athena 資訊
<a name="athena-info-in-cloudtrail"></a>

在您建立帳戶時，系統即會在 Amazon Web Services 帳戶中啟用 CloudTrail。當活動發生於 Athena 中時，系統便會將該活動記錄於 CloudTrail 事件中，並將其他 AWS 服務事件記錄至 **Event history** (事件歷史記錄) 中。您可以檢視、搜尋和下載 Amazon Web Services 帳戶中的最近事件。如需詳細資訊，請參閱[使用 CloudTrail 事件歷史記錄檢視事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)。

如需 Amazon Web Services 帳戶中正在進行事件的記錄 (包含 Athena 的事件)，請建立線索。*線索*能讓 CloudTrail 將日誌檔案交付至 Amazon S3 儲存貯體。依預設，當您在主控台中建立追蹤時，該追蹤會套用至所有的 AWS 區域。線索會記錄 AWS 分割區中所有區域的事件，並將日誌檔案傳送到您指定的 Amazon S3 儲存貯體。此外，您可以設定其他 AWS 服務 來進一步分析和處理 CloudTrail 日誌中收集的事件資料。如需詳細資訊，請參閱下列內容：
+ [建立追蹤的概觀](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)
+ [CloudTrail 支援的服務和整合](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-aws-service-specific-topics.html#cloudtrail-aws-service-specific-topics-integrations)
+ [設定 CloudTrail 的 Amazon SNS 通知](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/getting_notifications_top_level.html)
+ [接收多個區域的 CloudTrail 日誌檔案](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html)和[接收多個帳戶的 CloudTrail 日誌檔案](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-receive-logs-from-multiple-accounts.html)

所有 Athena 動作都由 CloudTrail 記錄，並以文件載明於 [Amazon Athena API 參考](https://docs.aws.amazon.com/athena/latest/APIReference/)中。例如，對 [StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) 和 [GetQueryResults](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) 動作的呼叫會在 CloudTrail 日誌檔案中產生相關項目。

每一筆事件或日誌專案都會包含產生請求者的資訊。身分資訊可協助您判斷下列事項：
+ 是否使用根或 AWS Identity and Access Management (IAM) 使用者登入資料提出請求。
+ 提出該請求時，是否使用了特定角色或聯合身分使用者的暫時安全憑證。
+ 該請求是否由另一項 AWS 服務服務提出。

如需詳細資訊，請參閱 [CloudTrail userIdentity 元素](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html)。

## 了解 Athena 日誌檔案項目
<a name="understanding-ate-log-file-entries"></a>

追蹤是一種組態，能讓事件以日誌檔案的形式交付到您指定的 Amazon S3 儲存貯體。CloudTrail 日誌檔案包含一或多個日誌專案。一個事件為任何來源提出的單一請求，並包含請求動作、請求的日期和時間、請求參數等資訊。CloudTrail 日誌檔並非依公有 API 呼叫的堆疊追蹤排序，因此不會以任何特定順序出現。

**注意**  
為了防止意外揭露敏感資訊，`StartQueryExecution` 和 `CreateNamedQuery` 日誌中的 `queryString` 項目的值都為 `***OMITTED***`。這是設計本身所致。若要存取實際的查詢字串，您可以使用 Athena [GetQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryExecution.html) API，並從 CloudTrail 日誌傳入 `responseElements.queryExecutionId` 的值。

以下範例會示範個別 CloudTrail 日誌項目：
+  [StartQueryExecution (Successful)](#startqueryexecution-successful) 
+  [StartQueryExecution (Failed)](#startqueryexecution-failed) 
+  [CreateNamedQuery](#createnamedquery) 

### StartQueryExecution (successful)
<a name="startqueryexecution-successful"></a>

```
{
 "eventVersion":"1.05",
 "userIdentity":{
    "type":"IAMUser",
    "principalId":"EXAMPLE_PRINCIPAL_ID",
    "arn":"arn:aws:iam::123456789012:user/johndoe",
    "accountId":"123456789012",
    "accessKeyId":"EXAMPLE_KEY_ID",
    "userName":"johndoe"
 },
 "eventTime":"2017-05-04T00:23:55Z",
 "eventSource":"athena.amazonaws.com",
 "eventName":"StartQueryExecution",
 "awsRegion":"us-east-1",
 "sourceIPAddress":"77.88.999.69",
 "userAgent":"aws-internal/3",
 "requestParameters":{
    "clientRequestToken":"16bc6e70-f972-4260-b18a-db1b623cb35c",
    "resultConfiguration":{
       "outputLocation":"s3://amzn-s3-demo-bucket/test/"
    },
    "queryString":"***OMITTED***"
 },
 "responseElements":{
    "queryExecutionId":"b621c254-74e0-48e3-9630-78ed857782f9"
 },
 "requestID":"f5039b01-305f-11e7-b146-c3fc56a7dc7a",
 "eventID":"c97cf8c8-6112-467a-8777-53bb38f83fd5",
 "eventType":"AwsApiCall",
 "recipientAccountId":"123456789012"
}
```

### StartQueryExecution (failed)
<a name="startqueryexecution-failed"></a>

```
{
 "eventVersion":"1.05",
 "userIdentity":{
  "type":"IAMUser",
  "principalId":"EXAMPLE_PRINCIPAL_ID",
  "arn":"arn:aws:iam::123456789012:user/johndoe",
  "accountId":"123456789012",
  "accessKeyId":"EXAMPLE_KEY_ID",
  "userName":"johndoe"
  },
 "eventTime":"2017-05-04T00:21:57Z",
 "eventSource":"athena.amazonaws.com",
 "eventName":"StartQueryExecution",
 "awsRegion":"us-east-1",
 "sourceIPAddress":"77.88.999.69",
 "userAgent":"aws-internal/3",
 "errorCode":"InvalidRequestException",
 "errorMessage":"Invalid result configuration. Should specify either output location or result configuration",
 "requestParameters":{
  "clientRequestToken":"ca0e965f-d6d8-4277-8257-814a57f57446",
  "queryString":"***OMITTED***"
  },
 "responseElements":null,
 "requestID":"aefbc057-305f-11e7-9f39-bbc56d5d161e",
 "eventID":"6e1fc69b-d076-477e-8dec-024ee51488c4",
 "eventType":"AwsApiCall",
 "recipientAccountId":"123456789012"
}
```

### CreateNamedQuery
<a name="createnamedquery"></a>

```
{
  "eventVersion":"1.05",
  "userIdentity":{
     "type":"IAMUser",
     "principalId":"EXAMPLE_PRINCIPAL_ID",
     "arn":"arn:aws:iam::123456789012:user/johndoe",
     "accountId":"123456789012",
     "accessKeyId":"EXAMPLE_KEY_ID",
     "userName":"johndoe"
  },
  "eventTime":"2017-05-16T22:00:58Z",
  "eventSource":"athena.amazonaws.com",
  "eventName":"CreateNamedQuery",
  "awsRegion":"us-west-2",
  "sourceIPAddress":"77.88.999.69",
  "userAgent":"aws-cli/1.11.85 Python/2.7.10 Darwin/16.6.0 botocore/1.5.48",
  "requestParameters":{
     "name":"johndoetest",
     "queryString":"***OMITTED***",
     "database":"default",
     "clientRequestToken":"fc1ad880-69ee-4df0-bb0f-1770d9a539b1"
     },
  "responseElements":{
     "namedQueryId":"cdd0fe29-4787-4263-9188-a9c8db29f2d6"
     },
  "requestID":"2487dd96-3a83-11e7-8f67-c9de5ac76512",
  "eventID":"15e3d3b5-6c3b-4c7c-bc0b-36a8dd95227b",
  "eventType":"AwsApiCall",
  "recipientAccountId":"123456789012"
},
```

# 的合規驗證
<a name="security-compliance-validation"></a>

在多個合規計畫中，第三方稽核人員會評估 的安全與 AWS 合規。這些計劃包括 SOC、PCI、FedRAMP 等等。

如需特定合規計劃 AWS 服務 範圍內的 清單，請參閱[AWS 服務 合規計劃範圍內](https://aws.amazon.com/compliance/services-in-scope/)的 。如需一般資訊，請參閱 [AWS 合規計劃](https://aws.amazon.com/compliance/programs/)。

您可以使用 下載第三方稽核報告 AWS Artifact。如需詳細資訊，請參閱[在 中下載報告 AWS Artifact](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)。

您使用 時的合規責任取決於資料的機密性、您公司的合規目標，以及適用的法律和法規。 AWS 提供下列資源來協助合規：
+ [安全與合規快速入門指南](https://aws.amazon.com/quickstart/?awsf.quickstart-homepage-filter=categories%23security-identity-compliance) – 這些部署指南討論架構考量，並提供在其中部署以安全與合規為重心的基準環境的步驟 AWS。
+ [Amazon Web Services 上的 HIPAA 安全與合規架構](https://docs.aws.amazon.com/whitepapers/latest/architecting-hipaa-security-and-compliance-on-aws/architecting-hipaa-security-and-compliance-on-aws.html) – 本白皮書說明公司如何使用 AWS 來建立符合 HIPAA 規範的應用程式。
+ [AWS 合規資源](https://aws.amazon.com/compliance/resources/) – 此工作手冊和指南集合可能適用於您的產業和位置。
+ [AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html) – 這會 AWS 服務 評估您的資源組態符合內部實務、產業準則和法規的程度。
+ [AWS Security Hub CSPM](https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html) – 這 AWS 服務 可讓您全面檢視 內的安全狀態 AWS ，協助您檢查是否符合安全產業標準和最佳實務。

# Athena 中的復原功能
<a name="security-resilience"></a>

 AWS 全球基礎設施是以 AWS 區域 和 可用區域為基礎建置。 AWS 區域 提供多個實體隔離和隔離的可用區域，這些可用區域與低延遲、高輸送量和高備援聯網連接。透過可用區域，您所設計與操作的應用程式和資料庫，就能夠在可用區域之間自動容錯移轉，而不會發生中斷。可用區域的可用性、容錯能力和擴充能力，均較單一或多個資料中心的傳統基礎設施還高。

如需 AWS 區域 和可用區域的詳細資訊，請參閱 [AWS 全球基礎設施](https://aws.amazon.com/about-aws/global-infrastructure/)。

除了 AWS 全球基礎設施之外， 還提供數種功能，以協助支援您的資料彈性和備份需求。

Athena 為無伺服器，無須設定或管理任何基礎設施。Athena 具有高可用性，並跨多個可用區域使用運算資源來執行查詢，如果無法連線特定可用區域，便會自動適當地路由查詢。Athena 會使用 Amazon S3 作為其基礎資料存放區，讓您的資料具有高可用性和耐用性。Amazon S3 會提供耐用的基礎設施來存放重要資料，其旨在提供 99.999999999% 的物件耐用性。您的資料會以冗餘方式存放在多個設施以及每個設施的多個裝置。

# Athena 中的基礎設施安全
<a name="security-infrastructure"></a>

作為受管服務， 受到 AWS 全球網路安全的保護。如需 AWS 安全服務以及如何 AWS 保護基礎設施的資訊，請參閱[AWS 雲端安全](https://aws.amazon.com/security/)。若要使用基礎設施安全的最佳實務來設計您的 AWS 環境，請參閱*安全支柱 AWS Well-Architected Framework* 中的[基礎設施保護](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/infrastructure-protection.html)。

您可以使用 AWS 發佈的 API 呼叫，透過網路存取 。使用者端必須支援下列專案：
+ Transport Layer Security (TLS)。我們需要 TLS 1.2 並建議使用 TLS 1.3。
+ 具備完美轉送私密(PFS)的密碼套件，例如 DHE (Ephemeral Diffie-Hellman)或 ECDHE (Elliptic Curve Ephemeral Diffie-Hellman)。現代系統(如 Java 7 和更新版本)大多會支援這些模式。

使用 IAM 政策來限制對 Athena 操作的存取。每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱*《IAM 使用者指南》*中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

Athena [受管政策](security-iam-awsmanpol.md)不但易於使用，且會隨著服務的演進以所需動作自動更新。客戶受管政策和內嵌政策允許您透過在政策內指定更精密的 Athena 動作來微調這些政策。授予對資料的 Amazon S3 位置之適當存取權。如需有關如何授予 Amazon S3 存取權的詳細資訊和案例，請參閱《Amazon Simple Storage Service 開發人員指南》**中的[演練範例：管理存取權](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access.html)。如需詳細資訊以及允許哪些 Amazon S3 動作的範例，請參閱[跨帳戶存取](cross-account-permissions.md)中的儲存貯體政策範例。

**Topics**
+ [使用界面 VPC 端點連接至 Amazon Athena](interface-vpc-endpoint.md)

# 使用界面 VPC 端點連接至 Amazon Athena
<a name="interface-vpc-endpoint"></a>

在虛擬私有雲端 (VPC) 中使用[介面 VPC 端點 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html) 和 [AWS Glue VPC 端點](https://docs.aws.amazon.com/glue/latest/dg/vpc-endpoint.html)，改善 VPC 的安全狀態。介面 VPC 端點可讓您控制從 VPC 內部到達哪些目的地，從而提高安全性。每個 VPC 端點皆會由一個或多個具私有 IP 地址[彈性網路介面](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html) (ENI) 來表示，而該介面位於 VPC 子網路中。

介面 VPC 端點會將您的 VPC 直接連接到 Athena，無需網際網路閘道、NAT 裝置、VPN 連接或 Direct Connect 連線。VPC 中的執行個體不需要公有 IP 地址，就能與 Athena API 進行通訊。

若要透過 VPC 來使用 Athena，您必須從 VPC 中的執行個體來連接，或使用 Amazon Virtual Private Network (VPN) 或 Direct Connect將私有網路連接至 VPC。如需有關 Amazon VPN 的資訊，請參閱《Amazon Virtual Private Cloud 使用者指南》**中的 [VPN 連接](https://docs.aws.amazon.com/vpc/latest/userguide/vpn-connections.html)。如需 的詳細資訊 AWS Direct Connect，請參閱*Direct Connect 《 使用者指南*》中的[建立連線](https://docs.aws.amazon.com/directconnect/latest/UserGuide/create-connection.html)。

Athena 在所有提供 Amazon VPC 和 [Athena](https://docs.aws.amazon.com/general/latest/gr/rande.html#athena) AWS 區域 的所有 中都支援 VPC 端點。 [https://docs.aws.amazon.com/general/latest/gr/rande.html#vpc_region](https://docs.aws.amazon.com/general/latest/gr/rande.html#vpc_region)

您可以使用 AWS 管理主控台 或 AWS Command Line Interface (AWS CLI) 命令建立介面 VPC 端點以連線至 Athena。如需詳細資訊，請參閱[建立介面端點](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)。

在建立界面 VPC 端點之後，如果您啟用端點的[私有 DNS](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#vpce-private-dns) 主機名稱，則預設 Athena 端點 (https://athena.*Region*.amazonaws.com) 會解析為您的 VPC 端點。

如果您尚未啟用私有 DNS 主機名稱，Amazon VPC 會透過以下格式提供一個 DNS 端點名稱，供您使用：

```
VPC_Endpoint_ID.athena.Region.vpce.amazonaws.com
```

如需詳細資訊，請參閱*《Amazon VPC 使用者指南》*中的 [介面 VPC 端點 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html)。

Athena 會支援在您的 VPC 內呼叫其所有 [API 動作](https://docs.aws.amazon.com/athena/latest/APIReference/API_Operations.html)。

## 為 Athena 建立 VPC 端點政策
<a name="api-private-link-policy"></a>

您可以為 Athena 的 Amazon VPC 端點建立政策，以指定下列限制：
+ **主體** – 可執行動作的主體。
+ **動作** – 可執行的動作。
+ **資源** – 可供執行動作的資源。
+ **僅受信任的身分** – 使用 `aws:PrincipalOrgId`條件來限制僅存取屬於您 AWS 組織一部分的登入資料。這有助於防止非預期的主體存取。
+ **僅可信資源** – 使用 `aws:ResourceOrgId` 條件，以防止存取非預期的資源。
+ **僅可信身分和資源** – 為 VPC 端點建立組合政策，以協助防止存取非預期的主體和資源。

如需詳細資訊，請參閱《*Amazon* [VPC 使用者指南》中的使用 VPC 端點控制對服務的存取](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-access.html)，以及 AWS 《白皮書*建置資料周邊 AWS*》中的[附錄 2 – VPC 端點政策範例](https://docs.aws.amazon.com/whitepapers/latest/building-a-data-perimeter-on-aws/appendix-2-vpc-endpoint-policy-examples.html)。

**Example – VPC 端點政策**  
下列範例允許組織身分對組織資源的請求，並允許 AWS 服務主體的請求。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowRequestsByOrgsIdentitiesToOrgsResources",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "my-org-id",
                    "aws:ResourceOrgID": "my-org-id"
                }
            }
        },
        {
            "Sid": "AllowRequestsByAWSServicePrincipals",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "aws:PrincipalIsAWSService": "true"
                }
            }
        }
    ]
}
```

每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

## 關於共用子網路中的 VPC 端點
<a name="interface-vpc-endpoint-shared-subnets"></a>

無法在與您共用的子網路中建立、描述、修改或刪除 VPC 端點。不過，可以在與您共用的子網路中使用 VPC 端點。如需有關 VPC 子網路共用的資訊，請參閱《*Amazon VPC 使用者指南*》中的[與其他帳戶共用 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-sharing.html)。

# Athena 中的組態與漏洞分析
<a name="security-vulnerability-management"></a>

Athena 是無伺服器，因此沒有可設定或管理的基礎設施。 會 AWS 處理基本安全任務，例如訪客作業系統 (OS) 和資料庫修補、防火牆組態和災難復原。這些程序已由適當的第三方進行檢閱並認證。如需詳細資訊，請參閱下列 AWS資源：
+  [共同的責任模型](https://aws.amazon.com/compliance/shared-responsibility-model/) 
+ [安全性、身分與合規的最佳實務](https://aws.amazon.com/architecture/security-identity-compliance/)

# 使用 Athena 查詢向 註冊的資料 AWS Lake Formation
<a name="security-athena-lake-formation"></a>

[AWS Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html) 可讓您在使用 Athena 查詢來讀取存放在 Amazon S3 中的資料或透過聯合資料來源存取時，定義並強制執行資料庫、資料表和資料欄層級存取政策。Lake Formation 會針對存放在 Amazon S3 或聯合資料目錄中的資料提供授權和控管層。您可以使用 Lake Formation 中的許可階層來授予或撤銷讀取資料目錄物件 (例如資料庫、資料表和資料欄) 的許可。Lake Formation 可簡化許可的管理，並讓您實作資料的精細定義存取控制 (FGAC)。

您可以使用 Athena 查詢向 Lake Formation 註冊的資料，以及未向 Lake Formation 註冊的資料。

使用 Athena 查詢已向 Lake Formation 註冊之 Amazon S3 位置或資料目錄的來源資料時，Lake Formation 許可即適用。當您建立指向已註冊 Amazon S3 資料位置或資料目錄的資料庫和資料表時，Lake Formation 許可也適用。

寫入物件時，Lake Formation 許可不適用，也不適用於查詢未向 Lake Formation 註冊的資料或中繼資料時。對於未向 Lake Formation 註冊的來源資料和中繼資料，存取權取決於 IAM 許可政策和 AWS Glue 動作。Simple Storage Service (Amazon S3) 中的 Athena 查詢結果位置無法向 Lake Formation 註冊，且 Simple Storage Service (Amazon S3) 的 IAM 許可政策控制存取權限。此外，Lake Formation 許可不適用於 Athena 查詢歷史記錄。您可以使用 Athena 工作群組來控制查詢歷史記錄的存取。

如需有關 Lake Formation 的詳細資訊，請參閱 [Lake Formation 常見問答集](https://aws.amazon.com/lake-formation/faqs/)與《[AWS Lake Formation 開發人員指南](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html)》。

## 將 Lake Formation 許可套用至現有資料庫和資料表
<a name="lf-athena-apply-lf-permissions-to-existing-databases-and-tables"></a>

如果您是初次使用 Athena，且使用 Lake Formation 設定對查詢資料的存取，則不需要設定 IAM 政策以讓使用者能夠讀取資料和建立中繼資料。您可以使用 Lake Formation 來管理許可。

不需要向 Lake Formation 註冊資料和更新 IAM 許可政策。如果資料未向 Lake Formation 註冊，則擁有適當許可的 Athena 使用者可以繼續查詢未向 Lake Formation 註冊的資料。

如果您有現有的 Athena 使用者查詢未向 Lake Formation 註冊的 Amazon S3 資料，您可以更新 Amazon S3 和 的 IAM 許可 AWS Glue Data Catalog，如果適用的話，以便您可以使用 Lake Formation 許可集中管理使用者存取。對於讀取 Simple Storage Service (Amazon S3) 資料位置的許可，您可更新以資源和以身分為基礎的政策，來修改 Simple Storage Service (Amazon S3) 許可。對於中繼資料的存取，如果您使用 設定了精細存取控制的資源層級政策 AWS Glue，則可以改用 Lake Formation 許可來管理存取。

如需詳細資訊，請參閱《 *AWS Lake Formation 開發人員指南*》中的將資料許可[在 中設定資料庫和資料表的存取權 AWS Glue Data Catalog](fine-grained-access-to-glue-resources.md)升級到模型。 [AWS GlueAWS Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/upgrade-glue-lake-formation.html)

**Topics**
+ [將 Lake Formation 許可套用至現有資料庫和資料表](#lf-athena-apply-lf-permissions-to-existing-databases-and-tables)
+ [資料存取的運作方式](lf-athena-access.md)
+ [考量和限制](lf-athena-limitations.md)
+ [跨帳戶存取權](lf-athena-limitations-cross-account.md)
+ [管理使用者許可](lf-athena-user-permissions.md)
+ [使用 Lake Formation 和 JDBC 或 ODBC 進行聯合存取](security-athena-lake-formation-jdbc.md)

# Athena 如何存取向 Lake Formation 註冊的資料
<a name="lf-athena-access"></a>

本節所述的存取工作流程適用於在 Amazon S3 位置、資料目錄或針對向 Lake Formation 註冊的中繼資料物件執行 Athena 查詢時。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的[註冊資料湖](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)。除了註冊資料之外，Lake Formation 管理員還會套用 Lake Formation 許可，以授予或撤銷對資料目錄中中繼資料 AWS Glue Data Catalog或 Amazon S3 中資料位置的存取權。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的[中繼資料與資料的安全性與存取控制](https://docs.aws.amazon.com/lake-formation/latest/dg/security-data-access.html#security-data-access-permissions)。

每當 Athena 主體 (使用者、群組或角色) 對使用 Lake Formation 註冊的資料執行查詢時，Lake Formation 都會驗證主體是否有適合查詢的資料庫、資料表和資料來源位置的適當 Lake Formation 許可。如果主體有權存取，Lake Formation 會將暫時性憑證*提供*給 Athena，且查詢會執行。

下圖顯示憑證販售如何在 Athena 中以逐次查詢為基礎運作，以便對 Lake Formation 中註冊之 Amazon S3 位置或資料目錄的資料表進行假設的 `SELECT` 查詢：

![\[Athena 資料表上的查詢的憑證販賣工作流程。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/lake-formation-athena-security.png)


1. 主體在 Athena 中執行 `SELECT` 查詢。

1. Athena 會分析查詢並檢查 Lake Formation 許可，以查看是否授予主體對資料表和資料欄的存取權。

1. 如果主體有權存取，則 Athena 會向 Lake Formation 請求憑證。如果主體*沒有*存取權，Athena 會發出存取遭拒錯誤。

1. Lake Formation 會在從 Amazon S3 或目錄讀取資料時發出憑證給 Athena，也會發出允許的資料欄之清單。

1. Athena 使用 Lake Formation 臨時憑證來查詢來自 Amazon S3 或目錄的資料。查詢完成後，Athena 會捨棄憑證。

# 查詢向 Lake Formation 註冊之資料的考量事項與限制
<a name="lf-athena-limitations"></a>

使用 Athena 查詢在 Lake Formation 中註冊的資料時請考慮以下項目。如需其他資訊，請參閱《AWS Lake Formation 開發人員指南》**中的 [AWS Lake Formation的已知問題](https://docs.aws.amazon.com/lake-formation/latest/dg/limitations.html)。

**Topics**
+ [在某些情況下，沒有資料欄資料許可的使用者可以看見資料欄中繼資料](#lf-athena-limitations-column-metadata)
+ [使用檢視的 Lake Formation 許可](#lf-athena-limitations-permissions-to-views)
+ [Iceberg DDL 支援](#lf-athena-limitations-iceberg-ddl-operations)
+ [Lake Formation 精細存取控制和 Athena 工作群組](#lf-athena-limitations-fine-grained-access-control)
+ [Amazon S3 中的 Athena 查詢結果位置未向 Lake Formation 註冊](#lf-athena-limitations-query-results-location)
+ [使用 Athena 工作群組限制查詢歷史記錄的存取](#lf-athena-limitations-use-workgroups-to-limit-access-to-query-history)
+ [無法在 Athena 中查詢向 Lake Formation 註冊的 CSE-KMS Amazon S3](#lf-athena-limitations-cse-kms)
+ [向 Lake Formation 註冊的分割資料位置必須位於資料表子目錄中](#lf-athena-limitations-partioned-data-locations)
+ [Create Table As Select (CTAS) 查詢需要 Amazon S3 寫入許可](#lf-athena-limitations-ctas-queries)
+ [預設資料庫需要 DESCRIBE 許可](#lf-athena-limitations-describe-default)

## 在某些情況下，未經授權的使用者利用 Avro 和自訂 SerDe 可以看見資料欄中繼資料
<a name="lf-athena-limitations-column-metadata"></a>

Lake Formation 資料欄層級授權可防止沒有 Lake Formation 許可的使用者存取資料欄中的資料。不過，在某些情況下，使用者可以存取描述資料表中所有資料欄的中繼資料，包括他們沒有資料許可的資料欄。

此情形會在資料欄中繼資料存放在資料表的資料表屬性中時發生，使用 Apache Avro 儲存格式或使用自訂序列化程式/還原序列化程式 (SerDe)，其中資料表結構描述與 SerDe 定義已一併在資料表屬性中定義。搭配 Lake Formation 使用 Athena 時，我們建議您檢閱向 Lake Formation 註冊的資料表屬性內容，並盡可能限制資料表屬性中所存放的資訊，以防止使用者看到任何敏感中繼資料。

## 了解 Lake Formation 和視觀表
<a name="lf-athena-limitations-permissions-to-views"></a>

對於向 Lake Formation 註冊的資料，Athena 使用者只有在擁有資料表、資料欄，以及來源 Simple Storage Service (Amazon S3) 資料位置 (此為 `VIEW` 之根據) 之 Lake Formation 許可時，才能建立 `VIEW`。在 Athena 中建立 `VIEW` 之後，Lake Formation 許可即可套用至 `VIEW`。資料欄層級許可不適用於 `VIEW`。具有 `VIEW` 的 Lake Formation 許可，但沒有資料表和資料欄許可 (此為檢視之根據) 的使用者，無法使用 `VIEW` 來查詢資料。不過，具有此混合許可的使用者可以使用陳述式 (例如 `DESCRIBE VIEW`、`SHOW CREATE VIEW` 和 `SHOW COLUMNS`) 來查看 `VIEW` 中繼資料。因此，請務必針對每個 `VIEW` 調整 Lake Formation 許可以符合基礎資料表的許可。在資料表中定義的儲存格篩選條件不適用於針對該資料表的 `VIEW`。資源連結名稱必須與原始帳戶中的資源名稱相同。在跨帳戶設定中使用檢視時，還會有其他限制。如需有關設定跨帳戶的共用視圖的許可的詳細資訊，請參閱[設定跨帳戶 Data Catalog 存取權](lf-athena-limitations-cross-account.md)。

## Iceberg DDL 支援
<a name="lf-athena-limitations-iceberg-ddl-operations"></a>

Athena 目前不支援位置已向 Lake Formation 註冊的 Iceberg 資料表執行 DDL 操作。嘗試對其中一個 Iceberg 資料表執行 DDL 查詢可能會傳回 Amazon S3 存取遭拒錯誤，或因查詢逾時失敗。Iceberg 資料表上的 DDL 操作要求使用者擁有對 Iceberg 資料表位置的直接 Amazon S3 存取權。

## Lake Formation 精細存取控制和 Athena 工作群組
<a name="lf-athena-limitations-fine-grained-access-control"></a>

同一 Athena 工作群組中的使用者可以看到 Lake Formation 精細存取控制設定為可供工作群組存取的資料。如需有關在 Lake Formation 中使用精細定義存取控制的詳細資訊，請參閱 *AWS 大數據部落格*中的[使用 AWS Lake Formation管理精細定義存取控制](https://aws.amazon.com/blogs/big-data/manage-fine-grained-access-control-using-aws-lake-formation/)。

## Amazon S3 中的 Athena 查詢結果位置未向 Lake Formation 註冊
<a name="lf-athena-limitations-query-results-location"></a>

Simple Storage Service (Amazon S3) 中的 Athena 查詢結果無法向 Lake Formation 註冊。Lake Formation 許可不會限制對這些位置的存取。除非您限制存取，否則 Athena 使用者可以在沒有 Lake Formation 的資料許可時存取查詢結果檔案和中繼資料。若要避免這種情況，我們建議您使用工作群組來指定查詢結果的位置，並使工作群組成員資格與 Lake Formation 許可保持一致。然後，您可以使用 IAM 許可政策來限制查詢結果位置的存取。如需有關查詢結果的詳細資訊，請參閱[使用查詢結果和近期查詢](querying.md)。

## 使用 Athena 工作群組限制查詢歷史記錄的存取
<a name="lf-athena-limitations-use-workgroups-to-limit-access-to-query-history"></a>

Athena 查詢歷史記錄會公開已儲存查詢和完整查詢字串的清單。除非您使用工作群組來分隔查詢歷程記錄的存取權限，否則未獲授權在 Lake Formation 中查詢資料的 Athena 使用者可以檢視對該資料執行的查詢字串，包括資料欄名稱、選取準則等。我們建議您使用工作群組來分隔查詢歷程記錄，並使 Athena 工作群組成員資格與 Lake Formation 許可保持一致，以限制存取。如需詳細資訊，請參閱[使用工作群組來控制查詢存取和成本](workgroups-manage-queries-control-costs.md)。

## 查詢向 Lake Formation 註冊的 CSE\$1KMS 加密資料表
<a name="lf-athena-limitations-cse-kms"></a>

無法使用 Athena 查詢具有下列特性的開放資料表格式 (OTF) 資料表，例如 Apache Iceberg：
+ 這些資料表以向 Lake Formation 註冊的 Amazon S3 資料位置為基礎。
+ 使用用戶端加密 (CSE) 對 Amazon S3 中的物件進行加密。
+ 加密使用 AWS KMS 客戶受管金鑰 (`CSE_KMS`)。

若要查詢使用`CSE_KMS`金鑰加密的非OTF 資料表，請將下列區塊新增至您用於 CSE 加密的 AWS KMS 金鑰政策。*<KMS\$1KEY\$1ARN>* 是加密資料的 AWS KMS 金鑰 ARN。*<IAM-ROLE-ARN>* 是 Lake Formation 中註冊 Amazon S3 位置的 IAM 角色的 ARN。

```
{
    "Sid": "Allow use of the key",
    "Effect": "Allow",
    "Principal": {
        "AWS": "*"
    },
    "Action": "kms:Decrypt",
    "Resource": "<KMS-KEY-ARN>",
    "Condition": {
        "ArnLike": {
            "aws:PrincipalArn": "<IAM-ROLE-ARN>"
        }
    }
}
```

## 向 Lake Formation 註冊的分割資料位置必須位於資料表子目錄中
<a name="lf-athena-limitations-partioned-data-locations"></a>

向 Lake Formation 註冊的分割資料表必須在目錄中擁有分割資料，這些目錄是 Simple Storage Service (Amazon S3) 中資料表的子目錄。例如，具有 `s3://amzn-s3-demo-bucket/mytable` 位置和分割區 `s3://amzn-s3-demo-bucket/mytable/dt=2019-07-11`、`s3://amzn-s3-demo-bucket/mytable/dt=2019-07-12` 等的資料表，可以向 Lake Formation 註冊並使用 Athena 進行查詢。另一方面，位置 `s3://amzn-s3-demo-bucket/mytable` 的資料表和位於 `s3://amzn-s3-demo-bucket/dt=2019-07-11`、`s3://amzn-s3-demo-bucket/dt=2019-07-12` 等的分割區，無法向 Lake Formation 註冊。此類分割區不是 `s3://amzn-s3-demo-bucket/mytable` 的子目錄，因此也無法從 Athena 讀取。

## Create Table As Select (CTAS) 查詢需要 Amazon S3 寫入許可
<a name="lf-athena-limitations-ctas-queries"></a>

Create Table As Statements (CTAS) 需要對資料表的 Simple Storage Service (Amazon S3) 位置的寫入存取權限。若要對在 Lake Formation 註冊的資料執行 CTAS 查詢，Athena 使用者除了適當的 Lake Formation 許可以讀取資料位置之外，還必須具有 IAM 許可才能寫入資料表 Simple Storage Service (Amazon S3) 位置。如需詳細資訊，請參閱[從查詢結果建立資料表 (CTAS)](ctas.md)。

## 預設資料庫需要 DESCRIBE 許可
<a name="lf-athena-limitations-describe-default"></a>

`default` 資料庫需要 Lake Formation `DESCRIBE` 許可，如此 Lake Formation 才能檢視該資料庫。下列範例 AWS CLI 命令會將`default`資料庫的 `DESCRIBE`許可授予 AWS 帳戶 `datalake_user1`中的使用者`111122223333`。

```
aws lakeformation grant-permissions --principal DataLakePrincipalIdentifier=arn:aws:iam::111122223333:user/datalake_user1 --permissions "DESCRIBE" --resource '{ "Database": {"Name":"default"}}
```

如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的 [DESCRIBE](https://docs.aws.amazon.com/lake-formation/latest/dg/lf-permissions-reference.html#perm-describe)。

# 設定跨帳戶 Data Catalog 存取權
<a name="lf-athena-limitations-cross-account"></a>

若要存取另一個帳戶中的資料目錄，您可以使用 Athena 的跨帳戶 AWS Glue 功能或在 Lake Formation 中設定跨帳戶存取。

## 選項 A：在 Athena 中設定跨帳戶 Data Catalog 存取權
<a name="lf-athena-limitations-cross-account-glue"></a>

您可以使用 Athena 的跨帳戶 AWS Glue 目錄功能，在帳戶中註冊目錄。僅 Athena 引擎版本 2 及更新版本中提供此功能，且僅限於帳戶之間的相同區域使用。如需詳細資訊，請參閱[從另一個帳戶註冊 Data Catalog](data-sources-glue-cross-account.md)。

如果要共用的資料目錄在 中設定了資源政策 AWS Glue，則必須更新以允許存取 ， AWS Resource Access Manager 並授予許可給帳戶 B 使用帳戶 A 的資料目錄。

如需詳細資訊，請參閱[設定 AWS Glue 資料目錄的跨帳戶存取](security-iam-cross-account-glue-catalog-access.md)。

## 選項 B：在 Lake Formation 中設定跨帳戶存取權
<a name="lf-athena-limitations-cross-account-glue-lf-xacct"></a>

AWS Lake Formation 可讓您使用單一帳戶來管理中央 Data Catalog。您可以使用此功能來實作對資料目錄中繼資料和基礎資料的[跨帳戶存取](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-cross-account.html)。例如，擁有者帳戶可以授予另一個 (收件人) 帳戶對資料表的 `SELECT` 許可。

若要在 Athena 查詢編輯器中顯示共用的資料庫或資料表，您需在 Lake Formation 中對共用的資料庫或資料表[建立資源連結](https://docs.aws.amazon.com/lake-formation/latest/dg/resource-links-about.html)。當 Lake Formation 中的收件人帳戶查詢擁有者的資料表時，[CloudTrail](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-logging.html) 會將資料存取事件新增至收件人帳戶和擁有者帳戶的記錄。

如需共用視圖，請謹記下列要點：
+ 在目標資源連結上執行，而不是來源資料表或視圖上執行查詢，然後將輸出共用到目標帳戶。
+ 僅共用視圖並不足夠。建立視圖所涉及的所有資料表必須是跨帳戶共用的一部分。
+ 在共用資源上建立的資源連結的名稱必須與擁有者帳戶中的資源名稱相符。如果名稱不相符，則會出現一則錯誤訊息，例如分析存放檢視 'awsdatacatalog.*my-lf-resource-link*.*my-lf-view*' 失敗：行 3:3：結構描述 *schema\$1name* 不存在。

如需有關在 Lake Formation 中跨帳戶存取的詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的以下資源：

 [跨帳戶存取](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-cross-account.html) 

 [資源連結在 Lake Formation 中如何運作](https://docs.aws.amazon.com/lake-formation/latest/dg/resource-links-about.html) 

 [跨帳戶 CloudTrail 記錄](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-logging.html) 

# 管理 Lake Formation 和 Athena 使用者許可
<a name="lf-athena-user-permissions"></a>

Lake Formation 提供憑證來查詢向 Lake Formation 註冊的 Amazon S3) 資料存放區或聯合目錄。如果您之前使用 IAM 政策來允許或拒絕讀取 Amazon S3 中目錄或資料位置的許可，您可以改為使用 Lake Formation 許可。不過，仍需要其他 IAM 許可。

每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱*《IAM 使用者指南》*中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

以下章節摘要說明使用 Athena 查詢在 Lake Formation 中註冊之資料所需的許可。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的 [AWS Lake Formation的安全性](https://docs.aws.amazon.com/lake-formation/latest/dg/security.html)。

**Topics**
+ [Lake Formation 和 Athena 的身分型許可](#lf-athena-user-permissions-identity-based)
+ [Athena 查詢結果位置的 Amazon S3 許可](#lf-athena-user-permissions-query-results-locations)
+ [查詢歷史記錄的 Athena 工作群組成員資格](#lf-athena-user-permissions-workgroup-memberships-query-history)
+ [Lake Formation 的資料許可](#lf-athena-user-permissions-data)
+ [寫入 Amazon S3 位置的 IAM 許可](#lf-athena-user-permissions-s3-write)
+ [加密資料、中繼資料和 Athena 查詢結果的許可](#lf-athena-user-permissions-encrypted)
+ [外部帳戶中的 Amazon S3 儲存貯體以資源為基礎的許可 (選用)](#lf-athena-user-permissions-s3-cross-account)

## Lake Formation 和 Athena 的身分型許可
<a name="lf-athena-user-permissions-identity-based"></a>

任何使用 Athena 查詢向 Lake Formation 註冊之資料的人，都必須擁有允許 `lakeformation:GetDataAccess` 動作的 IAM 許可政策。[AWS 受管政策：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 允許此動作。如果您使用內嵌政策，請務必更新許可政策來允許此動作。

在 Lake Formation 中，*資料湖管理員*具有建立中繼資料物件 (例如資料庫和資料表)、授予 Lake Formation 許可給其他使用者，以及註冊新 Amazon S3 位置或資料目錄的許可。若要註冊新的位置，需要 Lake Formation 的服務連結角色許可。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的[建立資料湖管理員](https://docs.aws.amazon.com/lake-formation/latest/dg/getting-started-setup.html#create-data-lake-admin)和 [Lake Formation 的服務連結角色許可](https://docs.aws.amazon.com/lake-formation/latest/dg/service-linked-roles.html#service-linked-role-permissions)。

Lake Formation 使用者可以根據資料湖管理員授予的 Lake Formation 許可，使用 Athena 查詢資料庫、資料表、資料表資料欄和基礎 Amazon S3 資料存放區或目錄。使用者無法建立資料庫或資料表，或向 Lake Formation 註冊新的 Simple Storage Service (Amazon S3) 位置。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的[建立資料湖使用者](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-create-lf-user.html)。

在 Athena 中，身分型許可政策 (包括 Athena 工作群組的政策) 仍然控制 Amazon Web Services 帳戶使用者對 Athena 動作的存取。此外，還可能透過 Athena 驅動程式提供以 SAML 為基礎的身分驗證來提供聯合存取。如需詳細資訊，請參閱[使用工作群組來控制查詢存取和成本](workgroups-manage-queries-control-costs.md)、[使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md)及[啟用對 Athena API 的聯合存取](access-federation-saml.md)。

如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的[授予 Lake Formation 許可](https://docs.aws.amazon.com/lake-formation/latest/dg/lake-formation-permissions.html)。

## Athena 查詢結果位置的 Amazon S3 許可
<a name="lf-athena-user-permissions-query-results-locations"></a>

Simple Storage Service (Amazon S3) 中的 Athena 查詢結果無法向 Lake Formation 註冊。Lake Formation 許可不會限制對這些位置的存取。除非您限制存取，否則 Athena 使用者可以在沒有 Lake Formation 的資料許可時存取查詢結果檔案和中繼資料。若要避免這種情況，我們建議您使用工作群組來指定查詢結果的位置，並使工作群組成員資格與 Lake Formation 許可保持一致。然後，您可以使用 IAM 許可政策來限制查詢結果位置的存取。如需有關查詢結果的詳細資訊，請參閱[使用查詢結果和近期查詢](querying.md)。

## 查詢歷史記錄的 Athena 工作群組成員資格
<a name="lf-athena-user-permissions-workgroup-memberships-query-history"></a>

Athena 查詢歷史記錄會公開已儲存查詢和完整查詢字串的清單。除非您使用工作群組來分隔查詢歷程記錄的存取權限，否則未獲授權在 Lake Formation 中查詢資料的 Athena 使用者可以檢視對該資料執行的查詢字串，包括資料欄名稱、選取準則等。我們建議您使用工作群組來分隔查詢歷程記錄，並使 Athena 工作群組成員資格與 Lake Formation 許可保持一致，以限制存取。如需詳細資訊，請參閱[使用工作群組來控制查詢存取和成本](workgroups-manage-queries-control-costs.md)。

## Lake Formation 的資料許可
<a name="lf-athena-user-permissions-data"></a>

除了使用 Lake Formation 的基準許可之外，Athena 使用者還必須具備 Lake Formation 許可，才能存取其查詢的資源。這些許可是由 Lake Formation 管理員授予和管理。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的[中繼資料與資料的安全性與存取控制](https://docs.aws.amazon.com/lake-formation/latest/dg/security-data-access.html#security-data-access-permissions)。

## 寫入 Amazon S3 位置的 IAM 許可
<a name="lf-athena-user-permissions-s3-write"></a>

對 Simple Storage Service (Amazon S3) 的 Lake Formation 許可不包含寫入 Simple Storage Service (Amazon S3) 的能力。Create Table As Statements (CTAS) 需要對資料表的 Simple Storage Service (Amazon S3) 位置的寫入存取權限。若要對在 Lake Formation 註冊的資料執行 CTAS 查詢，Athena 使用者除了適當的 Lake Formation 許可以讀取資料位置之外，還必須具有 IAM 許可才能寫入資料表 Simple Storage Service (Amazon S3) 位置。如需詳細資訊，請參閱[從查詢結果建立資料表 (CTAS)](ctas.md)。

## 加密資料、中繼資料和 Athena 查詢結果的許可
<a name="lf-athena-user-permissions-encrypted"></a>

在 Amazon S3 中的基礎來源資料，以及向 Lake Formation 註冊的目錄中繼資料都可以加密。使用 Athena 查詢向 Lake Formation 註冊的資料時，Athena 處理查詢結果加密的方式沒有變更。如需詳細資訊，請參閱[加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)。
+ **加密來源資料** – 支援 Simple Storage Service (Amazon S3) 資料位置來源資料的加密。查詢向 Lake Formation 註冊的已加密 Simple Storage Service (Amazon S3) 位置的 Athena 使用者，需要加密和解密資料的許可。如需有關需求的詳細資訊，請參閱[支援的 Amazon S3 加密選項](encryption.md#encryption-options-S3-and-Athena)和[Amazon S3 中加密資料的許可](encryption.md#permissions-for-encrypting-and-decrypting-data)。
+ **加密中繼資料** – AWS Glue Data Catalog 支援在 中加密中繼資料。對於使用 Athena 的主體，身分型政策必須允許用於加密中繼資料之索引鍵的 `"kms:GenerateDataKey"`、`"kms:Decrypt"` 和 `"kms:Encrypt"` 動作。如需詳細資訊，請參閱《AWS Glue 開發人員指南**》和 [在 中設定從 Athena 到加密中繼資料的存取權 AWS Glue Data Catalog](access-encrypted-data-glue-data-catalog.md) 中的[加密您的資料目錄](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html)。

## 外部帳戶中的 Amazon S3 儲存貯體以資源為基礎的許可 (選用)
<a name="lf-athena-user-permissions-s3-cross-account"></a>

若要在不同帳戶中查詢 Simple Storage Service (Amazon S3) 資料位置，以資源為基礎的 IAM 政策 (儲存貯體政策) 必須允許存取該位置。如需詳細資訊，請參閱[設定 Athena 中的 Amazon S3 儲存貯體跨帳戶存取權](cross-account-permissions.md)。

如需有關在其他帳戶中存取目錄的資訊，請參閱 [選項 A：在 Athena 中設定跨帳戶 Data Catalog 存取權](lf-athena-limitations-cross-account.md#lf-athena-limitations-cross-account-glue)。

# 使用 Lake Formation 和 JDBC 或 ODBC 驅動器對 Athena 進行聯合存取
<a name="security-athena-lake-formation-jdbc"></a>

Athena JDBC 和 ODBC 驅動程式支援使用 Okta 和 Microsoft Active Directory 聯合服務 (AD FS) 身分提供者，實現以 SAML 2.0 為基礎的 Athena 聯合。透過整合 Amazon Athena 與 AWS Lake Formation，您可以使用公司登入資料對 Athena 啟用 SAML 型身分驗證。使用 Lake Formation 和 AWS Identity and Access Management (IAM)，您可以對 SAML 使用者可用的資料維持精細的資料層級存取控制。透過 Athena JDBC 和 ODBC 驅動程式，聯合存取可用於工具或程式設計存取。

若要使用 Athena 存取 Lake Formation 控制的資料來源，您需要透過設定身分提供者 (IdP) 和 AWS Identity and Access Management (IAM) 角色來啟用 SAML 2.0 型聯合。如需詳細步驟，請參閱[教學課程：使用 Lake Formation 和 JDBC 設定 Okta 使用者對 Athena 的聯合存取](security-athena-lake-formation-jdbc-okta-tutorial.md)。

## 先決條件
<a name="security-athena-lake-formation-jdbc-prerequisites"></a>

若要使用 Amazon Athena 和 Lake Formation 進行聯合存取，您必須符合以下需求：
+ 您使用現有以 SAML 為基礎的身分提供者來管理您的公司身分，例如 Okta 或 Microsoft Active Directory 聯合服務 (AD FS)。
+ 您可以使用 AWS Glue Data Catalog 做為中繼資料存放區。
+ 您在 Lake Formation 中定義和管理許可，以存取 AWS Glue Data Catalog中的資料庫、資料表和資料欄。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南》[https://docs.aws.amazon.com/lake-formation/latest/dg/](https://docs.aws.amazon.com/lake-formation/latest/dg/)。
+ 您使用 2.0.14 版或更新版本的 [Athena JDBC 驅動程式](https://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html)，或 1.1.3 版或更新版本的 [Athena ODBC 驅動程式](connect-with-odbc.md)。

## 考量和限制
<a name="security-athena-lake-formation-jdbc-considerations-and-limitations"></a>

使用 Athena JDBC 或 ODBC 驅動程式和 Lake Formation 來設定對 Athena 的聯合存取時，請記住下列幾點：
+ 目前，Athena JDBC 驅動程式和 ODBC 驅動程式支援 Okta、Microsoft Active Directory 聯合服務 (AD FS) 和 Azure AD 身分提供者。雖然 Athena JDBC 驅動程式具有可擴充為使用其他身分提供者的通用 SAML 類別，但是讓其他身分提供者 (IdP) 搭配 Athena 使用的自訂擴充功能支援可能會受到限制。
+ 使用 JDBC 和 ODBC 驅動程式的聯合存取與 IAM Identity Center 信任身分傳播功能不相容。
+ 目前，您無法使用 Athena 主控台來設定 IdP 和 SAML 與 Athena 搭配使用時的支援。若要設定此支援，請使用第三方身分提供者、Lake Formation 和 IAM 管理主控台，以及 JDBC 或 ODBC 驅動程式用戶端。
+ 在設定身分提供者和 SAML 以與 Lake Formation 和 Athena 搭配使用之前，您應先了解 [SAML 2.0 規格](https://www.oasis-open.org/standards#samlv2.0)以及其如何與您的身分提供者搭配使用。
+ SAML 提供者和 Athena JDBC 和 ODBC 驅動程式由第三方提供，因此對 的使用相關問題 AWS 的支援可能會受到限制。

**Topics**
+ [先決條件](#security-athena-lake-formation-jdbc-prerequisites)
+ [考量和限制](#security-athena-lake-formation-jdbc-considerations-and-limitations)
+ [教學課程：使用 Lake Formation 和 JDBC 設定 Okta 使用者對 Athena 的聯合存取](security-athena-lake-formation-jdbc-okta-tutorial.md)

# 教學課程：使用 Lake Formation 和 JDBC 設定 Okta 使用者對 Athena 的聯合存取
<a name="security-athena-lake-formation-jdbc-okta-tutorial"></a>

本教學課程說明如何設定 Okta AWS Lake Formation、、 AWS Identity and Access Management permissions 和 Athena JDBC 驅動程式，以啟用 Athena 的 SAML 型聯合使用。Lake Formation 為以 SAML 為基礎的使用者提供對 Athena 中可用資料的精細存取控制。若要設定此組態，教學課程會使用 Okta 開發人員主控台、IAM AWS 和 Lake Formation 主控台，以及 SQL Workbench/J 工具。
<a name="security-athena-lake-formation-jdbc-okta-tutorial-prerequisites"></a>
**先決條件**  
此教學課程假設您已完成下列作業：
+ 已建立 Amazon Web Services 帳戶。若要建立帳戶，請造訪 [Amazon Web Services 首頁](https://aws.amazon.com/)。
+ 在 Amazon S3 中為 Athena [設定查詢結果位置](query-results-specify-location.md)。
+ 向 Lake Formation [註冊 Amazon S3 資料儲存貯體位置](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)
+ 在 [AWS Glue 資料目錄](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html) (指向您在 Amazon S3 中的資料) 上定義[資料庫](https://docs.aws.amazon.com/glue/latest/dg/define-database.html)和[資料表](https://docs.aws.amazon.com/glue/latest/dg/tables-described.html)。
  + 如果您尚未定義資料表，請[執行 AWS Glue 爬蟲程式](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html)[或使用 Athena 為您要存取的資料定義資料庫和一或多個資料表](work-with-data.md)。
  + 本教學課程使用以[紐約計程車行程資料集](https://registry.opendata.aws/nyc-tlc-trip-records-pds/) (可於 [AWS上的開放資料登記處](https://registry.opendata.aws/)取得) 為基礎的資料表。本教學課程會使用資料庫名稱 `tripdb` 和資料表名稱 `nyctaxi`。

**Topics**
+ [步驟 1：建立 Okta 帳戶](#security-athena-lake-formation-jdbc-okta-tutorial-step-1-create-an-okta-account)
+ [步驟 2：將使用者和群組新增至 Okta](#security-athena-lake-formation-jdbc-okta-tutorial-step-2-set-up-an-okta-application-for-saml-authentication)
+ [步驟 3：設定用於 SAML 身分驗證的 Okta 應用程式](#security-athena-lake-formation-jdbc-okta-tutorial-step-3-set-up-an-okta-application-for-saml-authentication)
+ [步驟 4：建立 AWS SAML 身分提供者和 Lake Formation 存取 IAM 角色](#security-athena-lake-formation-jdbc-okta-tutorial-step-4-create-an-aws-saml-identity-provider-and-lake-formation-access-IAM-role)
+ [步驟 5：將 IAM 角色和 SAML 身分提供者新增至 Okta 應用程式](#security-athena-lake-formation-jdbc-okta-tutorial-step-5-update-the-okta-application-with-the-aws-role-and-saml-identity-provider)
+ [步驟 6：透過 授予使用者和群組許可 AWS Lake Formation](#security-athena-lake-formation-jdbc-okta-tutorial-step-6-grant-permissions-through-aws-lake-formation)
+ [步驟 7：驗證透過 Athena JDBC 用戶端的存取](#security-athena-lake-formation-jdbc-okta-tutorial-step-7-verify-access-through-athena-jdbc-client)
+ [結論](#security-athena-lake-formation-jdbc-okta-tutorial-conclusion)
+ [相關資源](#security-athena-lake-formation-jdbc-okta-tutorial-related-resources)

## 步驟 1：建立 Okta 帳戶
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-1-create-an-okta-account"></a>

本教學課程使用 Okta 作為以 SAML 為基礎的身分提供者。如果您還沒有 Okta 帳戶，您可以建立免費的帳戶。需要 Okta 帳戶，以便您可以建立用於 SAML 身分驗證的 Okta 應用程式。

**若要建立 Okta 帳戶**

1. 若要使用 Okta，請導覽至 [Okta 開發人員註冊頁面](https://developer.okta.com/signup/)並建立免費的 Okta 試用帳戶。開發人員版服務免費提供，最高可達 Okta 在 [developer.okta.com/pricing](https://developer.okta.com/pricing) 指定的限制。

1. 收到啟用電子郵件時，請啟用您的帳戶。

   Okta 網域名稱將會指派給您。儲存網域名稱以供參考。稍後，您可以使用 JDBC 字串 (連接到 Athena) 中的網域名稱 (*<okta-idp-domain>*)。

## 步驟 2：將使用者和群組新增至 Okta
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-2-set-up-an-okta-application-for-saml-authentication"></a>

在此步驟中，您可以使用 Okta 主控台來執行以下任務：
+ 建立兩個 Okta 使用者。
+ 建立兩個 Okta 群組。
+ 在每個 Okta 群組中新增一個 Okta 使用者。

**若要將使用者新增至 Okta**

1. 啟用 Okta 帳戶之後，請以管理使用者身分登入指派的 Okta 網域。

1. 在左側導覽窗格中，選擇 **Directory** (目錄)，然後選擇 **People** (人員)。

1. 選擇 **Add Person** (新增人員)，新增一個將透過 JDBC 驅動程式存取 Athena 的新使用者。  
![\[選擇 Add Person (新增人員)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-3.png)

1. 在 **Add Person** (新增人員) 對話方塊中，輸入所需資訊。
   + 輸入 **First name** (名字) 和 **Last name** (姓氏) 的值。本教學課程使用 *athena-okta-user*。
   + 輸入 **Username** (使用者名稱) 和 **Primary email** (主要電子郵件地址)。本教學課程使用 *athena-okta-user@anycompany.com*。
   + 對於 **Password** (密碼)，選擇 **Set by admin** (由管理員設定)，然後提供密碼。本教學課程會清除 **User must change password on first login** (使用者首次登入時必須變更密碼) 的選項；您的安全需求可能會有所不同。  
![\[將使用者新增至 Okta 應用程式。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4.png)

1. 選擇 **Save and Add Another** (儲存並新增另一個)。

1. 輸入另一個使用者的資訊。此範例會新增業務分析師使用者 *athena-ba-user@anycompany.com*。  
![\[將使用者新增至 Okta 應用程式。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4a.png)

1. 選擇**儲存**。

在下列程序中，您可以新增 "Business Analysts" (業務分析師) 群組和 "Developer" (開發人員) 群組，透過 Athena JDBC 驅動程式提供兩個 Okta 群組的存取權限。

**若要新增 Okta 群組**

1. 在 Okta 導覽窗格中選擇 **Directory** (目錄)，然後選擇 **Groups** (群組)。

1. 在 **Groups** (群組) 頁面上，選擇 **Add Group** (新增群組)。  
![\[選擇 Add Group (新增群組)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4c.png)

1. 在 **Add Group** (新增群組) 對話方塊中，輸入所需資訊。
   + 在 **Name** (名稱) 中輸入 *lf-business-analyst*。
   + 在 **Group Description** (群組描述) 中輸入 *Business Analysts* (業務分析師)。  
![\[新增 Okta 群組。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4d.png)

1. 選擇 **Add Group** (新增群組)。

1. 在 **Groups** (群組) 頁面上，再次選擇 **Add Group** (新增群組)。現在輸入開發人員群組的資訊。

1. 輸入所需資訊。
   + 在 **Name** (名稱) 中輸入 *lf-developer*。
   + 在 **Group Description** (群組描述) 中輸入 *Developers* (開發人員)。

1. 選擇 **Add Group** (新增群組)。

現在您已擁有兩個使用者和兩個群組，可以在每個群組中新增使用者。

**若要將使用者新增至群組**

1. 在 **Groups** (群組) 頁面上，選擇您剛建立的 **lf-developer** 群組。您需將您建立為開發人員的 Okta 使用者之一新增至此群組。  
![\[選擇 lf-developer。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4f.png)

1. 選擇 **Manage People** (管理人員)。  
![\[選擇 Manage People (管理人員)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4g.png)

1. 從 **Not Members** (非成員) 清單，選擇 **athena-okta-user**。  
![\[選擇要新增至成員清單的使用者。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4h.png)

   使用者的項目會從左側的 **Not Members** (非成員) 清單移動至右側的 **Members** (成員) 清單。  
![\[Okta 使用者已新增至 Okta 群組。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4i.png)

1. 選擇**儲存**。

1. 選擇 **Back to Group** (返回群組)，或選擇 **Directory** (目錄)，接著選擇 **Groups** (群組)。

1. 選擇 **lf-business-analyst** 群組。

1. 選擇 **Manage People** (管理人員)。

1. 將 **athena-ba-user** 新增至 **lf-business-analyst** 群組的 **Members** (成員) 清單，然後選擇 **Save** (儲存)。

1. 選擇 **Back to Group** (返回群組)，或依序選擇 **Directory** (目錄)、**Groups** (群組)。

   **Groups** (群組) 頁面現在顯示每個群組都有一個 Okta 使用者。  
![\[Okta 主控台中的每個 Okta 群組均已新增一個使用者。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4j.png)

## 步驟 3：設定用於 SAML 身分驗證的 Okta 應用程式
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-3-set-up-an-okta-application-for-saml-authentication"></a>

在此步驟中，您需使用 Okta 開發人員主控台以執行下列任務：
+ 新增 SAML 應用程式以搭配 使用 AWS。
+ 將應用程式指派給 Okta 使用者。
+ 將應用程式指派給 Okta 群組。
+ 下載產生的身分提供者中繼資料，以便稍後與 AWS搭配使用。

**若要新增應用程式以進行 SAML 身分驗證**

1. 在 Okta 導覽窗格中，選擇 **Applications** (應用程式)、**Applications** (應用程式)，以便您可設定 Okta 應用程式以進行對 Athena 的 SAML 身分驗證。

1. 按一下 **Browse App Catalog** (瀏覽應用程式目錄)。

1. 在搜尋方塊中，輸入 **Redshift**。

1. 選擇 **Amazon Web Services Redshift**。本教學課程中的 Okta 應用程式對 Amazon Redshift 使用現有的 SAML 整合。  
![\[選擇 Amazon Web Services Redshift。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-7.png)

1. 在 **Amazon Web Services Redshift** 頁面上，選擇 **Add** (新增) 來為 Amazon Redshift 建立以 SAML 為基礎的應用程式。  
![\[選擇 Add (新增) 來建立以 SAML 為基礎的應用程式。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-8.png)

1. 在 **Application** (應用程式) 標籤中輸入 `Athena-LakeFormation-Okta`，然後選擇 **Done** (完成)。  
![\[輸入 Okta 應用程式的名稱。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-9.png)

現在您已建立 Okta 應用程式，您可以將其指派給您建立的使用者和群組。

**若要將應用程式指派給使用者和群組**

1. 在 **Applications** (應用程式) 頁面上，選擇 **Athena-LakeFormation-Okta** 應用程式。

1. 在 **Assignments** (指派) 索引標籤上，依序選擇 **Assign** (指派)、**Assign to People** (指派給人員)。  
![\[依序選擇 Assign (指派)、Assign to People (指派給人員)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-10.png)

1. 在 **Assign Athena-LakeFormation-Okta to People** (將 Athena-LakeFormation-Okta 指派給人員) 對話方塊中，尋找您之前建立的 **athena-okta-user** 使用者。

1. 選擇 **Assign** (指派) 將使用者指派給應用程式。  
![\[選擇 Assign (指派)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-11.png)

1. 選擇 **Save and Go Back** (儲存並返回)。

1. 選擇 **Done** (完成)。

1. 在 **Athena-LakeFormation-Okta** 應用程式的 **Assignments** (指派) 索引標籤上，依序選擇 **Assign** (指派)、**Assign to Groups** (指派給群組)。

1. 對於 **lf-business-analyst**，選擇 **Assign** (指派)，將 **Athena-LakeFormation-Okta** 應用程式指派給 **lf-business-analyst** 群組，然後選擇 **Done** (完成)。  
![\[將 Okta 應用程式指派給 Okta 使用者群組。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-12b.png)

   該群組會出現在應用程式的群組清單中。  
![\[Okta 應用程式指派給 Okta 群組。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-12c.png)

現在您已準備好下載身分提供者應用程式中繼資料，以與 AWS搭配使用。

**若要下載應用程式中繼資料**

1. 選擇 Okta 應用程式 **Sign On** (登入) 索引標籤，然後以滑鼠右鍵按一下 **Identity Provider metadata** (身分提供者中繼資料)。  
![\[在 Identity Provider metadata (身分提供者中繼資料) 上按一下滑鼠右鍵。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-13.png)

1. 選擇 **Save Link As** (另存連結)，將 XML 格式的身分提供者中繼資料儲存至檔案中。指定一個您認識的名稱 (例如 `Athena-LakeFormation-idp-metadata.xml`)。  
![\[儲存身分提供者中繼資料。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-14.png)

## 步驟 4：建立 AWS SAML 身分提供者和 Lake Formation 存取 IAM 角色
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-4-create-an-aws-saml-identity-provider-and-lake-formation-access-IAM-role"></a>

在此步驟中，您可以使用 AWS Identity and Access Management (IAM) 主控台來執行下列任務：
+ 為 AWS建立身分提供者。
+ 為 Lake Formation 存取建立 IAM 角色。
+ 將 AmazonAthenaFullAccess 受管政策新增至該角色。
+ 將 Lake Formation 和 的政策 AWS Glue 新增至角色。
+ 將 Athena 查詢結果的政策新增至該角色。

**建立 AWS SAML 身分提供者**

1. 以 **Amazon Web Services 帳戶管理員**身分登入 **Amazon Web Services 帳戶****主控台**，並導覽至 **IAM** 主控台 ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))。

1. 在導覽窗格中，選擇 **Identity providers** (身分提供者)，然後按一下 **Add provider** (新增供應商)。

1. 在 **Configure provider** (設定供應商) 畫面上，輸入以下資訊：
   + 對於 **Provider type** (供應商類型)，選擇 **SAML**。
   + 對於 **Provider name** (供應商名稱)，輸入 `AthenaLakeFormationOkta`。
   + 對於 **Metadata document** (中繼資料文件)，使用 **Choose file** (選擇檔案) 選項，以上傳您下載的身分提供者 (IdP) 中繼資料 XML 檔案。

1. 選擇 **Add provider** (新增供應商)。

接著，您可以建立 IAM 角色以進行 AWS Lake Formation 存取。您可以將兩個內嵌政策新增至該角色。一個政策提供存取 Lake Formation 和 AWS Glue APIs的許可。另一個政策可用於存取 Athena 和在 Amazon S3 中的 Athena 查詢結果位置。

**建立用於 AWS Lake Formation 存取的 IAM 角色**

1. 在 IAM 主控台導覽窗格中，選擇 **Roles** (角色)，然後選擇 **Create role** (建立角色)。

1. 在 **Create role** (建立角色) 頁面上，執行以下步驟：  
![\[將 IAM 角色設定為使用 SAML 2.0。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-20.png)

   1. 對於 **Select type of trusted entity** (選取信任的實體類型)，選擇 **SAML 2.0 Federation** (SAML 2.0 聯合)。

   1. 對於 **SAML provider** (SAML 供應商)，選取 **AthenaLakeFormationOkta**。

   1. 對於 **SAML 供應商**，選取**允許程式設計和 AWS 管理主控台 存取**選項。

   1. 選擇 **Next: Permissions** (下一步：許可)。

1. 在 **Attach Permissions policies** (連接許可政策) 頁面上，對於 **Filter policies** (篩選條件政策)，輸入 **Athena**。

1. 選取名為 **AmazonAthenaFullAccess** 的受管政策，然後選擇 **Next: Tags** (下一步：標籤)。  
![\[將 AmazonAthenaFullAccess 受管政策附加至 IAM 角色。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-21.png)

1. 在 **Add tags** (新增標籤) 頁面上，選擇 **Next: Review** (下一步：檢閱)。

1. 在 **Review** (檢閱) 頁面上，對於 **Role name** (角色名稱)，輸入角色的名稱 (例如 *Athena-LakeFormation-OktaRole*)，然後選擇 **Create role** (建立角色)。  
![\[輸入 IAM 角色的名稱。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-22.png)

接著，您可以新增內嵌政策，允許存取 Amazon S3 中的 Lake Formation、 AWS Glue APIs和 Athena 查詢結果。

每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

**將內嵌政策新增至 Lake Formation 和 的角色 AWS Glue**

1. 從 IAM 主控台的角色清單中，選擇新建立的 `Athena-LakeFormation-OktaRole`。

1. 在角色的 **Summary** (摘要) 頁面之 **Permissions** (許可) 索引標籤上，選擇 **Add inline policy** (新增內嵌政策)。

1. 在 **Create policy** (建立政策) 頁面上，選擇 **JSON**。

1. 新增內嵌政策 (如下所示)，該政策提供對 Lake Formation 和 AWS Glue API 的存取權限。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": [
               "lakeformation:GetDataAccess",
               "glue:GetTable",
               "glue:GetTables",
               "glue:GetDatabase",
               "glue:GetDatabases",
               "glue:CreateDatabase",
               "glue:GetUserDefinedFunction",
               "glue:GetUserDefinedFunctions"
           ],
           "Resource": "*"
       }
   }
   ```

------

1. 選擇 **Review policy** (檢閱政策)。

1. 對於 **Name** (名稱)，輸入政策名稱 (例如 **LakeFormationGlueInlinePolicy**)。

1. 選擇 **Create policy** (建立政策)。

**若要針對 Athena 查詢結果位置將內嵌政策新增至角色**

1. 在 `Athena-LakeFormation-OktaRole` 角色 的 **Summary** (摘要) 頁面之 **Permissions** (許可) 索引標籤上，選擇 **Add inline policy** (新增內嵌政策)。

1. 在 **Create policy** (建立政策) 頁面上，選擇 **JSON**。

1. 新增內嵌政策 (如下所示)，該政策允許對 Athena 查詢結果位置進行角色存取。將範例中的 *<athena-query-results-bucket>* 預留位置取代為您的 Amazon S3 儲存貯體名稱。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AthenaQueryResultsPermissionsForS3",
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket",
                   "s3:PutObject",
                   "s3:GetObject"
               ],
               "Resource": [
                   "arn:aws:s3:::<athena-query-results-bucket>",
                   "arn:aws:s3:::<athena-query-results-bucket>/*"
               ]
           }
       ]
   }
   ```

------

1. 選擇 **Review policy** (檢閱政策)。

1. 對於 **Name** (名稱)，輸入政策名稱 (例如 **AthenaQueryResultsInlinePolicy**)。

1. 選擇 **Create policy** (建立政策)。

接下來，您要複製 Lake Formation 存取角色的 ARN 和您建立的 SAML 供應商的 ARN。在本教學課程的下一節中設定 Okta SAML 應用程式時，這些都是必要的程序。

**若要複製角色 ARN 和 SAML 身分提供者 ARN**

1. 在 IAM 主控台中，在 `Athena-LakeFormation-OktaRole` 角色的 **Summary** (摘要) 頁面上，選擇 **Role ARN** (角色 ARN) 旁的 **Copy to clipboard** (複製至剪貼簿) 圖示。ARN 採用下列格式：

   ```
   arn:aws:iam::<account-id>:role/Athena-LakeFormation-OktaRole
   ```

1. 安全地儲存完整的 ARN 以供日後參考。

1. 在 IAM 主控台導覽窗格中，選擇 **Identity providers** (身分提供者)。

1. 選擇 **AthenaLakeFormationOkta** 供應商。

1. 在 **Summary** (摘要) 頁面上，選擇 **Provider ARN** (供應商 ARN) 旁的 **Copy to clipboard** (複製至剪貼簿) 圖示。ARN 看起來應該如下所示：

   ```
   arn:aws:iam::<account-id>:saml-provider/AthenaLakeFormationOkta
   ```

1. 安全地儲存完整的 ARN 以供日後參考。

## 步驟 5：將 IAM 角色和 SAML 身分提供者新增至 Okta 應用程式
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-5-update-the-okta-application-with-the-aws-role-and-saml-identity-provider"></a>

在此步驟中，您需返回 Okta 開發人員主控台並執行下列任務：
+ 將使用者和群組的 Lake Formation URL 屬性新增至 Okta 應用程式。
+ 將身分提供者的 ARN 和 IAM 角色的 ARN 新增至 Okta 應用程式。
+ 複製 Okta 應用程式 ID。連接至 Athena 的 JDBC 設定檔中需要 Okta 應用程式 ID。

**若要將使用者和群組的 Lake Formation URL 屬性新增至 Okta 應用程式**

1. 登入 Okta 開發人員主控台。

1. 選擇 **Applications** (應用程式) 索引標籤，然後選擇 `Athena-LakeFormation-Okta` 應用程式。

1. 選擇應用程式的 **Sign On** (登入) 索引標籤，然後選擇 **Edit** (編輯)。  
![\[編輯 Okta 應用程式。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-24.png)

1. 選擇 **Attributes (optional)** (屬性 (選填)) 以將其展開。  
![\[將使用者 Lake Formation URL 屬性新增至 Okta 應用程式。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-25.png)

1. 對於 **Attribute Statements (optional)** (屬性陳述式 (選填))，新增下列屬性：
   + 對於 **Name** (名稱)，輸入 **https://lakeformation.amazon.com/SAML/Attributes/Username**。
   + 對於 **Value** (值)，輸入 **user.login**

1. 在 **Group Attribute Statements (optional)** (群組屬性陳述式 (選填)) 下，新增下列屬性：
   + 對於 **Name** (名稱)，輸入 **https://lakeformation.amazon.com/SAML/Attributes/Groups**。
   + 對於 **Name format** (名稱格式)，輸入 **Basic**
   + 對於 **Filter** (篩選條件)，選擇 **Matches regex** (符合 regex)，然後在篩選條件方塊中輸入 **.\$1**。  
![\[將群組的 Lake Formation URL 屬性新增至 Okta 應用程式。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-25a.png)

1. 向下捲動至 **Advanced Sign-On Settings** (進階登入設定) 區段，您可以在此將身分提供者和 IAM 角色 ARN 新增至 Okta 應用程式。

**若要將身分提供者和 IAM 角色的 ARN 新增至 Okta 應用程式**

1. 對於 **Idp ARN 和角色 ARN**，以逗號分隔值格式輸入 AWS 身分提供者 ARN 和角色 ARN，格式為 *<saml-arn>*、*<role-arn>*。組合的字串看起來應該如下所示：

   ```
   arn:aws:iam::<account-id>:saml-provider/AthenaLakeFormationOkta,arn:aws:iam::<account-id>:role/Athena-LakeFormation-OktaRole
   ```  
![\[在 Okta 應用程式中輸入身分提供者 ARN 和 IAM 角色 ARN。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-26.png)

1. 選擇**儲存**。

接下來，複製 Okta 應用程式 ID。您稍後需要此 ID，以用於連接至 Athena 的 JDBC 字串。

**若要尋找並複製 Okta 應用程式 ID**

1. 選擇 Okta 應用程式的 **General** (一般) 索引標籤。  
![\[選擇 Okta 應用程式的 General (一般) 索引標籤。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-27.png)

1. 向下捲動至 **App Embed Link** (應用程式內嵌連結) 區段。

1. 從 **Embed Link** (內嵌連結)，複製並安全地儲存 URL 的 Okta 應用程式 ID 部分。Okta 應用程式 ID 是 URL 中在 `amazon_aws_redshift/` 之後、下一個正斜線之前的部分。例如，如果 URL 包含 `amazon_aws_redshift/aaa/bbb`，則應用程式 ID 為 `aaa`。  
![\[複製 Okta 應用程式 ID。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-28.png)

**注意**  
無法使用嵌入的連結直接登入 Athena 主控台以查看資料庫。僅當您使用 JDBC 或 ODBC 驅動程式向 Athena 提交查詢時，才能識別 SAML 使用者和群組的 Lake Formation 許可。若要查看資料庫，您可以使用 SQL Workbench/J 工具，其使用 JDBC 驅動程式連接至 Athena。在 [步驟 7：驗證透過 Athena JDBC 用戶端的存取](#security-athena-lake-formation-jdbc-okta-tutorial-step-7-verify-access-through-athena-jdbc-client) 中有SQL Workbench/J 工具的說明。

## 步驟 6：透過 授予使用者和群組許可 AWS Lake Formation
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-6-grant-permissions-through-aws-lake-formation"></a>

在此步驟中，您可以使用 Lake Formation 主控台，將資料表的許可授予 SAML 使用者和群組。執行以下任務：
+ 指定 Okta SAML 使用者的 ARN 和資料表的相關使用者許可。
+ 指定 Okta SAML 群組的 ARN 和資料表的相關群組許可。
+ 確認您授予的許可。

**若要在 Lake Formation 中為 Okta 使用者授予許可**

1. 以資料湖管理員身分登入 AWS 管理主控台。

1. 開啟 Lake Formation 主控台，網址為 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)。

1. 從導覽窗格中，選擇 **Tables** (資料表)，然後選取您要為其授予許可的資料表。本教學課程使用來自 `tripdb` 資料庫的 `nyctaxi` 資料表。  
![\[選擇您要為其授予許可的資料表。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-29.png)

1. 從 **Actions** (動作)，選擇 **Grant** (授予)。  
![\[選擇 Grant (授予)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-30.png)

1. 在 **Grant permissions** (授予許可) 對話方塊中，輸入下列資訊：

   1. 在 **SAML 和 Amazon Quick 使用者和群組**下，以下列格式輸入 Okta SAML 使用者 ARN：

      ```
      arn:aws:iam::<account-id>:saml-provider/AthenaLakeFormationOkta:user/<athena-okta-user>@<anycompany.com>       
      ```

   1. 對於 **Columns** (資料欄)、**Choose filter type** (選擇篩選條件類型)，選擇性地選擇 **Include columns** (包含資料欄) 或 **Exclude columns** (排除資料欄)。

   1. 使用篩選條件下的 **Choose one or more columns** (選擇一或多個資料欄) 下拉式清單，以指定您要包含或排除使用者的資料欄。

   1. 對於 **Table permissions** (資料表許可)，選擇 **Select** (選取)。本教學課程僅授予 `SELECT` 許可；您的需求可能會有所不同。  
![\[將表格和資料欄層級許可授予 Okta 使用者。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-31.png)

1. 選擇 **Grant** (授予)。

現在再針對 Okta 群組執行類似的步驟。

**若要在 Lake Formation 中為 Okta 群組授予許可**

1. 在 Lake Formation 主控台的 **Tables** (資料表) 頁面上，確定仍選取 **nyctaxi** 資料表。

1. 從 **Actions** (動作)，選擇 **Grant** (授予)。

1. 在 **Grant permissions** (授予許可) 對話方塊中，輸入下列資訊：

   1. 在 **SAML 和 Amazon Quick 使用者和群組**下，以下列格式輸入 Okta SAML 群組 ARN：

      ```
      arn:aws:iam::<account-id>:saml-provider/AthenaLakeFormationOkta:group/lf-business-analyst
      ```

   1. 對於 **Columns** (資料欄)、**Choose filter type** (選擇篩選條件類型)，選擇 **Include columns** (包含資料欄)。

   1. 對於 **Choose one or more columns** (選擇一或多個資料欄)，選擇資料表的前三個資料欄。

   1. 對於 **Table permissions** (資料表許可)，選擇要授予的特定存取許可。本教學課程僅授予 `SELECT` 許可；您的需求可能會有所不同。  
![\[將資料表許可授予 Okta 群組。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-31b.png)

1. 選擇 **Grant** (授予)。

1. 若要確認您授予的許可，請選擇 **Actions** (動作)、**View permissions** (檢視許可)。  
![\[選擇 View permissions (檢視許可) 以確認授予的許可。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-32.png)

   `nyctaxi` 資料表的**資料許可**頁面會顯示 **athena-okta-user** 與 **lf-business-analyst** 群組的許可。  
![\[檢視授予 Okta 使用者和群組的許可。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-33.png)

## 步驟 7：驗證透過 Athena JDBC 用戶端的存取
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-7-verify-access-through-athena-jdbc-client"></a>

現在，您已經準備好使用 JDBC 用戶端，以 Okta SAML 使用者身分執行與 Athena 的測試連接。

在本節中，您需執行下列任務：
+ 準備測試用戶端 – 下載 Athena JDBC 驅動程式，安裝 SQL Workbench，然後將驅動程式新增至 Workbench。本教學課程使用 SQL Workbench 透過 Okta 身分驗證來存取 Athena，並驗證 Lake Formation 許可。
+ 在 SQL Workbench 中：
  + 為 Athena Okta 使用者建立連線。
  + 以 Athena Okta 使用者身分執行測試查詢。
  + 為業務分析師使用者建立並測試連線。
+ 在 Okta 主控台中，將業務分析師使用者新增至開發人員群組。
+ 在 Lake Formation 主控台中，設定開發人員群組的資料表許可。
+ 在 SQL Workbench 中，以業務分析師使用者身分執行測試查詢，並確認許可變更如何影響結果。

**若要準備測試用戶端**

1. 從 [使用 JDBC 連接到 Amazon Athena](connect-with-jdbc.md) 下載並解壓縮 Lake Formation 相容的 Athena JDBC 驅動程式 (2.0.14 或更高版本)。

1. 下載並安裝免費的 [SQL Workbench/J](https://www.sql-workbench.eu/index.html) SQL 查詢工具 (可在修改後的 Apache 2.0 授權下取得)。

1. 在 SQL Workbench 中，選擇 **File** (檔案)，然後選擇 **Manage Drivers** (管理驅動程式)。  
![\[選擇 Manage Drivers (管理驅動程式)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-1.png)

1. 在 **Manage Drivers** (管理驅動程式) 對話方塊中，執行以下步驟：

   1. 選擇新驅動程式圖示。

   1. 對於 **Name** (名稱)，輸入 **Athena**。

   1. 對於 **Library** (程式庫)，瀏覽並選擇您剛下載的 Simba Athena JDBC `.jar` 檔案。

   1. 選擇**確定**。  
![\[將 Athena JDBC 驅動程式新增到 SQL Workbench。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-2.png)

您現在可以開始建立並測試 Athena Okta 使用者的連線。

**若要為 Okta 使用者建立連線**

1. 依序選擇 **File** (檔案)、**Connect window** (連接視窗)。  
![\[選擇 Connect window (連接視窗)。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-3.png)

1. 在 **Connection profile** (連線設定檔) 對話方塊中，輸入下列資訊來建立連線：
   + 在名稱方塊中，輸入 **Athena\$1Okta\$1User\$1Connection**。
   + 對於 **Driver** (驅動程式)，選擇 Simba Athena JDBC 驅動程式。
   + 對於 **URL**，執行下列其中一項作業：
     + 若要使用連線 URL，請輸入單行連線字串。以下範例新增了換行以方便閱讀。

       ```
       jdbc:awsathena://AwsRegion=region-id;
       S3OutputLocation=s3://amzn-s3-demo-bucket/athena_results;
       AwsCredentialsProviderClass=com.simba.athena.iamsupport.plugin.OktaCredentialsProvider;
       user=athena-okta-user@anycompany.com;
       password=password;
       idp_host=okta-idp-domain;
       App_ID=okta-app-id;
       SSL_Insecure=true;
       LakeFormationEnabled=true;
       ```
     + 若要使用 AWS 設定檔型 URL，請執行下列步驟：

       1. 設定具有 AWS 登入資料檔案的[AWS 設定檔](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html)，如下列範例所示。

          ```
          [athena_lf_dev]
          plugin_name=com.simba.athena.iamsupport.plugin.OktaCredentialsProvider
          idp_host=okta-idp-domain
          app_id=okta-app-id
          uid=athena-okta-user@anycompany.com
          pwd=password
          ```

       1. 對於 **URL**，輸入單行連線字串，如下列範例所示。該範例新增了換行以方便閱讀。

          ```
          jdbc:awsathena://AwsRegion=region-id;
          S3OutputLocation=s3://amzn-s3-demo-bucket/athena_results;
          profile=athena_lf_dev;
          SSL_Insecure=true;
          LakeFormationEnabled=true;
          ```

     請注意，這些範例是連接至 Athena 所需的 URL 的基本表示。如需 URL 中支援的完整參數清單，請參閱 [JDBC 文件](connect-with-jdbc.md)。

   下圖顯示使用連線 URL 的 SQL Workbench 連線設定檔。  
![\[SQL Workbench 中的連線設定檔。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-4.png)

現在您已經為 Okta 使用者建立了連線，您可以擷取一些資料來進行測試。

**若要測試 Okta 使用者的連線**

1. 選擇 **Test** (測試)，然後確認連線成功。

1. 從 SQL Workbench **Statement** (陳述式) 視窗中，執行下列 SQL `DESCRIBE` 命令。確認已顯示所有資料欄。

   ```
   DESCRIBE "tripdb"."nyctaxi"
   ```  
![\[已顯示所有資料欄。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-5.png)

1. 從 SQL Workbench **Statement** (陳述式) 視窗中，執行下列 SQL `SELECT` 命令。確認已顯示所有資料欄。

   ```
   SELECT * FROM tripdb.nyctaxi LIMIT 5
   ```  
![\[確認已顯示所有資料欄。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-6.png)

接下來，您需確認 **athena-ba-user** (**lf-business-analyst** 群組的成員) 只能存取您先前在 Lake Formation 中指定之資料表的前三個資料欄。

**若要確認 **athena-ba-user** 的存取權限**

1. 在 SQL Workbench 的 **Connection profile** (連線設定檔) 對話方塊中，建立另一個連線設定檔。
   + 對於連線設定檔名稱，輸入 ** Athena\$1Okta\$1Group\$1Connection**。
   + 對於 **Driver** (驅動程式)，選擇 Simba Athena JDBC 驅動程式。
   + 對於 **URL**，執行下列其中一項作業：
     + 若要使用連線 URL，請輸入單行連線字串。以下範例新增了換行以方便閱讀。

       ```
       jdbc:awsathena://AwsRegion=region-id;
       S3OutputLocation=s3://amzn-s3-demo-bucket/athena_results;
       AwsCredentialsProviderClass=com.simba.athena.iamsupport.plugin.OktaCredentialsProvider;
       user=athena-ba-user@anycompany.com;
       password=password;
       idp_host=okta-idp-domain;
       App_ID=okta-application-id;
       SSL_Insecure=true;
       LakeFormationEnabled=true;
       ```
     + 若要使用 AWS 設定檔型 URL，請執行下列步驟：

       1. 設定具有登入資料檔案的 AWS 設定檔，如下列範例所示。

          ```
          [athena_lf_ba]
          plugin_name=com.simba.athena.iamsupport.plugin.OktaCredentialsProvider
          idp_host=okta-idp-domain
          app_id=okta-application-id
          uid=athena-ba-user@anycompany.com
          pwd=password
          ```

       1. 對於 **URL**，輸入單行連線字串，如下所示。該範例新增了換行以方便閱讀。

          ```
          jdbc:awsathena://AwsRegion=region-id;
          S3OutputLocation=s3://amzn-s3-demo-bucket/athena_results;
          profile=athena_lf_ba;
          SSL_Insecure=true;
          LakeFormationEnabled=true;
          ```

1. 選擇 **Test** (測試) 以確認連線是否成功。

1. 從 **SQL Statement** (SQL 陳述式) 視窗中，執行與您之前執行相同的 `DESCRIBE` 和 `SELECT` SQL 命令並檢查結果。

   由於 **athena-ba-user** 是 **lf-business-analyst** 群組的成員，只會傳回您在 Lake Formation 主控台中指定的前三個資料欄。  
![\[只會傳回前三個資料欄。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-7.png)  
![\[來自前三個資料欄的資料。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-8.png)

接下來，您需返回 Okta 主控台，將 `athena-ba-user` 新增至 `lf-developer` Okta 群組。

**若要將 athena-ba-user 新增至 lf-developer 群組**

1. 以指派的 Okta 網域的管理使用者身分登入 Okta 主控台。

1. 選擇 **Directory** (目錄)，然後選擇 **Groups** (群組)。

1. 在 Groups (群組) 頁面上，選擇 **lf-developer** 群組。  
![\[選擇 lf-developer 群組。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-9.png)

1. 選擇 **Manage People** (管理人員)。

1. 從 **Not Members** (非成員) 清單中，選擇 **athena-ba-user**，將其新增至 **lf-developer** 群組。

1. 選擇**儲存**。

現在請返回 Lake Formation 主控台來設定 **lf-developer** 群組的資料表許可。

**若要為 lf-developer-group 設定資料表許可**

1. 以資料湖管理員身分登入 Lake Formation 主控台。

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

1. 選取 **nyctaxi** 資料表。

1. 依序選擇 **Actions** (動作) 和 **Grant** (授予)。

1. 在 **Grant Permissions** (授予許可) 對話方塊中，輸入下列資訊：
   + 針對 **SAML 和 Amazon Quick 使用者和群組**，以下列格式輸入 Okta SAML lf-developer 群組 ARN：
   + 對於 **Columns** (資料欄)、**Choose filter type** (選擇篩選條件類型)，選擇 **Include columns** (包含資料欄)。
   + 選擇 **trip\$1type** 資料欄。
   + 對於 **Table permissions** (資料表許可)，選擇 **SELECT** (選取)。

1. 選擇 **Grant** (授予)。

現在，您可以使用 SQL Workbench 來驗證 **lf-developer** 群組的許可變更。變更應反映在 **athena-ba-user** (現在是 **lf-developer** 群組的成員) 可用的資料中。

**若要驗證 athena-ba-user 許可的變更**

1. 關閉 SQL Workbench 程式，然後再重新開啟。

1. 連接至 **athena-ba-user** 的設定檔。

1. 從 **Statement** (陳述式) 視窗中，發出您先前執行的相同 SQL 陳述式：

   這一次將會顯示 **trip\$1type** 資料欄。  
![\[第四個資料欄可用於查詢。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-10.png)

   由於 **athena-ba-user** 現在是 **lf-developer** 和 **lf-business-analyst** 群組的成員，這些群組的 Lake Formation 許可的組合會決定傳回的資料欄。  
![\[資料結果中的第四個資料欄。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-11.png)

## 結論
<a name="security-athena-lake-formation-jdbc-okta-tutorial-conclusion"></a>

在本教學課程中，您將 Athena 整合設定為 AWS Lake Formation 使用 Okta 做為 SAML 供應商。您使用 Lake Formation 和 IAM 來控制資料湖 AWS Glue 資料目錄中 SAML 使用者可用的資源。

## 相關資源
<a name="security-athena-lake-formation-jdbc-okta-tutorial-related-resources"></a>

如需相關資訊，請參閱下列資源。
+ [使用 JDBC 連接到 Amazon Athena](connect-with-jdbc.md)
+ [啟用對 Athena API 的聯合存取](access-federation-saml.md)
+ [AWS Lake Formation 開發人員指南](https://docs.aws.amazon.com/lake-formation/latest/dg/)
+ 《AWS Lake Formation 開發人員指南》**中的[授予和撤銷資料目錄許可](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)。
+ 《IAM 使用者指南》**中的身分提供者[身分提供者與聯合](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html)。
+ 《IAM 使用者指南》**中的[建立 IAM SAML 身分提供者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html)。
+ *AWS 安全部落格*上的[啟用聯合 AWS 使用 Windows Active Directory、ADFS 和 SAML 2.0。](https://aws.amazon.com/blogs/security/enabling-federation-to-aws-using-windows-active-directory-adfs-and-saml-2-0/)

# 工作負載管理
<a name="workload-management"></a>

您可以使用 Athena 的工作群組、容量管理、效能調校、壓縮支援、標籤和服務配額功能來管理工作負載。

**Topics**
+ [使用工作群組來控制查詢存取和成本](workgroups-manage-queries-control-costs.md)
+ [管理查詢處理容量](capacity-management.md)
+ [最佳化 Athena 效能](performance-tuning.md)
+ [在 Athena 中使用壓縮](compression-formats.md)
+ [標記 Athena 資源](tags.md)
+ [Service Quotas](service-limits.md)

# 使用工作群組來控制查詢存取和成本
<a name="workgroups-manage-queries-control-costs"></a>

您可以使用 Athena 工作群組來分隔工作負載、控制團隊存取權、強制執行組態，以及追蹤查詢指標和控制成本。

**分隔工作負載**  
您可以使用工作群組來分隔工作負載。例如，您可以建立兩個獨立工作群組，一個用於自動排定的應用程式，例如產生報告，另一個供分析師臨時使用。

**控制團隊存取權**  
因為工作群組扮演 IAM 資源的角色，所以您可以使用資源層級的身分型政策，控制可存取工作群組並在其中執行查詢的人員。若要隔離組織中兩個不同團隊的查詢，您可以為每個團隊建立單獨的工作群組。每個工作群組都有其自己的查詢歷史記錄以及該工作群組中的查詢的易儲存查詢的清單，而不是針對帳戶中的所有查詢。如需詳細資訊，請參閱[使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md)。

**強制執行組態**  
您可以選擇性地對該工作群組中執行的所有查詢強制執行相同的工作群組整體設定。這些設定包含 Amazon S3 中查詢結果的位置、預期的儲存貯體擁有者、加密和對寫入查詢結果儲存貯體之物件的控制。如需詳細資訊，請參閱[Override client-side settings (覆寫用戶端設定)](workgroups-settings-override.md)。

**追蹤查詢指標、查詢事件和控制成本**  
若要追蹤每個 Athena 工作群組的查詢指標、查詢事件和控制成本，您可以使用下列功能：
+ **發布查詢指標** – 將工作群組的查詢指標發布至 CloudWatch。在 Athena 主控台中，您可以檢視每個工作群組的查詢指標。在 CloudWatch 中，您可以建立自訂儀表板，並針對這些指標設定閾值和警示。如需詳細資訊，請參閱[在 Athena 中啟用 CloudWatch 查詢指標](athena-cloudwatch-metrics-enable.md)及[使用 CloudWatch 監控 Athena 查詢指標](query-metrics-viewing.md)。
+ **監控 Athena 用量指標** – 透過在 CloudWatch 圖表和儀表板上顯示您目前的服務用量，了解您的帳戶如何使用資源。如需詳細資訊，請參閱[使用 CloudWatch 監控 Athena 用量指標](monitoring-athena-usage-metrics.md)
+ **監控查詢事件** – 使用 Amazon EventBridge 來接收查詢狀態的即時通知。如需詳細資訊，請參閱[使用 EventBridge 監控 Athena 查詢事件](athena-events.md)。
+ **建立資料用量控制** – 在 Athena 中，您可以設定每一查詢和每一工作群組資料用量控制。Athena 會在超過指定閾值時取消查詢，或在超過工作群組閾值時啟用 Amazon SNS 警示。如需詳細資訊，請參閱[設定每一查詢和每一工作群組資料用量控制](workgroups-setting-control-limits-cloudwatch.md)。
+ **使用成本分配標籤** – 使用帳單和成本管理主控台為工作群組加上成本分配標籤。與工作群組中執行查詢相關聯的成本會在成本和用量報告中顯示，並具有相應的成本分配標籤。如需詳細資訊，請參閱《AWS Billing 使用者指南**》中的[使用使用者定義的成本分配標籤](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/custom-tags.html)。
+ **使用容量保留** – 您可以使用指定的資料處理單位數目來建立容量保留，並將一或多個工作群組新增至保留。如需詳細資訊，請參閱[管理查詢處理容量](capacity-management.md)。

如需有關使用 Athena 工作群組分隔工作負載、控制使用者存取和管理查詢用量和成本的其他資訊，請參閱 AWS 大數據部落格文章[使用 Amazon Athena 工作群組分隔查詢和管理成本](https://aws.amazon.com/blogs/big-data/separating-queries-and-managing-costs-using-amazon-athena-workgroups/)。

**注意**  
Amazon Athena 資源現可在 Amazon SageMaker Unified Studio (預覽版) 內進行存取，如此可協助您存取組織的資料，並使用最佳工具對其採取行動。您可以將儲存的查詢從 Athena 工作群組移轉至 SageMaker Unified Studio 專案、使用現有的 Athena 工作群組設定專案，以及透過 IAM 角色更新維護必要許可。如需詳細資訊，請參閱[將 Amazon Athena 資源移轉至 Amazon SageMaker Unified Studio (預覽版)](https://github.com/aws/Unified-Studio-for-Amazon-Sagemaker/tree/main/migration/athena)。

## 考量和限制
<a name="workgroups-considerations-limitations"></a>

當您在 Athena 中使用工作群組時，請謹記以下幾點：
+ 每個帳戶都有一個主要工作群組。在預設情況下，如果您尚未建立任何工作群組，則您帳戶中的所有查詢會在主要工作群組中執行。無法刪除主要工作群組。預設許可允許所有已驗證身分的使用者存取該工作群組。
+ 當您能夠存取工作群組時，您可以檢視工作群組的設定、指標和資料用量控制限制。利用額外的許可，您可以編輯設定和資料用量控制限制。
+ 當您執行查詢時，它們會在目前工作群組中執行。您可以在主控台中，透過 API 操作、命令列介面或使用 JDBC 或 ODBC 驅動器的用戶端應用程式，在工作群組的內容中執行查詢。
+ 在 Athena 主控台查詢編輯器中，每個工作群組最多可開啟十個查詢索引標籤。在工作群組之間切換時，您的查詢索引標籤最多可以在三個工作群組中保持開啟。
+  AWS 區域 您帳戶中的每個 最多可建立 1000 個工作群組。
+ 工作群組可以停用。停用工作群組會阻止查詢在該工作群組中執行，直到您重新啟用該工作群組。
+ 如果您嘗試刪除包含已儲存查詢的工作群組，Athena 會向您發出警告。在您刪除其他使用者可存取的工作群組之前，請確保其可以存取能夠讓他們用於執行查詢的其他工作群組。

**Topics**
+ [考量和限制](#workgroups-considerations-limitations)
+ [建立工作群組](creating-workgroups.md)
+ [受管工作群組](workgroups-create-update-delete.md)
+ [使用 CloudWatch 和 EventBridge 來監控查詢](workgroups-control-limits.md)
+ [使用 Athena 工作群組 API](workgroups-api-list.md)
+ [對工作群組進行疑難排解](workgroups-troubleshooting.md)

# 建立工作群組
<a name="creating-workgroups"></a>

建立工作群組需要有執行 `CreateWorkgroup` API 動作的許可。請參閱 [設定存取工作群組和標籤](workgroups-access.md) 和 [使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md)。如果您新增標籤，您也需要將許可新增到 `TagResource`。請參閱 [工作群組的標籤政策範例](tags-access-control.md#tag-policy-examples-workgroups)。

下列程序說明如何使用 Athena 主控台來建立工作群組。若要使用 Athena API 建立工作群組，請參閱 [CreateWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateWorkGroup.html)。

**在 Athena 主控台中建立工作群組**

1.  決定建立哪些工作群組。要考量的幾個關鍵因素包括：
   + 誰可以在每個工作群組中執行查詢，以及誰擁有工作群組的組態。使用 IAM 政策來強制執行工作群組許可。如需詳細資訊，請參閱[使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md)。
   + Amazon S3 中用於存放工作群組查詢結果的位置。工作群組的所有使用者必須能夠存取這個位置。
   + 工作群組查詢結果是否必須加密。由於加密是按工作群組 (而不是按查詢) 進行的，因此您應該為加密和非加密的查詢結果建立單獨的工作群組。如需詳細資訊，請參閱[加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 在 Athena 主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在 **Workgroups** (工作群組) 頁面中，請選擇 **Create workgroup** (建立工作群組)。

1. 在 **Create workgroup** (建立工作群組) 頁面上，如下所示填寫欄位：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/creating-workgroups.html)

1. 選擇**建立工作群組**。工作群組會出現在 **Workgroups** (工作群組) 頁面上的清單。

   在查詢編輯器中，Athena 會在位於主控台右上角的**工作群組**選項中顯示目前工作群組。您可以使用此選項來切換工作群組。當您執行查詢時，它們會在目前工作群組中執行。

1. 建立 IAM 政策以允許使用者、群組或角色存取工作群組。政策建立工作群組成員資格和在 `workgroup` 資源上的動作存取權。如需詳細資訊，請參閱[使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md)。如需 JSON 政策的範例，請參閱[設定存取工作群組和標籤](workgroups-access.md)。

1. (選用) 當覆寫用戶端設定選項不會強制執行工作群組整體加密時，在 Amazon S3 中對該工作群組的所有查詢結果設定最低層級的加密。您可以使用此功能，確保查詢結果絕不會儲存在處於未加密狀態的 Amazon S3 儲存貯體中。如需詳細資訊，請參閱[為工作群組設定最低加密](workgroups-minimum-encryption.md)。

1. (選用) 使用 Amazon CloudWatch 和 Amazon EventBridge 來監控工作群組的查詢和控制成本。如需詳細資訊，請參閱[使用 CloudWatch 和 EventBridge 來監控查詢和控制成本](workgroups-control-limits.md)。

1. (選用) 使用帳單和成本管理主控台為工作群組加上成本分配標籤。如需詳細資訊，請參閱《AWS Billing 使用者指南**》中的[使用使用者定義的成本分配標籤](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/custom-tags.html)。

1. (選用) 若要取得工作群組中查詢的專用處理容量，請將該工作群組新增至容量保留。您可以將一或多個工作群組指派給預留。如需詳細資訊，請參閱[管理查詢處理容量](capacity-management.md)。

# Override client-side settings (覆寫用戶端設定)
<a name="workgroups-settings-override"></a>

當您建立或編輯工作群組時，您可以選擇**覆寫用戶端設定**選項。預設不會選取此選項。視您是否選取它而定，Athena 的行為如下：
+ 如果未選取**覆寫用戶端設定**，則不會在用戶端層級強制工作群組設定。當未為工作群組選取覆寫用戶端設定選項時，Athena 將對工作群組中執行的所有查詢使用用戶端的設定，包括查詢結果位置、預期的儲存貯體擁有者、加密和對寫入查詢結果儲存貯體之物件的控制等的設定。每個使用者可以在主控台的**設定**選單中指定其自己的設定。如果不設定用戶端設定，則會套用工作群組整體設定。如果您使用 AWS CLI、 API 動作或 JDBC 和 ODBC 驅動程式，在不覆寫用戶端設定的工作群組中執行查詢，您的查詢會使用您在查詢中指定的設定。
+ 如果選取**覆寫用戶端設定**，則會在工作群組層級強制工作群組中所有用戶端執行工作群組設定。當為工作群組選取覆寫用戶端設定選項時，Athena 將對工作群組中執行的所有查詢使用工作群組的設定，包括查詢結果位置、預期的儲存貯體擁有者、加密和對寫入查詢結果儲存貯體之物件的控制等的設定。當您使用主控台、API 動作或 JDBC 或 ODBC 驅動程式時，工作群組設定會覆寫您為查詢指定的任何用戶端設定。將工作群組設定設定為覆寫用戶端設定之後，可以省略驅動器或 API 中的用戶端設定。

  如果您覆寫使用者端設定，則您或任何工作群組使用者下次開啟 Athena 主控台時，Athena 會向您告知此工作群組中的查詢使用工作群組的設定，並提示您確認此變更。
**注意**  
由於覆寫用戶端設定可能會中斷根據任意 Amazon S3 儲存貯體中結果可用性的自訂自動化，我們建議您在覆寫之前先通知使用者。
**重要**  
如果您使用 API 動作 AWS CLI、 或 JDBC 和 ODBC 驅動程式在覆寫用戶端設定的工作群組中執行查詢，請確定您省略查詢中的用戶端設定，或更新它們以符合工作群組的設定。  
如果您在查詢中指定用戶端設定，但在覆寫設定的工作群組中執行這些設定，則將會使用工作群組設定執行查詢。如需有關檢視工作群組設定的資訊，請參閱 [檢視工作群組的詳細資訊](viewing-details-workgroups.md)。

# 受管工作群組
<a name="workgroups-create-update-delete"></a>

在 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 的 Athena 主控台中，您可以執行下列任務：




| 陳述式 | Description | 
| --- | --- | 
|  [建立工作群組](creating-workgroups.md)  |  建立新的工作群組。  | 
| [檢視工作群組的詳細資訊](viewing-details-workgroups.md) | 檢視工作群組的詳細資訊，例如其名稱、描述、資料用量限制、查詢結果的位置、預期查詢結果儲存貯體擁有者、加密和對寫入查詢結果儲存貯體之物件的控制。如果已勾選 Override client-side settings (覆寫用戶端設定)，您也可以驗證此工作群組是否強制其設定。 | 
|  [指定查詢的工作群組](specify-wkgroup-to-athena-in-which-to-run-queries.md)  |  您必須向 Athena 指定要使用的工作群組，才能執行查詢。您必須具有此工作群組的許可。  | 
|  [切換工作群組](switching-workgroups.md)  |  在您可以存取的工作群組之間切換。  | 
|  [編輯工作群組](editing-workgroups.md)  | 編輯工作群組和變更其設定。您無法變更工作群組的名稱，但可以使用相同的設定和不同的名稱來建立新的工作群組。 | 
|  [啟用或停用工作群組](workgroups-enabled-disabled.md)  |  啟用或停用工作群組。當工作群組停用時，其使用者無法執行查詢，或建立新的具名查詢。如果您可以存取此工作群組，則您仍可以檢視指標、資料用量限制控制、工作群組的設定、查詢歷史記錄和儲存的查詢。  | 
|  [在工作群組之間複製儲存的查詢](copy-a-query-between-workgroups.md)  | 在工作群組之間複製儲存的查詢。例如，如果您在預覽工作群組中建立了查詢，並且想要在非預覽工作群組中使用該查詢，則您可能需要執行此操作。 | 
|  [刪除工作群組](deleting-workgroups.md)  |  刪除工作群組。如果您刪除工作群組，將會刪除查詢歷史記錄、儲存的查詢、工作群組的設定和每一查詢資料限制控制。CloudWatch 中會保留工作群組整體的資料限制控制，您可以個別刪除它們。 無法刪除主要工作群組。  | 
| [使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md) | 使用 IAM 政策來控制工作群組存取權。如需工作群組政策的範例，請參閱 [工作群組政策範例](example-policies-workgroup.md)。 | 
| [建立使用 IAM Identity Center 身分驗證的 Athena 工作群組](workgroups-identity-center.md) | 若要將 IAM Identity Center 身分與 Athena 搭配使用，您必須建立啟用 IAM Identity Center 的工作群組。建立工作群組後，您可以使用 IAM Identity Center 主控台或 API，將 IAM Identity Center 使用者或群組指派給工作群組。 | 
| [為工作群組設定最低加密](workgroups-minimum-encryption.md) | 在 Amazon S3 對工作群組的所有查詢結果強制執行最低層級的加密。使用此功能，確保查詢結果絕不會儲存在處於未加密狀態的 Amazon S3 儲存貯體中。 | 

# 檢視工作群組的詳細資訊
<a name="viewing-details-workgroups"></a>

對於每個工作群組，您可以查看其詳細資訊。詳細資訊包括工作群組的名稱、描述、已啟用或停用，以及工作群組中執行的查詢所使用的設定，其中包括查詢結果的位置、預期的儲存貯體擁有者、加密和對寫入查詢結果儲存貯體之物件的控制。如果工作群組有資料用量限額，則也會顯示。

**若要檢視工作群組的詳細資訊**

1. 在 Athena 主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在 **Workgroups** (工作群組) 頁面上，請選擇您要檢視的工作群組連結。工作群組的 **Overview Details** (概觀詳細資料) 頁面隨即會顯示。

# 指定查詢的工作群組
<a name="specify-wkgroup-to-athena-in-which-to-run-queries"></a>

若要指定使用的工作群組，您必須具有此工作群組的許可。

**指定工作群組使用**

1. 請確認您的許可允許您在您想要使用在工作群組中執行查詢。如需詳細資訊，請參閱[使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md)。

1.  若要指定工作群組，請使用以下其中一個選項：
   + 如果您正在使用 Athena 主控台，請[切換工作群組](switching-workgroups.md)來設定工作群組。
   + 如果您是使用 Athena API 操作，請在 API 動作中指定工作群組名稱。例如，您可以在 [StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) 中設定工作群組名稱，如下所示：

     ```
     StartQueryExecutionRequest startQueryExecutionRequest = new StartQueryExecutionRequest()
                   .withQueryString(ExampleConstants.ATHENA_SAMPLE_QUERY)
                   .withQueryExecutionContext(queryExecutionContext)
                   .withWorkGroup(WorkgroupName)
     ```
   + 如果您是使用 JDBC 或 ODBC 驅動程式，請在連線字串中使用 `Workgroup` 組態參數來設定工作群組名稱。驅動程式會將工作群組名稱傳遞給 Athena。在連線字串中指定工作群組參數，如下列範例所示：

     ```
     jdbc:awsathena://AwsRegion=<AWSREGION>;UID=<ACCESSKEY>;
     PWD=<SECRETKEY>;S3OutputLocation=s3://amzn-s3-demo-bucket/<athena-output>-<AWSREGION>/;
     Workgroup=<WORKGROUPNAME>;
     ```

# 切換工作群組
<a name="switching-workgroups"></a>

如果您對兩個工作群組都有許可，您可以從其中一個切換到另一個。

在每個工作群組內，您最多可以開啟十個查詢索引標籤。在工作群組之間切換時，您的查詢索引標籤最多可以在三個工作群組中保持開啟。

**切換工作群組**

1. 在 Athena 主控台中，使用右上角的 **Workgroup** (工作群組) 選項選擇工作群組。

1. 如果**工作群組 *workgroup-name* 設定**對話方塊出現時，請選擇 **Acknowledge** (確認)。

**Workgroup** (工作群組) 選項會顯示您已切換到其中的工作群組名稱。您現在可以在此工作群組中執行查詢。

# 編輯工作群組
<a name="editing-workgroups"></a>

編輯工作群組需要有執行 `UpdateWorkgroup` API 操作的許可。請參閱 [設定存取工作群組和標籤](workgroups-access.md) 和 [使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md)。如果您新增或編輯標籤，您也需要有 `TagResource` 的許可。請參閱 [工作群組的標籤政策範例](tags-access-control.md#tag-policy-examples-workgroups)。

**在主控台編輯工作群組**

1. 在 Athena 主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在 **Workgroups** (工作群組) 頁面上，選取您要編輯的工作群組的按鈕。

1. 選擇 **Actions** (動作)、**Edit** (編輯)。

1. 請依需求變更欄位。關於欄位清單，請參閱[建立工作群組](creating-workgroups.md)。工作群組的名稱除外，您可以變更所有欄位。如果您需要變更名稱，請使用新的名稱和相同的設定建立另一個工作群組。

1. 選擇**儲存變更**。更新的工作群組會出現在 **Workgroups** (工作群組) 頁面上的清單。

# 啟用或停用工作群組
<a name="workgroups-enabled-disabled"></a>

如果您有許可這樣做，您可以在主控台、使用 API 操作或透過 JDBC 和 ODBC 驅動程式來啟用或停用工作群組。

**若要啟用或停用工作群組**

1. 在 Athena 主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在 **Workgroups** (工作群組) 頁面上，請選擇工作群組的連結。

1. 在右上角，選擇 **Enable workgroup** (啟用工作群組) 或 **Disable workgroup** (停用工作群組)。

1. 在確認提示時，選擇 **Enable** (啟用) 或 **Disable** (停用)。如果您停用工作群組，則其使用者無法在其中執行查詢，或建立新的具名查詢。如果您啟用工作群組，使用者可以使用它來執行查詢。

# 在工作群組之間複製儲存的查詢
<a name="copy-a-query-between-workgroups"></a>

Athena 主控台目前沒有將儲存的查詢從某個工作群組直接複製到另一個工作群組的選項，但您可以使用下列程序手動執行相同的任務。

**若要在工作群組之間複製儲存的查詢**

1. 在 Athena 主控台中，從您想要從中複製查詢的工作群組中，選擇 **Saved queries** (儲存的查詢) 索引標籤。

1. 選擇您想要複製的已儲存查詢連結。Athena 會在查詢編輯器中開啟查詢。

1. 在查詢編輯器中，選取查詢文字，然後按下 **Ctrl\$1C** 以進行複製。

1. [切換](switching-workgroups.md)至目的地工作群組，或[建立工作群組](creating-workgroups.md)，然後切換至該工作群組。

1. 在查詢編輯器中開啟新索引標籤，然後按下 **Ctrl\$1V** 將文字貼到新索引標籤中。

1. 在查詢編輯器中，選擇 **Save as** (另存為)，將查詢儲存在目的地工作群組中。

1. 在 **Choose a name** (選擇名稱) 對話方塊中，輸入查詢的名稱和選擇性描述。

1. 選擇**儲存**。

# 刪除工作群組
<a name="deleting-workgroups"></a>

如果您有許可刪除工作群組，您可以這樣做。無法刪除主要工作群組。

如有許可，您可以隨時刪除空的工作群組。您也可以刪除包含儲存的查詢的工作群組。在這種情況下，在繼續刪除工作群組之前，Athena 會警告將刪除儲存的查詢。

如果您刪除自己所在的工作群組，主控台將焦點切換到主要工作群組。如果您有它的存取權，則可以執行查詢和檢視其設定。

如果您刪除工作群組，則其設定和每一查詢資料限制控制也會刪除。CloudWatch 中會保留工作群組整體的資料限制控制，您可以視需要刪除它們。

**重要**  
在刪除工作群組之前，請確定其使用者也屬於能夠讓他們繼續執行查詢的其他工作群組。如果使用者的 IAM 政策*僅*允許他們在此工作群組中執行查詢，而且您刪除此工作群組，則他們再也沒有許可來執行查詢。如需詳細資訊，請參閱[Example policy for running queries in the primary workgroup](example-policies-workgroup.md#example4-run-in-primary-access)。

**在主控台刪除工作群組**

1. 在 Athena 主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在 **Workgroups** (工作群組) 頁面上，選取您要刪除的工作群組的按鈕。

1. 選擇 **動作**、**刪除**。

1. 在 **Delete workgroup** (刪除工作群組) 確認提示中，輸入工作群組的名稱，然後選擇 **Delete** (刪除)。

若要使用 API 操作來刪除工作群組，請使用 `DeleteWorkGroup` 動作。

# 使用 CloudWatch 和 EventBridge 來監控查詢和控制成本
<a name="workgroups-control-limits"></a>

工作群組可讓您設定每一查詢或每一工作群組的資料用量控制限制，設定超過這些限制時的警示，以及將查詢指標發布至 CloudWatch。

在每個工作群組中，您可以：
+ 設定每一查詢和每一工作群組的 **Data usage controls (資料用量控制)**，並建立當查詢超出閾值時將採取的動作。
+ 檢視和分析查詢指標，並將其發布至 CloudWatch。如果您在主控台中建立工作群組，則系統會為您選取將指標發布至 CloudWatch 的設定。如果您使用 API 操作，您必須[啟用發布指標](athena-cloudwatch-metrics-enable.md)。發布指標時，其會顯示在 **Workgroups** (工作群組) 面板中的 **Metrics** (指標) 索引標籤。對於主要工作群組，預設會停用指標。

## 影片
<a name="athena-cloudwatch-metrics-video"></a>

下列影片說明如何在 CloudWatch 中建立自訂儀表板，以及設定指標的警示和觸發。您可以直接從 Athena 主控台使用預先填入的儀表板，以使用這些查詢指標。

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


**Topics**
+ [影片](#athena-cloudwatch-metrics-video)
+ [啟用查詢指標](athena-cloudwatch-metrics-enable.md)
+ [使用 CloudWatch 監控查詢指標](query-metrics-viewing.md)
+ [使用 CloudWatch 監控用量指標](monitoring-athena-usage-metrics.md)
+ [使用 EventBridge 監控查詢事件](athena-events.md)
+ [設定資料用量控制](workgroups-setting-control-limits-cloudwatch.md)

# 在 Athena 中啟用 CloudWatch 查詢指標
<a name="athena-cloudwatch-metrics-enable"></a>

當您在主控台中建立工作群組時，系統預設會選取將查詢指標發布至 CloudWatch 的設定。

**若要在 Athena 主控台中啟用或停用工作群組的查詢指標**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 在導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 選擇您想要修改的工作群組連結。

1. 在工作群組的詳細資訊頁面上，選擇 **Edit** (編輯)。

1. 在**設定**區段中，選取或清除將**查詢指標發佈至 AWS CloudWatch**。

如果您使用 API 操作、命令列界面或具有 JDBC 驅動程式的用戶端應用程式來建立工作群組，啟用查詢指標的發布，請在 [WorkGroupConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroupConfiguration.html) 中將 `PublishCloudWatchMetricsEnabled` 設定為 `true`。以下範例只顯示指標組態，而省略其他組態：

```
"WorkGroupConfiguration": { 
      "PublishCloudWatchMetricsEnabled": "true"
     ....
     }
```

# 使用 CloudWatch 監控 Athena 查詢指標
<a name="query-metrics-viewing"></a>

當已選取 [publish query metrics to CloudWatch](athena-cloudwatch-metrics-enable.md) (將查詢指標發布至 CloudWatch) 選項時，Athena 會將查詢相關指標發布至 Amazon CloudWatch。您可以建立自訂儀表板，在 CloudWatch 中設定指標的警示和觸發，或直接從 Athena 主控台使用預先填入的儀表板。

當您為工作群組中的查詢啟用查詢指標時，Athena 主控台中每個工作群組的指標會顯示在 **Workgroups** (工作群組) 面板中的 **Metrics** (指標) 索引標籤中。

Athena 會將以下指標發布至 CloudWatch 主控台：
+ `DPUAllocated` – 在容量保留中佈建的用於執行查詢的 DPU (資料處理單位) 總數。
+ `DPUConsumed` – 在指定的時間，容量保留中處於 `RUNNING` 狀態的查詢主動使用的 DPU 數目。僅當工作群組與容量保留相關聯，並包含與保留關聯的所有工作群組時，才會發出指標。
+ `DPUCount` – 查詢使用的 DPU 數目上限，僅當查詢完成時發布一次。
+ `EngineExecutionTime` – 執行查詢所花費的毫秒數。
+ `ProcessedBytes` – Athena 在每次 DML 查詢所掃描的位元組。
+ `QueryPlanningTime` – Athena 規劃查詢處理流程所花費的毫秒數。
+ `QueryQueueTime` – 查詢在查詢佇列中等待資源的毫秒數。
+ `ServicePreProcessingTime` – 提交查詢至查詢引擎之前，Athena 預先處理查詢所花費的毫秒數。
+ `ServiceProcessingTime` – 查詢引擎完成查詢的執行後，Athena 處理查詢結果所花費的毫秒數。
+ `TotalExecutionTime` – Athena 執行 DDL 或 DML 查詢所花費的毫秒數。

如需更完整的描述，請參閱本文件稍後的 [Athena 的 CloudWatch 指標和維度清單](#athena-cloudwatch-metrics-table)。

這些指標具有下列維度：
+ `CapacityReservation`– 用於執行查詢的容量保留名稱 (如果適用)。
+ `QueryState` – `SUCCEEDED`、`FAILED` 或 `CANCELED`
+ `QueryType` – `DML`、`DDL` 或 `UTILITY`
+ `WorkGroup` – 工作群組的名稱

Athena 會將以下指標發布至 `AmazonAthenaForApacheSpark` 命名空間下的 CloudWatch 主控台：
+ `DPUCount` – 工作階段期間用來執行計算所消耗的 DPU 數目。

該指標具有下列兩個維度：
+ `SessionId` – 要提交計算的工作階段 ID。
+ `WorkGroup` – 工作群組的名稱。

如需詳細資訊，請參閱本主題稍後的[Athena 的 CloudWatch 指標和維度清單](#athena-cloudwatch-metrics-table)。如需有關 Athena 用量指標的資訊，請參閱[使用 CloudWatch 監控 Athena 用量指標](monitoring-athena-usage-metrics.md)。

您可以在 Athena 主控台或 CloudWatch 主控台中檢視查詢指標。

## 在 Athena 主控台中檢視查詢指標
<a name="query-metrics-viewing-athena-console"></a>

**在 Athena 主控台中檢視工作群組的查詢指標**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 在導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 從清單中選擇所需的工作群組，然後選擇 **Metrics** (指標) 索引標籤。

   指標儀表板隨即顯示。
**注意**  
如果您最近剛啟用工作群組的指標，且/或最近沒有任何查詢活動，儀表板上的圖形可能會是空白的狀態。系統會根據您在下一個步驟中指定的間隔，從 CloudWatch 擷取查詢活動。

1. 在 **Metrics** (指標) 區段中，選擇 Athena 應用來從 CloudWatch 擷取查詢指標的指標間隔，或指定自訂間隔。  
![\[指定 Athena 主控台中工作群組的指標擷取間隔。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/wg-custom-interval.png)

1. 若要重新整理顯示的指標，請選擇重新整理圖示。  
![\[選擇重新整理圖示。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/wg-refresh-metrics.png)

1. 按一下重新整理圖示旁的箭頭，以選擇您希望指標顯示的更新頻率。  
![\[選擇 Athena 主控台中工作群組指標顯示的重新整理間隔。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/wg-choose-refresh-interval.png)

## 在 CloudWatch 主控台中檢視查詢指標
<a name="query-metrics-viewing-cw-console"></a>

**若要在 Amazon CloudWatch 主控台中檢視指標**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，選擇 **Metrics** (指標)、**All metrics** (所有指標)。

1. 選取 **AWS/Athena** 命名空間。

## 使用 檢視查詢指標 AWS CLI
<a name="query-metrics-viewing-cli"></a>

**使用 檢視指標 AWS CLI**
+ 執行以下任意一項：
  + 若要列出 Athena 的指標，請開啟命令提示，然後使用下列命令：

    ```
    aws cloudwatch list-metrics --namespace "AWS/Athena"
    ```
  + 若要列出所有可用的指標，請使用以下命令：

    ```
    aws cloudwatch list-metrics"
    ```

## Athena 的 CloudWatch 指標和維度清單
<a name="athena-cloudwatch-metrics-table"></a>

如果您已在 Athena 中啟用 CloudWatch 指標，其會按照工作群組將以下指標傳送到 CloudWatch。下列指標使用 `AWS/Athena` 命名空間。


| 指標名稱 | Description | 
| --- | --- | 
| DPUAllocated |  在容量保留中佈建的用於執行查詢的 DPU (資料處理單位) 總數。  | 
| DPUConsumed | 在給定的時間，保留區中處於 RUNNING 狀態的查詢主動使用的 DPU 數目。僅當工作群組與容量保留相關聯並包含與保留關聯的所有工作群組時，才會發出這個指標。如果您將工作群組從一個保留區移至另一個保留區，則該指標會包含該工作群組屬於第一個保留區時的資料。如需有關容量保留的詳細資訊，請參閱 [管理查詢處理容量](capacity-management.md)。 | 
| DPUCount | 查詢使用的 DPU 數目上限，僅當查詢完成時發布一次。只有附加至容量保留的工作群組才會發出此指標。 | 
| EngineExecutionTime |  查詢執行所花費的毫秒數。  | 
| ProcessedBytes |  Athena 在每次 DML 查詢所掃描的位元組。對於取消的查詢 (無論是由使用者取消，或達到上限時自動取消)，這包括取消前掃描的資料量。DDL 查詢不會報告此指標。  | 
| QueryPlanningTime | Athena 規劃查詢處理流程所花費的毫秒數。這包括從資料來源擷取資料表分割區所花費的時間。請注意，因為查詢引擎會執行查詢規劃，所以查詢規劃時間是 EngineExecutionTime 的子集。 | 
| QueryQueueTime | 查詢在查詢佇列中等待資源的毫秒數。請注意，如果發生暫時性錯誤，查詢可能自動加回到佇列。 | 
| ServicePreProcessingTime | 提交查詢至查詢引擎之前，Athena 預先處理查詢所花費的毫秒數。 | 
| ServiceProcessingTime | 查詢引擎完成查詢的執行後，Athena 處理查詢結果所花費的毫秒數。 | 
| TotalExecutionTime | Athena 執行 DDL 或 DML 查詢所花費的毫秒數。TotalExecutionTime 包括 QueryQueueTime、QueryPlanningTime、EngineExecutionTime 和 ServiceProcessingTime。 | 

Athena 的這些指標具有下列維度。


| 維度 | Description | 
| --- | --- | 
| CapacityReservation |  用於執行查詢的容量保留名稱 (如果適用)。當未使用容量保留時，此維度不會傳回任何資料。  | 
| QueryState |  查詢狀態。 有效的統計資訊：已成功、已失敗、已取消。  | 
| QueryType |  查詢類型。 有效的統計資訊：`DDL`、`DML` 或 `UTILITY`。執行的查詢陳述式類型。`DDL` 表示 DDL (資料定義語言) 查詢陳述式。`DML` 表示 DML (資料處理語言) 查詢陳述式，例如 `CREATE TABLE AS SELECT`。`UTILITY` 表示除 DDL 和 DML 以外的查詢陳述式，例如 `SHOW CREATE TABLE` 或 `DESCRIBE TABLE`。  | 
| WorkGroup |  工作群組的名稱。  | 

# 使用 CloudWatch 監控 Athena 用量指標
<a name="monitoring-athena-usage-metrics"></a>

您可使用 CloudWatch 用量指標，透過在 CloudWatch 圖表和儀表板中顯示目前的服務使用量狀況，瞭解您的帳戶如何使用資源。

對於 Athena，用量可用性指標對應至 Athena AWS 服務 的配額。您可以設定警示，在您的用量接近服務配額時發出警示。如需有關 Athena 服務配額的詳細資訊，請參閱[Service Quotas](service-limits.md)。如需 AWS 用量指標的詳細資訊，請參閱《*Amazon CloudWatch 使用者指南*》中的[AWS 用量指標](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Service-Quota-Integration.html)。

Athena 在 `AWS/Usage` 命名空間中發布下列指標。


|  指標名稱  |  Description  | 
| --- | --- | 
|  `ResourceCount`  |   AWS 區域 每個帳戶所有佇列和執行查詢的總和，依查詢類型 (DML 或 DDL) 分隔。此指標唯一實用的統計資料是「上限」。 此指標每分鐘定期發布一次。如果您沒有執行任何查詢，則指標不會報告任何內容 (甚至不會報告 0)。僅當採用指標時正在執行啟用查詢時，指標才會發布。  | 

下列維度用於強化 Athena 所發布的用量指標。


|  維度  |  Description  | 
| --- | --- | 
|  `Service`  |   AWS 服務 包含資源的 名稱。對 Athena 而言，此維度的數值為 `Athena`。  | 
|  `Resource`  |  正在執行的資源類型。Athena 查詢用量的資源值為 `ActiveQueryCount`。  | 
|  `Type`  |  正在報告的實體類型。目前，Athena 用量指標的唯一有效值為 `Resource`。  | 
|  `Class`  |  正在追蹤的資源類別。對 Athena 而言，`Class` 可以是 `DML` 或 `DDL`。  | 

## 在 CloudWatch 主控台中檢視 Athena 資源用量指標
<a name="monitoring-athena-usage-metrics-cw-console"></a>

您可以使用 CloudWatch 主控台查看 Athena 用量指標圖表，並設定警示在用量接近服務配額時提醒您。

**檢視 Athena 資源用量指標**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，選擇 **Metrics** (指標)、**All metrics** (所有指標)。

1. 選擇**用量**，然後選擇**依據 AWS 資源**。

   服務配額用量指標清單隨即出現。

1. 選取 **Athena** 和 **ActiveQueryCount** 旁的核取方塊。

1. 選擇 **Graphed metrics (圖表化指標)** 標籤。

   上圖顯示資源的目前用量 AWS 。

如需了解如何將服務配額新增至圖表，以及設定警示，讓系統在用量接近服務配額時通知您，請參閱*《Amazon CloudWatch 使用者指南》*中[視覺化您的服務配額和設定警示](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Quotas-Visualize-Alarms.html)。如需設定每個工作群組用量限制的詳細資訊，請參閱 [設定每一查詢和每一工作群組資料用量控制](workgroups-setting-control-limits-cloudwatch.md)。

# 使用 EventBridge 監控 Athena 查詢事件
<a name="athena-events"></a>

您可以搭配使用 Amazon EventBridge 與 Amazon Athena，以接收有關查詢狀態的即時通知。當您提交的查詢轉換狀態時，Athena 會將事件發布至 EventBridge，當中包含該查詢狀態轉換的相關資訊。您可以針對感興趣的事件撰寫簡單的規則，並在事件符合規則時採取自動化動作。例如，您可以建立規則，在查詢達到終端狀態時叫用 AWS Lambda 函數。盡可能發出事件。

在您為 Athena 建立事件規則之前，請執行下列動作：
+ 熟悉 Eventbridge 中的事件、規則和目標。如需詳細資訊，請參閱[什麼是 Amazon EventBridge？](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 如需有關如何設定規則的詳細資訊，請參閱 [Amazon EventBridge 入門](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html)。
+ 建立要在事件規則中使用的一或多個目標。

**注意**  
Athena 目前提供一種事件類型 (Athena 查詢狀態變更)，但可能會新增其他事件類型和詳細資訊。如果您是透過程式設計方式將事件 JSON 資料還原序列化，請確定您的應用程式在新增這些額外屬性時已準備好處理不明屬性。

## Athena 事件格式
<a name="athena-events-pattern"></a>

以下是 Amazon Athena 事件的基本模式。

```
{
    "source":[
        "aws.athena"
    ],
    "detail-type":[
        "Athena Query State Change"
    ],
    "detail":{
        "currentState":[
            "SUCCEEDED"
        ]
    }
}
```

## Athena 查詢狀態變更事件
<a name="athena-events-athena-query-state-change"></a>

下列範例會顯示 `currentState` 值為 `SUCCEEDED` 的 Athena 狀態變更事件。

```
{
    "version":"0",
    "id":"abcdef00-1234-5678-9abc-def012345678",
    "detail-type":"Athena Query State Change",
    "source":"aws.athena",
    "account":"123456789012",
    "time":"2019-10-06T09:30:10Z",
    "region":"us-east-1",
    "resources":[

    ],
    "detail":{
        "versionId":"0",
        "currentState":"SUCCEEDED",
        "previousState":"RUNNING",
        "statementType":"DDL",
        "queryExecutionId":"01234567-0123-0123-0123-012345678901",
        "workgroupName":"primary",
        "sequenceNumber":"3"
    }
}
```

下列範例會顯示 `currentState` 值為 `FAILED` 的 Athena 狀態變更事件。只有在 `currentState` 為 `FAILED` 時，才會顯示 `athenaError` 區塊。如需有關 `errorCategory` 和 `errorType` 值的詳細資訊，請參閱 [Athena 錯誤目錄](error-reference.md)。

```
{
    "version":"0",
    "id":"abcdef00-1234-5678-9abc-def012345678",
    "detail-type":"Athena Query State Change",
    "source":"aws.athena",
    "account":"123456789012",
    "time":"2019-10-06T09:30:10Z",
    "region":"us-east-1",
    "resources":[ 
    ],
    "detail":{
        "athenaError": {
            "errorCategory": 2.0, //Value depends on nature of exception
            "errorType": 1306.0, //Type depends on nature of exception
            "errorMessage": "Amazon S3 bucket not found", //Message depends on nature of exception
            "retryable":false //Retryable value depends on nature of exception
        },
        "versionId":"0",
        "currentState": "FAILED",
        "previousState": "RUNNING",
        "statementType":"DML",
        "queryExecutionId":"01234567-0123-0123-0123-012345678901",
        "workgroupName":"primary",
        "sequenceNumber":"3"
    }
}
```

### 輸出屬性
<a name="athena-events-query-state-change-output-properties"></a>

JSON 輸出包含以下屬性。


****  

| 屬性 | Description | 
| --- | --- | 
| athenaError | 只有在 currentState 為 FAILED 時才會顯示。包含發生之錯誤的相關資訊，包括錯誤類別、錯誤類型、錯誤訊息，以及是否可以重試導致錯誤的動作。每個欄位的值視錯誤性質而定。如需有關 errorCategory 和 errorType 值的詳細資訊，請參閱 [Athena 錯誤目錄](error-reference.md)。 | 
| versionId | 詳細資訊物件之結構描述的版本號碼。 | 
| currentState | 在事件發生時查詢所轉換成的狀態。 | 
| previousState | 在事件發生時查詢從其轉換的狀態。 | 
| statementType | 執行的查詢陳述式類型。 | 
| queryExecutionId | 查詢執行的唯一識別碼。 | 
| workgroupName | 執行查詢的工作群組名稱。 | 
| sequenceNumber | 單調遞增的數字，允許刪除重複和排序涉及所執行單一查詢的傳入事件。當針對相同的狀態轉換發布重複事件時，sequenceNumber 值是相同的。當查詢經歷一次以上的狀態轉換時 (例如遇到鮮少列入佇列的查詢)，您可以使用 sequenceNumber 來排序 currentState 和 previousState 值相同的事件。 | 

## 範例
<a name="athena-events-examples"></a>

下列範例會將事件發布至您已訂閱的 Amazon SNS 主題。查詢 Athena 時，您會收到一封電子郵件。該範例假設 Amazon SNS 主題存在且您已訂閱該主題。

**若要將 Athena 事件發布至 Amazon SNS 主題**

1. 建立 Amazon SNS 主題的目標。授予 EventBridge 事件服務主體發布至 Amazon SNS 主題的 `events.amazonaws.com` 許可，如下列範例所示。

   ```
   {
       "Effect":"Allow",
       "Principal":{
           "Service":"events.amazonaws.com"
       },
       "Action":"sns:Publish",
       "Resource":"arn:aws:sns:us-east-1:111111111111:your-sns-topic"
   }
   ```

1. 使用 AWS CLI `events put-rule`命令來建立 Athena 事件的規則，如下列範例所示。

   ```
   aws events put-rule --name {ruleName} --event-pattern '{"source": ["aws.athena"]}'
   ```

1. 使用 AWS CLI `events put-targets`命令將 Amazon SNS 主題目標連接至規則，如下列範例所示。

   ```
   aws events put-targets --rule {ruleName} --targets Id=1,Arn=arn:aws:sns:us-east-1:111111111111:your-sns-topic
   ```

1. 查詢 Athena 並觀察被叫用的目標。您應該會收到來自該 Amazon SNS 主題的相應電子郵件。

## AWS 使用者通知 搭配 Amazon Athena 使用
<a name="monitoring-user-notifications"></a>

您可使用 [AWS 使用者通知](https://docs.aws.amazon.com/notifications/latest/userguide/what-is.html) 來設定交付管道，以取得有關 Amazon Athena 事件的通知。當事件符合您指定的規則時，便會收到通知。您可以透過多個管道接收事件通知，包括電子郵件、[聊天應用程式中的 Amazon Q Developer](https://docs.aws.amazon.com/chatbot/latest/adminguide/what-is.html) 聊天通知或 [AWS Console Mobile Application](https://docs.aws.amazon.com/consolemobileapp/latest/userguide/what-is-consolemobileapp.html) 推送通知。您也可以在[主控台通知中心](https://console.aws.amazon.com/notifications/)查看通知。 使用者通知 支援彙總，這可以減少您在特定事件期間收到的通知數量。

如需詳細資訊，請參閱[「*AWS 使用者通知 使用者指南」*](https://docs.aws.amazon.com/notifications/latest/userguide/what-is.html)。

# 設定每一查詢和每一工作群組資料用量控制
<a name="workgroups-setting-control-limits-cloudwatch"></a>

 Athena 可讓您設定兩種類型的成本控制：每一查詢限制和每一工作群組限制。對於每個工作群組，您只能設定一個每一查詢限制和多個每一工作群組限制。
+ **每一查詢控制限制**指定每次查詢所掃描的資料總量。如果工作群組中執行的任何查詢超過此限制，則會取消。您在工作群組中只能建立一個每一查詢控制限制，它會套用到其中執行的每個查詢。如果您需要變更限制，請編輯限制。如需詳細步驟，請參閱[建立每一查詢資料用量控制](#configure-control-limit-per-query)。
+ **工作群組整體資料用量控制限制**指定在指定期間內針對此工作群組中執行的所有查詢所掃描的資料總量。您可以為每一工作群組建立多個限制。工作群組整體查詢限制可讓您針對工作群組中執行的查詢所掃描的資料，在每小時或每日彙總上設定多個閾值。

  如果掃描的資料總量超過閾值，您可以將通知推送至 Amazon SNS 主題。若要這麼做，請在 Athena 主控台中設定 Amazon SNS 警示和動作，以便在超過限制時通知管理員。如需詳細步驟，請參閱[建立每一工作群組資料用量控制](#configure-control-limit-per-workgroup)。對於 Athena 從 CloudWatch 主控台發布的任何指標，您也可以建立警示和動作。例如，您可以對失敗的查詢次數設定提醒。如果次數超過特定閾值，這個提醒可以觸發將電子郵件寄給管理員。如果超過限制，將會有動作將 Amazon SNS 警示通知傳送給指定的使用者。

  您可以採取的其他動作：
  + 調用 Lambda 函數。如需詳細資訊，請參閱《Amazon Simple Notification Service 開發人員指南》**中的[使用 Amazon SNS 通知叫用 Lambda 函數](https://docs.aws.amazon.com/sns/latest/dg/sns-lambda-as-subscriber.html)。
  + 停用工作群組，以停止執行任何進一步的查詢。如需這些步驟，請參閱 [啟用或停用工作群組](workgroups-enabled-disabled.md)。

每一查詢限制和每一工作群組限制彼此獨立。每當超過任一限制時就會採取指定的動作。如果兩個或更多使用者在同一個工作群組中同時執行查詢，則可能每個查詢都不超過任何指定的限制，但掃描的資料總數超過每一工作群組的資料用量限制。在這種情況下，Amazon SNS 警示會傳送給使用者。

## 建立每一查詢資料用量控制
<a name="create-a-per-query-data-usage-control"></a><a name="configure-control-limit-per-query"></a>

**建立每一查詢資料用量控制**

每一查詢控制限制指定每次查詢所掃描的資料總量。如果工作群組中執行的任何查詢超過此限制，則會取消。已取消的查詢會按照 [Amazon Athena 定價](https://aws.amazon.com/athena/pricing/)計費。
**注意**  
如果是已取消或失敗的查詢，Athena 可能已將局部結果寫入 Amazon S3。在這種情況下，Athena 不會從存放結果的 Amazon S3 字首中刪除這些局部結果。您必須移除含有局部結果的 Amazon S3 字首。Athena 使用 Amazon S3 分段上傳，將資料寫入 Amazon S3。我們建議您設定儲存貯體生命週期政策，指定當查詢失敗時結束分段上傳。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[使用儲存貯體生命週期政策中止未完成的分段上傳](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config)。
在某些情況下，Athena 可能會自動重試查詢執行。在大多數情況下，這些查詢能夠成功完成，且查詢 ID 會標記為 `Completed`。這些查詢可能在初始嘗試期間已寫入部分結果，並可能產生未完成的分段上傳。

您在工作群組中只能建立一個每一查詢控制限制，它會套用到其中執行的每個查詢。如果您需要變更限制，請編輯限制。

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 從清單中選擇工作群組名稱。

1. 在**執行控制項**索引標籤上，選擇**編輯控制項**。

1. 編輯**資料掃描限制**的值。
   + 指定介於 10 MB （最小值） 和 7 EB （最大值） 之間的值。
   + 從下拉式清單中選取單位值 （例如 **Kilobytes KB** 或 **Exabytes EB**)。
**注意**  
預設動作是在查詢超過限制時取消查詢。此設定無法變更。

1. 選擇**儲存**以立即套用您的變更。

## 建立或編輯每一工作群組資料用量提醒
<a name="create-a-per-workgroup-data-usage-alert"></a><a name="configure-control-limit-per-workgroup"></a>

**建立或編輯每一工作群組資料用量提醒**

當工作群組中執行的查詢在特定時段內掃描指定數量的資料時，您可以設定多個提醒閾值。提醒會透過 Amazon CloudWatch 警示實作，並套用於工作群組中的所有查詢。達到閾值後，您可以讓 Amazon SNS 向您指定的使用者傳送電子郵件。達到閾值時，查詢作業不會自動取消。

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。

1. 在導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 從清單中選擇工作群組名稱。

1. 選擇 **Edit** (編輯) 以編輯工作群組的設定。

1. 向下捲動到並展開 **Workgroup data usage alerts - optional** (工作群組資料用量提醒 - 選用)。

1. 選擇 **Add alert** (新增提醒)。

1. 針對 **Data usage threshold configuration** (資料用量閾值組態)，指定值，如下所示：
   + 針對 **Data threshold** (資料閾值)，指定數字，然後從下拉式清單中選取單位值。
   + 對於 **Time period** (期間)，請從下拉式清單中選擇期間。
   + 針對 **SNS topic selection** (SNS 主題選擇)，請從下拉式清單中選擇 Amazon SNS 主題。或者，選擇 **Create SNS topic** (建立 SNS 主題)，直接前往 [Amazon SNS 主控台](https://console.aws.amazon.com/sns/v2/home)，建立 Amazon SNS 主題，並為 Athena 帳戶中的其中一個使用者設定主題訂閱。如需詳細資訊，請參閱《Amazon Simple Notification Service 開發人員指南》**中的 [Amazon SNS 入門](https://docs.aws.amazon.com/sns/latest/dg/sns-getting-started.html)。

1. 如果您正在建立新提醒，請選擇 **Add alert** (新增提醒)，或選擇 **Save** (儲存) 來儲存現有提醒。

# 使用 Athena 工作群組 API
<a name="workgroups-api-list"></a>

以下是一些用於 Athena 工作群組的 REST API 操作。在以下所有操作中 (`ListWorkGroups` 除外)，您必須指定工作群組。在其他操作中，例如 `StartQueryExecution`，工作群組參數是選擇性，此處未列出這些操作。如需操作的完整清單，請參閱 [Amazon Athena API 參考](https://docs.aws.amazon.com/athena/latest/APIReference/)。
+  [CreateWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateWorkGroup.html) 
+  [DeleteWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_DeleteWorkGroup.html) 
+  [GetWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetWorkGroup.html) 
+  [ListWorkGroups](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListWorkGroups.html) 
+  [UpdateWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_UpdateWorkGroup.html) 



# 對工作群組錯誤進行疑難排解
<a name="workgroups-troubleshooting"></a>

使用以下秘訣進行工作群組疑難排解。
+ 檢查您的帳戶中個別使用者的許可。他們必須有權存取查詢結果的位置，以及您們想要在其中執行查詢的工作群組。如果他們想要切換工作群組，則還需要有這兩個工作群組的許可。如需相關資訊，請參閱[使用 IAM 政策來控制工作群組存取](workgroups-iam-policy.md)。
+ 請注意 Athena 主控台中的內容，了解您將在哪個工作群組中執行查詢。如果您使用驅動程式，請務必設定為您需要的工作群組。如需相關資訊，請參閱[指定查詢的工作群組](specify-wkgroup-to-athena-in-which-to-run-queries.md)。
+ 如果您使用 API 或驅動程式來執行查詢，您必須使用其中一種方式指定查詢結果位置：對於個別的查詢，使用 [OutputLocation](https://docs.aws.amazon.com/athena/latest/APIReference/API_ResultConfiguration.html#athena-Type-ResultConfiguration-OutputLocation) (用戶端)。在工作群組中，使用 [WorkGroupConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroupConfiguration.html)。如果未以任何方式指定位置，Athena 會在查詢執行期時發出錯誤。
+ 如果您以工作群組設定覆寫用戶端設定，您可能會遇到查詢結果位置方面的錯誤。例如，工作群組的使用者可能沒有許可，無法在 Amazon S3 中的工作群組位置存放查詢結果。在這種情況下，請新增必要的許可。
+ 工作群組會對 API 操作的行為造成改變。您帳戶中的使用者在 IAM 中，對工作群組需要有以資源為基礎的許可，才能在這些工作群組中呼叫以下現有的 API 操作。如果沒有工作群組和工作群組動作的許可，下列 API 動作會擲出 `AccessDeniedException`：**CreateNamedQuery**、**DeleteNamedQuery**、**GetNamedQuery**、**ListNamedQueries**、**StartQueryExecution**、**StopQueryExecution**、**ListQueryExecutions**、**GetQueryExecution**、**GetQueryResults** 和 **GetQueryResultsStream** (此 API 動作只適用於驅動器，不公開為公有使用)。如需詳細資訊，請參閱《服務授權參考》**中的 [Amazon Athena 的動作、資源和條件索引鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html)。

  只有針對在使用者可存取的工作群組中執行的查詢，呼叫 **BatchGetQueryExecution** 和 **BatchGetNamedQuery** API 操作才會傳回查詢的相關資訊。如果使用者無法存取此工作群組，這些 API 操作會在未處理的 ID 清單中傳回未經授權的查詢 ID。如需詳細資訊，請參閱[使用 Athena 工作群組 API](workgroups-api-list.md)。
+ 如果執行查詢的工作群組已設定有[強制的查詢結果位置](workgroups-settings-override.md)，請勿為 CTAS 查詢指定 `external_location`。在這種情況下，Athena 會發出錯誤，且指定 `external_location` 的查詢會失敗。例如，如果您覆寫用戶端的查詢結果位置設定，而強制工作群組使用其自己的位置，此查詢會失敗：`CREATE TABLE <DB>.<TABLE1> WITH (format='Parquet', external_location='s3://amzn-s3-demo-bucket/test/') AS SELECT * FROM <DB>.<TABLE2> LIMIT 10;`

您可能會看到下列錯誤。下表列出工作群組的一些相關錯誤和建議的解決方案。


**工作群組錯誤**  

| 錯誤 | 發生時情況... | 
| --- | --- | 
|  查詢狀態為 CANCELED (已取消)。超出掃描的位元組限制。 | 查詢達到每一查詢資料限制，並且被取消。請考慮重寫查詢，以讀取較少的資料，或聯絡您的帳戶管理員。 | 
|  使用者 arn:aws:iam::123456789012:user/abc 無權對資源 arn:aws:athena:us-east-1:123456789012:workgroup/workgroupname 執行 athena:StartQueryExecution  | 使用者在工作群組中執行查詢，但沒有它的存取權。更新您的政策以提供此工作群組的存取權。 | 
|  INVALID\$1INPUT。工作群組 <name> 已停用。 | 使用者在工作群組中執行查詢，但此工作群組已停用。管理員可能停用您的工作群組。也可能是您沒有它的存取權。在這兩種情況下，請聯絡有權修改工作群組的管理員。 | 
|  INVALID\$1INPUT。找不到工作群組 <name>。 | 使用者在工作群組中執行查詢，但此工作群組不存在。如果已刪除工作群組，則可能發生此情況。切換到另一個工作群組來執行您的查詢。 | 
|  InvalidRequestException：呼叫 StartQueryExecution 操作時：未提供輸出位置。需要透過工作群組結果組態設定或作為 API 輸入來提供輸出位置。 |  使用者以 API 執行查詢，但未指定查詢結果的位置。您必須使用兩種方式之一來設定查詢結果的輸出位置：對於個別的查詢，使用 [OutputLocation](https://docs.aws.amazon.com/athena/latest/APIReference/API_ResultConfiguration.html#athena-Type-ResultConfiguration-OutputLocation) (用戶端)，或在工作群組中，使用 [WorkGroupConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroupConfiguration.html)。  | 
|   Create Table As Select 查詢失敗，因為該查詢已使用 'external\$1location' 屬性提交至 Athena 工作群組，而該工作群組會針對所有查詢強制執行集中輸出位置。請移除 'external\$1location' 屬性，然後重新提交查詢。  | 如果執行查詢的工作群組已設定[強制的查詢結果位置](workgroups-settings-override.md)，而且您為 CTAS 查詢指定 external\$1location。在這種情況下，請移除 external\$1location 並重新執行查詢。 | 
| 無法建立預備陳述式 prepared\$1statement\$1name。此工作群組中的預備陳述式數目超過 1000 的上限。 | 工作群組包含的預備陳述式超過 1000 的上限。若要解決此問題，請使用 [DEALLOCATE PREPARE](sql-deallocate-prepare.md) 以從工作群組中移除一或多個預備陳述式。或者，建立新的工作群組。 | 

# 管理查詢處理容量
<a name="capacity-management"></a>

您可以使用容量保留，為您在 Athena 中執行的查詢取得專用無伺服器處理容量。透過容量保留，您可以利用工作負載管理功能，協助您排定優先順序、控制和擴展最重要的工作負載。例如，您可以新增容量來控制可同時執行的查詢數量、選擇可使用容量的工作負載，以及在工作負載之間共用容量。容量是無伺服器且由 Athena 完全管理，只要您需要，就會為您保留。設定非常簡單，不需要變更 SQL 查詢。

若要取得查詢的處理能力，您可建立容量保留、指定所需的資料處理單位 (DPU) 數目，然後將一或多個工作群組指派給保留。

當您使用容量保留時，工作群組扮演著重要角色。工作群組可讓您將查詢組織成邏輯分組或使用案例。透過容量保留，您可以選擇性地將容量指派給工作群組，以便控制每個工作群組的查詢行為方式以及計費方式。如需有關工作群組的詳細資訊，請參閱 [使用工作群組來控制查詢存取和成本](workgroups-manage-queries-control-costs.md)。

將工作群組指派給容量保留可讓您優先處理這些查詢，因為它們會在預留容量上執行，且不計入您的 DDL 和 DML 查詢配額。例如，您可以將容量分配給用於時間敏感財務報告查詢的工作群組，以將這些查詢與其他工作群組中較不重要的查詢隔離。這可讓您預測關鍵工作負載的查詢執行，同時允許其他工作負載獨立執行。

您可以結合使用容量保留和工作群組，以滿足不同的需求。以下為一些範例案例：
+ **隔離重要的查詢** – 為了確保重要的工作負載具有所需的容量，請建立容量保留，並將其工作群組指派給保留。只有來自指派工作群組的查詢會使用保留的處理容量。例如，為了確保可靠執行支援生產應用程式的查詢，請將這些查詢的生產工作群組指派給容量保留。開發查詢時，請使用與保留無關的個別工作群組，並在就緒時將查詢移至生產工作群組。
+ **在類似的工作負載之間共用容量** – 多個工作負載可以從一個保留中共用容量。這可讓您實現這些工作負載的可預測成本，並控制其並行。例如，如果您的排程工作負載可容忍延遲的查詢執行開始時間，您可以將其工作群組指派給單一保留。這樣可以釋放 DDL 和 DML 查詢配額，以便在相同帳戶中執行的互動式查詢，確保這些查詢以最少的延遲開始。

## 了解 DPU
<a name="capacity-management-understanding-dpus"></a>

容量是以資料處理單位 (DPU) 為單位測量而得。DPUs代表 Athena 用來代表您存取和處理資料的無伺服器運算和記憶體資源。一個 DPU 通常提供 4 個 vCPUs和 16 GB 的記憶體。您持有DPUs 數量會影響您可以同時執行的查詢數量。例如，具有 256 個 DPU 的保留所支援的並行查詢數量大約是具有 128 個 DPU 的保留的兩倍。

如需有關估算容量需求的資訊，請參閱 [判斷容量需求](capacity-management-requirements.md)。如需定價資訊，請參閱 [Amazon Athena 定價](https://aws.amazon.com/athena/pricing/)。

## 考量和限制
<a name="capacity-management-considerations-limitations"></a>
+ 您可以根據掃描的資料，在同一帳戶中同時使用容量保留和每個查詢計費。
+ 在容量保留上執行的查詢不會計入您的 DDL 和 DML 查詢配額。
+ 如果您的容量忙於處理其他查詢，新提交的查詢會排入佇列，直到容量可用為止。佇列中允許的時間上限為 10 小時。
+ 一個工作群組一次可以指派給一個容量保留。您總共可以將 20 個工作群組指派給單一保留。當您將多個工作群組指派給保留時，容量會跨工作群組共用，並根據其提交順序配置給查詢。由於 Athena 如何動態分配容量給查詢，執行順序可能會有所不同。
+ Athena 會根據 DML 查詢的複雜性，自動將 4 到 124 DPUs 配置給 DML 查詢。DDL 查詢各使用 4 DPUs。如需詳細資訊，請參閱下列主題：
  + [判斷容量需求](capacity-management-requirements.md)
  + [控制容量用量](capacity-management-control-capacity-usage.md)
+ 每個容量保留所需的 DPUs 數目下限為 4。如需定價資訊，請參閱 [Amazon Athena 定價](https://aws.amazon.com/athena/pricing/)。
+ 您可建立多達 100 個容量保留，每個帳戶和區域可建立多達 1,000 個 DPU 總數目上限。如果您的使用案例需要 1,000 個以上的 DPU，請聯絡 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com?subject=Athena Provisioned Capacity DPU Limit Request)。
+ 無法保證容量請求，且可能需要 30 分鐘才能完成。容量無法轉移至另一個容量保留 AWS 帳戶，或 AWS 區域。
+ `DPUConsumed` CloudWatch 指標是以工作群組為單位，而非保留區為單位。因此，如果您將工作群組從一個保留區移至另一個保留區，則 `DPUConsumed` 指標會包含該工作群組屬於第一個保留區時的資料。如需有關使用 Athena 中的 CloudWatch 指標的詳細資訊，請參閱 [使用 CloudWatch 監控 Athena 查詢指標](query-metrics-viewing.md)。
+ 若要刪除已指派給保留的工作群組，請先從保留中移除該工作群組。
+ 不支援設定為使用 Apache Spark 的工作群組。
+ 容量保留不適用於下列商業 AWS 區域：
  + 以色列 (特拉維夫)
  + 中東 (阿拉伯聯合大公國)
  + Middle East (Bahrain)
  + 亞太區域 (紐西蘭)

**Topics**
+ [了解 DPU](#capacity-management-understanding-dpus)
+ [考量和限制](#capacity-management-considerations-limitations)
+ [判斷容量需求](capacity-management-requirements.md)
+ [建立容量保留](capacity-management-creating-capacity-reservations.md)
+ [控制容量用量](capacity-management-control-capacity-usage.md)
+ [自動調整容量](capacity-management-automatically-adjust-capacity.md)
+ [管理保留](capacity-management-managing-reservations.md)
+ [容量保留的 IAM 政策](capacity-reservations-iam-policy.md)
+ [Athena 容量保留 API](capacity-management-api-list.md)

# 判斷容量需求
<a name="capacity-management-requirements"></a>

建立容量保留之前，您可以預估所需的容量，以便為其指派正確的 DPU 數目。而且，在使用保留後，您可能需要檢查保留的容量是不足還是過多。本主題說明可用來進行這些預估的技術，也說明評估用量和成本的一些 AWS 工具。

**Topics**
+ [預估所需的容量](#capacity-management-requirements-estimating)
+ [需要更多容量的跡象](#capacity-management-requirements-insufficient-capacity)
+ [檢查閒置容量](#capacity-management-requirements-idle-capacity)
+ [監控 DPU 使用量](#capacity-management-requirements-monitoring-dpu-consumption)

## 預估所需的容量
<a name="capacity-management-requirements-estimating"></a>

預估容量需求時，考慮兩個觀點非常有用：特定查詢可能需要多少容量，以及一般需要多少容量。

### 預估每個查詢的容量需求
<a name="capacity-management-requirements-estimating-query"></a>

若要判斷查詢可能需要的 DPU 數目，您可以使用下列指導方針：
+ DDL 查詢會消耗 4 個 GPU。
+ DML 查詢會消耗 4 到 124 個 GPU。

Athena 可判斷提交查詢時 DML 查詢所需的 DPU 數目。數目會根據資料大小、儲存格式、查詢建構和其他因素而異。一般而言，Athena 會嘗試選取最低、最有效率的 DPU 數目。如果 Athena 判斷需要更多的運算能力才能順利完成查詢，則會增加指派給查詢的 DPU 數目。

### 預估工作負載特定容量需求
<a name="capacity-management-requirements-estimating-workload"></a>

若要判斷同時執行多個查詢時可能需要多少容量，請考慮下列資料表中的一般指導方針：


****  

| 並行查詢 | 所需的 DPU | 
| --- | --- | 
| 10 | 40 或以上 | 
| 20 | 96 或以上 | 
| 30 或以上 | 240 或以上 | 

請注意，您實際需要的 DPU 數目取決於您的目標和分析模式。例如，如果您想要立即開始查詢而不排入佇列，請判斷尖峰並行查詢需求，然後相應地佈建 DPU 數目。

您可以佈建比尖峰需求更少的 DPU，但在發生尖峰需求時可能會導致佇列。進行佇列時，Athena 會將您的查詢保存在佇列中，並在容量可用時執行查詢。

如果您的目標是在固定預算內執行查詢，您可以使用 [AWS Pricing Calculator](https://calculator.aws/#/addService/Athena) 來判斷適合您預算的 DPU 數目。

最後請記住，資料大小、儲存格式和查詢的寫入方式會影響查詢所需的 DPU。若要提高查詢效能，您可以壓縮或分割資料，或將其轉換為單欄式格式。如需詳細資訊，請參閱[最佳化 Athena 效能](performance-tuning.md)。

## 需要更多容量的跡象
<a name="capacity-management-requirements-insufficient-capacity"></a>

容量不足錯誤訊息和查詢佇列是指派容量不足的兩個指示。

如果您的查詢失敗並顯示容量不足錯誤訊息，則容量保留的 DPU 數目太低，無法滿足您的查詢要求。例如，如果您的保留具有 24 個 DPU，且執行的查詢需要 24 個以上的 DPU，則查詢將失敗。若要監控此查詢錯誤，您可以使用 Athena 的 [EventBridge 事件](athena-events.md)。嘗試新增更多 DPU，然後重新執行查詢。

如果有許多查詢排入佇列，則表示您的容量已被其他查詢充分利用。若要減少佇列，請執行下列任意一項：
+ 將 DPU 新增至您的保留，以提高查詢並行性。
+ 從保留中移除工作群組，以釋放容量供其他查詢使用。

若要檢查是否有過多的查詢佇列，請針對容量保留中的工作群組使用 Athena 查詢佇列時間 [CloudWatch 指標](query-metrics-viewing.md)。如果該值超過您偏好的閾值，您可以將 DPU 新增至容量保留。

## 檢查閒置容量
<a name="capacity-management-requirements-idle-capacity"></a>

若要檢查閒置容量，您可以減少保留中的 DPU 數目或增加其工作負載，然後觀察結果。

**若要檢查閒置容量**

1. 執行以下任意一項：
   + 減少保留中的 DPU 數目 (減少可用資源)
   + 將工作群組新增至您的保留 (增加工作負載)

1. 使用 [CloudWatch](query-metrics-viewing.md) 來測量查詢佇列時間。

1. 如果佇列時間增加超過理想水平，請執行下列任意一項
   + 移除工作群組
   + 將 DPU 新增至您的容量保留

1. 每次變更之後，請檢查效能和查詢佇列時間。

1. 繼續調整工作負載及/或 DPU 計數，以達到所需的平衡。

如果您不想將容量維持在偏好期間以外，您可以[取消](capacity-management-cancelling-a-capacity-reservation.md)保留並稍後建立另一個保留。但是，即使您最近取消了其他保留的容量，也無法保證請求新容量，而且建立新的保留需要一些時間。

## 監控 DPU 使用量
<a name="capacity-management-requirements-monitoring-dpu-consumption"></a>

查詢執行後，您可以檢視查詢使用的 DPU，以協助精簡容量預估。Athena 透過主控台、API 操作和 CloudWatch 提供 DPU 耗用指標。此資訊可協助您識別耗用比預期更多或更少資源的查詢，並根據實際資料最佳化容量配置。如需檢視和追蹤 DPU 使用量的詳細資訊，請參閱 [監控 DPU 用量](capacity-management-control-capacity-usage.md#capacity-management-monitor-dpu-usage)。

## 評估容量需求和成本的工具
<a name="capacity-management-requirements-tools"></a>

您可以在 中使用下列服務和功能 AWS 來測量您的 Athena 用量和成本。

### CloudWatch 指標
<a name="capacity-management-requirements-tools-cloudwatch-metrics"></a>

您可以將 Athena 設定為在工作群組層級將查詢相關指標發佈到 Amazon CloudWatch。為工作群組啟用指標後，工作群組查詢的指標會顯示在工作群組詳細資訊頁面的 Athena 主控台中。

如需有關發佈至 CloudWatch 的 Athena 指標及其維度的資訊，請參閱 [使用 CloudWatch 監控 Athena 查詢指標](query-metrics-viewing.md)。

### CloudWatch 用量指標
<a name="capacity-management-requirements-tools-cloudwatch-usage-metrics"></a>

您可使用 CloudWatch 用量指標，透過在 CloudWatch 圖表和儀表板中顯示目前的服務使用量狀況，瞭解您的帳戶如何使用資源。對於 Athena，用量可用性指標對應至 Athena AWS [的服務配額](service-limits.md)。您可以設定警示，在您的用量接近服務配額時發出警示。

如需詳細資訊，請參閱[使用 CloudWatch 監控 Athena 用量指標](monitoring-athena-usage-metrics.md)。

### Amazon EventBridge 事件
<a name="capacity-management-requirements-tools-eventbridge-events"></a>

您可以搭配使用 Amazon EventBridge 與 Amazon Athena，以接收有關查詢狀態的即時通知。當您提交的查詢變更狀態時，Athena 會將事件發布至 EventBridge，當中包含該查詢狀態轉換的相關資訊。您可以針對感興趣的事件撰寫簡單的規則，並在事件符合規則時採取自動化動作。

如需詳細資訊，請參閱下列資源。
+ [使用 EventBridge 監控 Athena 查詢事件](athena-events.md)
+ [什麼是 Amazon EventBridge？](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)
+ [Amazon EventBridge 事件](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events.html) 

### Tags (標籤)
<a name="capacity-management-requirements-tools-tags"></a>

在 Athena 中，容量保留支援標籤。一個標籤均包含一个索引鍵和一個值。若要在 Athena 中追蹤您的成本，您可以使用 AWS產生的成本分配標籤。 AWS 會使用成本分配標籤來整理成本[和用量報告中](https://docs.aws.amazon.com/cur/latest/userguide/what-is-cur.html)的資源成本。這可讓您更輕鬆地分類和追蹤 AWS 成本。若要啟用 Athena 的成本分配標籤，請使用 [AWS 帳單與成本管理 主控台](https://console.aws.amazon.com/billing/)。

如需詳細資訊，請參閱下列資源。
+ [標記 Athena 資源](tags.md)
+ [啟用 AWS產生的成本分配標籤](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/activate-built-in-tags.html)
+ [使用  AWS 成本分配標籤](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html)

# 建立容量保留
<a name="capacity-management-creating-capacity-reservations"></a>

若要開始使用，您可建立具有所需 DPU 數目的容量保留，然後指派一或多個工作群組，以使用該容量進行查詢。您可以稍後視需要調整容量，以提供更一致的效能或更好地管理成本。如需有關估算容量需求的資訊，請參閱 [判斷容量需求](capacity-management-requirements.md)。

**重要**  
無法保證容量請求，且可能需要 30 分鐘才能完成。

**若要建立容量保留**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。

1. 選擇**管理**、**容量保留**。

1. 選擇**建立容量保留**。

1. 在**建立容量保留**頁面上，對於**容量保留名稱**，輸入名稱。名稱必須是唯一的，長度介於 1 至 128 個字元之間，且只能使用字元 a-z、A-Z、0-9、\$1(底線)、.(句點) 和 -(連字號)。建立保留後，便無法變更名稱。

1. 對於 **DPU**，選擇或輸入所需的資料處理單位 (DPU) 數目，增量為 4。如需詳細資訊，請參閱[了解 DPU](capacity-management.md#capacity-management-understanding-dpus)。

1. (選用) 展開**標籤**選項，然後選擇**新增標籤**，以新增一或多個鍵值組，進而與容量保留資源建立關聯。如需詳細資訊，請參閱[標記 Athena 資源](tags.md)。

1. 選擇**檢閱**。

1. 在**確認建立容量保留**提示中，確認 DPUs數量 AWS 區域和其他資訊。如果您接受，請選擇**提交**。

   在詳細資訊頁面上，容量保留的**狀態**會顯示為**待定**。當您的預留容量可用於執行查詢時，其狀態會顯示為**作用中**。

此時，您可在保留中新增一或多個工作群組。如需這些步驟，請參閱 [將工作群組新增至保留](capacity-management-adding-workgroups-to-a-reservation.md)。

# 控制容量用量
<a name="capacity-management-control-capacity-usage"></a>

您可以設定最大或最小 DPU 控制項，以控制 Athena 配置給查詢的 DPU 數量。您可以在工作群組層級設定這些項目，以為所有查詢建立基準控制，或在個別查詢層級建立精細控制。這可讓您直接控制查詢效能、工作負載並行和成本。
+ 當您設定最大數量的 DPU 時，會防止查詢消耗超過您指定的容量。這可讓您輕鬆地控制成本和工作負載並行。例如，如果您的容量保留有 200 個 DPU，將每個查詢的 DPU 上限設定為 8 可讓您同時執行 25 個查詢。如果您將保留增加到 400 個 DPU，您可以同時執行 50 個查詢。
+ 當您設定最低數量的 DPU 時，您可以確保使用所需的最低數量的 DPU 執行查詢。當您事先了解查詢的一般容量用量描述檔時，這會很有幫助。

**注意**  
DPU 用量控制僅適用於使用容量保留執行的查詢。

**注意**  
若要對所有查詢使用相同數量的 DPU，請針對最小和最大 DPU 使用相同的值。

## 在工作群組層級設定 DPU 控制項
<a name="capacity-management-set-dpu-controls-workgroup-level"></a>

在工作群組層級設定 DPU 控制，以管理成本和控制您選擇的工作群組的工作負載效能。啟用**覆寫用戶端設定**時，工作群組層級設定的 DPU 控制項會套用至所有查詢。

**使用主控台設定 DPU 控制項**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 選取使用容量保留的工作群組。

1. 在**執行控制項**索引標籤上，選擇**編輯控制項**。

1. 設定下列項目：
   + 對於**每個查詢的最小 DPU**，以 4 為增量，輸入介於 4 到 124 之間的值。
   + 對於**每個查詢的最大 DPU**，以 4 為增量，輸入介於 4 到 124 之間的值。

1. 選擇**儲存**。

1. （選用） 選取**覆寫用戶端設定**以強制執行這些設定，並忽略查詢層級 DPU 組態。

**使用 設定 DPU 控制項 AWS CLI**
+ 使用 `update-work-group`命令來設定工作群組的 DPU 控制項：

  ```
  aws athena update-work-group \
    --work-group my_workgroup \
    --configuration-updates '{
          "EngineConfiguration": {
              "Classifications": [
                  {
                      "Name": "athena-query-engine-properties",
                      "Properties": {
                          "max-dpu-count" : "24",
                          "min-dpu-count" : "12"
                          }
                      }
                  ]
          }}'
  ```

  如果您將 `EnforceWorkGroupConfiguration` 設定為 `true`，工作群組設定會覆寫透過 [StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) 提交時在查詢層級指定的任何 DPU 控制項。這可確保工作群組中所有查詢的資源配置一致。

## 使用個別查詢設定 DPU 控制項
<a name="capacity-management-set-dpu-controls-individual-queries"></a>

當您需要使用具有不同資源需求的查詢進行精細控制時，請設定查詢層級 DPU 控制。查詢層級 DPU 控制優先於工作群組層級設定，除非工作群組已啟用**覆寫用戶端設定**。

**使用主控台設定查詢的 DPU 控制項**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在導覽窗格中，選擇 **Query Editor (查詢編輯器)**。

1. 選取使用容量保留的工作群組。

1. 選擇**查詢設定**索引標籤。

1. 在**執行控制項**區段中，選擇**編輯控制項**。

1. 設定下列項目：
   + 對於**每個查詢的最小 DPU**，以 4 為增量，輸入介於 4 到 124 之間的值。
   + 對於**每個查詢的最大 DPU**，以 4 為增量，輸入介於 4 到 124 之間的值。

1. 選擇**儲存**。

**使用 設定查詢的 DPU 控制項 AWS CLI**
+ 使用 `start-query-execution`命令搭配 `engine-configuration` 參數：

  ```
  aws athena start-query-execution \
    --query-string "SELECT * FROM my_table LIMIT 10" \
    --work-group "my_workgroup" \
    --engine-configuration '{
      "Classifications": [ {
          "Name": "athena-query-engine-properties",
              "Properties": {
                  "max-dpu-count" : "32",
                  "min-dpu-count" : "8"
                  }
              }
          ]}'
  ```

查詢層級和工作群組層級 DPU 設定之間的關係取決於您的工作群組組態：
+ 啟用**覆寫用戶端設定**時，工作群組層級 DPU 控制優先於任何查詢層級設定。這可確保指定工作群組中所有查詢的一致資源用量。
+ 未啟用**覆寫用戶端設定**時，查詢層級 DPU 控制優先於工作群組層級設定。這可讓個別查詢最佳化的彈性。

如果您未在任一層級指定 DPU 控制項，Athena 會根據查詢複雜性自動配置容量。

**注意**  
對於 DDL 查詢，最小 DPUs的最大值為 4。為 DDL 查詢設定較高的最小值會導致錯誤。

## 監控 DPU 用量
<a name="capacity-management-monitor-dpu-usage"></a>

查詢完成後，您可以檢視其 DPU 用量。Athena 透過主控台、API 操作和 CloudWatch 提供 DPU 用量指標。

**在主控台中檢視 DPU 使用量**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在導覽窗格中，選擇 **Query Editor (查詢編輯器)**。

1. 查詢完成後，請在查詢結果容器中檢視其**已使用的 DPU **值。

1. 若要檢視過去查詢的 DPU 使用量：

   1. 在導覽窗格中選擇**最近的查詢**。

   1. 如果尚未顯示，請選取設定圖示，將**已使用的 DPU** 資料欄新增至資料表。

   1. 檢閱每個已完成查詢的 DPU 使用量。

1. 或者，從**查詢編輯器**中，選擇**查詢統計資料**索引標籤，並檢閱**已使用的 DPU**。

**使用 API 擷取 DPU 耗用**

1. 使用下列 API 操作以程式設計方式擷取 DPU 耗用量：
   + `GetQueryExecution` - 傳回特定查詢的執行詳細資訊
   + `BatchGetQueryExecution` - 傳回多個查詢的執行詳細資訊

1. 使用 AWS CLI的範例：

   ```
   aws athena get-query-execution \
     --query-execution-id "123e4567-e89b-12d3-a456-426614174000"
   ```

   回應包含 `Statistics` 物件中的 `DpuCount` 欄位：

   ```
   {
     "QueryExecution": {
       "Statistics": {
         "DpuCount": 8
       }
     }
   }
   ```

**使用 CloudWatch 監控 DPU 用量**
+ Athena 會將查詢相關指標發佈至 CloudWatch，協助您監控容量使用率和其他效能資料。如需詳細資訊，請參閱 [使用 CloudWatch 監控 Athena 查詢指標](query-metrics-viewing.md)。

# 自動調整容量
<a name="capacity-management-automatically-adjust-capacity"></a>

您可以使用 Athena 的自動擴展解決方案自動調整保留的容量，以回應工作負載使用率。當使用率超過您設定的閾值時，它會自動新增容量，並在低使用率期間移除容量以降低成本。您可以透過設定不同的使用率閾值、最小和最大 DPU 數量、擴展增量和使用率評估頻率來自訂其行為。這可消除手動容量調整，同時協助您平衡效能需求與成本最佳化。

您可以使用 CloudFormation 範本部署此無伺服器解決方案。它建立 Step Functions 狀態機器，可監控使用率指標並做出擴展決策。您可以進一步自訂範本或狀態機器，以符合您的特定需求。

若要開始使用，請使用 Athena 主控台，然後選擇在容量保留詳細資訊頁面上**設定自動調整規模**，該頁面會使用預先載入的 CloudFormation 範本將您重新導向至 。或者，請遵循下列程序。

## 先決條件
<a name="capacity-management-auto-scaling-prerequisites"></a>
+ 需要主動容量保留
+ 部署 CloudFormation 堆疊和建立 Step Functions 資源所需的 IAM 許可

## 啟動 CloudFormation 堆疊
<a name="capacity-management-auto-scaling-launch-stack"></a>

此自動化 CloudFormation 範本會部署 Athena 容量保留自動擴展解決方案。您必須先完成 中的適用步驟，[先決條件](#capacity-management-auto-scaling-prerequisites)才能啟動堆疊。

[https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?&templateURL=https:%2F%2Fathena-downloads.s3.us-east-1.amazonaws.com%2F%2Ftemplates%2F%2Fcapacity-reservation-scaling%2F%2Fstate-machine%2F%2Fathena-capacity-reservation-scaling-template-v1.1.yaml](https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?&templateURL=https:%2F%2Fathena-downloads.s3.us-east-1.amazonaws.com%2F%2Ftemplates%2F%2Fcapacity-reservation-scaling%2F%2Fstate-machine%2F%2Fathena-capacity-reservation-scaling-template-v1.1.yaml) 

**啟動自動擴展解決方案**

1. 登入 [AWS 管理主控台](https://console.aws.amazon.com/)，然後選取按鈕以啟動`AWSAccelerator-InstallerStack` CloudFormation 範本。

1. 根據預設，範本會在美國東部 （維吉尼亞北部） 啟動。若要在不同的 中啟動解決方案 AWS 區域，請使用主控台導覽列中的區域選擇器。

1. 在**建立堆疊**頁面上，確認範本 URL 位於 **Amazon S3 URL** 文字方塊中，然後選擇**下一步**。

1. 在**指定堆疊詳細資訊**頁面上，為您的解決方案堆疊指派名稱。

1. 在**參數**下，檢閱此解決方案範本的參數，並視需要修改這些參數。此解決方案使用下列預設值。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/capacity-management-automatically-adjust-capacity.html)
**注意**  
所有 DPU 值都必須是 4 的倍數，以符合 Athena 的容量保留要求。

1. 選擇**下一步**。

1. 在 **Configure stack options** (設定堆疊選項) 頁面，選擇 **Next** (下一步)。

1. 在**檢閱和建立**頁面上，檢閱並確認設定。選取確認範本可能會建立 IAM 資源的方塊。

1. 選擇**提交**以部署堆疊。

   您可以在狀態欄的 CloudFormation 主控台中檢視堆疊**的狀態**。您應該會在幾分鐘內收到 `CREATE_COMPLETE` 狀態。

# 管理保留
<a name="capacity-management-managing-reservations"></a>

您可以在**容量保留**頁面上檢視和管理您的容量保留。您可以執行管理任務，例如新增或減少 DPU、修改工作群組指派，以及標記或取消保留。

**若要檢視和管理容量保留**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。

1. 選擇**管理**、**容量保留**。

1. 在容量保留頁面上，您可以執行下列任務：
   + 若要建立容量保留，請選擇**建立容量保留**。
   + 使用搜尋方塊，依名稱或 DPU 數目篩選保留。
   + 選擇狀態下拉式選單，依容量保留狀態進行篩選 (例如，**作用中**或**已取消**)。如需有關保留狀態的詳細資訊，請參閱 [了解保留狀態](#capacity-management-understanding-reservation-status)。
   + 若要檢視容量保留的詳細資訊，請選擇保留的連結。保留的詳細資訊頁面包括以下選項：[編輯容量](capacity-management-editing-capacity-reservations.md)、[新增工作群組](capacity-management-adding-workgroups-to-a-reservation.md)、[移除工作群組](capacity-management-removing-a-workgroup-from-a-reservation.md)以及[取消](capacity-management-cancelling-a-capacity-reservation.md)保留。
   + 若要編輯保留 (例如，透過新增或移除 DPU)，請選取保留的按鈕，然後選擇**編輯**。
   + 若要取消預留，請選取保留按鈕，然後選擇**取消**。

## 了解保留狀態
<a name="capacity-management-understanding-reservation-status"></a>

下表說明容量保留的可能狀態值。


****  

| 狀態 | Description | 
| --- | --- | 
| 待定 | Athena 正在處理您的容量請求。容量尚未準備好執行查詢。 | 
| Active (作用中) | 容量可用於執行查詢。 | 
| 失敗 | 您的容量請求未成功完成。請注意，無法保證滿足容量請求。失敗的保留會計入您的帳戶 DPU 限制。若要釋出使用量，您必須取消保留。 | 
| 更新待定 | Athena 正在處理保留的變更。例如，在您編輯保留以新增或移除 DPU 之後，就會發生此狀態。 | 
| 取消 | Athena 正在處理取消保留的請求。仍在使用保留的工作群組中執行的查詢可以完成，但工作群組中的其他查詢將使用隨選 (未佈建的) 容量。 | 
| 已取消 |  容量保留取消完成。已取消的保留會在主控台中保留 45 天。45 天後，Athena 將刪除保留。在這 45 天期間，您無法重新規劃或重複使用保留，但您可以參考其標籤並檢視其詳細資訊以供歷史參考。 無法保證可在未來日期重新保留取消的容量。容量無法轉移到另一個保留， AWS 帳戶 或 AWS 區域。  | 

## 了解作用中 DPU 和目標 DPU
<a name="capacity-management-understanding-dpu-status"></a>

在 Athena 主控台的容量保留清單中，您的保留會顯示兩個 DPU 值：**作用中 DPU** 和**目標 DPU**。
+ **作用中 DPU** – 保留中可用來執行查詢的 DPU 數目。例如，如果您請求 100 個 DPU，且您的請求已滿足，則**作用中 DPU** 會顯示 **100**。
+ **目標 DPU** – 您的保留正在移至的 DPU 數目。在建立保留或待定增加或減少 DPU 數目時，**目標 DPU** 顯示的值會與**作用中 DPU** 不同。

例如，在您提交請求以建立具有 24 個 DPU 的保留之後，保留**狀態**將為**待定**，**作用中 DPU** 將為 **0**，而**目標 DPU** 將為 **24**。

如果您的保留有 100 個 DPU，並編輯您的保留以請求增加 20 個 DPU，則**狀態**將為**更新待定**，**作用中 DPU** 將為 **100**，而**目標 DPU** 將為 **120**。

如果您的保留有 100 個 DPU，並編輯您的保留以請求減少 20 個 DPU，則**狀態**將為**更新待定**，**作用中 DPU** 將為 **100**，而**目標 DPU** 將為 **80**。

在這些轉換期間，Athena 會根據您的請求積極獲取或減少 DPU 數目。當**作用中 DPU** 等於**目標 DPU** 時，則達到目標數目，且沒有任何待定變更。

若要以程式設計方式擷取這些值，您可以呼叫 [GetCapacityReservation](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetCapacityReservation.html) API 動作。該 API 將**作用中 DPU** 和**目標 DPU** 稱為 `AllocatedDpus` 和 `TargetDpus`。

**Topics**
+ [了解保留狀態](#capacity-management-understanding-reservation-status)
+ [了解作用中 DPU 和目標 DPU](#capacity-management-understanding-dpu-status)
+ [編輯容量保留](capacity-management-editing-capacity-reservations.md)
+ [將工作群組新增至保留](capacity-management-adding-workgroups-to-a-reservation.md)
+ [從保留中移除工作群組](capacity-management-removing-a-workgroup-from-a-reservation.md)
+ [取消容量保留](capacity-management-cancelling-a-capacity-reservation.md)
+ [刪除容量保留](capacity-management-deleting-a-capacity-reservation.md)

# 編輯容量保留
<a name="capacity-management-editing-capacity-reservations"></a>

建立容量保留後，您可以調整其 DPU 數目，以及新增或移除其自訂標籤。

**若要編輯容量保留**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。

1. 選擇**管理**、**容量保留**。

1. 在容量保留清單中，執行下列任意一項：
   + 選取保留旁邊的按鈕，然後選擇**編輯**。
   + 選擇保留連結，然後選擇**編輯**。

1. 針對 **DPU**，選擇或輸入您想要的資料處理單位數量。如需詳細資訊，請參閱[了解 DPU](capacity-management.md#capacity-management-understanding-dpus)。
**注意**  
您可以隨時請求將 DPUs 新增至作用中容量保留。
當保留變為作用中或上次新增 DPUs後已超過 1 分鐘時，您可以請求從作用中容量保留減少 DPUs。
當您請求減少 DPUs 時，Athena 會優先移除閒置DPUs而非作用中DPUs。如果查詢正在使用標記為移除DPUs，Athena 會等待查詢完成，然後再移除 DPUs。

1. (選用) 針對**標籤**，選擇**移除**以移除標籤，或選擇**新增標籤**以新增標籤。

1. 選擇**提交**。保留詳細資訊頁面會顯示更新的組態。

# 將工作群組新增至保留
<a name="capacity-management-adding-workgroups-to-a-reservation"></a>

建立容量保留後，您最多可以將 20 個工作群組新增至保留。將工作群組新增至保留會告訴 Athena 應該在預留容量上執行哪些查詢。來自未與保留關聯的工作群組查詢，會繼續使用預設的每 TB 掃描定價模式執行。

當保留有兩個或多個工作群組時，來自這些工作群組的查詢可以使用保留的容量。您可以隨時新增和移除工作群組。新增或移除工作群組時，不會中斷正在執行的查詢。

當您的保留處於待定狀態時，來自您新增的工作群組的查詢會繼續使用預設的每 TB 掃描定價模式執行，直到保留變為作用中。

**若要將一或多個工作群組新增至您的容量保留**

1. 在容量保留的詳細資訊頁面上，選擇**新增工作群組**。

1. 在**新增工作群組**頁面上，選取要新增的工作群組，然後選擇**新增工作群組**。您不能將一個工作群組指派至多個預留。

   容量保留的詳細資訊頁面會列出您新增的工作群組。在這些工作群組中執行的查詢，將使用您在保留處於作用中狀態時保留的容量。

# 從保留中移除工作群組
<a name="capacity-management-removing-a-workgroup-from-a-reservation"></a>

如果您不再需要工作群組專用容量，或想要將工作群組移至其自己的保留中，您可以隨時將其移除。從保留移除工作群組輕鬆簡單。從保留中移除工作群組後，從移除的工作群組查詢會使用隨需容量返回 ，並根據掃描的 TB (TB) 計費。

**若要從保留移除一或多個工作群組**

1. 在容量保留之詳細資料頁面上，選取您要移除的工作群組。

1. 選擇**移除工作群組**。**是否移除工作群組？**提示會通知您，在將工作群組從保留中移除之前，將會完成所有目前作用中的查詢。

1. 選擇**移除**。容量保留的詳細資訊頁面會顯示移除的工作群組不再存在。

# 取消容量保留
<a name="capacity-management-cancelling-a-capacity-reservation"></a>

如果您不想再使用容量保留，則可將其取消。仍在使用保留的工作群組中執行的查詢將可完成，但工作群組中的其他查詢將不再使用保留。

**注意**  
無法保證可在未來日期重新保留取消的容量。容量無法轉移至其他保留， AWS 帳戶 或 AWS 區域。

**若要取消容量保留**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。

1. 選擇**管理**、**容量保留**。

1. 在容量保留清單中，執行下列任意一項：
   + 選取保留旁邊的按鈕，然後選擇**取消**。
   + 選擇容量連結，然後選擇**取消容量保留**。

1. 畫面出現**是否取消容量保留？**提示時，輸入**取消**，然後選擇**取消容量保留**。

   保留的狀態會變更為**取消中**，且進度橫幅會通知您正在取消。

   取消完成後，容量保留仍會保留，但其狀態會顯示為**已取消**。保留將在取消後 45 天刪除。在這 45 天期間，您無法重新規劃或重複使用已取消的保留，但您可以參考其標籤並檢視其詳細資訊以供歷史參考。

# 刪除容量保留
<a name="capacity-management-deleting-a-capacity-reservation"></a>

如果您要移除已取消的容量保留的所有參考，您可以刪除保留。必須先取消保留，然後才可將其刪除。刪除的保留會立即從您的帳戶中移除，且無法再參考，包括其 ARN。

**若要刪除容量保留**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。

1. 選擇**管理**、**容量保留**。

1. 在容量保留清單中，執行下列任意一項：
   + 選取已取消的保留旁邊的按鈕，然後選擇**動作**、**刪除**。
   + 選擇保留連結，然後選擇**刪除**。

1. 畫面出現**是否刪除容量保留？**提示時，選擇**刪除**。

   畫面會出現橫幅，通知您已成功刪除容量保留。刪除的保留不再出現在容量保留清單中。

# 容量保留的 IAM 政策
<a name="capacity-reservations-iam-policy"></a>

若要控制對容量保留的存取，請使用資源層級 IAM 許可或以身分為基礎的 IAM 政策。每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱*《IAM 使用者指南》*中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

下列程序專用於 Athena。

如需 IAM 特定的資訊，請參閱本節最後列出的連結。如需有關範例 JSON 容量保留政策的資訊，請參閱 [容量保留政策範例](example-policies-capacity-reservations.md)。

**若要在 IAM 主控台中使用視覺化編輯器來建立容量保留政策**

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

1. 在左邊的導覽窗格中，選擇 **Policies** (政策)，然後選擇 **Create policy** (建立政策)。

1. 在 **Visual editor** (視覺化編輯器) 標籤上，選擇 **Choose a service** (選擇一項服務)。接著選擇 Athena 以新增到政策。

1. 選擇 **Select actions** (選取動作)，然後選擇要新增到政策的動作。視覺化編輯器會顯示 Athena 中可用的動作。如需詳細資訊，請參閱《服務授權參考》**中的 [Amazon Athena 的動作、資源和條件索引鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html)。

1. 選擇**新增動作**來輸入特定動作，或使用萬用字元 (\$1) 來指定多個動作。

   預設情況下，您建立的政策允許執行選擇的操作。對於 Athena 中的 `capacity-reservation` 資源，如果您選擇的一個或多個動作支援資源層級許可，則編輯器會列出 `capacity-reservation` 資源。

1. 選擇**資源**來為您的政策指定特定容量保留。如需有關範例 JSON 容量保留政策的資訊，請參閱 [容量保留政策範例](example-policies-capacity-reservations.md)。

1. 如下所示指定 `capacity-reservation` 資源：

   ```
   arn:aws:athena:<region>:<user-account>:capacity-reservation/<capacity-reservation-name>
   ```

1. 選擇 **Review policy** (檢閱政策)，然後為您正在建立的政策輸入 **Name** (名稱) 與 **Description** (描述) (選用)。檢閱政策摘要來確認您已授予想要的許可。

1. 選擇 **Create policy** (建立政策) 儲存您的新政策。

1. 將此基於身分的政策連接到使用者、群組或角色。

如需詳細資訊，請參閱《服務授權參考》**與《IAM 使用者指南》**中的下列主題：
+  [Amazon Athena 的操作、資料和條件索引鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html) 
+  [使用視覺化編輯器來建立政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor) 
+  [新增和移除 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html) 
+  [控制資源的存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_controlling.html#access_controlling-resources) 

如需有關範例 JSON 容量保留政策的資訊，請參閱 [容量保留政策範例](example-policies-capacity-reservations.md)。

如需 Amazon Athena 動作的完整清單，請參閱《[Amazon Athena API 參考](https://docs.aws.amazon.com/athena/latest/APIReference/)》中的 API 動作名稱。

# 容量保留政策範例
<a name="example-policies-capacity-reservations"></a>

本節包含可讓您在容量保留上用來啟用各種動作的範例政策。每當您使用 IAM 政策時，請務必遵循 IAM 最佳實務。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 中的安全性最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

容量保留是由 Athena 管理的 IAM 資源。因此，如果您的容量保留政策使用 `capacity-reservation` 做為輸入的動作，您必須指定容量保留的 ARN，如下所示：

```
"Resource": [arn:aws:athena:<region>:<user-account>:capacity-reservation/<capacity-reservation-name>]
```

其中 `<capacity-reservation-name>` 為容量保留的名稱。例如，對於名為 `test_capacity_reservation` 的容量保留，將其指定為資源，如下所示：

```
"Resource": ["arn:aws:athena:us-east-1:123456789012:capacity-reservation/test_capacity_reservation"]
```

如需 Amazon Athena 動作的完整清單，請參閱《[Amazon Athena API 參考](https://docs.aws.amazon.com/athena/latest/APIReference/)》中的 API 動作名稱。如需有關 IAM 政策的詳細資訊，請參閱《IAM 使用者指南》**中的[使用視覺化編輯器來建立政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor)。

**Example 適用於列出容量保留的政策範例**  
以下政策允許所有使用者列出所有容量保留。    
****  

```
{ 
    "Version":"2012-10-17",		 	 	  
    "Statement": [ 
        { 
            "Effect": "Allow", 
            "Action": [ 
                "athena:ListCapacityReservations" 
            ], 
            "Resource": "*" 
        } 
    ] 
}
```

**Example 適用於管理操作的政策範例**  
下列政策可讓使用者建立、取消、取得詳細資訊，以及更新容量保留 `test_capacity_reservation`。該政策還允許使用者指派 `workgroupA` 和 `workgroupB` 給 `test_capacity_reservation`。    
****  

```
{ 
   "Version":"2012-10-17",		 	 	  
   "Statement":[ 
      { 
         "Effect": "Allow", 
         "Action": [ 
             "athena:CreateCapacityReservation", 
             "athena:GetCapacityReservation", 
             "athena:CancelCapacityReservation", 
             "athena:UpdateCapacityReservation", 
             "athena:GetCapacityAssignmentConfiguration", 
             "athena:PutCapacityAssignmentConfiguration" 
         ], 
         "Resource": [ 
             "arn:aws:athena:us-east-1:123456789012:capacity-reservation/test_capacity_reservation", 
             "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA", 
             "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupB" 
         ] 
      } 
   ] 
}
```

# Athena 容量保留 API
<a name="capacity-management-api-list"></a>

下列清單包含 Athena 容量保留 API 動作的參考連結。如需資料結構和其他 Athena API 動作，請參閱 [https://docs.aws.amazon.com/athena/latest/APIReference/](https://docs.aws.amazon.com/athena/latest/APIReference/)。
+  [CancelCapacityReservation](https://docs.aws.amazon.com/athena/latest/APIReference/API_CancelCapacityReservation.html) 
+  [CreateCapacityReservation](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateCapacityReservation.html) 
+  [DeleteCapacityReservation](https://docs.aws.amazon.com/athena/latest/APIReference/API_DeleteCapacityReservation.html) 
+  [GetCapacityAssignmentConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetCapacityAssignmentConfiguration.html) 
+  [GetCapacityReservation](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetCapacityReservation.html) 
+  [ListCapacityReservations](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListCapacityReservations.html) 
+  [PutCapacityAssignmentConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_PutCapacityAssignmentConfiguration.html) 
+  [UpdateCapacityReservation](https://docs.aws.amazon.com/athena/latest/APIReference/API_UpdateCapacityReservation.html) 

# 最佳化 Athena 效能
<a name="performance-tuning"></a>

本主題就改善 Athena 查詢效能以及如何解決與限制和資源使用量相關的錯誤，提供了一般資訊和具體建議。

一般而言，最佳化可以分組成服務、查詢和資料結構類別。在服務層級就撰寫查詢的方式以及建構資料和資料表的方式所做的決策，都可能會影響效能。

**Topics**
+ [最佳化服務使用](performance-tuning-service-level-considerations.md)
+ [最佳化查詢](performance-tuning-query-optimization-techniques.md)
+ [最佳化資料](performance-tuning-data-optimization-techniques.md)
+ [使用單欄式儲存格式](columnar-storage.md)
+ [使用分割和歸納](ctas-partitioning-and-bucketing.md)
+ [分割您的資料](partitions.md)
+ [透過 Amazon Athena 使用分割區投影](partition-projection.md)
+ [防止 Amazon S3 限流](performance-tuning-s3-throttling.md)
+ [其他資源](performance-tuning-additional-resources.md)

# 最佳化服務使用
<a name="performance-tuning-service-level-considerations"></a>

服務層級考量事項包括您每一帳戶執行的工作負載數量、不僅限於 Athena (而是所有服務) 的服務配額，以及思考如何減少「資源不足」錯誤。

**Topics**
+ [在同一帳戶中操作多個工作負載](#performance-tuning-service-quotas)
+ [減少「資源不足」錯誤](#performance-tuning-resource-limits)

## 在同一帳戶中操作多個工作負載
<a name="performance-tuning-service-quotas"></a>

Athena 使用配額來限制帳戶層級的查詢並行和 API 請求率。超出這些配額可能會導致查詢在執行期間或提交時失敗。如需有關這些配額的詳細資訊，請參閱 [Service Quotas](service-limits.md)。

如果您在同一個 AWS 帳戶中操作多個工作負載，您的工作負載會爭奪相同的帳戶層級配額。例如，如果一個工作負載遇到未預期的查詢爆量，同一帳戶中執行的另一個工作負載可能會出現佇列時間增加，或在最壞的情況下，因限流而導致查詢提交失敗。

我們建議您使用 CloudWatch 透過圖表和儀表板監控您的服務用量。您也可以設定 CloudWatch 警示，在用量接近並行查詢的服務配額時提醒您，讓您能在達到配額限制之前採取動作。如需詳細資訊，請參閱[使用 CloudWatch 監控 Athena 用量指標](monitoring-athena-usage-metrics.md)。

若要控制查詢並行並隔離帳戶內的工作負載，請使用容量保留。容量保留可在單一帳戶內提供專用查詢處理容量。容量是以資料處理單位 (DPU) 為單位測量而得，並可透過新增來增加查詢並行或透過移除來減少查詢並行。容量保留讓您能夠將容量指派給一或多個工作群組，進而隔離帳戶內的工作負載。如需詳細資訊，請參閱[管理查詢處理容量](capacity-management.md)。

雖然您應該隔離不同 AWS 帳戶中不相關的工作負載 （例如隔離開發與生產環境），但此方法無法提供可擴展的方式來增加查詢並行。反之，請使用容量保留來管理和擴展單一帳戶內的查詢處理需求。

### 考慮其他服務中的配額
<a name="performance-tuning-quotas-in-other-services"></a>

當 Athena 執行查詢時，它可以呼叫其他強制執行配額的服務。在查詢執行期間，Athena 可以對 AWS Glue Data Catalog、Amazon S3 和其他 AWS 服務進行 API 呼叫，例如 IAM 和 AWS KMS。如果您使用[聯合查詢](federated-queries.md)，Athena 也會呼叫 AWS Lambda。所有這些服務都有自己的限制和配額，可以超過。當查詢執行遇到來自這些服務的錯誤時，其便會失敗並包含來源服務的錯誤。重試可復原的錯誤，但如果問題無法及時自行解決，查詢仍可能失敗。請務必徹底閱讀錯誤訊息，以判斷其是來自 Athena 還是來自其他服務。此效能調校區段涵蓋一些相關錯誤。

如需有關解決 Amazon S3 Service Quotas 造成的錯誤的資訊，請參閱本文件稍後的 [避免檔案太多](performance-tuning-data-optimization-techniques.md#performance-tuning-avoid-having-too-many-files)。如需有關 Amazon S3 效能最佳化的詳細資訊，請參閱《Amazon S3 使用者指南》**中的[最佳實務設計模式：最佳化 Amazon S3 效能](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html)。

## 減少「資源不足」錯誤
<a name="performance-tuning-resource-limits"></a>

Athena 會在分散式查詢引擎中執行查詢。當您提交查詢時，Athena 引擎查詢規劃程式會預估執行查詢所需的運算容量，並相應地準備運算節點叢集。某些查詢 (例如 DDL 查詢) 只在一個節點上執行。大型資料集的複雜查詢可在更大的叢集上執行。節點是統一的，具有相同的記憶體、CPU 和磁碟組態。Athena 透過橫向擴展 (而非向上擴展) 來處理要求更高的查詢。

有時候，查詢的需求會超過執行查詢的叢集的可用資源。發生這種情況時，查詢會失敗，並顯示錯誤在此擴展因數下查詢耗盡的資源。

最常耗盡的資源是記憶體，但在極少數情況下，也可以是磁碟空間。當引擎執行聯結或視窗函數時，通常會發生記憶體錯誤，但也可能發生在不同的計數和彙總中。

即使查詢失敗並出現「資源不足」錯誤一次，當您再次執行時，其可能會成功。查詢執行不是確定性的。載入資料所花費時間以及如何在節點上分配中繼資料集等因素，可能會導致資源使用量不同。例如，假設一個查詢聯結兩個資料表，並且聯結條件的值分佈存在很大偏差。這樣的查詢在大多數時間都可以成功，但是當最常見的值最終由相同節點處理時，偶爾會失敗。

若要避免查詢超出可用資源，請使用本文件中提及的效能調校秘訣。具體而言，有關如何最佳化會耗盡可用資源之查詢的秘訣，請參閱 [最佳化聯結](performance-tuning-query-optimization-techniques.md#performance-tuning-optimizing-joins)、[減少視窗函式的範圍，或將其移除](performance-tuning-query-optimization-techniques.md#performance-tuning-optimizing-window-functions) 和 [使用近似值最佳化查詢](performance-tuning-query-optimization-techniques.md#performance-tuning-optimizing-queries-by-using-approximations)。

# 最佳化查詢
<a name="performance-tuning-query-optimization-techniques"></a>

使用本節中描述的查詢最佳化技術，可加快查詢執行速度，或做為 Athena 中超出資源限制的查詢解決方法。

## 最佳化聯結
<a name="performance-tuning-optimizing-joins"></a>

在分散式查詢引擎中執行聯結的策略有很多。最常見的兩個是分散式雜湊聯結和具有複雜聯結條件的查詢。

### 在分散式雜湊聯結中，將大型資料表放在左側，小型資料表放在右側
<a name="performance-tuning-distributed-hash-join"></a>

最常見的聯結類型使用對等比較做為聯結條件。Athena 以分散式雜湊聯結的形式執行此類聯結。

在分散式雜湊聯結中，引擎會從聯結的一側建置一個查詢表 (雜湊資料表)。這一側稱為*建置端*。建置端的記錄分散在多個節點上。每個節點為其子集建置一個查詢表。接著，聯結的另一端稱為*探查端*，會透過節點進行串流。探查端的記錄以與建置端相同的方式分散在節點上。這樣會啟用每個節點，以透過在其自己的查詢表中查詢相符記錄來執行聯結。

當從聯結的建置端建立的查詢表不適合放入記憶體中時，查詢可能會失敗。即使建置端的總大小小於可用記憶體，如果記錄的分佈存在很大偏差，查詢也可能會失敗。在極端情況下，所有記錄可能具有相同的聯結條件值，並且必須放入單一節點上的記憶體中。如果將一組值傳送至相同節點，且值加起來超過可用記憶體，即使是查詢偏差較小，也可能會失敗。節點確實可以將記錄溢寫至磁碟，但溢出會降低查詢執行速度，並且可能不足以防止查詢失敗。

Athena 會嘗試重新排序聯結，以使用較大的關係做為探查端，而較小的關係做為建置端。不過，由於 Athena 不會管理資料表中的資料，所以資訊有限，而且通常必須假設第一個資料表較大，第二個資料表較小。

使用以等值為基礎的聯結條件撰寫聯結時，假設 `JOIN` 關鍵字左側的資料表是探查端，右側的資料表是建置端。確保正確的資料表 (建置端) 是較小的資料表。如果無法使聯結的建置端足夠小以放入記憶體中，請考慮執行多個聯結建置資料表子集的查詢。

### 使用 EXPLAIN 來分析具有複雜聯結的查詢
<a name="performance-tuning-other-join-types"></a>

具有複雜聯結條件的查詢 (例如，使用 `LIKE`、`>` 或其他運算子的查詢) 通常運算要求較高。在最壞的情況下，聯結一端的每條記錄必須與聯結另一端的每條記錄進行比較。由於執行時間會隨著記錄數量的平方而增加，因此此類查詢會有超過最大執行時間的風險。

若要了解 Athena 將如何事先執行查詢，您可以使用 `EXPLAIN` 陳述式。如需詳細資訊，請參閱[在 Athena 使用 EXPLAIN 和 EXPLAIN ANALYZE](athena-explain-statement.md)及[了解 Athena EXPLAIN 陳述式結果](athena-explain-statement-understanding.md)。

## 減少視窗函式的範圍，或將其移除
<a name="performance-tuning-optimizing-window-functions"></a>

由於視窗函數是資源密集型操作，所以它們可能會使查詢執行緩慢甚至失敗，並顯示在此擴展因數下查詢耗盡的資源。視窗函數將其操作的所有記錄保留在記憶體中，以便計算其結果。當視窗非常大時，視窗函數可能會耗盡記憶體。

為了確保您的查詢在可用的記憶體限制內執行，請減少視窗函數操作的視窗大小。為此，您可以新增 `PARTITIONED BY` 子句或縮小現有分割區子句的範圍。

### 使用非視窗函式
<a name="performance-tuning-optimizing-window-functions-rewrite"></a>

有時，具有視窗函數的查詢可以在沒有視窗函數的情況下重寫。例如，您可以使用 `ORDER BY` 和 `LIMIT`，而不是使用 `row_number` 來尋找前 `N` 個記錄。您可以使用彙總函數 (例如 [max\$1by](https://trino.io/docs/current/functions/aggregate.html#max_by)、[min\$1by](https://trino.io/docs/current/functions/aggregate.html#min_by) 和 [arbitrary](https://trino.io/docs/current/functions/aggregate.html#arbitrary))，而不是使用 `row_number` 或 `rank` 來重複記錄。

例如，假設您的資料集包含來自感應器的更新。感應器會定期報告其電池狀態，並包含一些中繼資料，例如位置。如果您想知道每個感應器及其位置的最新電池狀態，可以使用以下查詢：

```
SELECT sensor_id,
       arbitrary(location) AS location,
       max_by(battery_status, updated_at) AS battery_status
FROM sensor_readings
GROUP BY sensor_id
```

因為每筆記錄的中繼資料 (例如位置) 都相同，因此您可以使用 `arbitrary` 函數從群組中選擇任何值。

要獲取最新的電池狀態，您可以使用 `max_by` 函數。`max_by` 函數從找到另一個資料欄的最大值的記錄中選擇資料欄的值。在此範例中，它會傳回群組內上次更新時間的記錄的電池狀態。與具有視窗函數的對等查詢相比，此查詢執行速度更快，而且使用的記憶體更少。

## 最佳化彙總
<a name="performance-tuning-optimizing-aggregations"></a>

當 Athena 執行彙總時，它會使用 `GROUP BY` 子句中的資料欄，跨不同的工作節點分佈記錄。為了使相符記錄與群組的任務盡可能有效率，節點會嘗試將記錄放入記憶體中，但必要時會將記錄溢寫至磁碟。

避免在 `GROUP BY` 子句中包含備援資料欄也是個不錯的主意。由於較少的資料欄需要較少的記憶體，因此使用較少資料欄描述群組的查詢會更有效率。數值資料欄使用的記憶體也少於字串。例如，當您彙總同時具有數值類別 ID 和類別名稱的資料集時，請僅使用 `GROUP BY` 子句中的類別 ID 資料欄。

有時候，查詢會在 `GROUP BY` 子句中包含資料欄，以解決資料欄必須是 `GROUP BY` 子句的一部分或彙總表達式的事實。如果未遵循此規則，您可能會收到以下錯誤訊息：

 EXPRESSION\$1NOT\$1AGGREGATE：行 1:8：「類別」必須是一個彙總表達式或出現在 GROUP BY 子句 

若要避免在 `GROUP BY` 子句中新增備援資料欄，您可以使用[任意](https://trino.io/docs/current/functions/aggregate.html#arbitrary)函數，如下列範例所示。

```
SELECT country_id,
       arbitrary(country_name) AS country_name,
       COUNT(*) AS city_count
FROM world_cities
GROUP BY country_id
```

`ARBITRARY` 函數會從群組中傳回任意值。當您知道群組中的所有記錄都具有相同的資料欄值，但該值無法識別群組時，此函數非常有用。

## 最佳化前 N 個查詢
<a name="performance-tuning-optimizing-top-n-queries"></a>

`ORDER BY` 子句會以排序順序傳回查詢的結果。Athena 使用分散式排序，在多個節點上平行執行排序操作。

如果您並不需要對結果進行排序，請避免新增 `ORDER BY` 子句。另外，如果並非絕對必要，請避免新增 `ORDER BY` 到內部查詢。在許多情況下，查詢規劃程式可以移除備援排序，但不保證一定如此。此規則的例外是，如果內部查詢正在執行前 `N` 個操作，例如尋找最新的 `N` 個值或最常用的 `N` 個值。

當 Athena 發現 `ORDER BY` 與 `LIMIT` 時，就會明白您正在執行前 `N` 個查詢，並相應地使用專用操作。

**注意**  
雖然 Athena 也經常可以偵測視窗函數 (例如使用前 `N` 個的 `row_number`)，但我們建議使用 `ORDER BY` 和 `LIMIT` 的較簡單版本。如需詳細資訊，請參閱[減少視窗函式的範圍，或將其移除](#performance-tuning-optimizing-window-functions)。

## 僅包含必填資料欄
<a name="performance-tuning-include-only-required-columns"></a>

如果您並不需要資料欄，請不要將其包含在查詢中。查詢必須處理的資料越少，執行速度就越快。這可以減少所需的記憶體數量，以及必須在節點之間傳送的資料量。如果您使用的是單欄式檔案格式，減少資料欄數量也會減少從 Amazon S3 讀取的資料量。

Athena 對結果中的資料欄數量沒有特定限制，但是執行查詢的方式會限制可能的資料欄合併大小。資料欄的合併大小包括它們的名稱和類型。

例如，下列錯誤是由超出關係描述項大小限制的關係造成的：

 GENERIC\$1INTERNAL\$1ERROR: io.airlift.bytecode.CompilationException 

若要解決此問題，請減少查詢中的資料欄數量或建立子查詢，並使用擷取較少量資料的 `JOIN`。如果您有在最外層查詢中執行 `SELECT *` 的查詢，則應將 `*` 變更為僅包含所需資料欄的清單。

## 使用近似值最佳化查詢
<a name="performance-tuning-optimizing-queries-by-using-approximations"></a>

Athena 支援[近似彙總函數](https://trino.io/docs/current/functions/aggregate.html#appro)，用於計算獨特值、最常出現的值、百分位數 (包括近似中位數)，以及建立直方圖。每當不需要確切值時，請使用這些函數。

與 `COUNT(DISTINCT col)` 操作不同，[approx\$1distinct](https://trino.io/docs/current/functions/aggregate.html#approx_distinct) 使用的記憶體更少且執行速度更快。同樣，使用 [numeric\$1histogram](https://trino.io/docs/current/functions/aggregate.html#numeric_histogram) (而不是[直方圖](https://trino.io/docs/current/functions/aggregate.html#histogram)) 使用了近似方法，因此所需的記憶體更少。

## 最佳化 LIKE
<a name="performance-tuning-optimizing-like"></a>

您可以使用 `LIKE` 來查找相符字串，但對於長字串而言，此為計算密集型。[regexp\$1like](https://trino.io/docs/current/functions/regexp.html#regexp_like) 函數在大多數情況下是一個更快的替代方案，並且還提供了更多的靈活性。

通常，您可以透過錨定要尋找的子字串來最佳化搜尋。*例如，如果您正在尋找字首，最好使用 '*substr*%' 而不是 '%substr*%'。或者，如果您使用的是 `regexp_like`，則為 '^*substr*'。

## 使用 UNION ALL 而非 UNION
<a name="performance-tuning-use-union-all-instead-of-union"></a>

 `UNION ALL` 和 `UNION` 是兩種將兩個查詢結果合併為一個結果的方法。`UNION ALL` 將第一個查詢中的記錄與第二個查詢中的記錄串連起來，且 `UNION` 會執行相同的操作，但也會移除重複項目。`UNION` 需要處理所有記錄並找到重複項目，此為記憶體和計算密集型，不過 `UNION ALL` 是一個相對快速的操作。除非您需要重複記錄，否則請使用 `UNION ALL` 以獲得最佳效能。

## 對大型結果集使用 UNLOAD
<a name="performance-tuning-use-unload-for-large-result-sets"></a>

當查詢結果預期很大 (例如，數萬個資料列或更多) 時，請使用 UNLOAD 匯出結果。在大多數情況下，這比執行規則查詢更快，並且使用 `UNLOAD` 也可以讓您更好地控制輸出。

查詢完成執行後，Athena 會將結果以單一未壓縮的 CSV 檔案形式存放在 Amazon S3 上。這比 `UNLOAD` 需要更長的時間，不僅因為結果未壓縮，而且還因為操作無法平行化。相反地，`UNLOAD` 會直接從工作節點寫入結果，並充分利用運算叢集的平行處理。此外，您可以設定 `UNLOAD`，以壓縮格式和其他檔案格式 (例如 JSON 和 Parquet) 寫入結果。

如需詳細資訊，請參閱[UNLOAD](unload.md)。

## 使用 CTAS 或 Glue ETL 將常用的彙總具體化
<a name="performance-tuning-use-ctas-or-glue-etl-to-materialize-frequently-used-aggregations"></a>

「具體化」查詢是一種透過儲存預先計算的複雜查詢結果 (例如，彙總和聯結) 以便在後續查詢中重複使用，來加速查詢效能的方法。

如果您的許多查詢包含相同的聯結和彙總，您可以將通用子查詢具體化為新資料表，然後針對該資料表執行查詢。您可以使用 [從查詢結果建立資料表 (CTAS)](ctas.md) 或專用 ETL 工具 (例如 [Glue ETL](https://aws.amazon.com/glue)) 來建立新的資料表。

例如，假設您的儀表板中包含顯示訂單資料集的不同層面的小工具。每個小工具都有自己的查詢，但所有查詢會共用相同的聯結和篩選條件。訂單資料表會與明細項目資料表結合在一起，而且有一個篩選條件，可僅顯示過去三個月。如果您識別這些查詢的常用功能，您可以建立小工具可使用的新資料表。這樣可以減少重複並提高效能。缺點是您必須將資料表保持在最新狀態。

## 重複使用查詢結果
<a name="performance-tuning-reuse-query-results"></a>

同一查詢在短時間內執行多次非常常見。例如，當多個人開啟相同的資料儀表板時，就會發生這種情況。執行查詢時，您可以告訴 Athena 重複使用先前計算的結果。您可以指定要重複使用的結果的最長期限。如果先前在該時間範圍內執行同一查詢，Athena 會傳回這些結果，而不是再次執行查詢。如需詳細資訊，請參閱此處《*Amazon Athena 使用者指南*》中的 [在 Athena 中重複使用查詢結果](reusing-query-results.md)，以及 *AWS 大數據部落格*中的[使用 Amazon Athena 查詢結果重複使用降低成本和提升查詢效能](https://aws.amazon.com/blogs/big-data/reduce-cost-and-improve-query-performance-with-amazon-athena-query-result-reuse/)。

# 最佳化資料
<a name="performance-tuning-data-optimization-techniques"></a>

效能不僅取決於查詢，而且還取決於資料集的組織方式，以及資料集使用的檔案格式和壓縮。

## 分割您的資料
<a name="performance-tuning-partition-your-data"></a>

分割會將您的資料表分為多個部分，並根據日期、國家或地區等屬性將相關資料保留在一起。分割區索引鍵可可做為虛擬資料欄。您可以在建立資料表時定義分割區索引鍵，並使用它們來篩選查詢。當您篩選分割區索引鍵資料欄時，只會讀取相符分割區中的資料。例如，如果您的資料集依日期進行分割，而您的查詢具有僅符合上週的篩選條件，則只會讀取上週的資料。如需有關分割區的詳細資訊，請參閱 [分割您的資料](partitions.md)。

## 選擇將支援您查詢的分割區索引鍵
<a name="performance-tuning-pick-partition-keys-that-will-support-your-queries"></a>

由於分割會對查詢效能產生重大影響，因此在設計資料集和資料表時，請務必仔細考慮分割的方式。分割區索引鍵太多可能會導致資料集分段為過多的檔案且各個檔案過小。相反地，分割區索引鍵太少或完全沒有分割，會導致查詢掃描的資料超過必要的資料。

### 避免最佳化罕見查詢
<a name="performance-tuning-avoid-optimizing-for-rare-queries"></a>

一個好的策略是針對最常見的查詢進行最佳化，並避免針對罕見查詢進行最佳化。例如，如果您的查詢瀏覽時間跨度 (天數)，即使某些查詢會篩選至該級別，也不要按小時進行分割。如果您的資料具有精確的時間戳記資料欄，則依小時篩選的罕見查詢可以使用時間戳記資料欄。即使極少數情況掃描的資料超過必要的資料，為了極少數情況而降低整體效能通常不是一種很好的權衡。

若要減少查詢必須掃描的資料量，進而改善效能，請使用單欄式檔案格式，並保持記錄排序。請依時間戳記排序記錄，而不是依小時分割。對於在較短時間視窗上進行查詢，按時間戳記排序的效率幾乎與依小時分割一樣有效。此外，依時間戳記排序通常不會損害時間視窗上的查詢效能 (以天數計算)。如需詳細資訊，請參閱[使用單欄式檔案格式](#performance-tuning-use-columnar-file-formats)。

請注意，如果所有分割區索引鍵都有述詞，則對具有數萬個分割區的資料表進行查詢的效果會更好。這是為最常見的查詢設計分割結構的另一個原因。如需詳細資訊，請參閱[依等式查詢分割區](#performance-tuning-query-partitions-by-equality)。

## 使用分割區投影
<a name="performance-tuning-use-partition-projection"></a>

分割區投影是一種 Athena 功能，可儲存不在 中的分割區資訊 AWS Glue Data Catalog，但做為 資料表屬性中的規則 AWS Glue。當 Athena 在設定了分割區投影的資料表上計劃查詢時，其會讀取資料表的分割區投影規則。Athena 會根據查詢和規則，計算要在記憶體中讀取的分割區，而不是在 AWS Glue Data Catalog中查找分割區。

除了簡化分割區管理之外，分割區投影還可以改善具有大量分割區的資料集的效能。當查詢包含範圍而不是分割區索引鍵的特定值時，在目錄中查找相符分割區所花費的時間越長，所需的分割區就越多。使用分割區投影，可以在記憶體中計算篩選條件而無需進入目錄，並且速度可以更快。

在某些情況下，分割區投影可能會導致效能變差。一個範例就是當資料表為「稀疏」時。稀疏資料表沒有分割區投影組態所描述的分割區索引鍵值的每個排列資料。使用稀疏資料表時，從查詢和分割區投影組態計算的一組分區都會列在 Amazon S3 上，即使它們沒有資料也一樣。

當您使用分割區投影時，請務必在所有分割區索引鍵上包含述詞。縮小可能值的範圍，以避免不必要的 Amazon S3 清單。假設一個分割區索引鍵的範圍包含一百萬個值，以及查詢在該分割區索引鍵上沒有任何篩選條件。若要執行查詢，Athena 必須執行至少一百萬個 Amazon S3 清單操作。查詢特定值時，無論您是使用分割區投影還是將分割區資訊儲存在目錄中，查詢速度都是最快的。如需詳細資訊，請參閱[依等式查詢分割區](#performance-tuning-query-partitions-by-equality)。

當您設定分割區投影的資料表時，請確定您指定的範圍是合理的。如果查詢不包含分割區索引鍵的述詞，則會使用該索引鍵範圍內的所有值。如果您的資料集是在特定日期建立的，請使用該日期做為任何日期範圍的起點。使用 `NOW` 作為日期範圍的結束。避免使用具有大量值的數值範圍，並考慮改用[注入](partition-projection-dynamic-id-partitioning.md#partition-projection-injection)類型。

如需有關分割區投影的詳細資訊，請參閱[透過 Amazon Athena 使用分割區投影](partition-projection.md)。

## 使用分割區索引
<a name="performance-tuning-use-partition-indexes"></a>

分割區索引是 中的一項功能 AWS Glue Data Catalog ，可改善具有大量分割區之資料表的分割區查詢效能。

目錄中的分割區清單就像是關聯式資料庫中的資料表。此資料表包含分割區索引鍵的資料欄，以及分割區位置的其他資料欄。當您查詢分割區資料表時，會掃描此資料表來查詢分割區位置。

就像關聯式資料庫一樣，您可以透過新增索引來提高查詢的效能。您可以新增多個索引，以支援不同的查詢模式。 AWS Glue Data Catalog 分割區索引支援等式運算子和比較運算子`>`，例如 `>=`、 和 與運算`AND`子`<`結合。如需詳細資訊，請參閱《 *AWS Glue 開發人員指南*》中的[在 中使用分割區索引 AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/partition-indexes.html)，以及《 *AWS 大數據部落格*》中的[使用 AWS Glue Data Catalog 分割區索引改善 Amazon Athena 查詢效能](https://aws.amazon.com/blogs/big-data/improve-amazon-athena-query-performance-using-aws-glue-data-catalog-partition-indexes/)。

## 始終使用 STRING 做為分割區索引鍵類型
<a name="performance-tuning-always-use-string-as-the-type-for-partition-keys"></a>

當您查詢分割區索引鍵時，請記住 Athena 要求分割區索引鍵為類型 `STRING`，才能將分割區篩選下推至 AWS Glue。如果分割區數目不小，使用其他類型可能會導致效能變差。如果您的分割區索引鍵值為 date-like 或 number-like，請將它們轉換為查詢中的適當類型。

## 移除舊的和空的分割區
<a name="performance-tuning-remove-old-and-empty-partitions"></a>

如果您從 Amazon S3 上的分割區移除資料 (例如，使用 Amazon S3 [生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html))，您也應該從 AWS Glue Data Catalog中移除分割區項目。在查詢規劃期間，與查詢相符的任何分割區都會列在 Amazon S3 上。如果您有許多空的分割區，列出這些分割區的負荷可能會產生不利影響。

此外，如果您有數千個分割區，請考慮移除不再相關的舊資料的分割區中繼資料。例如，如果查詢從未查看超過一年的資料，您可以定期移除舊分割區的分割區中繼資料。如果分割區數目增加到數萬個，移除未使用的分割區可以加速查詢，其中這些查詢不包含所有分割區索引鍵的述詞。如需有關在查詢中包含所有分割區索引鍵的述詞的資訊，請參閱 [依等式查詢分割區](#performance-tuning-query-partitions-by-equality)。

## 依等式查詢分割區
<a name="performance-tuning-query-partitions-by-equality"></a>

在所有分割區索引鍵上包含等式述詞的查詢執行速度更快，因為可以直接載入分割區中繼資料。避免查詢中一個或多個分割區索引鍵沒有述詞，或述詞選擇了範圍值。對於此類查詢，必須篩選所有分割區的清理，以找到相符的值。對於大多數資料表而言，負荷會降至最低，但對於具有數萬個或更多分割區的資料表而言，負荷可能會變得很大。

如果無法重寫查詢以透過等式篩選分割區，則可以嘗試分割區投影。如需詳細資訊，請參閱[使用分割區投影](#performance-tuning-use-partition-projection)。

## 避免使用 MSCK REPAIR TABLE 進行分割區維護
<a name="performance-tuning-avoid-using-msck-repair-table-for-partition-maintenance"></a>

由於 `MSCK REPAIR TABLE` 可能需要很長的時間才能執行，並且僅會新增分割區，而不會移除舊的分割區，因此不是管理分割區的有效方法 (請參閱 [考量和限制](msck-repair-table.md#msck-repair-table-considerations))。

使用 [AWS Glue Data Catalog API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog.html)、[ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 或 [AWS Glue 爬蟲程式](https://docs.aws.amazon.com/glue/latest/dg/crawler-running.html)可以更好地手動管理分割區。或者，您也可以使用分割區投影，這樣就不需要完全管理分割區。如需詳細資訊，請參閱[透過 Amazon Athena 使用分割區投影](partition-projection.md)。

## 驗證您的查詢是否與分割結構相容
<a name="performance-tuning-validate-that-your-queries-are-compatible-with-the-partitioning-scheme"></a>

您可以使用 [`EXPLAIN`](athena-explain-statement.md) 陳述式預先檢查查詢將掃描的分割區。使用 `EXPLAIN` 關鍵字作為查詢字首，然後在 `EXPLAIN` 輸出底部附近查找每個資料表的來源片段 (例如，`Fragment 2 [SOURCE]`)。查找右側被定義為分割區索引鍵的指派。下方的列包含一份清單，列出執行查詢時將要掃描的該分割區索引鍵的所有值。

例如，假設您對具有 `dt` 分割區索引鍵的資料表進行查詢，並使用 `EXPLAIN` 作為查詢字首。如果查詢中的值是日期，並且篩選條件選取了三天的範圍，則 `EXPLAIN` 輸出可能如下所示：

```
dt := dt:string:PARTITION_KEY
    :: [[2023-06-11], [2023-06-12], [2023-06-13]]
```

`EXPLAIN` 輸出顯示，規劃程式找到了此分割區索引鍵的三個值，且其與查詢相符。它還顯示了這些值是什麼。如需有關使用 `EXPLAIN` 的詳細資訊，請參閱 [在 Athena 使用 EXPLAIN 和 EXPLAIN ANALYZE](athena-explain-statement.md) 和 [了解 Athena EXPLAIN 陳述式結果](athena-explain-statement-understanding.md)。

## 使用單欄式檔案格式
<a name="performance-tuning-use-columnar-file-formats"></a>

專為分散式分析工作負載而設計的單欄式檔案格式，例如 Parquet 和 ORC。它們依資料欄而非資料列整理資料。以單欄式格式整理資料具有下列優點：
+ 僅會載入查詢所需的資料欄
+ 減少需要載入的整體資料量
+ 資料欄值會一起存放，因此可以有效地壓縮資料 
+ 檔案可以包含允許引擎略過載入不需要的資料的中繼資料

做為如何使用檔案中繼資料的範例，檔案中繼資料可以包含有關資料頁面中最小值和最大值的資訊。如果查詢的值不在中繼資料中註明的範圍內，則可以略過該頁面。

使用此中繼資料提高效能的一種方法是，確定對檔案中的資料進行排序。例如，假設您有查詢會尋找 `created_at` 項目在短時間範圍內的記錄。如果您的資料依 `created_at` 資料欄排序，Athena 可以使用檔案中繼資料中的最小值和最大值來略過資料檔案中不需要的部分。

使用單欄式檔案格式時，請確定檔案不會太小。如 [避免檔案太多](#performance-tuning-avoid-having-too-many-files) 中所述，含有許多小型檔案的資料集會造成效能問題。對於單欄式檔案格式而言，尤其如此。對於小型檔案，單欄式檔案格式的負荷超過優勢。

請注意，Parquet 和 ORC 在內部依資料列群組 (Parquet) 和條紋 (ORC) 進行整理。資料列群組的預設大小為 128 MB，而條紋的預設大小則為 64 MB。如果您有許多資料欄，您可以增加資料列群組和條紋大小，以提升效能。不建議將資料列群組或條紋大小減少至小於其預設值。

若要將其他資料格式轉換為 Parquet 或 ORC，您可以使用 AWS Glue ETL 或 Athena。如需詳細資訊，請參閱[轉換為單欄式格式](columnar-storage.md#convert-to-columnar)。

## 壓縮資料
<a name="performance-tuning-compress-data"></a>

Athena 支援各種壓縮格式。查詢壓縮資料的速度更快，也更便宜，因為您需要為解壓縮前掃描的位元組數量進行支付。

[gzip](https://www.gnu.org/software/gzip/) 格式提供了良好的壓縮比，並且在其他工具和服務中具有廣泛的支援。[zstd](https://facebook.github.io/zstd/) (Zstandard) 格式是一種較新的壓縮格式，可使效能和壓縮比之間達到良好的平衡。

壓縮文字檔案 (例如 JSON 和 CSV 資料) 時，請嘗試在檔案數量和檔案大小之間取得平衡。大多數壓縮格式都要求讀者從頭開始讀取檔案。這表示一般而言，壓縮的文字檔案無法平行處理。大型未壓縮的檔案通常會在工作者之間分割，以在查詢處理期間達到更高的平行處理能力，但大多數壓縮格式無法執行這項操作。

如 [避免檔案太多](#performance-tuning-avoid-having-too-many-files) 中所述，檔案最好不要太多也不宜過少。由於檔案數目是可處理查詢的工作者數量限制，因此對於壓縮檔案而言，此規則尤其如此。

如需有關在 Athena 中使用壓縮的詳細資訊，請參閱 [在 Athena 中使用壓縮](compression-formats.md)。

## 使用歸納來查詢具有高基數的索引鍵
<a name="performance-tuning-use-bucketing-for-lookups-on-keys-with-high-cardinality"></a>

歸納是一種技術，可根據其中一個資料欄的值，將記錄分佈至個別檔案中。這能確保具有相同值的所有記錄都位於同一個檔案中。當您擁有高基數的索引鍵，而且許多查詢都會查詢索引鍵的特定值時，歸納功能非常有用。

例如，假設您查詢特定使用者的一組記錄。如果資料是依使用者 ID 歸納，Athena 會事先知道哪些檔案包含特定 ID 的記錄，哪些檔案不包含。這可讓 Athena 僅讀取包含 ID 的檔案，進而大幅減少讀取的資料量。這同意也可減少在資料中搜尋特定 ID 所需的運算時間。

### 當查詢頻繁搜尋資料欄中的多個值時，請避免使用歸納
<a name="performance-tuning-disadvantages-of-bucketing"></a>

當查詢經常在資料歸納的資料欄中搜尋多個值時，歸納的價值就不太重要。查詢的值越多，必須讀取所有或大部分檔案的可能性就越高。例如，如果您有三個儲存貯體，而查詢會尋找三個不同的值，則可能必須讀取所有檔案。當查詢在查找單一值時，歸納效果最佳。

如需詳細資訊，請參閱[使用分割和歸納](ctas-partitioning-and-bucketing.md)。

## 避免檔案太多
<a name="performance-tuning-avoid-having-too-many-files"></a>

由許多小型檔案組成的資料集會導致整體查詢效能不佳。Athena 計劃查詢時，會列出所有分割區位置，而這需要花費一些時間。處理和請求每個檔案也會產生運算負載。因此，從 Amazon S3 載入單一較大的檔案比從許多較小的檔案載入相同記錄更快。

在極端情況下，您可能會遇到 Amazon S3 服務限制。針對單一索引分割區，Amazon S3 每秒最多可支援 5,500 個請求。最初，儲存貯體會被視為單一索引分割區，但隨著請求載入的增加，它可以分割成多個索引分割區。

Amazon S3 會根據索引鍵字首查詢請求模式和分割。如果您的資料集包含數千個檔案，則來自 Athena 的請求可能會超出請求的配額。即使檔案較少，如果對同一個資料集進行多個並行查詢，則可能會超過配額。存取相同檔案的其他應用程式可能會增加請求總數。

當超出請求率 `limit` 時，Amazon S3 會傳回下列錯誤。此錯誤已包含在 Athena 查詢的狀態資訊中。

 SlowDown：請降低請求率 

若要進行疑難排解，請先判斷錯誤是由單一查詢還是由可讀取相同檔案的多個查詢造成的。如果是後者，請協調查詢的執行，以便它們不會同時執行。為此，請在應用程式中新增佇列機制，甚至是重試。

如果執行單一查詢觸發錯誤，請嘗試合併資料檔案或修改查詢，以讀取較少的檔案。合併小型檔案的最佳時間是在將其寫入之前。為此，請考慮下列技巧：
+ 變更寫入檔案的程序，以寫入較大的檔案。例如，您可以在寫入記錄之前緩衝一段較長的時間。
+ 將檔案放在 Amazon S3 上的某個位置，然後使用 Glue ETL 等工具將其合併為較大的檔案。然後，將較大的檔案移至資料表所指向的位置。如需詳細資訊，請參閱《 *AWS Glue 開發人員指南*》中的[讀取較大群組中的輸入檔案](https://docs.aws.amazon.com/glue/latest/dg/grouping-input-files.html)，以及[如何在 re：Post 知識中心中設定 AWS Glue ETL 任務以輸出較大的檔案？](https://repost.aws/knowledge-center/glue-job-output-large-files)。 *AWS *
+ 減少分割區索引鍵的數量。當您的分割區索引鍵太多時，每個分割區可能只有少數記錄，因此會產生過多的小型檔案。如需有關決定要建立哪些分割區的資訊，請參閱 [選擇將支援您查詢的分割區索引鍵](#performance-tuning-pick-partition-keys-that-will-support-your-queries)。

## 避免分割區以外的其他儲存體階層
<a name="performance-tuning-avoid-additional-storage-hierarchies-beyond-the-partition"></a>

若要避免查詢規劃負荷，請將檔案儲存在每個分割區位置的單層式結構中。請勿使用任何其他目錄階層。

Athena 計劃查詢時，會列出與查詢相符的所有分割區中的所有檔案。雖然 Amazon S3 本身沒有目錄，但慣例是將 `/` 斜線解譯為目錄分隔符號。當 Athena 列出分割區位置時，其會遞歸列出找到的任何目錄。當分割區內的檔案整理成階層時，會出現多輪清單。

當所有檔案都直接位於分割區位置時，大多數情況下只需執行一個清單操作。但是，如果一個分割區中有 1000 個以上的檔案，則需要多個連續清單操作，因為 Amazon S3 每個清單操作只會傳回 1000 個物件。分區中有 1000 多個檔案也可能會導致其他更嚴重的效能問題。如需詳細資訊，請參閱[避免檔案太多](#performance-tuning-avoid-having-too-many-files)。

## 僅在必要時使用 SymlinkTextInputFormat
<a name="performance-tuning-use-symlinktextinputformat-only-when-necessary"></a>

使用 [https://athena.guide/articles/stitching-tables-with-symlinktextinputformat](https://athena.guide/articles/stitching-tables-with-symlinktextinputformat) 技術可以是一種解決相關情況的方法，當資料表的檔案沒有整齊地整理到分割區中時。例如，當所有檔案都使用相同的字首，或是具有不同結構描述的檔案位於相同位置時，符號連結可能很有用。

但是，使用符號連結會為查詢執行增加間接層級。這些間接層級會影響整體效能。必須讀取符號連結檔案，並且必須列出它們定義的位置。如此會新增至 Amazon S3 的多次往返，而這並非常見 Hive 資料表所需的。總之，只有當沒有更好的選項 (例如整理檔案) 可用時，您才應使用 `SymlinkTextInputFormat`。

# 使用單欄式儲存格式
<a name="columnar-storage"></a>

[Apache Parquet](https://parquet.apache.org) 和 [ORC](https://orc.apache.org/) 是經過最佳化的單欄式儲存格式，可快速擷取資料並用於 AWS 分析應用程式。

單欄式儲存格式具有以下特點，使其適用於 Athena：
+ *針對資料欄資料類型選擇壓縮演算法來壓縮欄*，可以節省 Amazon S3 中的儲存空間，並在查詢處理期間降低磁碟空間和輸入/輸出。
+ Parquet 和 ORC 中的*述詞下推*，可讓 Athena 查詢僅擷取需要的區塊，進而提高查詢效能。當 Athena 查詢從您的資料中取得特定資料欄值時，它會使用資料區塊述詞 (例如上限/下限值) 的統計資料，判斷要讀取或略過該區塊。
+ Parquet 和 ORC 中的*資料分割*，可讓 Athena 將資料的讀取分割給多個讀取器，在其查詢處理期間增加平行處理。

若要將您現有的原始資料從其他儲存格式轉換為 Parquet 或 ORC，您可以在 Athena 中執行 [CREATE TABLE AS SELECT (CTAS)](ctas.md) 查詢，並將資料儲存格式指定為 Parquet 或 ORC，或使用 AWS Glue 爬蟲程式。

## 在 Parquet 與 ORC 之間進行選擇
<a name="columnar-storage-choosing"></a>

ORC (優化列單欄式) 和 Parquet 之間的選擇取決於您的特定使用需求。

Apache Parquet 提供高效的資料壓縮和編碼機制，非常適合用於執行複雜查詢和處理大量資料。為與 [Apache Arrow](https://arrow.apache.org/) 搭配使用，Parquet 進行了優化，因此如果您使用與 Arrow 相關的工具，Parquet 可能比較有利。

ORC 可以很有效率地存放 Hive 資料。ORC 檔案通常比 Parquet 檔案要小，因此 ORC 索引可以加快查詢速度。此外，ORC 支援複雜類型，例如結構、映射和清單。

在 Parquet 或 ORC 間選擇時，請考慮以下因素：

**查詢效能** – 由於 Parquet 能夠支援更廣泛的查詢類型，因此，如果您打算執行複雜的查詢，則 Parquet 可能是更好的選擇。

**複雜的資料類型** – 如果您使用的是複雜的資料類型，那麼 ORC 可能是更好的選擇，因為它能支援更廣泛的複雜資料類型。

**檔案大小** – 如果需要考慮磁碟空間，ORC 通常可產生較小的檔案，進而降低儲存成本。

**壓縮** – Parquet 和 ORC 均可提供良好的壓縮，但最適合您的最佳格式主要取決於您的特定使用案例。

**演進** – Parquet 和 ORC 均可支援支持結構描述變化，這意味著您可以隨時間新增、刪除或修改資料欄。

對於大數據應用程式來說，Parquet 和 ORC 都是不錯的選擇，但在選擇之前，請考慮您的案例需求。您可能希望對資料和查詢執行基準測試，以查看哪種格式更適合您的使用案例。

## 轉換為單欄式格式
<a name="convert-to-columnar"></a>

將 JSON 或 CSV 等來源資料輕鬆轉換為單欄式格式的選項，包括使用 [CREATE TABLE AS](ctas.md) 查詢或執行 AWS Glue中的任務。
+ 使用 `CREATE TABLE AS` (CTAS) 查詢，只需一個步驟即可將資料轉換為 Parquet 或 ORC。如需範例，請參閱 [CTAS 查詢的範例](ctas-examples.md) 頁面上的[範例：將查詢結果寫為不同格式](https://docs.aws.amazon.com/athena/latest/ug/ctas-examples.html#ctas-example-format)。
+ 如需有關使用 Athena for ETL 將資料從 CSV 轉換為 Parquet 的詳細資訊，請參閱 [使用 CTAS 和 INSERT INTO 以進行 ETL 和資料分析](ctas-insert-into-etl.md)。
+ 如需有關執行 AWS Glue 任務以將 CSV 資料轉換為 Parquet 的資訊，請參閱 AWS 大數據部落格文章中的「將資料從 CSV 轉換為 Parquet 格式」一節[使用 AWS Glue 和 Amazon S3 建置資料湖基礎](https://aws.amazon.com/blogs/big-data/build-a-data-lake-foundation-with-aws-glue-and-amazon-s3/)。 AWS Glue 支援使用相同的技術將 CSV 資料轉換為 ORC，或 JSON 資料轉換為 Parquet 或 ORC。

# 使用分割和歸納
<a name="ctas-partitioning-and-bucketing"></a>

分割和歸納是減少執行查詢時 Athena 必須掃描的資料量的兩種方法。分割和歸納互為補充，且可搭配使用。減少掃描的資料量可改善查詢效能並降低成本。如需有關 Athena 查詢效能的一般指導方針，請參閱 [Amazon Athena 的十大效能調校秘訣](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/)。

**Topics**
+ [什麼是分割？](ctas-partitioning-and-bucketing-what-is-partitioning.md)
+ [什麼是歸納？](ctas-partitioning-and-bucketing-what-is-bucketing.md)
+ [其他資源](ctas-partitioning-and-bucketing-additional-resources.md)

# 什麼是分割？
<a name="ctas-partitioning-and-bucketing-what-is-partitioning"></a>

分割表示根據資料的特定屬性，將資料整理到 Amazon S3 上的目錄 (或「字首」)。這類屬性稱為分割區索引鍵。常見的分割區索引鍵是日期或一些其他時間單位，例如年份或月份。不過，資料集可以依多個索引鍵進行分割。例如，有關產品銷售的資料可能依日期、產品類別和市場進行分割。

## 決定如何分割
<a name="ctas-partitioning-and-bucketing-deciding-how-to-partition"></a>

分割區索引鍵的理想候選者是始終或經常在查詢中使用且具有低基數的屬性。分割區過多和分割區過少之間需要取得權衡。由於分割區過多，檔案數增加會產生負荷。篩選分割區本身也有一些負荷。如果分割區太少，查詢通常需要掃描更多資料。

## 建立分割的資料表
<a name="ctas-partitioning-and-bucketing-creating-a-partitioned-table"></a>

分割資料集後，您可以在 Athena 建立分割的資料表。分割的資料表是具有分割區索引鍵的資料表。使用 `CREATE TABLE` 時，您可以將分割區新增至資料表中。使用 `CREATE TABLE AS` 時，在 Amazon S3 上建立的分割區會自動新增至資料表。

在 `CREATE TABLE` 陳述式中，您可以在 `PARTITIONED BY (column_name data_type)` 子句中指定分割區索引鍵。在 `CREATE TABLE AS` 陳述式中，您可以在 `WITH (partitioned_by = ARRAY['partition_key'])` 子句或 Iceberg 資料表的 `WITH (partitioning = ARRAY['partition_key'])` 中指定分割區索引鍵。出於效能考量，分割區索引鍵應始終是類型 `STRING`。如需詳細資訊，請參閱[使用字串做為分割區索引鍵的資料類型](data-types-timestamps.md#data-types-timestamps-partition-key-types)。

如需其他 `CREATE TABLE` 和 `CREATE TABLE AS` 語法詳細資訊，請參閱 [CREATE TABLE](create-table.md) 和 [CTAS 資料表屬性](create-table-as.md#ctas-table-properties)。

## 查詢分割的資料表
<a name="ctas-partitioning-and-bucketing-querying-partitioned-tables"></a>

當您查詢分割區資料表時，Athena 會使用查詢中的述詞來篩選分割區的清單。然後，其會使用相符分割區的位置來處理找到的檔案。Athena 只要不讀取與查詢述詞不相符的分割區中的資料，就能有效減少掃描的資料量。

### 範例
<a name="ctas-partitioning-and-bucketing-partitioned-table-example-queries"></a>

假設您有一個依 `sales_date` 和 `product_category` 分割的資料表，並且想知道特定類別中一周的總收入。您可以在 `sales_date` 和 `product_category` 資料欄上加入述詞，以確保 Athena 只掃描最少量的資料，如下列範例所示。

```
SELECT SUM(amount) AS total_revenue 
FROM sales 
WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' 
AND product_category = 'Toys'
```

假設您有依日期分割的資料集，但也有精細的時間戳記。

使用 Iceberg 資料表，您可以宣告分割區索引鍵與資料欄之間的關係，但是使用 Hive 資料表時，查詢引擎對資料欄和分割區索引鍵之間的關係一無所知。因此，您必須在查詢中包含資料欄和分割區索引鍵的述詞，以確保查詢掃描的資料不會超過必要數目。

例如，假設上一個範例中的 `sales` 資料表也有 `TIMESTAMP` 資料類型的 `sold_at` 資料欄。如果您只想在特定時間範圍內獲得收入，則可以像這樣寫入查詢：

```
SELECT SUM(amount) AS total_revenue 
FROM sales 
WHERE sales_date = '2023-02-28' 
AND sold_at BETWEEN TIMESTAMP '2023-02-28 10:00:00' AND TIMESTAMP '2023-02-28 12:00:00' 
AND product_category = 'Toys'
```

如需有關查詢 Hive 和 Iceberg 資料之間的差異的詳細資訊，請參閱 [如何寫入同樣按時間分割的時間戳記欄位的查詢](data-types-timestamps.md#data-types-timestamps-how-to-write-queries-for-timestamp-fields-that-are-also-time-partitioned)。

# 什麼是歸納？
<a name="ctas-partitioning-and-bucketing-what-is-bucketing"></a>

歸納是一種將資料集的記錄整理至稱為儲存貯體的類別的方法。

儲存貯體和歸納的含義與 Amazon S3 儲存貯體不同，且不應與 Amazon S3 儲存貯體混淆。在資料歸納中，具有相同屬性值的記錄會進入同一個儲存貯體。記錄會盡可能在儲存貯體之間平均分配，因此每個儲存貯體的資料量大致相同。

實際上，儲存貯體是檔案，而雜湊函數可確定記錄進入的儲存貯體。歸納的資料集在每個分割區的每個儲存貯體中會有一或多個檔案。檔案所屬的儲存貯體會以檔案名稱編碼。

## 歸納益處
<a name="ctas-partitioning-and-bucketing-bucketing-benefits"></a>

當資料集依特定屬性進行歸納，而且您想要擷取該屬性具有特定值的記錄時，歸納功能非常有用。由於資料是歸納性質的，Athena 可以使用此值來判斷要查看的檔案。例如，假設資料集依 `customer_id` 進行歸納，而您想要尋找特定客戶的所有記錄。Athena 會判斷包含這些記錄的儲存貯體，而且只會讀取該儲存貯體中的檔案。

當您的資料欄具有高基數 (也就是，有許多不同的值)、平均分散，以及您經常查詢特定值的資料欄時，就會發生歸納的適當候選項。

**注意**  
Athena 不支援使用 `INSERT INTO` 將新記錄新增至歸納的資料表。

## 支援依據已歸納資料欄進行篩選的資料類型
<a name="ctas-partitioning-and-bucketing-data-types-supported-for-filtering-on-bucketed-columns"></a>

您可以在具有某些資料類型的歸納資料欄上新增篩選條件。Athena 支援對具有下列資料類型的已歸納資料欄進行篩選：
+ BOOLEAN
+ BYTE
+ DATE
+ DOUBLE
+ FLOAT
+ INT
+ LONG
+ SHORT
+ STRING
+ VARCHAR

## Hive 和 Spark 支援
<a name="ctas-partitioning-and-bucketing-hive-and-spark-support"></a>

Athena 引擎版本 2 支援使用 Hive 儲存貯體演算法歸納的資料集，而 Athena 引擎版本 3 也支援 Apache Spark 歸納演算法。預設為 Hive 歸納。如果您的資料集是使用 Spark 演算法歸納，請使用 `TBLPROPERTIES` 子句將 `bucketing_format` 屬性值設定為 `spark`。

**注意**  
Athena 在每個 `CREATE TABLE AS SELECT` ([CTAS](ctas.md)) 查詢的分割區限制為 100 個。同樣地，您僅可以使用 [INSERT INTO](insert-into.md) 陳述式將最多 100 個分割區新增至目的地資料表。  
如果您超出此限制，您可能會收到錯誤訊息 HIVE\$1TOO\$1MANY\$1OPEN\$1PARTITIONS: Exceeded limit of 100 open writers for partitions/buckets (HIVE\$1TOO\$1MANY\$1OPEN\$1PARTITIONS：超過分割區／儲存貯體 100 個開啟寫入器的限制)。若要避開此限制，您可以使用 CTAS 陳述式和一系列的 `INSERT INTO` 陳述式，每個陳述式可建立或插入最多 100 個分割區。如需詳細資訊，請參閱[使用 CTAS 和 INSERT INTO 來解決 100 個分割區限制](ctas-insert-into.md)。

## 歸納 CREATE TABLE 範例
<a name="ctas-partitioning-and-bucketing-bucketing-create-table-example"></a>

若要為現有歸納的資料集建立資料表，請使用 `CLUSTERED BY (column)` 子句，後面接著 `INTO N BUCKETS` 子句。`INTO N BUCKETS` 子句指定了資料要歸納到的儲存貯體數量。

在下列 `CREATE TABLE` 範例中，使用 Spark 演算法，依 `customer_id` 將 `sales` 資料集歸納成 8 個儲存貯體。`CREATE TABLE` 陳述式會使用 `CLUSTERED BY` 和 `TBLPROPERTIES` 子句來設定相應的屬性。

```
CREATE EXTERNAL TABLE sales (...) 
... 
CLUSTERED BY (`customer_id`) INTO 8 BUCKETS 
... 
TBLPROPERTIES ( 
  'bucketing_format' = 'spark' 
)
```

## 歸納 CREATE TABLE AS (CTAS) 範例
<a name="ctas-partitioning-and-bucketing-bucketing-create-table-as-example"></a>

若要使用 `CREATE TABLE AS` 指定歸納，請使用 `bucketed_by` 和 `bucket_count` 參數，如下列範例所示。

```
CREATE TABLE sales 
WITH ( 
  ... 
  bucketed_by = ARRAY['customer_id'], 
  bucket_count = 8 
) 
AS SELECT ...
```

## 歸納查詢範例
<a name="ctas-partitioning-and-bucketing-bucketing-query-example"></a>

下列範例查詢會尋找特定客戶在一週內購買的產品名稱。

```
SELECT DISTINCT product_name 
FROM sales 
WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' 
AND customer_id = 'c123'
```

如果此資料表依 `sales_date` 進行分割並依 `customer_id` 歸納，則 Athena 可以計算客戶記錄所在的儲存貯體。Athena 每個分割區最多只能讀取一個檔案。

# 其他資源
<a name="ctas-partitioning-and-bucketing-additional-resources"></a>
+ 有關建立歸納和分割資料表的 `CREATE TABLE AS` 範例，請參閱[範例：建立歸納和分割的資料表](https://docs.aws.amazon.com/athena/latest/ug/ctas-examples.html#ctas-example-bucketed)。
+ 如需在 AWS 資料湖實作儲存貯體的資訊，包括使用 Athena CTAS 陳述式、 AWS Glue 適用於 Apache Spark 的儲存貯體，以及適用於 Apache Iceberg 資料表的儲存貯體，請參閱 AWS 大數據部落格文章[使用 Amazon Athena 儲存貯體最佳化資料配置 AWS Glue ，並加速下游查詢](https://aws.amazon.com/blogs/big-data/optimize-data-layout-by-bucketing-with-amazon-athena-and-aws-glue-to-accelerate-downstream-queries/)。

# 分割您的資料
<a name="partitions"></a>

您可以分割資料，以限制每個查詢所掃描的資料量，從而提高效能和降低成本。您可透過任何索引鍵來分割您的資料。常見做法是根據時間來分割資料，這通常會產生多層級的分割機制。例如，每小時都有資料傳入的客戶可能決定依年、月、日、小時來分割。另一個客戶的資料來自許多不同來源，且每天只載入一次，則可能依資料來源識別符和日期來分割。

Athena 可以使用 Apache Hive 樣式的分割區，其資料路徑包含由等號連接的鍵值對 (例如 `country=us/...` 或 `year=2021/month=01/day=26/...`)。因此，路徑會包含分割區索引鍵的名稱，以及每個路徑所代表的值。若要將新的 Hive 分割區載入已分割的資料表，您可以使用 [MSCK REPAIR TABLE](msck-repair-table.md) 命令，其只適用於 Hive 樣式的分割區。

Athena 也可以使用非 Hive 樣式的分割區結構描述。例如，CloudTrail 日誌和 Firehose 交付串流對日期部分使用不同的路徑元件，例如 `data/2021/01/26/us/6fc7845e.json`。對於這類非 Hive 樣式的分割區，您可以使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 手動新增分割區。

## 考量和限制
<a name="partitions-considerations-limitations"></a>

使用分割區時，請謹記以下幾點：
+ 若您查詢已分割的資料表並在 `WHERE` 子句中指定分割區，Athena 便只會掃描該分割區中的資料。
+ 如果您對 Amazon S3 儲存貯體發出具有大量物件的查詢，並且未將資料分割，這類查詢可能會影響 Amazon S3 中的 `GET` 請求率限制，並導致 Amazon S3 例外狀況。若要避免錯誤，請分割您的資料。此外，請考慮調校您的 Amazon S3 請求率。如需詳細資訊，請參閱[最佳實務設計模式：最佳化 Amazon S3 效能](https://docs.aws.amazon.com/AmazonS3/latest/userguide/request-rate-perf-considerations.html)。
+ 要搭配 Athena 使用的分割區位置必須使用 `s3` 通訊協定 (例如，`s3://amzn-s3-demo-bucket/folder/`)。在 Athena 中，當在包含的資料表上執行 `MSCK REPAIR TABLE` 查詢時，使用其他通訊協定的位置 (例如 `s3a://amzn-s3-demo-bucket/folder/`) 會導致查詢失敗。
+ 請確定 Amazon S3 路徑是小寫而不是小駝峰式命名法 (camel case) (例如，`userid` 而非 `userId`)。如果 S3 路徑是小駝峰式命名法 (camel case)，則 `MSCK REPAIR TABLE` 不會將分割區新增到 AWS Glue Data Catalog。如需詳細資訊，請參閱 [MSCK REPAIR TABLE](msck-repair-table.md)。
+ 由於 `MSCK REPAIR TABLE` 會同時掃描資料夾及其子資料夾，以尋找相符的分割區配置，請務必將個別資料表的資料留在不同的資料夾階層中。例如，假設您在 `s3://amzn-s3-demo-bucket1` 中有資料表 1 的資料，在 `s3://amzn-s3-demo-bucket1/table-2-data` 中有資料表 2 的資料。如果兩個資料表都以字串分割，`MSCK REPAIR TABLE` 會將資料表 2 的分割區新增至資料表 1 中。為避免此情況，請改用單獨的資料夾結構，如 `s3://amzn-s3-demo-bucket1` 和 `s3://amzn-s3-demo-bucket2`。請注意，此行為與 Amazon EMR 和 Apache Hive 一致。
+ 如果您將 AWS Glue Data Catalog 與 Athena 搭配使用，請參閱每個帳戶[AWS Glue 和每個資料表分割區上服務配額的端點](https://docs.aws.amazon.com/general/latest/gr/glue.html)和配額。
  + 雖然 Athena 支援查詢具有 1，000 萬個分割區的 AWS Glue 資料表，但 Athena 無法在單一掃描中讀取超過 100 萬個分割區。在這種情況下，分割區索引可能有利。如需詳細資訊，請參閱 AWS 大數據部落格文章[使用 AWS Glue Data Catalog 分割區索引改善 Amazon Athena 查詢效能](https://aws.amazon.com/blogs/big-data/improve-amazon-athena-query-performance-using-aws-glue-data-catalog-partition-indexes/)。
+ 若要在使用 時請求增加分割區配額 AWS Glue Data Catalog，請造訪 [Service Quotas 主控台 AWS Glue](https://console.aws.amazon.com/servicequotas/home?region=us-east-1#!/services/glue/quotas)。

## 建立和載入含有分割資料的資料表
<a name="partitions-creating-loading"></a>

若要建立使用分割區的資料表，請在 [CREATE TABLE](create-table.md) 陳述式中使用 `PARTITIONED BY` 子句。`PARTITIONED BY` 子句定義對資料進行分割區的索引鍵，如下列範例所示。`LOCATION` 子句指定已分割的資料的根位置。

```
CREATE EXTERNAL TABLE users (
first string,
last string,
username string
)
PARTITIONED BY (id string)
STORED AS parquet
LOCATION 's3://amzn-s3-demo-bucket'
```

建立資料表之後，您可以在分割區中載入要查詢的資料。對於 Hive 樣式的分割區，您可以執行 [MSCK REPAIR TABLE](msck-repair-table.md)。對於非 Hive 樣式的分割區，您可以使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 手動新增分割區。

## 準備 Hive 樣式和非 Hive 樣式資料進行查詢
<a name="partitions-preparing-data"></a>

下列區段說明如何準備 Hive 樣式和非 Hive 樣式資料，以便在 Athena 中進行查詢。

### 案例 1：以 Hive 格式存放在 Amazon S3 上的資料
<a name="scenario-1-data-already-partitioned-and-stored-on-s3-in-hive-format"></a>

在此案例中，分割區存放在 Amazon S3 中的單獨資料夾。例如，以下是 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/ls.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/ls.html) 命令輸出的廣告曝光範例的部分清單，其中列出了指定字首下的 S3 物件：

```
aws s3 ls s3://elasticmapreduce/samples/hive-ads/tables/impressions/

    PRE dt=2009-04-12-13-00/
    PRE dt=2009-04-12-13-05/
    PRE dt=2009-04-12-13-10/
    PRE dt=2009-04-12-13-15/
    PRE dt=2009-04-12-13-20/
    PRE dt=2009-04-12-14-00/
    PRE dt=2009-04-12-14-05/
    PRE dt=2009-04-12-14-10/
    PRE dt=2009-04-12-14-15/
    PRE dt=2009-04-12-14-20/
    PRE dt=2009-04-12-15-00/
    PRE dt=2009-04-12-15-05/
```

在此，存放的日誌將欄名稱 (dt) 設為等於日期、小時和分鐘增量。當您在 DDL 中提供父資料夾的位置、結構描述和分割欄的名稱時，Athena 就能在這些子資料夾中查詢資料。

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

若要使用此資料建立資料表，請沿著 'dt' 建立分割區，如下列 Athena DDL 陳述式所示：

```
CREATE EXTERNAL TABLE impressions (
    requestBeginTime string,
    adId string,
    impressionId string,
    referrer string,
    userAgent string,
    userCookie string,
    ip string,
    number string,
    processId string,
    browserCookie string,
    requestEndTime string,
    timers struct<modelLookup:string, requestTime:string>,
    threadId string,
    hostname string,
    sessionId string)
PARTITIONED BY (dt string)
ROW FORMAT  serde 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://elasticmapreduce/samples/hive-ads/tables/impressions/' ;
```

此資料表使用 Hive 的原生 JSON 序列化程式-還原序列化程式，讀取存放在 Amazon S3 中的 JSON 資料。如需支援格式的詳細資訊，請參閱[為您的資料選擇 SerDe](supported-serdes.md)。

#### 執行 MSCK REPAIR TABLE
<a name="run-msck-repair-table"></a>

在您執行 `CREATE TABLE` 查詢後，在 Athena 查詢編輯器中執行 `MSCK REPAIR TABLE` 命令以載入分割區，如下列範例所示。

```
MSCK REPAIR TABLE impressions
```

執行此命令後，即可對資料進行查詢。

#### 查詢資料
<a name="query-the-data"></a>

使用分割區欄位查詢 impressions 資料表的資料。範例如下：

```
SELECT dt,impressionid FROM impressions WHERE dt<'2009-04-12-14-00' and dt>='2009-04-12-13-00' ORDER BY dt DESC LIMIT 100
```

此查詢應該會顯示類似下列的資料：

```
2009-04-12-13-20    ap3HcVKAWfXtgIPu6WpuUfAfL0DQEc
2009-04-12-13-20    17uchtodoS9kdeQP1x0XThKl5IuRsV
2009-04-12-13-20    JOUf1SCtRwviGw8sVcghqE5h0nkgtp
2009-04-12-13-20    NQ2XP0J0dvVbCXJ0pb4XvqJ5A4QxxH
2009-04-12-13-20    fFAItiBMsgqro9kRdIwbeX60SROaxr
2009-04-12-13-20    V4og4R9W6G3QjHHwF7gI1cSqig5D1G
2009-04-12-13-20    hPEPtBwk45msmwWTxPVVo1kVu4v11b
2009-04-12-13-20    v0SkfxegheD90gp31UCr6FplnKpx6i
2009-04-12-13-20    1iD9odVgOIi4QWkwHMcOhmwTkWDKfj
2009-04-12-13-20    b31tJiIA25CK8eDHQrHnbcknfSndUk
```

### 案例 2：資料未分割 (Hive 格式)
<a name="scenario-2-data-is-not-partitioned"></a>

在下列範例中，`aws s3 ls` 命令顯示存放在 Amazon S3 中的 [ELB](elasticloadbalancer-classic-logs.md) 日誌。請注意，資料配置如何不使用 `key=value` 對，因此不屬於 Hive 格式。(`aws s3 ls` 命令的 `--recursive` 選項指定列出指定目錄或字首下的所有檔案或物件。)

```
aws s3 ls s3://athena-examples-myregion/elb/plaintext/ --recursive

2016-11-23 17:54:46   11789573 elb/plaintext/2015/01/01/part-r-00000-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:46    8776899 elb/plaintext/2015/01/01/part-r-00001-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:46    9309800 elb/plaintext/2015/01/01/part-r-00002-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47    9412570 elb/plaintext/2015/01/01/part-r-00003-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47   10725938 elb/plaintext/2015/01/01/part-r-00004-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:46    9439710 elb/plaintext/2015/01/01/part-r-00005-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47          0 elb/plaintext/2015/01/01_$folder$
2016-11-23 17:54:47    9012723 elb/plaintext/2015/01/02/part-r-00006-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47    7571816 elb/plaintext/2015/01/02/part-r-00007-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47    9673393 elb/plaintext/2015/01/02/part-r-00008-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48   11979218 elb/plaintext/2015/01/02/part-r-00009-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48    9546833 elb/plaintext/2015/01/02/part-r-00010-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48   10960865 elb/plaintext/2015/01/02/part-r-00011-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48          0 elb/plaintext/2015/01/02_$folder$
2016-11-23 17:54:48   11360522 elb/plaintext/2015/01/03/part-r-00012-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48   11211291 elb/plaintext/2015/01/03/part-r-00013-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48    8633768 elb/plaintext/2015/01/03/part-r-00014-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:49   11891626 elb/plaintext/2015/01/03/part-r-00015-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:49    9173813 elb/plaintext/2015/01/03/part-r-00016-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:49   11899582 elb/plaintext/2015/01/03/part-r-00017-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:49          0 elb/plaintext/2015/01/03_$folder$
2016-11-23 17:54:50    8612843 elb/plaintext/2015/01/04/part-r-00018-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:50   10731284 elb/plaintext/2015/01/04/part-r-00019-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:50    9984735 elb/plaintext/2015/01/04/part-r-00020-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:50    9290089 elb/plaintext/2015/01/04/part-r-00021-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:50    7896339 elb/plaintext/2015/01/04/part-r-00022-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    8321364 elb/plaintext/2015/01/04/part-r-00023-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51          0 elb/plaintext/2015/01/04_$folder$
2016-11-23 17:54:51    7641062 elb/plaintext/2015/01/05/part-r-00024-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51   10253377 elb/plaintext/2015/01/05/part-r-00025-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    8502765 elb/plaintext/2015/01/05/part-r-00026-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51   11518464 elb/plaintext/2015/01/05/part-r-00027-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    7945189 elb/plaintext/2015/01/05/part-r-00028-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    7864475 elb/plaintext/2015/01/05/part-r-00029-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51          0 elb/plaintext/2015/01/05_$folder$
2016-11-23 17:54:51   11342140 elb/plaintext/2015/01/06/part-r-00030-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    8063755 elb/plaintext/2015/01/06/part-r-00031-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52    9387508 elb/plaintext/2015/01/06/part-r-00032-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52    9732343 elb/plaintext/2015/01/06/part-r-00033-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52   11510326 elb/plaintext/2015/01/06/part-r-00034-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52    9148117 elb/plaintext/2015/01/06/part-r-00035-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52          0 elb/plaintext/2015/01/06_$folder$
2016-11-23 17:54:52    8402024 elb/plaintext/2015/01/07/part-r-00036-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52    8282860 elb/plaintext/2015/01/07/part-r-00037-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52   11575283 elb/plaintext/2015/01/07/part-r-00038-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:53    8149059 elb/plaintext/2015/01/07/part-r-00039-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:53   10037269 elb/plaintext/2015/01/07/part-r-00040-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:53   10019678 elb/plaintext/2015/01/07/part-r-00041-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:53          0 elb/plaintext/2015/01/07_$folder$
2016-11-23 17:54:53          0 elb/plaintext/2015/01_$folder$
2016-11-23 17:54:53          0 elb/plaintext/2015_$folder$
```

#### 執行 ALTER TABLE ADD PARTITION
<a name="run-alter-table-add-partition"></a>

因為資料不是 Hive 格式，您無法在建立資料表後，使用 `MSCK REPAIR TABLE` 命令將分割區新增至該資料表。相反，您可以使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 命令以手動新增每個分割區。例如，如需載入 s3://athena-examples-*myregion*/elb/plaintext/2015/01/01/ 中的資料，您可以執行下列查詢：請注意，每個 Amazon S3 資料夾不需要單獨的分割區資料欄，且分割區鍵值可與 Amazon S3 索引鍵不同。

```
ALTER TABLE elb_logs_raw_native_part ADD PARTITION (dt='2015-01-01') location 's3://athena-examples-us-west-1/elb/plaintext/2015/01/01/'
```

如果已具有分割區，您會收到 Partition already exists (分割區已存在) 錯誤。若要避免發生此錯誤，您可以使用 `IF NOT EXISTS` 子句。如需詳細資訊，請參閱[ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。如需移除分割區，請使用 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)。

## 考慮分割區投影
<a name="partitions-partition-projection"></a>

若要避免必須自行管理分割區，您可以使用分割區投影。分割區投影是高度已分割的資料表，其結構是提前已知的選項。在分割區投影中，分割區的值和位置是以您所設定的資料表屬性計算，而不是從中繼資料儲存庫所讀取到的來計算。因為記憶體中的計算是比遠端查詢更快，分割區投影的使用可以大幅減少查詢執行時間。

如需詳細資訊，請參閱[透過 Amazon Athena 使用分割區投影](partition-projection.md)。

## 其他資源
<a name="partitions-additional-resources"></a>
+ 如需有關 Firehose 資料分割選項的資訊，請參閱 [Amazon Data Firehose 範例](partition-projection-kinesis-firehose-example.md)。
+ 您可以使用 [JDBC 驅動程式](connect-with-jdbc.md)來自動新增分割區。
+ 您可以使用 CTAS 和 INSERT INTO 來分割資料集。如需詳細資訊，請參閱[使用 CTAS 和 INSERT INTO 以進行 ETL 和資料分析](ctas-insert-into-etl.md)。

# 透過 Amazon Athena 使用分割區投影
<a name="partition-projection"></a>

您可以使用 Athena 中的分割區投影來加速高度分割資料表的查詢處理，以及自動化分割區管理。

在分割區投影中，Athena 會使用您直接在 AWS Glue中的資料表設定的資料表屬性來計算分割區的值和位置。資料表屬性可讓 Athena「投影」或判斷必要的分割區資訊，而不必在 AWS Glue Data Catalog中執行耗時的中繼資料查詢。因為記憶體內操作通常比遠端操作更快，所以分割區投影可以減少對高度分割資料表的查詢執行期。取決於查詢和基礎資料的特定特性，分割區投影可能大幅減少受限於分割區中繼資料擷取的查詢執行期。

## 了解分割區剔除與分割區投影
<a name="partition-projection-pruning-vs-projection"></a>

分割區清除會收集中繼資料，並將它「修剪」至只限適用於查詢的分割區。這通常可加快查詢速度。Athena 會對所有具有分割區資料欄的資料表使用分割區剔除，包括為分割區投影設定的資料表。

一般而言，在處理查詢時，Athena 會`GetPartitions`先呼叫 ， AWS Glue Data Catalog 再執行分割區剔除。如果資料表有大量分割區，使用 `GetPartitions` 可能會對效能造成負面影響。若要避免這種情況，您可以使用分割區投影。分割區投影讓 Athena 可以避免呼叫 `GetPartitions`，因為分割區投影組態可提供 Athena 建置分割區本身的全部所需資訊。

## 如何使用分割區投影
<a name="partition-projection-using"></a>

若要使用分割區投影，請在 AWS Glue Data Catalog 或[外部 Hive 中繼存放](connect-to-data-source-hive.md)區中的資料表屬性中指定每個分割區欄的分割區值和投影類型範圍。資料表上的這些自訂屬性可讓 Athena 知道在資料表上執行查詢時預期的分割區模式。在查詢執行期間，Athena 會使用此資訊投影分割區值，而不是從 AWS Glue Data Catalog 或外部 Hive 中繼存放區擷取它們。這不僅可以減少查詢執行期，還可以自動化分割區管理，因為它不需要在 Athena、 AWS Glue或外部 Hive 中繼存放區中手動建立分割區。

**重要**  
在資料表上啟用分割區投影會導致 Athena 忽略註冊到 AWS Glue Data Catalog 或 Hive 中繼存放區中資料表的任何分割區中繼資料。

## 一些使用案例
<a name="partition-projection-use-cases"></a>

適合使用分割區投影的案例包括下列：
+ 針對高度分割資料表的查詢無法如您所願的那麼快完成。
+ 隨著在資料中建立新的日期或時間分割區，您定期將分割區新增至資料表。使用分割區投影，您可以設定相對日期範圍，以便在新資料到達時使用。
+ 您在 Amazon S3 中有高度分割的資料。資料在 AWS Glue Data Catalog 或 Hive 中繼存放區中建立模型並不切實際，您的查詢只會讀取其中的一小部分。

### 可投影的分割區結構
<a name="partition-projection-known-data-structures"></a>

當您的分割區遵循可預測的模式 (例如，但不限於下列項目) 時，分割區投影最容易設定：
+ **整數** – 任何連續的整數序列，例如 `[1, 2, 3, 4, ..., 1000]` 或 `[0500, 0550, 0600, ..., 2500]`。
+ **日期** – 任何連續的日期或日期時間序列，例如 `[20200101, 20200102, ..., 20201231]` 或 `[1-1-2020 00:00:00, 1-1-2020 01:00:00, ..., 12-31-2020 23:00:00]`。
+ **列舉值** – 一組有限的列舉值，例如機場代碼或 AWS 區域。
+ **AWS 服務 日誌** – AWS 服務 日誌通常具有已知的結構，您可以在其中指定分割區配置 AWS Glue ，因此 Athena 可以用於分割區投影。

### 如何自訂分割區路徑範本
<a name="partition-projection-custom-s3-storage-locations"></a>

依預設，Athena 會使用格式 `s3://amzn-s3-demo-bucket/<table-root>/partition-col-1=<partition-col-1-val>/partition-col-2=<partition-col-2-val>/` 建置分割區位置，但如果您的資料以不同的方式組織，Athena 也提供自訂此路徑範本的機制。如需這些步驟，請參閱 [如何指定自訂 S3 儲存位置](partition-projection-setting-up.md#partition-projection-specifying-custom-s3-storage-locations)。

## 考量和限制
<a name="partition-projection-considerations-and-limitations"></a>

適用下列注意事項：
+ 分割區投影無須在 AWS Glue 或外部 Hive 中繼存放區手動指定分割區。
+ 當您在資料表上啟用分割區投影時，Athena 會忽略該資料表的 AWS Glue Data Catalog 或外部 Hive 中繼存放區中的任何分割區中繼資料。
+ 如果投影的分割區不存在於 Amazon S3 中，Athena 仍會投影該分割區。Athena 不會擲回錯誤，但也不會傳回任何資料。不過，如果太多分割區是空的，效能可能會比傳統 AWS Glue 分割區慢。如果超過一半的投影分割區是空的，建議您使用傳統分割區。
+ 如果數值超過分割區投影定義的範圍邊界，查詢不會傳回錯誤。查詢反而會執行，但不會傳回任何資料行。例如，如果您擁有自 2020 年起並定義為 `'projection.timestamp.range'='2020/01/01,NOW'` 的時間相關資料，如 `SELECT * FROM table-name WHERE timestamp = '2019/02/02'` 等的查詢將成功完成，但不會傳回任何資料行。
+ 分割區投影只適用於透過 Athena 查詢資料表時。如果透過其他服務 (例如 Amazon Redshift Spectrum、Athena for Spark 或 Amazon EMR) 讀取相同的資料表，則會使用標準的分割區中繼資料。
+ 由於分割區投影是僅限 DML 的功能， `SHOW PARTITIONS` 不會列出 Athena 投影但未在 AWS Glue 目錄或外部 Hive 中繼存放區中註冊的分割區。
+ Athena 未將檢視的資料表屬性作為分割區投影的組態。若要解決此限制，請在檢視參照之資料表的資料表屬性中設定並啟用分割區投影。

## 影片
<a name="partition-projection-video"></a>

以下影片展示如何使用分割區投影，改善在 Athena 中的查詢效能。

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


**Topics**
+ [了解分割區剔除與分割區投影](#partition-projection-pruning-vs-projection)
+ [如何使用分割區投影](#partition-projection-using)
+ [一些使用案例](#partition-projection-use-cases)
+ [考量和限制](#partition-projection-considerations-and-limitations)
+ [影片](#partition-projection-video)
+ [設定分割區投影](partition-projection-setting-up.md)
+ [支援的分割區投影類型](partition-projection-supported-types.md)
+ [使用動態 ID 分割](partition-projection-dynamic-id-partitioning.md)
+ [Amazon Data Firehose 範例](partition-projection-kinesis-firehose-example.md)

# 設定分割區投影
<a name="partition-projection-setting-up"></a>

在資料表屬性中設定分割區投影共有兩個步驟：

1. 為每個分割區資料欄指定資料範圍和相關模式，或使用自訂範本。

1. 啟用資料表的分割區投影。

**注意**  
在您將分割區投影屬性新增至現有的資料表之前，您要設定分割區投影屬性的分割區資料欄必須已經存在於資料表結構描述中。如果分割區資料欄尚不存在，您必須手動將分割區資料欄新增至現有資料表。 AWS Glue 不會自動為您執行此步驟。

本節說明如何設定 的資料表屬性 AWS Glue。若要設定它們，您可以使用 AWS Glue 主控台、Athena [CREATE TABLE](create-table.md)查詢或 [AWS Glue API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api.html)操作。下列程序說明如何在 AWS Glue 主控台中設定屬性。

**使用 AWS Glue 主控台設定和啟用分割區投影**

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

1. 選擇 **Tables** (資料表) 索引標籤。

   在 **Tables** (資料表) 索引標籤上，您可以編輯現有資料表，或選擇 **Add tables** (新增資料表) 以建立新的資料表。如需有關手動或使用爬蟲程式新增資料表的資訊，請參閱《AWS Glue 開發人員指南》**中的 [在 AWS Glue 主控台上使用資料表。](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html)

1. 在資料表清單中，選擇您要編輯之資料表的連結。  
![\[在 AWS Glue 主控台中，選擇要編輯的資料表。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/partition-projection-1.png)

1. 選擇 **Actions** (動作)、**Edit table** (編輯資料表)。

1. 在 **Edit table** (編輯資料表) 頁面的 **Table properties** (資料表屬性) 區段中，針對每個分割的資料欄新增下列索引鍵/值組：

   1. 對於 **Key** (索引鍵)，新增 `projection.columnName.type`。

   1. 對於 **Value** (值)，新增其中一個支援的類型：`enum`、`integer`、`date` 或 `injected`。如需詳細資訊，請參閱[支援的分割區投影類型](partition-projection-supported-types.md)。

1. 遵循[支援的分割區投影類型](partition-projection-supported-types.md)中的指導，根據您的組態需求新增額外的索引鍵/值組。

   下列範例資料表組態會設定分割區投影的 `year` 資料欄，限制可傳回值的範圍為 2010 年到 2016 年。  
![\[在 AWS Glue 主控台資料表屬性中為分割區資料欄設定分割區投影。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/partition-projection-3.png)

1. 新增索引鍵/值組以啟用分割區投影。對於 **Key** (索引鍵)，輸入 `projection.enabled`，對於其 **Value** (值)，輸入 `true`。
**注意**  
您可以透過將 `projection.enabled` 設定為 `false`，隨時停用此資料表上的分割區投影。

1. 完成時，請選擇 **Save (儲存)**。

1. 在 Athena 查詢編輯器中，測試查詢您為資料表設定的資料欄。

   下列範例查詢使用 `SELECT DISTINCT` 從 `year` 資料欄傳回唯一值。資料庫包含 1987 年到 2016 年的資料，但 `projection.year.range` 屬性將傳回的值限制為 2010 年到 2016 年。  
![\[查詢使用分割區投影的資料欄。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/partition-projection-5.png)
**注意**  
如果您將 `projection.enabled` 設定為 `true` 但無法設定一或多個分割區資料欄，您會收到如下所示的錯誤訊息：  
`HIVE_METASTORE_ERROR: Table database_name.table_name is configured for partition projection, but the following partition columns are missing projection configuration: [column_name] (table database_name.table_name)`.

## 如何指定自訂 S3 儲存位置
<a name="partition-projection-specifying-custom-s3-storage-locations"></a>

在 中編輯資料表屬性時 AWS Glue，您也可以為投影的分割區指定自訂 Amazon S3 路徑範本。自訂範本可讓 Athena 將分割區值正確地對應到不遵循典型 `.../column=value/...` 模式的自訂 Amazon S3 檔案位置。

使用自訂範本是選擇性的。不過，如果您使用自訂範本，則範本必須包含每個分割區資料欄的預留位置。範本位置必須以正斜線結尾，以便分割的資料檔案存在於每個分割區的「資料夾」中。

**指定自訂分割區位置範本**

1. 依照[使用 AWS Glue 主控台設定和啟用分割區投影](#partition-projection-setting-up-procedure)的步驟，新增額外的鍵/值對，指定自訂範本，如下所示：

   1. 在 **Key** (索引鍵) 欄位，輸入 `storage.location.template`。

   1. 對於 **Value** (值)，指定包含每個分割區資料欄之預留位置的位置。請確定每個預留位置 (及 S3 路徑本身) 是以單一正斜線結尾。

      下列範例範本值假設資料表具有分割區資料欄 `a`、`b` 和 `c`。

      ```
      s3://amzn-s3-demo-bucket/table_root/a=${a}/${b}/some_static_subdirectory/${c}/      
      ```

      ```
      s3://amzn-s3-demo-bucket/table_root/c=${c}/${b}/some_static_subdirectory/${a}/${b}/${c}/${c}/      
      ```

      對於相同的資料表，下列範例範本值無效，因為它不包含資料欄 `c` 的預留位置。

      ```
      s3://amzn-s3-demo-bucket/table_root/a=${a}/${b}/some_static_subdirectory/         
      ```

1. 選擇 **Apply** (套用)。

# 支援的分割區投影類型
<a name="partition-projection-supported-types"></a>

資料表可以具有 `enum`、`integer`、`date,` 或 `injected` 分割區資料欄類型的任意組合。

## 列舉類型
<a name="partition-projection-enum-type"></a>

將 `enum`類型用於值為列舉集合成員的分割區資料欄 （例如，機場代碼 或 AWS 區域)。

在資料表中定義分割區屬性，如下所示：


****  

| 屬性名稱 | 範例值 | Description | 
| --- | --- | --- | 
| projection.columnName.type |  `enum`  | 必要。用於資料欄 columnName 的投影類型。該值必須是 enum (不區分大小寫) 以表示使用列舉類型。允許開頭和結尾空格。 | 
| projection.columnName.values |  `A,B,C,D,E,F,G,Unknown`  | 必要. 用於資料欄 columnName 之以逗號分隔的列舉分割區值清單。任何空格都會被視為列舉值的一部分。 | 

**注意**  
建議的最佳實務是將 `enum` 型分割區投影的使用限制成幾十個或以下。雖然`enum`投影沒有特定限制，但 gzip 壓縮時，資料表中繼資料的總大小不得超過約 1 MB AWS Glue 的限制。請注意，您資料表的主要部分會共用此限制，例如資料欄名稱、位置、儲存格式等。如果您發現自己在 `enum` 投影中使用幾十個以上的唯一 ID，請考慮使用替代方法，例如歸納為代理欄位中較少數的唯一數值。您可以透過取捨基數的方式，控制 `enum` 欄位中唯一數值的數量。

## 整數類型
<a name="partition-projection-integer-type"></a>

對於其可能值會被解譯為定義範圍內整數的分割區資料欄，請使用整數類型。投影整數資料欄目前限制為帶正負號的 Java 長整數範圍 (-263 至 263-1，含)。


****  

| 屬性名稱 | 範例值 | Description | 
| --- | --- | --- | 
| projection.columnName.type |  `integer`  | 必要。用於資料欄 columnName 的投影類型。該值必須是 integer (不區分大小寫) 以表示使用整數類型。允許開頭和結尾空格。 | 
| projection.columnName.range |  `0,10` `-1,8675309` `0001,9999`  | 必要. 以逗號分隔的雙元素清單，提供資料欄 columnName 上的查詢要傳回的最小和最大範圍值。請注意，值必須以逗號分隔，而非連字號。這些值包含在內，可以是負的，也可以以零開頭。允許開頭和結尾空格。 | 
| projection.columnName.interval |  `1` `5`  | 選用。正整數，指定用於資料欄 columnName 之連續分割區值之間的間隔。例如，range 值 "1,3" 具有 "1" 的 interval 值，會產生 1、2 和 3 的值。range 值相同但 interval 值為 "2" 會產生 1 和 3 的值，略過 2。允許開頭和結尾空格。預設為 1。 | 
| projection.columnName.digits |  `1` `5`  | 選用。正整數，指定用於資料欄 columnName 之分割區值最終表示法中要包含的位數。例如，range 值 "1,3" 具有 "1" 的 digits 值，會產生 1、2 和 3 的值。range 值相同但 digits 值為 "2" 會產生 01、02 和 03 的值。允許開頭和結尾空格。預設值是非靜態位數，且不以零開頭。 | 

## 日期類型
<a name="partition-projection-date-type"></a>

對於其值會被解譯為定義範圍內之日期 (以及選用的時間) 的分割區資料欄，請使用整數類型。

**重要**  
投影的日期資料欄會在查詢執行期以國際標準時間 (UTC) 產生。


****  

| 屬性名稱 | 範例值 | Description | 
| --- | --- | --- | 
| projection.columnName.type |  `date`  | 必要。用於資料欄 columnName 的投影類型。該值必須是 date (不區分大小寫) 以表示使用日期類型。允許開頭和結尾空格。 | 
| projection.columnName.range |  `201701,201812` `01-01-2010,12-31-2018` `NOW-3YEARS,NOW` `201801,NOW+1MONTH`  |  必要. 以逗號分隔的雙元素清單，提供資料欄 *columnName* 的最小和最大 `range` 值。這些數值包含在內，可以使用與 Java `java.time.*` 日期類型相容的任何格式。最小值和最大值都必須使用相同的格式。`.format` 屬性中指定的格式必須是用於這些值的格式。 此資料欄也可以包含相對日期字串，格式化為此規則運算式模式： `\s*NOW\s*(([\+\-])\s*([0-9]+)\s*(YEARS?\|MONTHS?\|WEEKS?\|DAYS?\|HOURS?\|MINUTES?\|SECONDS?)\s*)?` 允許使用空格，但在日期常值中會被視為日期字串本身的一部分。  | 
| projection.columnName.format |  `yyyyMM` `dd-MM-yyyy` `dd-MM-yyyy-HH-mm-ss`  | 必要. 根據 Java 日期格式 [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html) 的日期格式字串。可以是任何支援的 Java.time.\$1 類型。 | 
| projection.columnName.interval |  `1` `5`  |  正整數，指定用於資料欄 *columnName* 之連續分割區值之間的間隔。例如，`range` 值為 `2017-01,2018-12` 搭配 `interval` 值為 `1` 以及 `interval.unit` 值為 `MONTHS`，會產生值 2017-01、2017-02、2017-03 等。相同的 `range` 值搭配 `interval` 值為 `2` 且 `interval.unit` 值為 `MONTHS`，會產生值 2017-01、2017-03、2017-05 等。允許開頭和結尾空格。 如果提供的日期採用單日或單月精確度，則 `interval` 是選用的，並且分別預設為 1 天或 1 個月。否則，`interval` 是必要的。  | 
| projection.columnName.interval.unit |  `YEARS` `MONTHS` `WEEKS` `DAYS` `HOURS` `MINUTES` `SECONDS` `MILLIS`  |  時間單位，代表 [ChronoUnit](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoUnit.html) 的序列化格式。可能值為 `YEARS`、`MONTHS`、`WEEKS`、`DAYS`、`HOURS`、`MINUTES`、`SECONDS` 或 `MILLIS`。這些值不區分大小寫。 如果提供的日期採用單日或單月精確度，則 `interval.unit` 是選用的，並且分別預設為 1 天或 1 個月。否則，`interval.unit` 是必要的。  | 

**Example – 按月份分割**  
下列範例資料表組態會按月份分割 2015 年至今的資料。  

```
'projection.month.type'='date', 
'projection.month.format'='yyyy-MM', 
'projection.month.interval'='1', 
'projection.month.interval.unit'='MONTHS', 
'projection.month.range'='2015-01,NOW', 
...
```

## 注入類型
<a name="partition-projection-injected-type"></a>

注入類型適用於其可能值不能在某個邏輯範圍內依程序產生，但可在查詢的 `WHERE` 子句中作為單一值提供的分割區資料欄。

請務必牢記以下幾點：
+ 如果未為每個注入的資料欄提供篩選條件表達式，則注入資料欄上的查詢會失敗。
+ 只有當值為分離值時，才能成功在注入資料欄上針對篩選條件表達式查詢多個值。
+ 僅支援 `string` 類型的資料欄。
+ 當您使用具有注入的分割區資料欄的 `WHERE IN` 子句時，您可在 `IN` 清單中指定的值的限制為 1,000 個。若要查詢的資料集包含的注入資料欄具有超過 1,000 個分割區，則請將查詢分割為多個較小的查詢，每個查詢的 `WHERE IN` 子句中最多可以包含 1,000 個值，然後彙總結果。


****  

| 屬性名稱 | Value | Description | 
| --- | --- | --- | 
| projection.columnName.type |  `injected`  | 必要. 用於資料欄 columnName 的投影類型。僅支援 string 類型。指定的值必須是 injected (不區分大小寫)。允許開頭和結尾空格。 | 

如需詳細資訊，請參閱[何時使用 `injected` 投影類型](partition-projection-dynamic-id-partitioning.md#partition-projection-injection)。

# 使用動態 ID 分割
<a name="partition-projection-dynamic-id-partitioning"></a>

當您的資料以高基數屬性分割，或者無法事先知道這些值時，您可使用 `injected` 投影類型。此類屬性的範例包括使用者名稱，以及裝置或產品的 ID。當您使用 `injected` 投影類型來設定分割區索引鍵時，Athena 會使用查詢本身的值來計算將要讀取的分割區集。

對於具有使用 `injected` 投影類型設定的分割區索引鍵的資料表，若要讓 Athena 能夠在此類資料表上執行查詢，必須符合下列條件：
+ 您的查詢必須包含至少一個分割區索引鍵值。
+ 值必須是文字或運算式，可在不讀取任何資料的情況下進行評估。

如果不滿足上述任何條件，您的查詢會失敗，並出現下列錯誤：

CONSTRAINT\$1VIOLATION：對於注入的投影分割區資料欄 *column\$1name*，WHERE 子句必須僅包含靜態等式條件，且必須至少存在一個此類條件。

## 何時使用 `injected` 投影類型
<a name="partition-projection-injection"></a>

假設您有一個資料集，其中包含 IoT 裝置的事件，並根據裝置的 ID 進行分割。此資料集具有下列特性：
+ 裝置 ID 隨機產生。
+ 新裝置會經常進行佈建。
+ 目前有數十萬部裝置，未來將會有數百萬部裝置。

使用傳統的中繼儲存難以管理此資料集。在資料儲存與中繼儲存之間難以保持分割區同步，並且在查詢規劃期間篩選分割區可能較慢。但是，如果您將資料表設定為使用分割區投影，並使用 `injected` 投影類型，則有兩項優勢：您不必管理中繼儲存中的分割區，並且您的查詢也不必查詢分割區中繼資料。

下列 `CREATE TABLE` 範例會針對剛才描述的裝置事件資料集來建立資料表。該資料表使用注入的投影類型。

```
CREATE EXTERNAL TABLE device_events (
  event_time TIMESTAMP,
  data STRING,
  battery_level INT
)
PARTITIONED BY (
  device_id STRING
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
  "projection.enabled" = "true",
  "projection.device_id.type" = "injected",
  "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${device_id}"
)
```

下列範例查詢會查詢 12 小時內，從三個特定裝置接收的事件數目。

```
SELECT device_id, COUNT(*) AS events
FROM device_events
WHERE device_id IN (
  '4a770164-0392-4a41-8565-40ed8cec737e',
  'f71d12cf-f01f-4877-875d-128c23cbde17',
  '763421d8-b005-47c3-ba32-cc747ab32f9a'
)
AND event_time BETWEEN TIMESTAMP '2023-11-01 20:00' AND TIMESTAMP '2023-11-02 08:00'
GROUP BY device_id
```

當您執行此查詢時，Athena 會看到 `device_id` 分割區索引鍵的三個值，並使用這些值來計算分割區位置。Athena 會使用 `storage.location.template` 屬性的值來產生下列位置：
+ `s3://amzn-s3-demo-bucket/prefix/4a770164-0392-4a41-8565-40ed8cec737e`
+ `s3://amzn-s3-demo-bucket/prefix/f71d12cf-f01f-4877-875d-128c23cbde17`
+ `s3://amzn-s3-demo-bucket/prefix/763421d8-b005-47c3-ba32-cc747ab32f9a`

如果您從分割區投影組態中省略 `storage.location.template` 屬性，Athena 會根據 `LOCATION` 中的值 (例如 `s3://amzn-s3-demo-bucket/prefix/device_id=4a770164-0392-4a41-8565-40ed8cec737e`)，使用 HIVE 樣式的分割區來投影分割區位置。

# Amazon Data Firehose 範例
<a name="partition-projection-kinesis-firehose-example"></a>

當您使用 Firehose 將資料交付到 Amazon S3 時，預設組態會使用下列範例所示的索引鍵來寫入物件：

```
s3://amzn-s3-demo-bucket/prefix/yyyy/MM/dd/HH/file.extension
```

若要建立 Athena 資料表，在查詢時間自動尋找分割區，而不必在新資料送達 AWS Glue Data Catalog 時將其新增至 ，您可以使用分割區投影。

下列 `CREATE TABLE` 範例使用的是預設的 Firehose 組態。

```
CREATE EXTERNAL TABLE my_ingested_data (
 ...
)
...
PARTITIONED BY (
 datehour STRING
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
 "projection.enabled" = "true",
 "projection.datehour.type" = "date",
 "projection.datehour.format" = "yyyy/MM/dd/HH",
 "projection.datehour.range" = "2021/01/01/00,NOW",
 "projection.datehour.interval" = "1",
 "projection.datehour.interval.unit" = "HOURS",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${datehour}/"
)
```

`CREATE TABLE` 陳述式中的 `TBLPROPERTIES` 子句告訴 Athena 以下內容：
+ 查詢資料表時使用分割區投影
+ 分割區索引鍵 `datehour` 的類型為 `date` (其中包括可選時間)
+ 將日期格式化的方式
+ 日期時間的範圍。請注意，值必須以逗號分隔，而非連字號。
+ 可尋找 Amazon S3 上資料的位置。

當您查詢資料表時，Athena 會計算 `datehour` 的值，並使用儲存位置範本來產生分割區位置的清單。

**Topics**
+ [如何使用 `date` 類型](partition-projection-kinesis-firehose-example-using-the-date-type.md)
+ [如何選擇分割區索引鍵](partition-projection-kinesis-firehose-example-choosing-partition-keys.md)
+ [如何使用自訂字首和動態分割](partition-projection-kinesis-firehose-example-using-custom-prefixes-and-dynamic-partitioning.md)

# 如何使用 `date` 類型
<a name="partition-projection-kinesis-firehose-example-using-the-date-type"></a>

當您將 `date` 類型用於投影分割區索引鍵時，您必須指定範圍。因為您在建立 Firehose 交付串流之前沒有日期資料，您可以使用建立日期作為開始日期。並且因為您沒有未來日期的資料，您可以使用特殊字符 `NOW` 作為結束。

在 `CREATE TABLE` 範例中，開始日期指定為世界協調時間 (UTC) 2021 年 1 月 1 日午夜。

**注意**  
設定與您的資料盡可能相符的範圍，以便 Athena 僅查詢現有分割區。

在範例資料表上執行查詢時，Athena 將 `datehour` 分割區索引鍵上的條件與範圍結合使用來產生值。請考處下列查詢：

```
SELECT *
FROM my_ingested_data
WHERE datehour >= '2020/12/15/00'
AND datehour < '2021/02/03/15'
```

`SELECT` 查詢中的第一個條件會使用日期，該日期會在 `CREATE TABLE` 陳述句指定的日期範圍開始之前。由於分割區投影組態沒有為 2021 年 1 月 1 日之前的日期指定分割區，因此 Athena 僅在以下位置查詢資料，並忽略查詢中較早的日期。

```
s3://amzn-s3-demo-bucket/prefix/2021/01/01/00/
s3://amzn-s3-demo-bucket/prefix/2021/01/01/01/
s3://amzn-s3-demo-bucket/prefix/2021/01/01/02/
...
s3://amzn-s3-demo-bucket/prefix/2021/02/03/12/
s3://amzn-s3-demo-bucket/prefix/2021/02/03/13/
s3://amzn-s3-demo-bucket/prefix/2021/02/03/14/
```

同樣地，如果在 2021 年 2 月 3 日 15:00 之前的日期和時間執行查詢，則最後一個分割區會反映目前的日期和時間，而不是在查詢條件中的日期和時間。

如果要查詢最新資料，您可以利用 Athena 不產生未來日期並僅指定開頭 `datehour` 的事實，如下列範例所示。

```
SELECT *
FROM my_ingested_data
WHERE datehour >= '2021/11/09/00'
```

# 如何選擇分割區索引鍵
<a name="partition-projection-kinesis-firehose-example-choosing-partition-keys"></a>

您可以指定分割區投影將分割區位置映射至分割區索引鍵的方式。在前一部份的 `CREATE TABLE` 範例中，日期和小時被合併成一個名為 datehour 的分割區索引鍵，但也可以使用其他結構描述。例如，您也可以針對年份、月份、日期及小時，設定個別分割區索引鍵的資料表。

但是，將日期分割為年、月和日，表示無法使用 `date` 分割區投影類型。另一種方法是將日期與小時分開，即可仍然利用 `date` 分割區投影類型，但讓指定小時範圍的查詢更易於閱讀。

請記住，以下 `CREATE TABLE` 範例將日期與小時分開。由於 `date` 是 SQL 中的保留字詞，因此此範例會用 `day` 表示日期之分割區索引鍵的名稱。

```
CREATE EXTERNAL TABLE my_ingested_data2 (
 ...
)
...
PARTITIONED BY (
 day STRING,
 hour INT
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
 "projection.enabled" = "true",
 "projection.day.type" = "date",
 "projection.day.format" = "yyyy/MM/dd",
 "projection.day.range" = "2021/01/01,NOW",
 "projection.day.interval" = "1",
 "projection.day.interval.unit" = "DAYS",
 "projection.hour.type" = "integer",
 "projection.hour.range" = "0,23",
 "projection.hour.digits" = "2",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${day}/${hour}/"
)
```

在範例 `CREATE TABLE` 陳述式中，小時是個別的分割區索引鍵並設定為整數。小時分割區索引鍵的組態會指定範圍 0 到 23，而當 Athena 產生分割區位置時，小時應該格式化為兩位數。

對 `my_ingested_data2` 資料表的查詢可能如下所示：

```
SELECT *
FROM my_ingested_data2
WHERE day = '2021/11/09'
AND hour > 3
```

## 了解分割區索引鍵和分割區投影資料類型
<a name="partition-projection-kinesis-firehose-example-partition-key-types-and-partition-projection-types"></a>

請注意，第一個 `CREATE TABLE` 範例中的 `datehour` 索引鍵在分割區投影組態中設定為 `date`，但是分割區索引鍵的類型為 `string`。第二個範例中的 `day` 也是如此。分割區投影組態中的類型只會告訴 Athena 在產生分割區位置時如何將值格式化。您指定的類型不會變更分割區索引鍵的類型；在查詢中，`datehour` 和 `day` 為 `string` 類型。

當查詢包含類似 `day = '2021/11/09'` 的條件時，Athena 會使用分割區投影組態中指定的日期格式剖析表達式右側的字串。在 Athena 確認日期是否位於所設定範圍後，它會再次使用日期格式將日期作為字串插入儲存位置範本。

同樣，對於像 `day > '2021/11/09'` 的查詢條件，Athena 會剖析右側並產生設定範圍內所有相符日期的清單。然後，它會使用日期格式將每個日期插入儲存位置範本，以建立分割區位置的清單。

寫入與 `day > '2021-11-09'` 或 `day > DATE '2021-11-09'` 相同的條件不起作用。在第一種情況下，日期格式不相符 (請注意連字號而不是正斜線)，而在第二種情況下，資料類型不相符。

# 如何使用自訂字首和動態分割
<a name="partition-projection-kinesis-firehose-example-using-custom-prefixes-and-dynamic-partitioning"></a>

可以使用[自訂字首](https://docs.aws.amazon.com/firehose/latest/dev/s3-prefixes.html)和[動態分割](https://docs.aws.amazon.com/firehose/latest/dev/dynamic-partitioning.html)設定 Firehose。使用這些功能，您可以設定 Amazon S3 索引鍵，並設定能對您使用案例提供更佳支援的分割區結構描述。您還可以將分割區投影與這些分割結構描述搭配使用並相應地設定它們。

例如，您可以使用自訂字首功能來取得具有 ISO 格式化日期的 Amazon S3 索引鍵，而不是預設 `yyyy/MM/dd/HH` 結構描述。

您還可以將自訂字首與動態分割結合，從 Firehose 訊息中擷取類似於 `customer_id` 的內容，如下列範例所示。

```
prefix/!{timestamp:yyyy}-!{timestamp:MM}-!{timestamp:dd}/!{partitionKeyFromQuery:customer_id}/
```

使用 Amazon S3 字首，Firehose 交付串流會將物件寫入索引鍵，例如 `s3://amzn-s3-demo-bucket/prefix/2021-11-01/customer-1234/file.extension`。對於像 `customer_id` 的屬性，其中值並未事先知道，您可以使用分割區投影類型 `injected` 並使用 `CREATE TABLE` 陳述式，如下所示：

```
CREATE EXTERNAL TABLE my_ingested_data3 (
 ...
)
...
PARTITIONED BY (
 day STRING,
 customer_id STRING
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
 "projection.enabled" = "true",
 "projection.day.type" = "date",
 "projection.day.format" = "yyyy-MM-dd",
 "projection.day.range" = "2021-01-01,NOW",
 "projection.day.interval" = "1",
 "projection.day.interval.unit" = "DAYS",
 "projection.customer_id.type" = "injected",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${day}/${customer_id}/"
)
```

當您查詢具有類型 `injected` 的分割區索引鍵的資料表時，您的查詢必須包含該分割區索引鍵的值。對 `my_ingested_data3` 資料表的查詢可能如下所示：

```
SELECT *
FROM my_ingested_data3
WHERE day BETWEEN '2021-11-01' AND '2021-11-30'
AND customer_id = 'customer-1234'
```

## 使用 DATE 類型作為日期分割區索引鍵
<a name="partition-projection-kinesis-firehose-example-iso-formatted-dates"></a>

因為 `day` 分割區索引鍵的值是 ISO 格式化，所以您也可以使用 `DATE` 類型而不是 `STRING` 來做為日期分割區索引鍵，如下列範例所示：

```
PARTITIONED BY (day DATE, customer_id STRING)
```

當您查詢時，此策略可讓您在分割區索引鍵上使用日期函數，而不需要剖析或轉換，如下列範例所示：

```
SELECT *
FROM my_ingested_data3
WHERE day > CURRENT_DATE - INTERVAL '7' DAY
AND customer_id = 'customer-1234'
```

**注意**  
指定 `DATE` 類型的分割區索引鍵，假設您已使用[自訂字首](https://docs.aws.amazon.com/firehose/latest/dev/s3-prefixes.html)功能建立具有 ISO 格式化日期的 Amazon S3 索引鍵。如果您使用預設的 Firehose 格式 `yyyy/MM/dd/HH`，即使對應的資料表屬性為類型 `date`，您仍必須將分割區索引鍵指定為類型 `string`，如下列範例所示：  

```
PARTITIONED BY ( 
  `mydate` string)
TBLPROPERTIES (
  'projection.enabled'='true', 
   ...
  'projection.mydate.type'='date',
  'storage.location.template'='s3://amzn-s3-demo-bucket/prefix/${mydate}')
```

# 防止 Amazon S3 限流
<a name="performance-tuning-s3-throttling"></a>

限流是限制您使用服務、應用程式或系統的速率的程序。在 中 AWS，您可以使用限流來防止過度使用 Amazon S3 服務，並提高所有使用者的 Amazon S3 可用性和回應能力。但是，由於限流限制了資料傳輸到 Amazon S3 或從 Amazon S3 傳輸的速率，因此請務必考慮防止您的互動受到限流。

正如[效能調校](performance-tuning.md)章節所述，最佳化取決於您的服務層級決策、您建構資料表和資料的方式，以及您寫入查詢的方式。

**Topics**
+ [減少服務層級的限流](performance-tuning-s3-throttling-reduce-throttling-at-the-service-level.md)
+ [最佳化您的資料表](performance-tuning-s3-throttling-optimizing-your-tables.md)
+ [最佳化您的查詢](performance-tuning-s3-throttling-optimizing-queries.md)

# 減少服務層級的限流
<a name="performance-tuning-s3-throttling-reduce-throttling-at-the-service-level"></a>

若要避免 Amazon S3 在服務層級的限流，您可以監控您的用量並調整[服務配額](https://docs.aws.amazon.com/general/latest/gr/s3.html#limits_s3)，或者使用分割等特定技術。以下某些條件可能導致限流：
+ **超出帳戶的 API 請求限制** – Amazon S3 具有基於帳戶類型和用量的預設 API 請求限制。如果您超過單一字首每秒的請求數目上限，則您的請求可能會受到限流，以防止 Amazon S3 服務多載。
+ **資料分割不足** – 如果您沒有正確地分割資料並傳輸大量資料，Amazon S3 可能會對您的請求限流。如需有關分割的詳細資訊，請參閱本文件中的 [使用分割區](performance-tuning-s3-throttling-optimizing-your-tables.md#performance-tuning-s3-throttling-use-partitioning) 部分。
+ **大量小型物件** – 如果可能，請避免擁有大量小型檔案。Amazon S3 每個分割的字首具有每秒 [5500 個 GET 請求](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html)的限制，而您的 Athena 查詢也共用此相同限制。如果您在單一查詢中掃描數百萬個小型物件，您的查詢將很容易受到 Amazon S3 限流。

若要避免過度掃描，您可以使用 AWS Glue ETL 定期壓縮檔案，或分割資料表並新增分割區索引鍵篩選條件。如需詳細資訊，請參閱下列資源。
+ [如何設定 AWS Glue ETL 任務以輸出較大的檔案？](https://aws.amazon.com/premiumsupport/knowledge-center/glue-job-output-large-files/) (*AWS 知識中心*)
+ [讀取較大群組中的輸入檔案](https://docs.aws.amazon.com/glue/latest/dg/grouping-input-files.html) *AWS Glue （開發人員指南*)

# 最佳化您的資料表
<a name="performance-tuning-s3-throttling-optimizing-your-tables"></a>

如果遇到限流問題，建構資料很重要。雖然 Amazon S3 可以處理大量資料，但有時會因為資料的建構方式而發生限流。

下列各節就如何在 Amazon S3 中建構資料以避免限流問題提供了一些建議。

## 使用分割區
<a name="performance-tuning-s3-throttling-use-partitioning"></a>

您可以限制在任何指定時間內存取的資料量，使用分割來減少限流。藉由分割特定資料欄上的資料，您可以將請求平均分散至多個物件，並減少單一物件的請求數目。減少必須掃描的資料量會改善查詢效能並降低成本。

您可以在建立資料表時，定義可做為虛擬資料欄的分割區。若要在 `CREATE TABLE` 陳述式中建立含有分割區的資料表，您可以使用 `PARTITIONED BY (column_name data_type)` 子句來定義分割資料的索引鍵。

若要限制查詢掃描的分割區，您可以在查詢的 `WHERE` 子句中將其指定為述詞。因此，經常用作篩選器的資料欄是分割的理想候選者。常見做法是根據時間間隔來分割資料，這通常會產生多層級的分割機制。

請注意，分割也有成本。當您增加資料表中的分割區數目時，擷取和處理分割區中繼資料所需的時間也會增加。因此，過度分割會消除您透過更明智分區而獲得的益處。如果您的資料明顯集中於一個分割區值，並且大多數查詢使用該值，則可能會產生額外開銷。

如需有關在 Athena 中分割的詳細資訊，請參閱 [什麼是分割？](ctas-partitioning-and-bucketing-what-is-partitioning.md)

## 歸納您的資料
<a name="performance-tuning-s3-throttling-bucket-your-data"></a>

分割資料的另一個方法是將資料歸納在單一分割區內。使用歸納功能時，您可以指定一或多個資料欄，其中包含要組合在一起的資料列。然後，將這些資料列放入多個儲存貯體中。如此一來，您只會查詢必須讀取的儲存貯體，從而減少必須掃描的資料列數目。

當您選取要用於歸納的資料欄時，請選取具有高基數 (亦即，具有許多不同值)、均勻分散且經常用來篩選資料的資料欄。主索引鍵 (例如 ID 資料欄) 是用來歸納的良好資料欄範例。

如需有關在 Athena 中歸納的詳細資訊，請參閱 [什麼是歸納？](ctas-partitioning-and-bucketing-what-is-bucketing.md)。

## 使用 AWS Glue 分割區索引
<a name="performance-tuning-s3-throttling-use-aws-glue-partition-indexes"></a>

您可以使用 AWS Glue 分割區索引，根據一或多個分割區的值整理資料表中的資料。 AWS Glue 分割區索引可減少資料傳輸的數量、資料處理量，以及查詢的處理時間。

 AWS Glue 分割區索引是中繼資料檔案，其中包含資料表中分割區的相關資訊，包括分割區索引鍵及其值。分割區索引存放在 Amazon S3 儲存貯體中，當新的分割區新增至資料表 AWS Glue 時， 會自動更新分割區索引。

當 AWS Glue 分割區索引存在時，查詢會嘗試擷取分割區的子集，而不是載入資料表中的所有分割區。查詢只會在與查詢相關的資料子集上執行。

在 中建立資料表時 AWS Glue，您可以在資料表上定義的任意分割區索引鍵組合上建立分割區索引。在資料表上建立一或多個分割區索引之後，您必須將屬性新增至啟用分割區篩選的資料表。然後，您可以從 Athena 查詢資料表。

如需有關在 中建立分割區索引的資訊 AWS Glue，請參閱《 *AWS Glue 開發人員指南*》中的[在 中使用分割區索引 AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/partition-indexes.html)。如需有關新增資料表屬性以啟用分割區篩選的資訊，請參閱 [使用 AWS Glue 分割區索引和篩選來最佳化查詢](glue-best-practices-partition-index.md)。

## 使用資料壓縮和檔案分割
<a name="performance-tuning-s3-throttling-use-data-compression-and-file-splitting"></a>

如果檔案處於最佳大小，或可以將檔案分割成邏輯群組，則資料壓縮可以大幅加快查詢速度。一般而言，較高的壓縮比需要更多的 CPU 週期來壓縮和解壓縮資料。對於 Athena，建議您使用 Apache Parquet 或 Apache ORC，因為其預設會壓縮資料。如需有關 Athena 中資料壓縮的資訊，請參閱[在 Athena 中使用壓縮](compression-formats.md)。

分割檔案可讓 Athena 將讀取單一檔案的任務分散至多個讀取器，藉此提高平行處理能力。如果單一檔案不可分割，則只有一個讀取器可以讀取檔案，而其他讀取器則處於閒置狀態。Apache Parquet 和 Apache ORC 還支援可分割的檔案。

## 使用優化單欄式資料存放區
<a name="performance-tuning-s3-throttling-use-optimized-columnar-data-stores"></a>

如果您將資料轉換為單欄式格式，則 Athena 查詢效能會大幅提升。當您產生單欄式檔案時，需要考量的一種優化技術是根據資料分割區索引鍵排序資料。

Apache Parquet 和 Apache ORC 是常用的開放原始碼單欄式資料存放區。如需有關將現有 Amazon S3 資料來源轉換為其中一種格式的資訊，請參閱 [轉換為單欄式格式](columnar-storage.md#convert-to-columnar)。

### 使用較大的 Parquet 區塊大小或 ORC 條紋大小
<a name="performance-tuning-s3-throttling-use-a-larger-parquet-block-size-or-orc-stripe-size"></a>

Parquet 和 ORC 具有資料儲存參數，您可以調整以進行優化。在 Parquet 中，您可以優化區塊大小。在 ORC 中，您可以優化條紋大小。區塊或條紋越大，您可以在其中儲存的資料列就越多。依預設，Parquet 區塊大小為 128 MB，而 ORC 條紋大小為 64 MB。

如果 ORC 條紋小於 8 MB (預設值為 `hive.orc.max_buffer_size`)，則 Athena 會讀取整個 ORC 條紋。對於較小的條紋，這是 Athena 在資料欄選取性和每秒輸入/輸出操作之間進行的權衡。

如果您的資料表包含大量資料欄，則較小的區塊或條紋大小可能會導致掃描的資料超過必要的數量。在這些情況下，較大的區塊大小可能會更有效率。

### 對複雜類型使用 ORC
<a name="performance-tuning-s3-throttling-use-orc-for-complex-types"></a>

目前，當您查詢存放在 Parquet 中且具有複雜資料類型 (例如，`array`、`map` 或 `struct`) 的資料欄時，Athena 會讀取整個資料列，而不是只選擇性地讀取指定的資料欄。這是 Athena 的已知問題。解決方法是考慮使用 ORC。

### 選擇壓縮演算法
<a name="performance-tuning-s3-throttling-choose-a-compression-algorithm"></a>

您可以設定的另一個參數是資料區塊上的壓縮演算法。如需有關 Athena 中 Parquet 和 ORC 支援的壓縮演算法的資訊，請參閱 [Athena 壓縮支援](https://docs.aws.amazon.com/athena/latest/ug/compression-formats.html)。

如需 Athena 中單欄式儲存格式最佳化的詳細資訊，請參閱 AWS 大數據部落格文章 [Amazon Athena 的前 10 個效能調校秘訣](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/)中的「最佳化單欄式資料存放區產生」一節。

## 使用 Iceberg 資料表
<a name="performance-tuning-s3-throttling-use-iceberg-tables"></a>

Apache Iceberg 是開放式的資料表格式，專用於非常大型的分析資料集，旨在優化 Amazon S3 上的用量。您可以使用 Iceberg 資料表來協助減少 Amazon S3 中的限流。

Iceberg 資料表可為您提供下列優點：
+ 您可以在一或多個資料欄上對 Iceberg 資料表進行分割。這樣可優化資料存取，並減少查詢必須掃描的資料量。
+ 由於 Iceberg 物件儲存模式可將 Iceberg 資料表優化以與 Amazon S3 搭配使用，因此其可以處理大量資料和繁重的查詢工作負載。
+ 物件儲存模式中的 Iceberg 資料表具備可擴展性、容錯能力和耐用性，有助於減少限流。
+ ACID 交易支援意味著，多個使用者可以以原子方式新增和刪除 Amazon S3 物件。

如需有關 Apache Iceberg 的詳細資訊，請參閱 [Apache Iceberg](https://iceberg.apache.org/)。如需有關在 Athena 中使用 Apache Iceberg 資料表的詳細資訊，請參閱[使用 Iceberg 資料表](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg.html)。

# 最佳化您的查詢
<a name="performance-tuning-s3-throttling-optimizing-queries"></a>

使用本節中的建議優化 Athena 中的 SQL 查詢。

## 使用 LIMIT 與 ORDER BY 子句
<a name="performance-tuning-s3-throttling-use-limit-with-the-order-by-clause"></a>

`ORDER BY` 子句會以排序順序傳回資料。這需要 Athena 將所有資料列傳送至單一工作節點，然後排序資料列。這種查詢類型可以執行很長一段時間，甚至失敗。

為了提高查詢的效率，請查看頂部或底部的 *N* 個值，然後使用 `LIMIT` 子句。這樣可以將排序和限制推送至個別工作節點，而不是單一工作節點，進而大幅降低排序的成本。

## 優化 JOIN 子句
<a name="performance-tuning-s3-throttling-optimize-join-clauses"></a>

當您聯結兩個資料表時，Athena 會將右側的資料表分散至工作節點，然後串流左側的資料表以執行聯結。

因此，請在聯結左側指定較大的資料表，並在聯結的右側指定較小的資料表。如此一來，Athena 會使用較少的記憶體，並以較低的延遲執行查詢。

另外，請注意以下重點：
+ 當您使用多個 `JOIN` 命令時，請按從最大到最小的順序指定資料表。
+ 除非查詢需要交叉聯結，否則請予以避免。

## 優化 GROUP BY 子句
<a name="performance-tuning-s3-throttling-optimize-group-by-clauses"></a>

`GROUP BY` 運算子會根據 `GROUP BY` 資料欄將資料列分散至工作節點。我們會在記憶體中引用這些資料欄，並在擷取資料列時比較這些值。當 `GROUP BY` 資料欄相符時，這些值彙總在一起。考慮到此程序的運作方式，建議按從最高基數到最低基數的順序排序資料欄。

## 使用數字而不是字串
<a name="performance-tuning-s3-throttling-use-numbers-instead-of-strings"></a>

由於相較於字串，數字需要的記憶體較少，而且處理速度更快，因此請盡可能使用數字而不是字串。

## 限制資料欄的數目
<a name="performance-tuning-s3-throttling-limit-the-number-of-columns"></a>

若要減少儲存資料所需的記憶體總量，請限制 `SELECT` 陳述式中指定的資料欄數。

## 使用規則表達式而不是 LIKE
<a name="performance-tuning-s3-throttling-use-regular-expressions-instead-of-like"></a>

包含子句 (例如大型字串上的 `LIKE '%string%'`) 的查詢可能需要非常大量的運算。當您篩選字串資料欄上的多個值時，請改用 [regexp\$1like()](https://trino.io/docs/current/functions/regexp.html#regexp_like) 函數和規則表達式。當您比較一長串值時，這特別有用。

## 使用 LIMIT 子句
<a name="performance-tuning-s3-throttling-use-the-limit-clause"></a>

當您執行查詢時，請不要選取所有資料欄，而是使用 `LIMIT` 子句，以只傳回您需要的資料欄。這樣做可減少透過查詢執行管道處理的資料集大小。當您查詢具有大量字串型資料欄的資料表時，`LIMIT` 子句會更有幫助。當您對任何查詢執行多個聯結或彙總時，`LIMIT` 子句也很有用。

# 其他資源
<a name="performance-tuning-additional-resources"></a>

如需 Athena 效能調校的其他相關資訊，請參閱下列資源：
+ AWS 大數據部落格文章：[Amazon Athena 的前 10 大效能調校秘訣](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/)。
+ AWS 大數據部落格文章：*AWS 大數據部落格*中[的最新 Amazon Athena 引擎，以 3 倍的速度執行查詢，節省高達 70% 的成本](https://aws.amazon.com/blogs/big-data/run-queries-3x-faster-with-up-to-70-cost-savings-on-the-latest-amazon-athena-engine/)。
+ AWS 大數據部落格文章：[在 Amazon Athena 中使用述詞下推來改善聯合查詢](https://aws.amazon.com/blogs/big-data/improve-federated-queries-with-predicate-pushdown-in-amazon-athena/)。
+ 《Amazon Simple Storage Service 使用者指南》：[最佳實務設計模式：最佳化 Amazon S3 效能](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html)。
+  AWS 巨量資料部落格中的其他 [Athena 文章](https://aws.amazon.com/blogs/big-data/tag/amazon-athena/)。
+ 使用 **Amazon Athena** 標籤在 [AWS re:Post](https://repost.aws/tags/TA78iVOM7gR62_QqDe2-CmiA/amazon-athena) 上詢問問題。
+ 請參閱[AWS 知識中心的 Athena 主題](https://aws.amazon.com/premiumsupport/knowledge-center/#Amazon_Athena)。
+ Contact AWS 支援 （在 中 AWS 管理主控台，按一下 **Support**、**Support Center**)

# 在 Athena 中使用壓縮
<a name="compression-formats"></a>

Athena 支援各種壓縮格式來讀取和寫入資料，包括從使用多種壓縮格式的資料表讀取。例如，當某些 Parquet 檔案使用 Snappy 壓縮而其他 Parquet 檔案使用 GZIP 壓縮時，Athena 可以成功讀取使用 Parquet 檔案格式的資料表中的資料。相同的原則適用於 ORC、文字檔案和 JSON 儲存格式。

## 支援的壓縮格式
<a name="compression-support-formats"></a>

Athena 支援以下壓縮格式：
+ **BZIP2** – 使用 Burrows-Wheeler 演算法的格式。
+ **DEFLATE** – 基於 [LZSS](https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Storer%E2%80%93Szymanski) 和 [Huffman 編碼](https://en.wikipedia.org/wiki/Huffman_coding)的壓縮演算法。[Deflate](https://en.wikipedia.org/wiki/Deflate) 僅適用於 Avro 檔案格式。
+ **GZIP** – 以 Deflate 為基礎的壓縮演算法。對於 Athena 引擎版本 2 和 3 中的 Hive 資料表，以及 Athena 引擎版本 2 中的 Iceberg 資料表，GZIP 是採用 Parquet 格式和文字檔案存儲格式之檔案的預設寫入壓縮格式。不支援 `tar.gz` 格式的檔案。
+ **LZ4** – Lempel-Ziv 77 (LZ7) 系列的這個成員也著重於壓縮和解壓縮速度，而不是資料的最大壓縮。LZ4 具有以下框架格式：
  + **LZ4 原始/無框架** – LZ4 區塊壓縮格式的無框架標準實作。如需詳細資訊，請參閱 GitHub 上的 [LZ4 區塊格式說明](https://github.com/lz4/lz4/blob/dev/doc/lz4_Block_format.md)。
  + **LZ4 框架** – LZ4 的一般框架實作。如需詳細資訊，請參閱 GitHub 上的 [LZ4 框架格式說明](https://github.com/lz4/lz4/blob/dev/doc/lz4_Frame_format.md)。
  + **LZ4 Hadoop 相容** – LZ4 的 Apache Haddop 實作。這個實作使用 [BlockCompressorStream.java](https://github.com/apache/hadoop/blob/f67237cbe7bc48a1b9088e990800b37529f1db2a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/compress/BlockCompressorStream.java) 類別包裝 LZ4 壓縮。
+ **LZO** – 使用 Lempel–Ziv–Oberhumer 演算法的格式，該演算法著重於高壓縮和解壓縮速度，而不是資料的最大壓縮。LZO 有兩種實作：
  + **標準 LZO** – 如需詳細資訊，請參閱 Oberhumer 網站上的 LZO [摘要](http://www.oberhumer.com/opensource/lzo/#abstract)。
  + **LZO Hadoop 相容** – 這個實作使用 [BlockCompressorStream.java](https://github.com/apache/hadoop/blob/f67237cbe7bc48a1b9088e990800b37529f1db2a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/compress/BlockCompressorStream.java) 類別包裝 LZO 演算法。
+ **SNAPPY** – 屬於 Lempel-Ziv 77 (LZ7) 系列的壓縮演算法。Snappy 著重於高壓縮和解壓縮速度，而不是資料的最大壓縮。
+ **ZLIB** – 根據 Deflate，ZLIB 是 ORC 資料儲存格式中檔案的預設寫入壓縮格式。如需詳細資訊，請參閱 GitHub 上的 [zlib](https://github.com/madler/zlib) 頁面。
+  **ZSTD** – [Zstandard 即時資料壓縮演算法](http://facebook.github.io/zstd/)是一種提供高壓縮比的快速壓縮演算法。Zstandard (ZSTD) 程式庫是使用 BSD 授權作為開放原始碼所提供。ZSTD 是 Iceberg 資料表的預設壓縮。寫入 ZSTD 壓縮資料時，Athena 預設使用 ZSTD 壓縮級別 3。如需有關在 Athena 中使用 ZSTD 壓縮級別的詳細資訊，請參閱 [使用 ZSTD 壓縮級別](compression-support-zstd-levels.md)。

**注意**  
Athena 不支援寫入以 LZ4 或 LZO 格式壓縮的 Parquet 檔案。支援讀取這些壓縮格式。

## 指定壓縮格式
<a name="compression-support-specifying-compression-formats"></a>

當您寫入 CREATE TABLE 或 CTAS 陳述式時，您可以指定壓縮屬性，以指定 Athena 寫入這些資料表時要使用的壓縮類型。
+ 如需 CTAS 的資訊，請參閱 [CTAS 資料表屬性](create-table-as.md#ctas-table-properties)。如需範例，請參閱 [CTAS 查詢的範例](ctas-examples.md)。
+ 如需 CREATE TABLE 的資訊，請參閱 [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md) 以取得壓縮資料表屬性的清單。

## 指定未壓縮
<a name="compression-support-specifying-no-compression"></a>

CREATE TABLE 陳述式支援寫入未壓縮的檔案。若要編寫未壓縮檔案，請使用下列語法：
+ CREATE TABLE (文字檔案或 JSON) – 在 `TBLPROPERTIES` 中，指定 `write.compression = NONE`。
+ CREATE TABLE (Parquet) – 在 `TBLPROPERTIES` 中，指定 `parquet.compression = UNCOMPRESSED`。
+ CREATE TABLE (ORC) – 在 `TBLPROPERTIES` 中，指定 `orc.compress = NONE`。

## 備註和資源
<a name="compression-support-notes-and-resources"></a>
+ 目前 Athena 無法識別大寫的副檔名，諸如 `.GZ` 或 `.BZIP2`。避免使用大寫副檔名的資料集，或將資料副檔名重新以小寫字母命名。
+ 若為 CSV、TSV 和 JSON 的資料，Athena 會根據副檔名決定壓縮類型。如果不存在任何副檔名，Athena 會將資料視為未壓縮的純文字。如果您的資料已壓縮，請確定檔案名稱包含副檔名，例如 `gz`。
+ 不支援 ZIP 檔案格式。
+ 如需從 Athena 查詢 Amazon Data Firehose 日誌，支援的格式包括 GZIP 壓縮或具有 SNAPPY 壓縮的 ORC 檔案。
+ 如需使用壓縮的詳細資訊，請參閱 Amazon Athena AWS 大數據部落格文章前 10 大效能調校秘訣的第 3 節 (「壓縮和分割檔案」)。 [ Amazon Athena](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/)

**Topics**
+ [指定壓縮格式](#compression-support-specifying-compression-formats)
+ [指定未壓縮](#compression-support-specifying-no-compression)
+ [備註和資源](#compression-support-notes-and-resources)
+ [Hive 資料表壓縮](compression-support-hive.md)
+ [Iceberg 資料表壓縮](compression-support-iceberg.md)
+ [ZSTD 壓縮級別](compression-support-zstd-levels.md)

# 使用 Hive 資料表壓縮
<a name="compression-support-hive"></a>

Athena 中 Hive 資料表的壓縮選項會隨引擎版本和檔案格式而異。

## Athena 引擎版本 3 中的 Hive 壓縮支援
<a name="compression-support-hive-v3"></a>

下列資料表摘要說明 Athena 引擎版本 3 對 Apache Hive 中的儲存檔案格式的壓縮格式支援。文字檔案格式包括 TSV、CSV、JSON 和文字的自訂 SerDes。儲存格中的「是」或「否」同樣適用於讀取和寫入操作，除非另有註明。基於本資料表的用途，CREATE TABLE、CTAS 和 INSERT INTO 會被視為寫入操作。如需有關在 Athena 中使用 ZSTD 壓縮級別的詳細資訊，請參閱 [使用 ZSTD 壓縮級別](compression-support-zstd-levels.md)。


****  

|  | Avro | Ion | ORC | Parquet | 文字檔案 | 
| --- | --- | --- | --- | --- | --- | 
| BZIP2 | 是 | 是 | 否 | 否 | 是 | 
| DEFLATE | 是 | 否 | 否 | 否 | 否 | 
| GZIP | 否 | 是 | 否 | 是 | 是 | 
| LZ4 | 否 | 是 | 是 |  寫入 - 否 讀取 - 是  | 是 | 
| LZO | 否 |  寫入 - 否 讀取 - 是  | 否 |  寫入 - 否 讀取 - 是  |  寫入 - 否 讀取 - 是  | 
| SNAPPY | 是 | 是 | 是 | 是 | 是 | 
| ZLIB | 否 | 否 | 是 | 否 | 否 | 
| ZSTD | 是 | 是 | 是 | 是 | 是 | 
| NONE | 是 | 是 | 是 | 是 | 是 | 

# 使用 Iceberg 資料表壓縮
<a name="compression-support-iceberg"></a>

Athena 中 Iceberg 資料表的壓縮選項會隨引擎版本和檔案格式而異。

## Athena 引擎版本 3 中的 Iceberg 壓縮支援
<a name="compression-support-iceberg-v3"></a>

下列資料表摘要說明 Athena 引擎版本 3 對 Apache Iceberg 中的儲存檔案格式的壓縮格式支援。儲存格中的「是」或「否」同樣適用於讀取和寫入操作，除非另有註明。基於本資料表的用途，CREATE TABLE、CTAS 和 INSERT INTO 會被視為寫入操作。Athena 引擎版本 3 中的 Iceberg 的預設儲存格式是 Parquet。Athena 引擎版本 3 中的 Iceberg 的預設壓縮格式是 ZSTD。如需有關在 Athena 中使用 ZSTD 壓縮級別的詳細資訊，請參閱 [使用 ZSTD 壓縮級別](compression-support-zstd-levels.md)。


****  

|  | Avro | ORC | Parquet (預設) | 
| --- | --- | --- | --- | 
| BZIP2 | 否 | 否 | 否 | 
| GZIP | 是 | 否 | 是 | 
| LZ4 | 否 | 是 | 否 | 
| SNAPPY | 是 | 是 | 是 | 
| ZLIB | 否 | 是 | 否 | 
| ZSTD | 是 | 是 | 是 (預設) | 
| NONE | 是 (指定 None 或 Deflate) | 是 | 是 (指定 None 或 Uncompressed) | 

# 使用 ZSTD 壓縮級別
<a name="compression-support-zstd-levels"></a>

[Zstandard 即時資料壓縮演算法](http://facebook.github.io/zstd/)是一種提供高壓縮比的快速壓縮演算法。Zstandard (ZSTD) 程式庫是開放原始碼軟體，使用 BSD 授權。Athena 支援讀取和寫入 ZStandard 壓縮的 ORC、Parquet 和文字檔案資料。

您可以使用 ZSTD 壓縮級別根據自己的要求調整壓縮比和速度。ZSTD 庫支援從 1 到 22 的壓縮級別。Athena 預設使用 ZSTD 壓縮級別 3。

壓縮級別在壓縮速度和達到的壓縮量之間提供了細微的權衡。壓縮級別越低，速度越快，但檔案大小更大。例如，如果速度最重要，則可以使用級別 1，如果大小最重要，則可以使用級別 22。級別 3 適用於許多使用案例，且為預設值。請謹慎使用大於 19 的級別，因為這些級別需要更多的記憶體。ZSTD 庫還提供負壓縮級別，其可擴展壓縮速度和比率的範圍。如需詳細資訊，請參閱 [Zstandard 壓縮 RFC](https://datatracker.ietf.org/doc/html/rfc8478)。

豐富的壓縮級別為微調提供了大量機會。但是，請確保在決定壓縮級別時測量資料並考慮權衡。建議使用預設級別 3，或 6 到 9 之間的級別，以便在壓縮速度與壓縮資料大小之間取得合理的權衡。對於大小最重要且壓縮速度不是問題的情況，預留級別 20 或更高。

## 考量和限制
<a name="compression-support-zstd-levels-considerations-and-limitations"></a>

在 Athena 中使用 ZSTD 壓縮級別時，請考慮下列幾點。
+ 只有 Athena 引擎版本 3 中才支援 ZSTD `compression_level` 屬性。
+ `ALTER TABLE`、`CREATE TABLE`、`CREATE TABLE AS` (CTAS) 以及 `UNLOAD` 陳述式支援 ZSTD `compression_level` 屬性。
+ `compression_level` 屬性是選用屬性。
+ 只有 ZSTD 壓縮才支援 `compression_level` 屬性。
+ 可能的壓縮級別為 1 到 22。
+ 預設壓縮級別為 3。

如需有關 Athena 中 Apache Hive ZSTD 壓縮支援的資訊，請參閱 [使用 Hive 資料表壓縮](compression-support-hive.md)。如需有關 Athena 中 Apache Iceberg ZSTD 壓縮支援的資訊，請參閱 [使用 Iceberg 資料表壓縮](compression-support-iceberg.md)。

## 指定 ZSTD 壓縮級別
<a name="compression-support-zstd-levels-specifying"></a>

若要指定 `ALTER TABLE`、`CREATE TABLE`、`CREATE TABLE AS` 和 `UNLOAD` 陳述式的 ZSTD 壓縮級別，請使用 `compression_level` 屬性。若要指定 ZSTD 壓縮本身，您必須使用陳述式語法所使用的單獨壓縮屬性。

### ALTER TABLE SET TBLPROPERTIES
<a name="compression-support-zstd-levels-alter-table"></a>

在 [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md) 陳述式 `SET TBLPROPERTIES` 子句中，使用 `'write.compression' = ' ZSTD'` 或 `'parquet.compression' = 'ZSTD'` 指定 ZSTD 壓縮。然後使用 `compression_level` 屬性來指定 1 到 22 之間的值 (例如，'`compression_level' = '5'`)。如果您沒有指定壓縮級別屬性，則壓縮級別會預設為 3。

#### 範例
<a name="compression-support-zstd-levels-alter-table-example"></a>

下列範例會修改資料表 `existing_table`，以使用具有 ZSTD 壓縮和 ZSTD 壓縮級別 4 的 Parquet 檔案格式。請注意，在 `TBLPROPERTIES` 子句中，壓縮級別值必須輸入為字串而不是整數，因此必須用單引號或雙引號括住。

```
ALTER TABLE existing_table 
SET TBLPROPERTIES ('parquet.compression' = 'ZSTD', 'compression_level' = '4')
```

### CREATE TABLE
<a name="compression-support-zstd-levels-create-table"></a>

在 [CREATE TABLE](create-table.md) 陳述式 `TBLPROPERTIES` 子句中，指定 '`write.compression' = 'ZSTD'` 或 `'parquet.compression' = 'ZSTD'`，然後使用 `compression_level = compression_level` 並指定介於 1 到 22 之間的字串值。如果未指定 `compression_level` 屬性，則預設壓縮級別為 3。

#### 範例
<a name="compression-support-zstd-levels-create-table-example"></a>

下列範例使用 ZSTD 壓縮和 ZSTD 壓縮級別 4 建立 Parquet 檔案格式的資料表。

```
CREATE EXTERNAL TABLE new_table ( 
  `col0` string COMMENT '', 
  `col1` string COMMENT '' 
) 
STORED AS PARQUET 
LOCATION 's3://amzn-s3-demo-bucket/' 
TBLPROPERTIES ('write.compression' = 'ZSTD', 'compression_level' = '4')
```

### CREATE TABLE AS (CTAS)
<a name="compression-support-zstd-levels-ctas"></a>

在 [CREATE TABLE AS](create-table-as.md) 陳述式 `WITH` 子句中，指定 `write_compression = 'ZSTD'` 或 `parquet_compression = 'ZSTD'`，然後使用 `compression_level = compression_level` 並指定介於 1 到 22 之間的整數值。如果未指定 `compression_level` 屬性，則預設壓縮級別為 3。

#### 範例
<a name="compression-support-zstd-levels-ctas-example"></a>

下列 CTAS 範例使用 ZSTD 壓縮和 ZSTD 壓縮級別 4，將 Parquet 指定為檔案格式。請注意，在 `WITH` 子句中，壓縮級別值必須指定為整數而不是字串。

```
CREATE TABLE new_table  
WITH ( format = 'PARQUET', write_compression = 'ZSTD', compression_level = 4)  
AS SELECT * FROM old_table
```

### UNLOAD
<a name="compression-support-zstd-levels-unload"></a>

在 [UNLOAD](unload.md) 陳述式 `WITH` 子句中，指定 `compression = 'ZSTD'`，然後使用 `compression_level = compression_level` 並指定介於 1 到 22 之間的整數值。如果未指定 `compression_level` 屬性，則預設壓縮級別為 3。

#### 範例
<a name="compression-support-zstd-levels-unload-example"></a>

下列範例會使用 Parquet 檔案格式、ZSTD 壓縮和 ZSTD 壓縮級別 4，將查詢結果卸載到指定的位置。

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/' 
WITH (format = 'PARQUET', compression = 'ZSTD', compression_level = 4)
```

# 標記 Athena 資源
<a name="tags"></a>

每個標記皆包含由您定義的金鑰和值。標記 Athena 資源時，您可以將自訂中繼資料指派給該資源。您可以使用標籤以不同方式分類 AWS 資源，例如依用途、擁有者或環境。在 Athena 中，工作群組、資料目錄和容量保留等資源都是可標記的資源。例如，您可以為帳戶中的工作群組建立一組標籤，以協助您追蹤工作群組擁有者，或依用途來識別工作群組。如果您也在 Billing and Cost Management 主控台中啟用標籤作為成本分配標籤，則與執行查詢相關聯的成本會顯示在「成本和用量報告」中，並含有該成本分配標籤。我們建議您使用 AWS [ 標記最佳實務](https://docs.aws.amazon.com/whitepapers/latest/tagging-best-practices/tagging-best-practices.html)來建立一組一致的標籤，以滿足您組織的需求。

您可以使用 Athena 主控台或 API 操作來處理標籤。

**Topics**
+ [標籤基本概念](#tag-basics)
+ [標籤限制](#tag-restrictions)
+ [使用工作群組的標籤](tags-console.md)
+ [使用 API 和 AWS CLI 標籤操作](tags-operations.md)
+ [使用標籤型 IAM 存取控制政策](tags-access-control.md)

## 標籤基本概念
<a name="tag-basics"></a>

標籤是您指派給 Athena 資源的標籤。每個標籤皆包含由您定義的一個金鑰與一個選用值。

標籤可讓您以不同的方式分類 AWS 資源。例如，您可以為您帳戶的工作群組定義一組標籤，以協助您追蹤每個工作群組擁有者或用途。

您可以在建立新的 Athena 工作群組或資料目錄時新增標籤，或從中新增、編輯或移除標籤。您可以在主控台編輯標籤。如果您使用 API 操作來編輯標籤，請移除舊標籤，再加入新標籤。如果您刪除資源，也會刪除任何該資源所使用的標籤。

Athena 不會自動為您的資源指派標籤。您可以編輯標籤索引鍵和值，也可以隨時從資源中移除標籤。您可以將標籤的值設為空白字串，但您無法將標籤的值設為 Null。請勿將重複的標籤鍵新增至相同的資源。如果這樣做，Athena 會發出錯誤訊息。如果您使用 **TagResource** 動作來標記使用現有標籤鍵的資源，則新標籤值會覆寫舊值。

在 IAM 中，您可以控制 Amazon Web Services 帳戶中的哪些使用者具有建立、編輯、移除或列出標籤的許可。如需詳細資訊，請參閱[使用標籤型 IAM 存取控制政策](tags-access-control.md)。

如需 Amazon Athena 標籤動作的完整清單，請參閱 [Amazon Athena API 參考](https://docs.aws.amazon.com/athena/latest/APIReference/)中的 API 動作名稱。

您可以使用標籤來計費。如需詳細資訊，請參閱《AWS 帳單與成本管理 使用者指南》**中的[使用標籤計費](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/custom-tags.html)。

如需詳細資訊，請參閱[標籤限制](#tag-restrictions)。

## 標籤限制
<a name="tag-restrictions"></a>

標籤有以下限制：
+ 在 Athena 中，您可以標記工作群組、資料目錄和容量保留。您無法標記查詢。
+ 每一資源標籤數最多為 50。若要保持在限制內，請檢閱和刪除未使用的標籤。
+ 針對每一個資源，每個標籤鍵必須是唯一的，且每個標籤鍵只能有一個值。請勿將重複的標籤鍵同時新增到相同的工作群組。如果這樣做，Athena 會發出錯誤訊息。如果您在個別的 `TagResource` 動作中使用現有的標籤鍵來標記資源，新標籤值會覆寫舊值。
+ 標籤索引鍵長度為 1-128 個 UTF-8 Unicode 字元。
+ 標籤值長度為 0-256 個 UTF-8 Unicode 字元。

  您需要指定工作群組資源的 ARN，才能執行標記操作，例如新增、編輯、移除或列出標籤。
+ Athena 可讓您使用字母、數字、以 UTF-8 表示的空格，以及下列字元：\$1 – = . \$1 : / @。
+ 標籤鍵與值皆區分大小寫。
+ 標籤索引鍵中的`"aws:"`字首保留供 AWS 使用。您無法編輯或刪除含有此字首的標籤索引鍵。含有此字首的標籤不算在每一資源的標籤限制內。
+ 您指派的標籤僅供 Amazon Web Services 帳戶使用。

# 使用工作群組的標籤
<a name="tags-console"></a>

您可以使用 Athena 主控台，查看您帳戶中每個工作群組正在使用的標籤。您只能依工作群組來檢視標籤。Athena 主控台也可讓您一次在一個工作群組中套用、編輯或移除標籤。

您可以使用您建立的標籤來搜尋工作群組。

**Topics**
+ [顯示個別工作群組的標籤](#tags-display)
+ [在個別工作群組上新增和刪除標籤](#tags-add-delete)

## 顯示個別工作群組的標籤
<a name="tags-display"></a>

**在 Athena 主控台中顯示個別工作群組的標籤**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 在導覽選單上，選擇 **Workgroups** (工作群組)，然後選擇您要的工作群組。

1. 執行以下任意一項：
   + 選擇 **Tags** (標籤) 索引標籤。如果標籤清單很長，請使用搜尋方塊。
   + 選擇 **Edit** (編輯)，然後向下捲動到 **Tags** (標籤) 區段。

## 在個別工作群組上新增和刪除標籤
<a name="tags-add-delete"></a>

您可以直接從 **Workgroups** (工作群組) 索引標籤來管理個別工作群組的標籤。

**注意**  
如果您希望使用者在主控台中建立工作群組時新增標籤，或在使用 **CreateWorkGroup** 動作時傳入標籤，請確定您授予使用者進行 **TagResource** 和 **CreateWorkGroup** 動作的 IAM 許可。

**在建立新的工作群組時新增標籤**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在導覽選單中，選擇 **Workgroups** (工作群組)。

1. 選擇 **Create workgroup** (建立工作群組)，並視需要填寫值。如需詳細步驟，請參閱[建立工作群組](creating-workgroups.md)。

1. 在 **Tags** (標籤) 區段中，指定索引鍵和值來新增一或多個標籤。請勿將重複的標籤索引鍵同時新增到相同的工作群組。如果這樣做，Athena 會發出錯誤訊息。如需詳細資訊，請參閱[標籤限制](tags.md#tag-restrictions)。

1. 完成時，選擇 **Create Workgroup** (建立工作群組)。

**在現有的工作群組中新增或編輯標籤**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 選擇您想要修改的工作群組。

1. 執行以下任意一項：
   + 選擇 **Tags** (標籤) 索引標籤，然後選擇 **Manage tags** (管理標籤)。
   + 選擇 **Edit** (編輯)，然後向下捲動到 **Tags** (標籤) 區段。

1. 指定每個標籤的索引鍵和數值。如需詳細資訊，請參閱[標籤限制](tags.md#tag-restrictions)。

1. 選擇 **Save** (儲存)。

**從個別工作群組中刪除標籤**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 選擇您想要修改的工作群組。

1. 執行以下任意一項：
   + 選擇 **Tags** (標籤) 索引標籤，然後選擇 **Manage tags** (管理標籤)。
   + 選擇 **Edit** (編輯)，然後向下捲動到 **Tags** (標籤) 區段。

1. 在標籤清單中，選取您要刪除標籤的 **Remove** (移除)，然後選擇 **Save** (儲存)。

# 使用 API 和 AWS CLI 標籤操作
<a name="tags-operations"></a>

使用下列標籤操作來新增、移除或列出資源上的標籤。


****  

| API | CLI | 動作描述 | 
| --- | --- | --- | 
| TagResource | tag-resource | 在具有指定 ARN 的資源上新增或覆寫一或多個標籤。 | 
| UntagResource | untag-resource | 從具有指定 ARN 的資源中刪除一個或多個標籤。 | 
| ListTagsForResource | list‑tags‑for‑resource | 列出具有指定 ARN 之資源的一個或多個標籤。 | 

**在建立資源時新增標籤**  
若要在建立工作群組或資料目錄時新增標籤，請使用 `tags` 參數搭配 `CreateWorkGroup`或 `CreateDataCatalog` API 操作，或搭配 AWS CLI `create-work-group`或 `create-data-catalog`命令。

## 使用 API 動作管理標籤
<a name="tags-operations-examples-java"></a>

下列範例說明如何使用標籤 API 操作來管理工作群組和資料目錄上的標籤。這些範例使用 Java 程式語言。

### 範例 – TagResource
<a name="tags-operations-examples-java-tag-resource"></a>

下列範例將兩個標籤新增至工作群組 `workgroupA`：

```
List<Tag> tags = new ArrayList<>();
tags.add(new Tag().withKey("tagKey1").withValue("tagValue1"));
tags.add(new Tag().withKey("tagKey2").withValue("tagValue2"));

TagResourceRequest request = new TagResourceRequest()
    .withResourceARN("arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA")
    .withTags(tags);

client.tagResource(request);
```

下列範例將兩個標籤新增至資料目錄 `datacatalogA`：

```
List<Tag> tags = new ArrayList<>();
tags.add(new Tag().withKey("tagKey1").withValue("tagValue1"));
tags.add(new Tag().withKey("tagKey2").withValue("tagValue2"));

TagResourceRequest request = new TagResourceRequest()
    .withResourceARN("arn:aws:athena:us-east-1:123456789012:datacatalog/datacatalogA")
    .withTags(tags);

client.tagResource(request);
```

**注意**  
請勿將重複的標籤鍵新增至相同的資源。如果這樣做，Athena 會發出錯誤訊息。如果您在個別的 `TagResource` 動作中使用現有的標籤鍵來標記資源，新標籤值會覆寫舊值。

### 範例 – UntagResource
<a name="tags-operations-examples-java-untag-resource"></a>

下列範例將 `tagKey2` 從工作群組 `workgroupA` 中移除：

```
List<String> tagKeys = new ArrayList<>();
tagKeys.add("tagKey2");

UntagResourceRequest request = new UntagResourceRequest()
    .withResourceARN("arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA")
    .withTagKeys(tagKeys);

client.untagResource(request);
```

下列範例將 `tagKey2` 從資料目錄 `datacatalogA` 中移除：

```
List<String> tagKeys = new ArrayList<>();
tagKeys.add("tagKey2");

UntagResourceRequest request = new UntagResourceRequest()
    .withResourceARN("arn:aws:athena:us-east-1:123456789012:datacatalog/datacatalogA")
    .withTagKeys(tagKeys);

client.untagResource(request);
```

### 範例 – ListTagsForResource
<a name="tags-operations-examples-java-list-tags-for-resource"></a>

下列範例列出工作群組 `workgroupA` 的標籤：

```
ListTagsForResourceRequest request = new ListTagsForResourceRequest()
    .withResourceARN("arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA");

ListTagsForResourceResult result = client.listTagsForResource(request);

List<Tag> resultTags = result.getTags();
```

下列範例列出資料目錄 `datacatalogA` 的標籤：

```
ListTagsForResourceRequest request = new ListTagsForResourceRequest()
    .withResourceARN("arn:aws:athena:us-east-1:123456789012:datacatalog/datacatalogA");

ListTagsForResourceResult result = client.listTagsForResource(request);

List<Tag> resultTags = result.getTags();
```

## 使用 管理標籤 AWS CLI
<a name="tags-operations-examples-cli"></a>

下列範例示範如何使用 AWS CLI 來建立和管理資料目錄上的標籤。

### 新增標籤至資源：tag-resource
<a name="tags-operations-examples-cli-tag-resource"></a>

`tag-resource` 命令將一或多個標籤新增到指定的資源。

**語法**  
`aws athena tag-resource --resource-arn arn:aws:athena:region:account_id:datacatalog/catalog_name --tags Key=string,Value=string Key=string,Value=string`

`--resource-arn` 參數會指定要新增標籤的資源。`--tags` 參數會指定以空格分隔的鍵值組清單，以做為標籤新增至資源。

**Example**  
下列範例會將標籤新增至 `mydatacatalog` 資料目錄。  

```
aws athena tag-resource --resource-arn arn:aws:athena:us-east-1:111122223333:datacatalog/mydatacatalog --tags Key=Color,Value=Orange Key=Time,Value=Now
```
若要顯示結果，請使用 `list-tags-for-resource` 命令。  
如需使用 `create-data-catalog` 命令時新增標籤的相關資訊，請參閱[註冊目錄：Create-data-catalog](datastores-hive-cli.md#datastores-hive-cli-registering-a-catalog)。

### 列出資源的標籤：list-tags-for-resource
<a name="tags-operations-examples-cli-list-tags-for-resource"></a>

`list-tags-for-resource` 命令會列出指定資源的標籤。

**語法**  
`aws athena list-tags-for-resource --resource-arn arn:aws:athena:region:account_id:datacatalog/catalog_name`

`--resource-arn` 參數會指定列出標籤的資源。

下列範例列出 `mydatacatalog` 資料目錄的標籤。

```
aws athena list-tags-for-resource --resource-arn arn:aws:athena:us-east-1:111122223333:datacatalog/mydatacatalog
```

以下樣本結果為 JSON 格式。

```
{
    "Tags": [
        {
            "Key": "Time",
            "Value": "Now"
        },
        {
            "Key": "Color",
            "Value": "Orange"
        }
    ]
}
```

### 從資源移除標籤：untag-resource
<a name="tags-operations-examples-cli-untag-resource"></a>

`untag-resource` 命令會從指定的資源中刪除指定的標籤鍵及其關聯的數值。

**語法**  
`aws athena untag-resource --resource-arn arn:aws:athena:region:account_id:datacatalog/catalog_name --tag-keys key_name [key_name ...]` 

`--resource-arn` 參數會指定要從中移除標籤的資源。`--tag-keys` 參數會取得以空格分隔的索引鍵名稱清單。對於指定的每個索引鍵名稱，`untag-resource` 命令會同時移除索引鍵及其數值。

下列範例會從 `mydatacatalog` 目錄資源中移除 `Color` 和 `Time` 索引鍵及其數值。

```
aws athena untag-resource --resource-arn arn:aws:athena:us-east-1:111122223333:datacatalog/mydatacatalog --tag-keys Color Time
```

# 使用標籤型 IAM 存取控制政策
<a name="tags-access-control"></a>

使用標籤可讓您撰寫包含 `Condition` 區塊的 IAM 政策，以根據資源的標籤來控制對資源的存取。本節包含工作群組和資料目錄資源的標籤政策範例。

## 工作群組的標籤政策範例
<a name="tag-policy-examples-workgroups"></a>

### 範例 – 基本標籤政策
<a name="tag-policy-examples-workgroups-basic"></a>

以下 IAM 政策可讓您執行查詢，並與名為 `workgroupA` 的工作群組的標籤互動：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
       {
            "Effect": "Allow",
            "Action": [
                "athena:ListWorkGroups",
                "athena:ListEngineVersions",
                "athena:ListDataCatalogs",
                "athena:ListDatabases",
                "athena:GetDatabase",
                "athena:ListTableMetadata",
                "athena:GetTableMetadata"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:GetWorkGroup",
                "athena:TagResource",
                "athena:UntagResource",
                "athena:ListTagsForResource",
                "athena:StartQueryExecution",
                "athena:GetQueryExecution",
                "athena:BatchGetQueryExecution",
                "athena:ListQueryExecutions",
                "athena:StopQueryExecution",
                "athena:GetQueryResults",
                "athena:GetQueryResultsStream",
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:BatchGetNamedQuery",
                "athena:ListNamedQueries",
                "athena:DeleteNamedQuery",
                "athena:CreatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:ListPreparedStatements",
                "athena:UpdatePreparedStatement",
                "athena:DeletePreparedStatement"
            ],
            "Resource": "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA"
        }
    ]
}
```

------

### 範例 – 根據標籤索引鍵和標籤值配對在工作群組上拒絕動作的政策區塊
<a name="tag-policy-examples-workgroups-basic"></a>

與資源 (如工作群組) 相關聯的標籤稱為資源標籤。資源標籤可讓您編寫政策區塊，如以下項目在以鍵值組所標記的任何工作群組上拒絕列出的動作，例如 `stack`、`production`。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "athena:GetWorkGroup",
                "athena:UpdateWorkGroup",
                "athena:DeleteWorkGroup",
                "athena:TagResource",
                "athena:UntagResource",
                "athena:ListTagsForResource",
                "athena:StartQueryExecution",
                "athena:GetQueryExecution",
                "athena:BatchGetQueryExecution",
                "athena:ListQueryExecutions",
                "athena:StopQueryExecution",
                "athena:GetQueryResults",
                "athena:GetQueryResultsStream",
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:BatchGetNamedQuery",
                "athena:ListNamedQueries",
                "athena:DeleteNamedQuery",
                "athena:CreatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:ListPreparedStatements",
                "athena:UpdatePreparedStatement",
                "athena:DeletePreparedStatement"
            ],
            "Resource": "arn:aws:athena:us-east-1:123456789012:workgroup/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/stack": "production"
                }
            }
        }
    ]
}
```

------

### 範例 – 限制對指定的標籤提出標籤變更動作請求的政策區塊
<a name="tag-policy-examples-workgroups-restricted-specific"></a>

做為參數傳入至變更標籤之操作的標籤 (例如帶有標籤的 `TagResource`、`UntagResource` 或 `CreateWorkGroup`) 稱為請求標籤。下列範例政策區塊只有在傳遞的其中一個標籤具有索引鍵 `costcenter` 和數值 `1`、`2` 或 `3` 時，才允許 `CreateWorkGroup` 操作。

**注意**  
如果您想要允許 IAM 角色在 `CreateWorkGroup` 操作中傳入標籤，請確定您授予角色進行 `TagResource` 和 `CreateWorkGroup` 動作的許可。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:CreateWorkGroup",
                "athena:TagResource"
            ],
            "Resource": "arn:aws:athena:us-east-1:123456789012:workgroup/*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/costcenter": [
                        "1",
                        "2",
                        "3"
                    ]
                }
            }
        }
    ]
}
```

------

## 資料目錄的標籤政策範例
<a name="tag-policy-examples-data-catalogs"></a>

### 範例 – 基本標籤政策
<a name="tag-policy-examples-data-catalogs-basic"></a>

以下 IAM 政策可讓您與名為 `datacatalogA` 的資料目錄的標籤互動：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListWorkGroups",
                "athena:ListEngineVersions",
                "athena:ListDataCatalogs",
                "athena:ListDatabases",
                "athena:GetDatabase",
                "athena:ListTableMetadata",
                "athena:GetTableMetadata"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:GetWorkGroup",
                "athena:TagResource",
                "athena:UntagResource",
                "athena:ListTagsForResource",
                "athena:StartQueryExecution",
                "athena:GetQueryExecution",
                "athena:BatchGetQueryExecution",
                "athena:ListQueryExecutions",
                "athena:StopQueryExecution",
                "athena:GetQueryResults",
                "athena:GetQueryResultsStream",
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:BatchGetNamedQuery",
                "athena:ListNamedQueries",
                "athena:DeleteNamedQuery"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:CreateDataCatalog",
                "athena:GetDataCatalog",
                "athena:UpdateDataCatalog",
                "athena:DeleteDataCatalog",
                "athena:ListDatabases",
                "athena:GetDatabase",
                "athena:ListTableMetadata",
                "athena:GetTableMetadata",
                "athena:TagResource",
                "athena:UntagResource",
                "athena:ListTagsForResource"
            ],
            "Resource": "arn:aws:athena:us-east-1:123456789012:datacatalog/datacatalogA"
        }
    ]
}
```

------

### 範例 – 根據標籤索引鍵和標籤值組在資料目錄上拒絕動作的政策區塊
<a name="tag-policy-examples-data-catalogs-deny-actions"></a>

您可以使用資源標籤撰寫政策區塊，以拒絕針對以特定標籤鍵值組標記的資料目錄上的特定動作。下列範例政策會拒絕具有標籤鍵值組 `stack`、`production` 的資料目錄上的動作。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "athena:CreateDataCatalog",
                "athena:GetDataCatalog",
                "athena:UpdateDataCatalog",
                "athena:DeleteDataCatalog",
                "athena:GetDatabase",
                "athena:ListDatabases",
                "athena:GetTableMetadata",
                "athena:ListTableMetadata",
                "athena:StartQueryExecution",
                "athena:TagResource",
                "athena:UntagResource",
                "athena:ListTagsForResource"
            ],
            "Resource": "arn:aws:athena:us-east-1:123456789012:datacatalog/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/stack": "production"
                }
            }
        }
    ]
}
```

------

### 範例 – 限制對指定的標籤提出標籤變更動作請求的政策區塊
<a name="tag-policy-examples-data-catalogs-action-specific-tags"></a>

做為參數傳入至變更標籤之操作的標籤 (例如帶有標籤的 `TagResource`、`UntagResource` 或 `CreateDataCatalog`) 稱為請求標籤。下列範例政策區塊只有在傳遞的其中一個標籤具有索引鍵 `costcenter` 和數值 `1`、`2` 或 `3` 時，才允許 `CreateDataCatalog` 操作。

**注意**  
如果您想要允許 IAM 角色在 `CreateDataCatalog` 操作中傳入標籤，請確定您授予角色進行 `TagResource` 和 `CreateDataCatalog` 動作的許可。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:CreateDataCatalog",
                "athena:TagResource"
            ],
            "Resource": "arn:aws:athena:us-east-1:123456789012:datacatalog/*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/costcenter": [
                        "1",
                        "2",
                        "3"
                    ]
                }
            }
        }
    ]
}
```

------

# Service Quotas
<a name="service-limits"></a>

**注意**  
Service Quotas 主控台提供有關 Amazon Athena 配額的資訊。您也可以使用 Service Quotas 主控台，針對可調整的配額[請求提高配額](https://console.aws.amazon.com/servicequotas/home?region=us-east-1#!/services/athena/quotas)。如需 AWS Glue 相關的結構描述限制，請參閱 [AWS Glue 端點和配額](https://docs.aws.amazon.com/general/latest/gr/glue.html)頁面。如需 AWS 服務配額的一般資訊，請參閱 中的[AWS 服務配額](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)*AWS 一般參考*。

## 查詢
<a name="service-limits-queries"></a>

您的帳戶於 Amazon Athena 有下列查詢相關的配額：如需詳細資訊，請參閱 AWS 一般參考的 [Amazon Athena 端點和配額](https://docs.aws.amazon.com/general/latest/gr/athena.html#amazon-athena-limits)頁面。
+ **Active DDL queries** (作用中 DDL 查詢) - 作用中 DDL 查詢的數量。DDL 查詢包括 `CREATE TABLE` 和 `ALTER TABLE ADD PARTITION` 查詢。
+ **DDL query timeout** (DDL 查詢逾時) - DDL 查詢在取消之前可以執行的時間上限，以分鐘為單位。
+ **Active DML queries** (作用中 DML 查詢) - 作用中 DML 查詢的數量。DML 查詢包括 `SELECT`、`CREATE TABLE AS` (CTAS)和 `INSERT INTO` 查詢。具體配額因 AWS 區域而異。
+ **DML query timeout** (DML 查詢逾時) - DML 查詢在取消之前可以執行的時間上限，以分鐘為單位。您可以請求將此逾時增加最多 240 分鐘。

若要請求增加配額，可使用 [Athena Service Quotas](https://console.aws.amazon.com/servicequotas/home?region=us-east-1#!/services/athena/quotas) 主控台。

Athena 會根據整體服務負載和傳入請求數量，以指派資源來處理查詢。系統可能會在執行您的查詢之前，先將其暫時排入佇列。非同步處理會從佇列中接收查詢，並在資源可用且帳戶設定允許的情況下，立即在實體資源上執行查詢。

Active DML 查詢和 Active DDL 查詢配額包括正在執行中和已排入佇列的查詢。例如，如果您的 Active DML 查詢配額為 25，而正在執行中和佇列的查詢總數為 26，則查詢 26 會出現 TooManyRequestsException 的錯誤。

**注意**  
若您要直接控制在 Athena 中執行的查詢的並行，則可以使用容量保留。如需詳細資訊，請參閱[管理查詢處理容量](capacity-management.md)。

### 查詢字串長度
<a name="service-limits-query-string-length"></a>

允許的查詢字串長度上限是 262144 位元組，其中字串以 UTF-8 編碼。這不是可調整的配額。不過，您可以將長查詢分割成多個較小的查詢，以解決這項限制。如需詳細資訊，請參閱 AWS 知識中心中的[如何在 Athena 中增加最大查詢字串長度？](https://aws.amazon.com/premiumsupport/knowledge-center/athena-query-string-length/)。

## 工作群組
<a name="service-limits-workgroups"></a>

使用 Athena 工作群組時，請記住以下幾點：
+ Athena Service Quotas 會在帳戶中的所有工作群組之間共用。
+ 可以在帳戶中為每個區域建立的工作群組數量上限為 1000 個。
+ 工作群組中預備陳述式的數量上限為 1000。
+ 每一工作階段的標籤數上限為 50。如需詳細資訊，請參閱[標籤限制](tags.md#tag-restrictions)。

## 資料庫、資料表和分割區
<a name="service-limits-glue"></a>

Athena 使用 AWS Glue Data Catalog。如需了解資料表、資料庫和分割區的服務配額 (例如，每個帳戶的資料庫或資料表數量上限)，請參閱 [AWS Glue 端點和配額](https://docs.aws.amazon.com/general/latest/gr/glue.html)。請注意，雖然 Athena 支援查詢具有 1，000 萬個分割區的 AWS Glue 資料表，但 Athena 無法在單一掃描中讀取超過 100 萬個分割區。

## Amazon S3 儲存貯體
<a name="service-limits-buckets"></a>

在您使用 Amazon S3 儲存貯體時，請記住以下幾點：
+ Amazon S3 預設的服務配額為每個帳戶 10，000 個儲存貯體。
+ Athena 需有一個單獨的儲存貯體來記錄結果。
+ 您可以要求每個 AWS 帳戶增加最多 100 萬個 Amazon S3 儲存貯體的配額。

## 每個帳戶 API 呼叫配額
<a name="service-limits-api-calls"></a>

Athena API 關於每個帳戶 (而非每個查詢) 的 API 呼叫數量的預設配額。如需預設配額的完整清單，請參閱 AWS 一般參考 指南中的[服務配額](https://docs.aws.amazon.com/general/latest/gr/athena.html#amazon-athena-limits)表。

如果您使用任何這些 API，且超過預設的每秒呼叫數配額，或帳戶中的高載容量，Athena API 會發出類似以下的錯誤："ClientError: An error occurred (ThrottlingException) when calling the *<API\$1name>* operation: Rate exceeded." (ClientError：呼叫 <API\$1name> 操作時發生錯誤 (ThrottlingException)：超過速率。) 請減少每秒呼叫次數，或此帳戶的 API 爆發容量。

您可以在 [Athena Service Quotas 主控台](https://console.aws.amazon.com/servicequotas/home?region=us-east-1#!/services/athena/quotas)中變更每個帳戶 API 呼叫的 Athena 配額。

# Athena 引擎版本控制
<a name="engine-versions"></a>

Athena 偶爾會發行新的引擎版本，以提供改進的效能、功能和程式碼修正。當有新的引擎版本可供使用時，Athena 會透過 Athena 主控台和 [AWS Health 儀板表](https://aws.amazon.com/premiumsupport/technology/personal-health-dashboard/) 通知您。您的 會 AWS Health 儀板表 通知您可能影響 AWS 服務或帳戶的事件。如需 的詳細資訊 AWS Health 儀板表，請參閱 [入門 AWS Health 儀板表](https://docs.aws.amazon.com/health/latest/ug/getting-started-phd.html)。

引擎版本控制是按[工作群組](workgroups-manage-queries-control-costs.md)設定。您可以使用工作群組來控制查詢所使用的查詢引擎，以及是否讓 Athena 自動升級工作群組。使用中的查詢引擎會顯示在查詢編輯器中的工作群組詳細資訊頁面上，並可透過 Athena API 取得。
+ 依預設，工作群組設定為自動升級。當工作群組設定為自動升級時，Athena 會為您升級工作群組，除非它發現不相容。
+ 如果您將工作群組設定為使用特定版本，Athena 將不會變更工作群組的版本。

在這兩種情況下，當版本不再可用時，Athena 會升級您的工作群組。Athena 會透過 [AWS Health 儀板表](https://aws.amazon.com/premiumsupport/technology/personal-health-dashboard/) 通知您何時不再提供某個引擎版本。您的 會 Health 儀板表 通知您可能影響 AWS 服務或帳戶的事件。如需 的詳細資訊 AWS Health 儀板表，請參閱 [入門 AWS Health 儀板表](https://docs.aws.amazon.com/health/latest/ug/getting-started-phd.html)。

當您開始使用新的引擎版本時，一小部分的查詢子集可能會因為不相容而中斷。在發布新的 Athena 版本時，即會公告重大變更。您應透過建立使用新引擎的測試工作群組或測試升級現有工作群組，在升級之前使用工作群組來測試查詢。如需詳細資訊，請參閱[在引擎版本升級之前測試查詢](engine-versions-changing.md#engine-versions-testing)。

**Topics**
+ [變更 Athena 引擎版本](engine-versions-changing.md)
+ [Athena 引擎版本 3](engine-versions-reference-0003.md)

# 變更 Athena 引擎版本
<a name="engine-versions-changing"></a>

Athena 偶爾會發行新的引擎版本，以提供改進的效能、功能和程式碼修正。當有新的引擎版本可供使用時，Athena 會在主控台中通知您。您可以選擇讓 Athena 決定何時升級，或手動為每個工作群組指定 Athena 引擎版本。

## 尋找工作群組的引擎版本
<a name="engine-versions-changing-finding-the-query-engine-version-for-a-workgroup"></a>

您也可以使用 **Workgroups** (工作群組) 頁面，來尋找任何工作群組目前使用的引擎版本。

**若要尋找任意工作群組目前的引擎版本**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![\[選擇展開選單。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 在 Athena 主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在 **Workgroups** (工作群組) 頁面，尋找您想要的工作群組。工作群組的 **Query engine version** (查詢引擎版本) 欄位顯示查詢引擎版本。

## 使用 Athena 主控台變更引擎版本
<a name="engine-versions-changing-changing-the-engine-version"></a>

當有新的引擎版本可用時，您可以選擇讓 Athena 決定何時升級工作群組，或手動指定工作群組使用的 Athena 引擎版本。如果目前只有一個版本可以使用，則無法手動指定不同版本。

**注意**  
若要變更工作群組的引擎版本，必須擁有許可，才能對該工作群組執行 `athena:ListEngineVersions` 動作。如需 IAM 政策範例，請參閱 [工作群組政策範例](example-policies-workgroup.md)。

**讓 Athena 決定何時升級工作群組**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。

1. 在主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在工作群組清單中，選擇您想要設定的工作群組連結。

1. 選擇**編輯**。

1. 在 **Query engine version** (查詢引擎版本) 中，對於 **Update query engine** (更新查詢引擎)，選擇 **Automatic** (自動) 讓 Athena 選擇何時升級您的工作群組。這是預設設定。

1. 選擇**儲存變更**。

   在工作群組清單中，工作群組的 **Query engine update status** (查詢引擎更新狀態) 會顯示為 **Automatic** (自動)。

**若要手動選擇引擎版本**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。

1. 在主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在工作群組清單中，選擇您想要設定的工作群組連結。

1. 選擇**編輯**。

1. 在 **Query engine version** (查詢引擎版本) 下，對於 **Update query engine** (更新查詢引擎)，選擇 **Manually** (手動) 即可手動選擇引擎版本。

1. 使用 **Query engine version** (查詢引擎版本) 選項，選擇您希望工作群組使用的引擎版本。如果不同引擎版本無法使用，則無法指定不同引擎版本。

1. 選擇**儲存變更**。

   在工作群組清單中，工作群組的 **Query engine update status** (查詢引擎更新狀態) 會顯示為 **Manual** (手動)。

## 使用 AWS CLI 變更引擎版本
<a name="engine-versions-changing-changing-the-engine-version-cli"></a>

若要使用 變更引擎版本 AWS CLI，請使用下列範例中的語法。

```
aws athena update-work-group --work-group workgroup-name --configuration-updates EngineVersion={SelectedEngineVersion='Athena engine version 3'}
```

## 在建立工作群組時指定引擎版本
<a name="engine-versions-changing-specifying-the-engine-version-when-you-create-a-workgroup"></a>

當您建立工作群組時，您可以指定工作群組使用的引擎版本，或讓 Athena 決定何時升級工作群組。如果新的引擎版本可供使用，則最佳實務則是建立工作群組，以測試新引擎，然後再升級其他工作群組。若要指定工作群組的引擎版本，您必須擁有工作群組的 `athena:ListEngineVersions` 許可。如需 IAM 政策範例，請參閱 [工作群組政策範例](example-policies-workgroup.md)。

**若要在建立工作群組時指定引擎版本**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。

1. 在主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在 **Workgroups** (工作群組) 頁面中，請選擇 **Create workgroup** (建立工作群組)。

1. 在 **Create workgroup** (建立工作群組) 頁面中，請於 **Query engine version** (查詢引擎版本) 區段執行下列其中一項動作：
   + 選擇 **Automatic** (自動)，便可讓 Athena 選擇何時升級您的工作群組。這是預設設定。
   + 如果有不同引擎版本可供使用，透過選擇 **Manual** (手動)，便可手動選擇該引擎版本。

1. 視需要輸入其他欄位的資訊。如需其他欄位的相關資訊，請參閱 [建立工作群組](creating-workgroups.md)。

1. 選擇 **Create workgroup** (建立工作群組)。

## 在引擎版本升級之前測試查詢
<a name="engine-versions-testing"></a>

當工作群組升級到新的引擎版本時，您的部分查詢可能會因為不相容而中斷。若要確保您的引擎版本升級順利進行，您可以事先測試您的查詢。

**若要在引擎版本升級之前測試您的查詢**

1. 請驗證您所使用的工作群組引擎版本。您正在使用的引擎版本顯示在 **Workgroups** (工作群組) 頁面上用於該工作群組的 **Query engine version** (查詢引擎版本) 欄位中。如需詳細資訊，請參閱[尋找工作群組的引擎版本](#engine-versions-changing-finding-the-query-engine-version-for-a-workgroup)。

1. 建立使用新引擎版本的測試工作群組。如需詳細資訊，請參閱[在建立工作群組時指定引擎版本](#engine-versions-changing-specifying-the-engine-version-when-you-create-a-workgroup)。

1. 使用新工作群組來執行您要測試的查詢。

1. 如果查詢失敗，請檢查新引擎中是否有可能會影響查詢的重大變更。某些變更可能需要您更新查詢的語法。

1. 如果您的查詢仍然失敗，請聯絡 AWS 支援 尋求協助。在 AWS 管理主控台中，選擇**支援**、**支援中心**，或使用 **Amazon Athena** 標籤在 [AWS re:Post](https://repost.aws/tags/TA78iVOM7gR62_QqDe2-CmiA/amazon-athena) 上詢問問題。

## 對引擎版本升級後失敗的查詢進行疑難排解
<a name="engine-versions-troubleshooting"></a>

如果查詢在引擎版本升級後失敗，請檢查是否有重大變更，包括可能會影響查詢中的語法的變更。

如果您的查詢仍然失敗，請聯絡 AWS 支援 尋求協助。在 中 AWS 管理主控台，選擇**支援**、**支援中心**，或使用 **Amazon Athena** 標籤在 [AWS re：Post](https://repost.aws/tags/TA78iVOM7gR62_QqDe2-CmiA/amazon-athena) 上提出問題。

# Athena 引擎版本 3
<a name="engine-versions-reference-0003"></a>

Athena 引擎版本 3 也仍然採用持續整合方法，管理開放原始碼軟體，提高 [Trino](https://trino.io/) 和 [Presto](https://prestodb.io/) 專案的並行數，讓您可以更快速地使用到各種改善後的社群功能，並在 Athena 引擎中執行整合和調整。

此次推出的 Athena 引擎版本 3 支援先前的引擎版本的所有功能。本文件會重點說明先前的引擎版本與 Athena 引擎版本 3 之間的主要差異。如需詳細資訊，請參閱 *AWS 大數據部落格*文章「[升級至 Athena 引擎版本 3，以提升查詢效能並存取更多分析功能](https://aws.amazon.com/blogs/big-data/upgrade-to-athena-engine-version-3-to-increase-query-performance-and-access-more-analytics-features/)」。
+ [開始使用](#engine-versions-reference-0003-getting-started)
+ [改善和新功能](#engine-versions-reference-0003-improvements-and-new-features)
  + [新增功能](#engine-versions-reference-0003-added-features)
  + [新增的函數](#engine-versions-reference-0003-added-functions)
  + [效能改進](#engine-versions-reference-0003-performance-improvements)
  + [可靠性增強功能](#engine-versions-reference-0003-reliability-enhancements)
  + [查詢語法增強功能](#engine-versions-reference-0003-query-syntax-enhancements)
  + [資料格式和資料類型增強功能](#engine-versions-reference-0003-data-format-and-data-type-enhancements)
+ [突破性變更](#engine-versions-reference-0003-breaking-changes)
  + [查詢語法變更](#engine-versions-reference-0003-syntax-changes)
  + [資料處理變更](#engine-versions-reference-0003-data-processing-changes)
  + [時間戳記變更](#engine-versions-reference-0003-timestamp-changes)
+ [限制](#engine-versions-reference-0003-known-limitations)

## 開始使用
<a name="engine-versions-reference-0003-getting-started"></a>

若要開始使用，請建立使用 Athena 引擎版本 3 的新 Athena 工作群組，或將現有工作群組設定為使用版本 3。

如需詳細資訊，請參閱[變更 Athena 引擎版本](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-changing.html)。

## 改善和新功能
<a name="engine-versions-reference-0003-improvements-and-new-features"></a>

所列之功能和更新內容包括 Athena 本身的功能改進，以及從開放原始碼 Trino 整合的功能改進。如需有關 SQL 查詢運算子和函數的詳盡清單，請參閱 [Trino 文件](https://trino.io/docs/current/functions.html)。

### 新增功能
<a name="engine-versions-reference-0003-added-features"></a>

#### Apache Spark 歸納演算法支援
<a name="engine-versions-reference-0003-spark-bucketing-support"></a>

Athena 可讀取 Spark 雜湊演算法產生的儲存貯體。若要指定最初由 Spark 雜湊演算法撰寫該資料，請將 `('bucketing_format'='spark')` 放入 `CREATE TABLE` 陳述式的 `TBLPROPERTIES` 子句中。若未指定此屬性，則系統會使用 Hive 雜湊演算法。

```
CREATE EXTERNAL TABLE `spark_bucket_table`(
  `id` int, 
  `name` string
  )
CLUSTERED BY (`name`) 
INTO 8 BUCKETS
STORED AS PARQUET
LOCATION 
  's3://amzn-s3-demo-bucket/to/bucketed/table/'
TBLPROPERTIES ('bucketing_format'='spark')
```

### 新增的函數
<a name="engine-versions-reference-0003-added-functions"></a>

本節中的函數是 Athena 引擎版本 3 中新增的函數。

#### 彙總函數
<a name="engine-versions-reference-0003-aggregate-functions"></a>

**listagg(x, separator)** – 傳回串連的輸入值，由分隔符號字串分開。

```
SELECT listagg(value, ',') WITHIN GROUP (ORDER BY value) csv_value 
FROM (VALUES 'a', 'c', 'b') t(value);
```

#### 陣列函數
<a name="engine-versions-reference-0003-array-functions"></a>

**contains\$1sequence(x, seq)** – 如果陣列 x 包含所有陣列序列，並作為循序子集 (相同連續順序中的所有值)，則會傳回 true。

```
SELECT contains_sequence(ARRAY [1,2,3,4,5,6], ARRAY[1,2]);
```

#### 二進位函數
<a name="engine-versions-reference-0003-binary-functions"></a>

**murmur3(binary)** – 計算二進位的 128 位元 MurmurHash3 雜湊。

```
SELECT murmur3(from_base64('aaaaaa'));
```

#### 轉換函數
<a name="engine-versions-reference-0003-conversion-functions"></a>

**format\$1number(number)** – 傳回使用單位符號的格式化字串。

```
SELECT format_number(123456); -- '123K'
```

```
SELECT format_number(1000000); -- '1M'
```

#### 日期和時間函數
<a name="engine-versions-reference-0003-date-and-time-functions"></a>

**timezone\$1hour(timestamp)** – 傳回與時間戳記偏離的時區小時數。

```
SELECT EXTRACT(TIMEZONE_HOUR FROM TIMESTAMP '2020-05-10 12:34:56 +08:35');
```

**timezone\$1minute(timestamp)** – 傳回與時間戳記偏離的時區分鐘數。

```
SELECT EXTRACT(TIMEZONE_MINUTE FROM TIMESTAMP '2020-05-10 12:34:56 +08:35');
```

#### 地理空間函數
<a name="engine-versions-reference-0003-geospatial-functions"></a>

**to\$1encoded\$1polyline(Geometry)** – 將 linestring 或 multipoint 編碼為 polyline。

```
SELECT to_encoded_polyline(ST_GeometryFromText(
   'LINESTRING (-120.2 38.5, -120.95 40.7, -126.453 43.252)'));
```

**from\$1encoded\$1polyline(varchar)** – 將 polyline 解碼為 linestring。

```
SELECT ST_AsText(from_encoded_polyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@'));         
```

**to\$1geojson\$1geometry(SphericalGeography)** – 以 GeoJSON 格式傳回指定的球形地理資訊。

```
SELECT to_geojson_geometry(to_spherical_geography(ST_GeometryFromText(
   'LINESTRING (0 0, 1 2, 3 4)')));
```

**from\$1geojson\$1geometry(varchar)** – 以 GeoJSON 表示法傳回剝離非幾何鍵/值的球形地理類型物件。不支援 `Feature` 和 `FeatureCollection`。

```
SELECT from_geojson_geometry(to_geojson_geometry(to_spherical_geography(ST_GeometryFromText(
   'LINESTRING (0 0, 1 2, 3 4)'))));
```

**geometry\$1nearest\$1points(Geometry, Geometry)** – 傳回每個幾何形狀上互相最近的點。如果任一幾何形狀為空，則會傳回 NULL。否則，便會傳回由兩個 `Point` 物件組成的資料列，這兩個物件與幾何形狀上任兩點的距離為最小距離。第一個點來自第一個 Geometry 引數，第二個點來自第二個 Geometry 引數。如果有多個具有相同最小距離的配對，則會任意選擇一對。

```
SELECT geometry_nearest_points(ST_GeometryFromText(
   'LINESTRING (50 100, 50 200)'), ST_GeometryFromText(
   'LINESTRING (10 10, 20 20)'));
```

#### Set Digest 函數
<a name="engine-versions-reference-0003-set-digest-functions"></a>

**make\$1set\$1digest(x)** – 將 x 的所有輸入值撰寫成一個 Setdigest。

```
SELECT make_set_digest(value) FROM (VALUES 1, 2, 3) T(value);
```

#### 字串函數
<a name="engine-versions-reference-0003-string-functions"></a>

**soundex(char)** – 傳回包含字元音標表示法的字元串。

```
SELECT name 
FROM nation 
WHERE SOUNDEX(name) = SOUNDEX('CHYNA'); -- CHINA
```

**concat\$1ws(string0, string1, ..., stringN)** – 傳回串連的 `string1, string2, ..., stringN` (使用 `string0` 作分隔符號)。如果 `string0` 為 NULL，則傳回值為 NULL。系統會略過在分隔符號後以引數方式提供的任何 Null 值。

```
SELECT concat_ws(',', 'def', 'pqr', 'mno');
```

#### 範圍函數
<a name="engine-versions-reference-0003-window-functions"></a>

**GROUPS** – 新增對群組型範圍框的支援。

```
SELECT array_agg(a) OVER(
   ORDER BY a ASC NULLS FIRST GROUPS BETWEEN 1 PRECEDING AND 2 FOLLOWING) 
FROM (VALUES 3, 3, 3, 2, 2, 1, null, null) T(a);
```

### 效能改進
<a name="engine-versions-reference-0003-performance-improvements"></a>

Athena 引擎版本 3 的效能改進包含以下內容。
+ **更快速的 AWS Glue 資料表中繼資料擷取** – 涉及多個資料表的查詢將縮短查詢規劃時間。
+ **RIGHT JOIN 的動態篩選** – 現可針對具有相等聯結條件的右端聯結啟用動態篩選，如以下範例所示。

  ```
  SELECT * 
  FROM lineitem RIGHT JOIN tpch.tiny.supplier 
  ON lineitem.suppkey = supplier.suppkey 
  WHERE supplier.name = 'abc';
  ```
+ **大型預備陳述式** – 預設 HTTP 請求/回應標頭大小已增加至 2 MB，以允許使用大型預備陳述式。
+ **approx\$1percentile()** – `approx_percentile` 函數現在使用 `tdigest` 而不是 `qdigest` 來從分佈擷取近似分位數值。這會導致更高的效能以及更低的記憶體使用量。請注意，由於此變更，函式傳回的結果與先前的引擎版本中的結果不同。如需詳細資訊，請參閱[approx\$1percentile 函數會傳回不同的結果](#engine-versions-reference-0003-approx-percentile-function)。

### 可靠性增強功能
<a name="engine-versions-reference-0003-reliability-enhancements"></a>

Athena 引擎版本 3 的一般引擎記憶體用量和追蹤功能已改進。大型查詢較不易因節點當機而失敗。

### 查詢語法增強功能
<a name="engine-versions-reference-0003-query-syntax-enhancements"></a>

**INTERSECT ALL** – 已新增對 `INTERSECT ALL` 的支援。

```
SELECT * FROM (VALUES 1, 2, 3, 4) INTERSECT ALL SELECT * FROM (VALUES 3, 4);
```

**EXCEPT ALL** – 已新增對 `EXCEPT ALL` 的支援。

```
SELECT * FROM (VALUES 1, 2, 3, 4) EXCEPT ALL SELECT * FROM (VALUES 3, 4);
```

**RANGE PRECEDING** – 已新增對範圍函數中 `RANGE PRECEDING` 的支援。

```
SELECT sum(x) over (order by x range 1 preceding) 
FROM (values (1), (1), (2), (2)) t(x);
```

**MATCH\$1RECOGNIZE** – 已新增對資料列模式比對的支援，如以下範例所示。

```
SELECT m.id AS row_id, m.match, m.val, m.label 
FROM (VALUES(1, 90),(2, 80),(3, 70),(4, 70)) t(id, value) 
MATCH_RECOGNIZE ( 
        ORDER BY id 
        MEASURES match_number() AS match, 
        RUNNING LAST(value) AS val, 
        classifier() AS label 
        ALL ROWS PER MATCH 
        AFTER MATCH SKIP PAST LAST ROW 
        PATTERN (() | A) DEFINE A AS true 
) AS m;
```

### 資料格式和資料類型增強功能
<a name="engine-versions-reference-0003-data-format-and-data-type-enhancements"></a>

Athena 引擎版本 3 具有以下資料格式和資料類型增強功能。
+ **LZ4 和 ZSTD** – 已新增對讀取 LZ4 和 ZSTD 壓縮 Parquet 資料的支援。已新增對寫入 ZSTD 壓縮 ORC 資料的支援。
+ **符號連結型資料表** – 已新增對在 Avro 檔案上建立符號連結型資料表的支援。範例如下。

  ```
  CREATE TABLE test_avro_symlink  
  ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'  
  ... 
  INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
  ```
+ **SphericalGeography** – SphericalGeography 類型對地理座標 (有時稱為測地座標、緯度/經度或緯度/經度) 上所表示的空間特徵提供原生支援。地理座標是以角度單位 (度) 來表示的球面座標。

  `to_spherical_geography` 函數會從幾何 (平面) 座標傳回地理 (球形) 座標，如以下範例所示。

  ```
  SELECT to_spherical_geography(ST_GeometryFromText(
     'LINESTRING (-40.2 28.9, -40.2 31.9, -37.2 31.9)'));
  ```

## 突破性變更
<a name="engine-versions-reference-0003-breaking-changes"></a>

從先前的引擎版本移轉至 Athena 引擎版本 3 時，特定變更可能會影響資料表結構描述、語法或資料類型用量。本節會列出相關的錯誤訊息，並提供建議的因應措施。

### 查詢語法變更
<a name="engine-versions-reference-0003-syntax-changes"></a>

#### IGNORE NULLS 不能與非值視窗函數一起使用
<a name="engine-versions-reference-0003-remove-ignore-nulls-for-bool_or"></a>

**錯誤訊息**：無法為 `bool_or` 函數指定 Null 處理方式子句。

**原因**：`IGNORE NULLS` 現在只能與[值函數](https://trino.io/docs/current/functions/window.html#value-functions) `first_value`、`last_value`、`nth_value`、`lead` 和 `lag` 一起使用。此變更之目的是符合 ANSI SQL 規格。

**建議的解決方案**：從查詢字符串中的非值視窗函數中移除 `IGNORE NULLS`。

#### CONCAT 函數必須有兩個或多個引數
<a name="engine-versions-reference-0003-concat-str-minimum-two-args"></a>

**錯誤信息**：INVALID\$1FUNCTION\$1ARGUMENT: There must be two or more concatenation arguments (NVALID\$1FUNCTION\$1ARGUMENT：必須有兩個或多個串聯參數)

**原因**：先前，`CONCAT` 字串函數接受了單一引數。在 Athena 引擎版本 3 中，`CONCAT` 函數需要至少兩個引數。

**建議的解決方案**：將出現次數從 `CONCAT(str)` 變更為 `CONCAT(str, '')`。

在 Athena 引擎版本 3 中，函數中不可超過 127 個引數。如需詳細資訊，請參閱[函數呼叫的引數過多](troubleshooting-athena.md#troubleshooting-athena-too-many-arguments)。

#### approx\$1percentile 函數會傳回不同的結果
<a name="engine-versions-reference-0003-approx-percentile-function"></a>

`approx_percentile` 函式會在 Athena 引擎版本 3 中傳回的結果與先前的引擎版本中傳回的結果不同。

**錯誤訊息**：無。

**原因**：`approx_percentile` 函數可能因版本變更而變更。

**重要**  
由於 `approx_percentile` 函數的輸出是近似值，並且近似值可能會從一個版本變更為下一個版本，因此關鍵應用程式不得倚賴 `approx_percentile` 函數。

**建議的解決方案**：若要將先前的引擎版本行為估算為 `approx_percentile`，您可以在 Athena 引擎版本 3 中使用不同的函式組。例如，假設您在先前的引擎版本中有下列查詢：

```
SELECT approx_percentile(somecol, 2E-1)
```

若要估計 Athena 引擎版本 3 中的相同輸出，您可以嘗試使用 `qdigest_agg` 和 `value_at_quantile` 函數，如下列範例所示。請注意，即使使用此解決方法，也不能保證行為相同。

```
SELECT value_at_quantile(qdigest_agg(somecol, 1), 2E-1)
```

#### 地理空間函數不支援 varbinary 輸入
<a name="engine-versions-reference-0003-geo-spatial-function-does-not-support-varbinary-input"></a>

**錯誤訊息**：FUNCTION\$1NOT\$1FOUND for st\$1XXX

**原因**：一些地理空間函數不再支援舊版 `VARBINARY` 輸入類型或與文字相關的函數簽章。

**建議的解決方案**：使用地理空間函數將輸入類型轉換為受支援的類型。錯誤訊息會指出受支援的輸入類型。

#### 在 GROUP BY 子句中，巢狀資料欄必須使用雙引號
<a name="engine-versions-reference-0003-group-by-nested-columns-require-double-quotes"></a>

**錯誤訊息**："*column\$1name*"."*nested\$1column*" 必須是彙總表達式，或出現在 GROUP BY 子句中

**原因**：Athena 引擎版本 3 要求 `GROUP BY` 子句中的巢狀資料欄名稱必須加上雙引號。例如，下列查詢會產生錯誤，因為在 `GROUP BY` 子句中，`user.name` 未使用雙引號。

```
SELECT "user"."name" FROM dataset 
GROUP BY user.name
```

**建議的解決方案**：在 `GROUP BY` 子句中的巢狀資料欄名稱周圍使用雙引號，如下列範例所示。

```
SELECT "user"."name" FROM dataset 
GROUP BY "user"."name"
```

#### 在 Iceberg 資料表上使用 OPTIMIZE 時發生未預期的 FilterNode 錯誤
<a name="engine-versions-reference-0003-iceberg-optimize-where-clause-filters"></a>

**錯誤訊息**：計畫中發現未預期的 FilterNode；可能是連接器無法處理提供的 WHERE 表達式。

**原因**：在 Iceberg 資料表上執行的 `OPTIMIZE` 陳述式使用了 `WHERE` 子句，其中該子句在其篩選條件表達式中包含了非分割區資料欄。

**建議的解決方案**：`OPTIMIZE` 陳述式僅支援依分割區來進行篩選。當您在已分割的資料表上執行 `OPTIMIZE` 時，請在 `WHERE` 子句中僅包含分割區資料欄。如果您在未分割的資料表上執行 `OPTIMIZE`，請勿指定 `WHERE` 子句。

#### Log() 函數引數的順序
<a name="engine-versions-reference-0003-log-function"></a>

在 Athena 引擎版本 3 中，`log()` 函式的引數順序已變更為 `log(base, value)`，以符合 SQL 標準。

#### Minute() 函數不支援 interval year to month
<a name="engine-versions-reference-0003-minute-function"></a>

**錯誤訊息**：Unexpected parameters (interval year to month) for function minute.(Minute 函數的意外參數 (間隔使用年份和月份)。) Expected: minute(timestamp with time zone) , minute(time with time zone) , minute(timestamp) , minute(time) , minute(interval day to second). (函數 minute 出現未預期參數 (interval year to month)。預期：minute(timestamp with time zone)、minute(time with time zone)、minute(timestamp)、minute(time)、minute(interval day to second)。)

**原因**：在 Athena 引擎版本 3 中，已依據 ANSI SQL 規格，更精確地為 `EXTRACT` 執行類型檢查。

**建議的解決方案**：更新查詢，以確保類型與建議的函數簽章相符。

#### ORDER BY 表達式必須出現在 SELECT 清單中。
<a name="engine-versions-reference-0003-order-by-expressions-must-appear-in-select-list"></a>

**錯誤訊息**：For SELECT DISTINCT, ORDER BY expressions must appear in SELECT list (若為 SELECT DISTINCT，ORDER BY 表達式必須出現在 SELECT 清單中)

**原因**：`SELECT` 子句中使用了不正確的資料表別名方式。

**建議的解決方案**：再次檢查 `ORDER BY` 表達式中的所有資料欄是否在 `SELECT DISTINCT` 子句中皆具有正確參考。

#### 比較從子查詢傳回的多個資料欄時，查詢失敗
<a name="engine-versions-reference-0003-subquery-failure-multiple-columns"></a>

**範例錯誤訊息**：值表達式和子查詢的結果必須是相同的類型：資料列(varchar, varchar) 與資料列(row(varchar, varchar))

**原因**：由於 Athena 引擎版本 3 中的語法更新，當查詢嘗試比較子查詢傳回的多個值，而子查詢 `SELECT` 陳述式會包括其資料欄清單 (用括號) 時，就會發生此錯誤，如下列範例所示。

```
SELECT *
FROM table1
WHERE (t1_col1, t1_col2)
IN (SELECT (t2_col1, t2_col2) FROM table2)
```

**解決方案**：在 Athena 引擎版本 3 中，移除子查詢 `SELECT` 陳述式中資料欄清單周圍的括號，如下列更新的範例查詢所示。

```
SELECT *
FROM table1
WHERE (t1_col1, t1_col2)
IN (SELECT t2_col1, t2_col2 FROM table2)
```

#### SKIP 是 DML 查詢的保留字詞
<a name="engine-versions-reference-0003-skip-is-a-reserved-word-for-dml"></a>

單字 `SKIP` 是 DML 查詢的保留字詞，例如 `SELECT`。若要在 DML 查詢中將 `SKIP` 用作識別符，請將其括在雙引號中。

如需有關 Athena 中保留字詞的詳細資訊，請參閱 [在查詢中逸出預留關鍵字](reserved-words.md)。

#### 時間歷程已取代 SYSTEM\$1TIME 和 SYSTEM\$1VERSION 子句。
<a name="engine-versions-reference-0003-time-travel-syntax"></a>

**錯誤訊息**：mismatched input 'SYSTEM\$1TIME'. (不相符的輸入 'SYSTEM\$1TIME'。) 預期：'TIMESTAMP'、'VERSION'

**原因**：在先前的引擎版本中，Iceberg 資料表使用了 `FOR SYSTEM_TIME AS OF` 和 `FOR SYSTEM_VERSION AS OF` 子句作為時間戳記和版本時間歷程。Athena 引擎版本 3 使用了 `FOR TIMESTAMP AS OF` 和 `FOR VERSION AS OF` 子句。

**建議的解決方案**：更新 SQL 查詢，以使用 `TIMESTAMP AS OF` 和 `VERSION AS OF` 子句作為時間歷程操作，如下列範例所示。

依時間戳記的時間歷程：

```
SELECT * FROM TABLE FOR TIMESTAMP AS OF (current_timestamp - interval '1' day)
```

 依版本的時間歷程：

```
SELECT * FROM TABLE FOR VERSION AS OF 949530903748831860
```

#### 陣列建構的引數過多
<a name="engine-versions-reference-0003-array-max-elements"></a>

**錯誤訊息**：TOO\$1MANY\$1ARGUMENTS：陣列建構的引數過多。

**原因**：陣列建構中的元素數目上限現已設定為 254。

**建議的解決方案**：將元素分解為多個陣列，每個陣列具有 254 個或更少的元素，並使用 `CONCAT` 函數來串連陣列，如下列範例所示。

```
CONCAT(
ARRAY[x1,x2,x3...x254],
ARRAY[y1,y2,y3...y254],
...
)
```

#### 不允許使用零長度分隔的識別碼
<a name="engine-versions-reference-0003-zero-length-delimited-identifier"></a>

**錯誤訊息**：Zero-length delimited identifier not allowed. (不允許使用零長度分隔的識別碼。)

**原因**：查詢使用了空白字串作為資料欄別名。

**建議的解決方案**：更新查詢以使用非空白的資料欄別名。

### 資料處理變更
<a name="engine-versions-reference-0003-data-processing-changes"></a>

#### 儲存貯體驗證
<a name="engine-versions-reference-0003-bucket-validation"></a>

**錯誤訊息**：HIVE\$1INVALID\$1BUCKET\$1FILES：Hive 資料表已損壞。

**原因**：該資料表可能已損壞。為確定歸納資料表的查詢正確性，Athena 引擎版本 3 會在歸納資料上啟用額外的驗證，以確保查詢的正確性並避免執行期發生非預期的失敗。

**建議的解決方案**：使用 Athena 引擎版本 3 重新建立資料表。

#### 現在，將結構轉換為 JSON，會傳回欄位名稱
<a name="engine-versions-reference-0003-cast-struct-to-json"></a>

當您在 Athena 引擎第 3 版的 `SELECT` 查詢中將 `struct` 轉換為 JSON 時，該轉換現在會傳回欄位名稱和值 (例如 "`useragent":null`) 而非只是值 (例如，`null`)。

#### Iceberg 資料表資料欄層級安全性強制執行變更
<a name="engine-versions-reference-0003-iceberg-column-security"></a>

**錯誤信息**：Access Denied: Cannot select from columns (存取遭拒：無法從資料欄中選取)

**原因**：Iceberg 資料表是在 Athena 之外建立的，並使用早於 0.13.0 的 [Apache Iceberg SDK](https://iceberg.apache.org/releases/) 版本。由於舊版 SDK 不會在 中填入資料欄 AWS Glue，Lake Formation 無法判斷授權存取的資料欄。

**建議的解決方案**：使用 Athena [ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md) 陳述式執行更新，或使用最新的 Iceberg SDK 來修正資料表並更新 AWS Glue中的資料欄資訊。

#### List 資料類型中的 Null 值現已傳播至 UDF
<a name="engine-versions-reference-0003-nulls-in-list-datatypes-for-udfs"></a>

**錯誤訊息**：Null Pointer Exception (Null 指標異常情形)

**原因**：如果您使用 UDF 連接器並已執行使用者定義的 Lambda 函數，則此問題可能會對您產生影響。

先前的引擎版本會篩選出 List 資料類型中已傳遞給使用者定義函式的 Null 值。在 Athena 引擎版本 3 中，會保留 Null 值並傳遞給 UDF。如果 UDF 嘗試在未檢查的情況下取消參考 Null 元素，這可能會導致 Null 指標異常情形。

例如，若您在如 DynamoDB 等原始資料來源中具有資料 `[null, 1, null, 2, 3, 4]`，則系統會將以下項目傳遞至使用者定義的 Lambda 函數：

**Athena 引擎版本 3**：`[null, 1, null, 2, 3, 4]`

**建議的解決方案**：確保使用者定義的 Lambda 函數會處理 List 資料類型中的 Null 元素。

#### 字元陣列中的子字串不再包含已填補的空格
<a name="engine-versions-reference-0003-substring-no-padded-spaces"></a>

**錯誤訊息**：No error is thrown, but the string returned no longer contains padded spaces. (未擲回任何錯誤，但傳回的字串不再包含已填補的空格。) 例如，`substr(char[20],1,100)` 現在會傳回長度為 20 而非 100 的字串。

**建議的解決方案**：無需採取任何動作。

#### 不支援的十進位資料欄類型強制轉換
<a name="engine-versions-reference-0003-unsupported-column-type"></a>

**錯誤訊息**：HIVE\$1CURSOR\$1ERROR：讀取 Parquet 檔案失敗：s3://amzn-s3-demo-bucket/*path*/*file\$1name*.parquet 或 Parquet 資料欄有不支援的資料欄類型 (varchar) ([*column\$1name*]

**原因**：當嘗試將資料類型強制從 `varchar` 轉換為 decimal 時，Athena 引擎版本 2 偶有成功 (但經常失敗)。由於 Athena 引擎版本 3 會有類型驗證，即會在嘗試讀取值之前先檢查類型是否相容，因此類型嘗試強制執行現在總會失敗。

**建議的解決方案**：對於 Athena 引擎第 3 版，在 中修改結構描述 AWS Glue ，以使用數值資料類型，而不是 Parquet 檔案中`varchar`的小數資料欄。重新編目資料並確定新的資料欄資料類型為 decimal 類型，或在 Athena 中手動重新建立資料表，然後使用語法 `decimal(precision, scale)` 指定資料欄的 [decimal](data-types.md#data-types-decimal) 資料類型。

#### Float 或 double NaN 值不能再轉換為 bigint
<a name="engine-versions-reference-0003-no-nan-to-bigint"></a>

**錯誤訊息**：INVALID\$1CAST\$1ARGUMENT：無法將 real/double NaN 轉換為 bigint

**原因**：在 Athena 引擎版本 3 中，`NaN` 無法再以 `bigint` 的形式轉換為 0。

**建議的解決方案**：當您轉換為 `bigint` 時，請確保 `NaN` 值不存在於 `float` 或 `double` 資料欄。

#### uuid() 函數傳回類型變更
<a name="engine-versions-reference-0003-uuid-function-return-type-change"></a>

下列問題會影響資料表和檢視。

**錯誤訊息**：不支援的 Hive 類型：uuid

**原因**：在先前的引擎版本中，`uuid()` 函式傳回了一個字串，但在 Athena 引擎版本 3 中，它會傳回一個偽隨機產生的 UUID (類型 4)。由於 Athena 中不支援 UUID 資料欄資料類型，因此無法在 CTAS 查詢中直接使用 `uuid()` 函數，以在 Athena 引擎版本 3 中產生 UUID 資料欄。

例如，下列 `CREATE TABLE` 陳述式在先前的引擎版本中成功完成；但在 Athena 引擎版本 3 中，則會傳回 NOT\$1SUPPORTED：不支援的 Hive 類型：uuid：

```
CREATE TABLE uuid_table AS 
   SELECT uuid() AS myuuid
```

同樣地，下列 `CREATE VIEW` 陳述式在 Athena 引擎版本 2 中已成功完成；但在 Athena 引擎版本 3 中，則會傳回資料欄 myuuid 的資料欄類型無效：不支援的 Hive 類型：uuid：

```
CREATE VIEW uuid_view AS 
   SELECT uuid() AS myuuid
```

在 Athena 引擎版本 3 中查詢在先前的引擎版本中建立的檢視時，會發生類似下列情況的錯誤：

VIEW\$1IS\$1STALE：行 1:15:：檢視 'awsdatacatalog.mydatabase.uuid\$1view' 已過時或處於無效狀態：從位置 0 查詢檢視投影之 uuid 類型的資料欄 [myuuid] 無法強制轉換為儲存在檢視定義中的 varchar 類型的資料欄 [myuuid]

**建議的解決方案**：建立資料表或檢視時，請使用 `cast()` 函數將 `uuid()` 的輸出轉換為 `varchar`，如下列範例所示：

```
CREATE TABLE uuid_table AS
   SELECT CAST(uuid() AS VARCHAR) AS myuuid
```

```
CREATE VIEW uuid_view AS
   SELECT CAST(uuid() AS VARCHAR) AS myuuid
```

#### CHAR 和 VARCHAR 強制問題
<a name="engine-versions-reference-0003-char-varchar-coercion-issues"></a>

如果您在 Athena 引擎版本 3 中遇到 `varchar` 和 `char` 強制問題，請使用本節的解決方法。如果您無法使用這些解決方法，請聯絡 支援。

##### 混合 CHAR 和 VARCHAR 輸入的 CONCAT 函數失敗
<a name="engine-versions-reference-0003-concat-function-failure"></a>

**問題**：Athena 引擎版本 2 會成功執行下列查詢。

```
SELECT concat(CAST('abc' AS VARCHAR(20)), '12', CAST('a' AS CHAR(1)))
```

但是，在 Athena 引擎版本 3 上，相同的查詢會失敗，並顯示下列情況：

**錯誤訊息**：FUNCTION\$1NOT\$1FOUND：行 1:8：函數 concat 的意外參數 (varchar(20), varchar(2), char(1))。預期：concat(char(x), char(y)), concat(array(E), E) E、concat(E, array(E)) E、concat(array(E)) E、concat(varchar)、concat(varbinary)

**建議的解決方案**：使用 `concat` 函數時`varchar`，可轉換為 `char` 或 ，但不能混合兩者。

##### SQL \$1\$1 CHAR 和 VARCHAR 輸入的串聯失敗
<a name="engine-versions-reference-0003-double-pipe-char-varchar-failure"></a>

在 Athena 引擎版本 3 中，雙垂直長條圖 `||` 串聯操作員要求 `varchar` 做為輸入。輸入不能是 `varchar` 和 `char` 類型的組合。

**錯誤訊息**：TYPE\$1NOT\$1FOUND：行 1:26：未知類型：char(65537)

**原因**：使用 `||` 來串連 `char` 和 `varchar` 的查詢可能會產生錯誤，如下列範例所示。

```
SELECT CAST('a' AS CHAR) || CAST('b' AS VARCHAR)
```

**建議的解決方案**：串連 `varchar` 和 `varchar`，如下列範例所示。

```
SELECT CAST('a' AS VARCHAR) || CAST('b' AS VARCHAR) 
```

##### CHAR 和 VARCHAR UNION 查詢失敗
<a name="engine-versions-reference-0003-char-varchar-union-query-failure"></a>

**錯誤訊息**：NOT\$1SUPPORTED：不支援的 Hive 類型：char(65536)。支援的 CHAR 類型：CHAR(<=255)

**原因**：嘗試合併 `char` 和 `varchar` 的查詢，如下列範例所示：

```
CREATE TABLE t1 (c1) AS SELECT CAST('a' as CHAR) as c1 UNION ALL SELECT CAST('b' AS VARCHAR) AS c1 
```

**建議的解決方案**：在範例查詢中，將 `'a'` 轉換為 `varchar` 而不是 `char`。

##### CHAR 或 VARCHAR 強制後不需要的空白空格
<a name="engine-versions-reference-0003-empty-spaces-added-after-coercion"></a>

在 Athena 引擎版本 3 中，當 `char(X)` 和 `varchar` 資料在形成陣列或單一資料欄時強制轉換為單一類型，則 `char(65535)` 是目標類型，而且每個欄位都包含許多不需要的尾隨空格。

**原因**：Athena 引擎版本 3 強制將 `varchar` 和 `char(X)` 轉換為 `char(65535)`，然後右邊填補了空格的資料。

**建議的解決方案**：明確地將每個欄位轉換為 `varchar`。

### 時間戳記變更
<a name="engine-versions-reference-0003-timestamp-changes"></a>

#### 日期時間戳記溢出會擲出錯誤
<a name="engine-versions-reference-0003-date-timestamp-overflow"></a>

**錯誤訊息**：Millis overflow: XXX (毫秒溢出：XXX)

**原因**：由於在先前的引擎版本中未檢查 ISO 8601 日期是否溢出，因此部分日期會產生負數時間戳記。Athena 引擎版本 3 會檢查此溢出，並擲出例外狀況。

**建議的解決方案**：確保時間戳記在範圍內。

#### 不支援具有 TIME 的政治時區
<a name="engine-versions-reference-0003-political-time-zones"></a>

**錯誤訊息**：INVALID LITERAL (無效常值)

**原因**：如 `SELECT TIME '13:21:32.424 America/Los_Angeles'` 等查詢。

**建議的解決方案**：避免使用具有 `TIME` 的政治時區。

#### Timestamp 資料欄中的精確度不符會造成序列化錯誤
<a name="engine-versions-reference-0003-timestamp-precision-serialization-error"></a>

**錯誤訊息**：SERIALIZATION\$1ERROR: Could not serialize column '*COLUMNZ*' of type 'timestamp(3)' at position *X*:*Y* (SERIALIZATION\$1ERROR：無法在位置 X:Y 處序列化類型為 'timestamp(3)' 的資料欄 'COLUMNZ')

*COLUMNZ* 是造成該問題之資料欄的輸出名稱。數字 *X*:*Y* 表示資料欄在輸出中的位置。

**原因**：Athena 引擎版本 3 會執行檢查，以確保資料中時間戳記的精確度與資料表規格中資料欄資料類型指定的精確度相同。目前，此精確度一直是 3。如果資料的精確度大於此值，則查詢會失敗，且系統會指出錯誤。

**建議的解決方案**：檢查您的資料，以確保您的時間戳記為毫秒精確度。

#### Iceberg 表的 UNLOAD 和 CTAS 查詢中的時間戳記精度不正確
<a name="engine-versions-reference-0003-timestamp-precision-unload-ctas-iceberg"></a>

**錯誤訊息**：時間戳記 (6) 的時間戳記精確度不正確；設定的精確度為毫秒

**原因**：Athena 引擎版本 3 會執行檢查，以確保資料中時間戳記的精確度與資料表規格中資料欄資料類型指定的精確度相同。目前，此精確度一直是 3。如果資料的精確度大於此值 (例如以微秒而非毫秒)，則查詢會失敗且系統會指出錯誤。

**解決方案**：若要解決此問題，請先將時間戳記精確度 `CAST` 為 6，如下列建立 Iceberg 資料表的 CTAS 範例所示。請注意，必須將精確度指定為 6 而不是 3，以避免錯誤：Iceberg 不支援時間戳記精度 (3)。

```
CREATE TABLE my_iceberg_ctas
WITH (table_type = 'ICEBERG', location = 's3://amzn-s3-demo-bucket/table_ctas/',
format = 'PARQUET')
AS SELECT id, CAST(dt AS timestamp(6)) AS "dt"
FROM my_iceberg
```

然後，由於 Athena 不支援時間戳記 6，因此請將值再次轉換為時間戳記 (例如，在檢視中)。下列範例從 `my_iceberg_ctas` 資料表建立檢視。

```
CREATE OR REPLACE VIEW my_iceberg_ctas_view AS
SELECT cast(dt AS timestamp) AS dt
FROM my_iceberg_ctas
```

#### 現在，將 ORC 檔案中的 Long 類型讀取為 Timestamp 會造成不正確的 ORC 檔案錯誤，反之亦然
<a name="engine-versions-reference-0003-orc-no-implicit-long-to-timestamp-coercion"></a>

**錯誤訊息**：Error opening Hive split ‘FILE (SPLIT POSITION)’ Malformed ORC file. (開啟 Hive 分割 ‘FILE (SPLIT POSITION)’ 格式不正確的 ORC 檔案時發生錯誤。) Cannot read SQL type timestamp from ORC stream .long\$1type of type LONG (開啟 Hive 分割 ‘FILE (SPLIT POSITION)’ 不正確的 ORC 檔案時發生錯誤。無法從 LONG 類型的 ORC 串流 .long\$1type 讀取 SQL 類型的時間戳記)

**原因**：Athena 引擎版本 3 現在會拒絕從 `Long` 資料類型隱含強制轉換至 `Timestamp`，或從 `Timestamp` 轉換至 `Long`。過去，若 `Long` 值為 epoch 毫秒，便會被隱含強制轉換為時間戳記。

**建議的解決方案**：使用 `from_unixtime` 函數來明確轉換資料欄，或者使用 `from_unixtime` 函數為以後的查詢建立一個額外的資料欄。

#### 不支援 time 和 interval year to month
<a name="engine-versions-reference-0003-time-and-interval-year-to-month"></a>

**錯誤訊息**：TYPE MISMATCH (類型不相符)

**原因**：Athena 引擎版本 3 不支援 time 和 interval year to month (例如 `SELECT TIME '01:00' + INTERVAL '3' MONTH`)。

#### Int96 Parquet 格式的時間戳記溢出
<a name="engine-versions-reference-0003-timestamp-overflow-for-int96-parquet-format"></a>

**錯誤訊息**：Invalid timeOfDayNanos (無效的 timeOfDayNanos)

**原因**：`int96` Parquet 格式的時間戳記溢出。

**建議的解決方案**：辨識發生問題的特定檔案。然後使用最新且知名的 Parquet 程式庫再次產生資料檔案，或使用 Athena CTAS。如果問題仍持續發生，請聯絡 Athena 支援，並告知我們產生資料檔案的方法。

#### 從字串轉換為時間戳記時，日期和時間值之間需要的空格
<a name="engine-versions-reference-0003-timestamp-cast-space"></a>

**錯誤訊息**：INVALID\$1CAST\$1ARGUMENT：值無法轉換為時間戳記。

**原因**：Athena 引擎版本 3 不再接受連字號做為輸入字串中日期和時間值之間的有效分隔符。`cast`例如，下列查詢在 Athena 引擎版本 3 中無法運作：

```
SELECT CAST('2021-06-06-23:38:46' AS timestamp) AS this_time
```

**建議的解決方案**：在 Athena 引擎版本 3 中，將日期與時間之間的連字號取代為空格，如下列範例所示。

```
SELECT CAST('2021-06-06 23:38:46' AS timestamp) AS this_time
```

#### to\$1iso8601() 時間戳記傳回值變更
<a name="engine-versions-reference-0003-to-iso8601-function"></a>

**錯誤訊息**：無

**原因**：在先前的引擎版本中，即使傳遞給 `to_iso8601` 函式的值不包含時區，該函式也會傳回帶有時區的時間戳記。在 Athena 引擎版本 3 中，只有當傳遞的引數包含時區時，`to_iso8601` 函數才會傳回時間戳記與時區。

例如，下列查詢會將目前日期傳遞給 `to_iso8601` 函數兩次：首先是做為具有時區的時間戳記，然後是做為時間戳記。

```
SELECT TO_ISO8601(CAST(CURRENT_DATE AS TIMESTAMP WITH TIME ZONE)), TO_ISO8601(CAST(CURRENT_DATE AS TIMESTAMP))
```

下列輸出會顯示 Athena 引擎版本 3 中的查詢結果。

在先前的引擎版本中：


****  

| \$1 | \$1col0 | \$1col1 | 
| --- | --- | --- | 
| 1 |  `2023-02-24T00:00:00.000Z `  |  `2023-02-24T00:00:00.000Z`  | 

Athena 引擎版本 3：


****  

| \$1 | \$1col0 | \$1col1 | 
| --- | --- | --- | 
| 1 |  `2023-02-24T00:00:00.000Z`  |  `2023-02-24T00:00:00.000`  | 

**建議的解決方案**：要複製先前的行為，您可以先將時間戳記值傳遞至 `with_timezone` 函數，然後再將其傳遞給 `to_iso8601`，如下列範例所示：

```
SELECT to_iso8601(with_timezone(TIMESTAMP '2023-01-01 00:00:00.000', 'UTC'))
```

結果


****  

| \$1 | \$1col0 | 
| --- | --- | 
| 1 |  2023-01-01T00:00:00.000Z  | 

#### at\$1timezone() 第一個參數必須指定一個日期
<a name="engine-versions-reference-at-timezone-function"></a>

**問題**：在 Athena 引擎版本 3 中，`at_timezone` 函數無法將 `time_with_timezone` 值做為第一個參數。

**原因**：如果沒有日期資訊，則無法判斷傳遞的值是夏令時間還是標準時間。例如，`at_timezone('12:00:00 UTC', 'America/Los_Angeles')` 並不明確，因為無法判斷傳遞的值是太平洋夏令時間 (PDT) 還是太平洋標準時間 (PST)。

## 限制
<a name="engine-versions-reference-0003-known-limitations"></a>

Athena 引擎版本 3 有以下限制。
+ **查詢效能** – 許多查詢在 Athena 引擎版本 3 上的執行速度更快，但部分查詢計畫可能與先前的引擎版本不同。因此，部分查詢的延遲或成本可能有所不同。
+ **Trino 和 Presto 連接器** – 不支援 [Trino](https://trino.io/docs/current/connector.html) 和 [Presto](https://prestodb.io/docs/current/connector.html) 連接器。使用 Amazon Athena 聯合查詢來連接資料來源。如需詳細資訊，請參閱[使用 Amazon Athena 聯合查詢](federated-queries.md)。
+ **容錯執行** – 不支援 Trino [容錯執行](https://trino.io/docs/current/admin/fault-tolerant-execution.html) (Trino Tardigrade)。
+ **函數參數限制** – 函數使用的參數不能超過 127 個。如需詳細資訊，請參閱[函數呼叫的引數過多](troubleshooting-athena.md#troubleshooting-athena-too-many-arguments)。

Athena 引擎版本 2 中引入了下列限制，以確保查詢不會因資源限制而失敗。使用者無法設定這些限制。
+ **結果元素的數量** – 下列函數的結果元素 `n` 的數量限制為 10,000 或更少：`min(col, n)`、`max(col, n)`、`min_by(col1, col2, n)` 以及 `max_by(col1, col2, n)`。
+ **GROUPING SETS** – 分組集中的配量數目上限為 2048。
+ **文字檔案一行長度上限** – 文字檔案預設的一行長度上限為 200 MB。
+ **序列函數結果大小上限** – 序列函數的結果大小上限為 50,000 個項目。例如：`SELECT sequence(0,45000,1)` 成功，但 `SELECT sequence(0,55000,1)` 失敗並顯示錯誤訊息 The result of the sequence function must not have more than 50000 entries (序列函數的結果不能有 50,000 個以上項目)。此限制適用於序列函數 (包括時間戳記) 的所有輸入類型。

# Athena 的 SQL 參考
<a name="ddl-sql-reference"></a>

Amazon Athena 支援一部分的資料定義語言 (DDL) 和資料處理語言 (DML) 陳述式、函數、運算子和資料類型。在某些例外中，Athena DDL 是以 [HiveQL DDL](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL) 為基礎，而 Athena DML 是以 [Trino](https://trino.io/docs/current/language.html) 為基礎。如需有關 Athena 引擎版本的資訊，請參閱[Athena 引擎版本控制](engine-versions.md)。

**Topics**
+ [Athena 中的資料類型](data-types.md)
+ [DML 查詢、函數和運算子](dml-queries-functions-operators.md)
+ [DDL 陳述式](ddl-reference.md)
+ [考量和限制](other-notable-limitations.md)

# Amazon Athena 中的資料類型
<a name="data-types"></a>

當您執行 `CREATE TABLE` 時，您需指定資料欄名稱和每個資料欄可包含的資料類型。您建立的資料表會存放在 AWS Glue Data Catalog中。

為了促進與其他查詢引擎的互通性，Athena 會對 DDL 陳述式 (例如 `CREATE TABLE`) 使用 [Apache Hive](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types) 資料類型名稱。對於 `SELECT`、`CTAS` 和 `INSERT INTO` 等 DML 查詢，Athena 會使用 [Trino](https://trino.io/docs/current/language/types.html) 資料類型名稱。下列資料表會顯示 Athena 支援的資料類型。當 DDL 和 DML 類型在名稱、可用性或語法等方面有所不同時，它們會顯示在不同的資料欄中。


****  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/data-types.html)

**Topics**
+ [資料類型範例](data-types-examples.md)
+ [資料類型的考量事項](data-types-considerations.md)
+ [使用時間戳記資料](data-types-timestamps.md)

# 資料類型範例
<a name="data-types-examples"></a>

下列資料表會顯示 DML 資料類型的範例常值。


****  

| 資料類型 | 範例 | 
| --- | --- | 
| BOOLEAN |  `true` `false `  | 
| TINYINT |  `TINYINT '123'`  | 
| SMALLINT |  `SMALLINT '123'`  | 
| INT、INTEGER |  `123456790`  | 
| BIGINT |  `BIGINT '1234567890'` `2147483648`  | 
| REAL |  `'123456.78'`  | 
| DOUBLE |  `1.234`  | 
| DECIMAL(precision, scale) |  `DECIMAL '123.456'`  | 
| CHAR, CHAR(length) |  `CHAR 'hello world'`, `CHAR 'hello ''world''!'`  | 
| VARCHAR, VARCHAR(length) |  `VARCHAR 'hello world'`, `VARCHAR 'hello ''world''!'`  | 
| VARBINARY |  `X'00 01 02'`  | 
| TIME, TIME(precision) |  `TIME '10:11:12'`, `TIME '10:11:12.345'`  | 
| TIME WITH TIME ZONE |  `TIME '10:11:12.345 -06:00'`  | 
| DATE |  `DATE '2024-03-25'`  | 
|  TIMESTAMP, TIMESTAMP WITHOUT TIME ZONE, TIMESTAMP(*precision*), TIMESTAMP(*precision*) WITHOUT TIME ZONE   |  `TIMESTAMP '2024-03-25 11:12:13'`, `TIMESTAMP '2024-03-25 11:12:13.456'`  | 
| TIMESTAMP WITH TIME ZONE, TIMESTAMP(precision) WITH TIME ZONE |  `TIMESTAMP '2024-03-25 11:12:13.456 Europe/Berlin'`  | 
| INTERVAL YEAR TO MONTH |  `INTERVAL '3' MONTH`  | 
| INTERVAL DAY TO SECOND |  `INTERVAL '2' DAY`  | 
| ARRAY[element\$1type] |  `ARRAY['one', 'two', 'three']`  | 
| MAP(key\$1type, value\$1type) |  `MAP(ARRAY['one', 'two', 'three'], ARRAY[1, 2, 3])` 請注意，映射是從索引鍵陣列和值陣列建立的。下列範例會建立將字串映射為整數的資料表。 <pre>CREATE TABLE map_table(col1 map<string, integer>) LOCATION '...';<br />INSERT INTO map_table values(MAP(ARRAY['foo', 'bar'], ARRAY[1, 2]));</pre>  | 
| ROW(field\$1name\$11 field\$1type\$11, field\$1name\$12 field\$1type\$12, …) |  `ROW('one', 'two', 'three')` 請注意，以這種方式建立的資料列沒有資料欄名稱。若要新增資料欄名稱，可以使用 `CAST`，如下列範例所示： <pre>CAST(ROW(1, 2, 3) AS ROW(one INT, two INT, three INT))</pre>  | 
| JSON |  `JSON '{"one":1, "two": 2, "three": 3}'`  | 
| UUID |  `UUID '12345678-90ab-cdef-1234-567890abcdef'`  | 
| IPADDRESS |  `IPADDRESS '10.0.0.1'` `IPADDRESS '2001:db8::1'`  | 

# 資料類型的考量事項
<a name="data-types-considerations"></a>

## 大小限制
<a name="data-types-considerations-size"></a>

對於未指定大小限制的資料類型，請記住，單一資料列中所有資料的實際限制為 32MB。如需詳細資訊，請參閱 [在 Amazon Athena 中進行 SQL 查詢的考量事項與限制](other-notable-limitations.md) 中的 [Row or column size limitation](other-notable-limitations.md#sql-limitations-rowsize)。

## CHAR 和 VARCHAR
<a name="data-types-considerations-char"></a>

`CHAR(n)` 值的計數一律為 `n` 個字元。例如，如果您將 'abc' 轉換為 `CHAR(7)`，則會新增 4 個尾隨空格。

`CHAR` 值的比較包括前導和尾隨空格。

如果為 `CHAR` 或 `VARCHAR` 指定，讀取字串時，會以指定的長度進行截斷。如果基礎資料字串較長，則基礎資料字串會維持不變。

若要逸出 `CHAR` 或 `VARCHAR` 中的單引號，請使用額外的單引號。

若要將非字串資料類型轉換為 DML 查詢中的字串，請轉換為 `VARCHAR` 資料類型。

若要使用 `substr` 函式從 `CHAR` 資料類型傳回指定長度的子字串，您必須先將 `CHAR` 值轉換為 `VARCHAR`。在下列範例中，`col1` 使用 `CHAR` 資料類型。

```
substr(CAST(col1 AS VARCHAR), 1, 4)
```

## DECIMAL
<a name="data-types-considerations-decimal"></a>

若要在 `SELECT` 查詢中指定小數值為常值，例如以特定小數值選取資料列，可指定 `DECIMAL` 類型，並在查詢中以單引號列出小數值為常值，如下列範例所示。

```
SELECT * FROM my_table
WHERE decimal_value = DECIMAL '0.12'
```

```
SELECT DECIMAL '44.6' + DECIMAL '77.2'
```

# 使用時間戳記資料
<a name="data-types-timestamps"></a>

本節說明在 Athena 中使用時間戳記資料的一些考量。

**注意**  
先前的引擎版本與 Athena 引擎版本 3 之間的時間戳記處理方式發生變更。如需有關 Athena 引擎版本 3 中可能發生的時間戳記相關錯誤及建議的解決方案的資訊，請參閱 [Athena 引擎版本 3](engine-versions-reference-0003.md) 參考中的 [時間戳記變更](engine-versions-reference-0003.md#engine-versions-reference-0003-timestamp-changes)。

## 將時間戳記資料寫入 Amazon S3 物件的格式
<a name="data-types-timestamps-writing-to-s3-objects"></a>

將時間戳記資料寫入 Amazon S3 物件的格式，取決於您使用的資料欄資料類型和 [SerDe 程式庫](https://docs.aws.amazon.com/athena/latest/ug/supported-serdes.html)。
+ 如果您有類型為 `DATE` 的資料表資料欄，Athena 會預期資料的對應資料欄或屬性是 ISO 格式的字串 `YYYY-MM-DD`，或是內建的日期類型 (例如 Parquet 或 ORC 的日期類型)。
+ 如果您有類型為 `TIME` 的資料表資料欄，Athena 會預期資料的對應資料欄或屬性是 ISO 格式的字串 `HH:MM:SS`，或是內建的時間類型 (例如 Parquet 或 ORC 的時間類型)。
+ 如果您有類型為 `TIMESTAMP` 的資料表資料欄，Athena 會預期資料的對應資料欄或屬性是格式的字串 `YYYY-MM-DD HH:MM:SS.SSS` (注意日期和時間之間的空格)，或是內建的時間類型 (例如 Parquet、ORC 或 Ion 的時間類型)。請注意，Athena 不保證對無效時間戳記的行為 （例如 `0000-00-00 08:00:00.000`)。
**注意**  
OpenCSVSerDe 時間戳記是例外狀況，且必須編碼為毫秒解析度的 UNIX epochs。

## 確保時間分割資料符合記錄中的時間戳記欄位
<a name="data-types-timestamps-time-partitioned-data-and-timestamp-fields"></a>

資料的產生者必須確定分割區值與分割區內的資料一致。例如，如果您的資料具有 `timestamp` 屬性，而您使用 Firehose 將資料載入 Amazon S3，則必須使用[動態分割](https://docs.aws.amazon.com/firehose/latest/dev/dynamic-partitioning.html)，因為 Firehose 的預設分割以掛鐘為基礎的。

## 使用字串做為分割區索引鍵的資料類型
<a name="data-types-timestamps-partition-key-types"></a>

出於效能考量，最好將 `STRING` 用作分割區索引鍵的資料類型。雖然 Athena 將格式 `YYYY-MM-DD` 的分割區值識別為您使用 `DATE` 類型時的日期，而這可能造成效能不彰。因此，我們建議您改用 `STRING` 資料類型做為分割區索引鍵。

## 如何寫入同樣按時間分割的時間戳記欄位的查詢
<a name="data-types-timestamps-how-to-write-queries-for-timestamp-fields-that-are-also-time-partitioned"></a>

如何寫入同樣按時間分割的時間戳記欄位的查詢，取決於您要查詢的資料表的類型。

### Hive 資料表
<a name="data-types-timestamps-hive-tables"></a>

使用 Athena 中最常用的 Hive 資料表，查詢引擎對資料欄和分割區索引鍵之間的關係一無所知。因此，您必須始終在資料欄和分割區索引鍵的查詢中新增述詞。

例如，假設您有 `event_time` 資料欄和 `event_date` 分割區索引鍵，而且想要查詢 23:00 到 03:00 之間的事件。在此案例中，您必須在查詢資料欄和分割區索引鍵中包含述詞，如下列範例所示。

```
WHERE event_time BETWEEN start_time AND end_time 
  AND event_date BETWEEN start_time_date AND end_time_date
```

### Iceberg 資料表
<a name="data-types-timestamps-iceberg-tables"></a>

使用 Iceberg 資料表，您可以使用運算的分割區值，從而簡化查詢。例如，假設您的 Iceberg 資料表是使用如下 `PARTITIONED BY` 子句建立的：

```
PARTITIONED BY (event_date month(event_time))
```

在此案例下，查詢引擎會根據 `event_time` 述詞的值自動剔除分割區。因此，您的查詢只需要指定 `event_time` 的述詞，如下列範例所示。

```
WHERE event_time BETWEEN start_time AND end_time
```

如需詳細資訊，請參閱[建立 Iceberg 資料表](querying-iceberg-creating-tables.md)。

對時間戳記資料欄使用 Iceberg 的隱藏分割時，Iceberg 可能會在衍生自時間戳記資料欄的建構資料表資料欄上建立分割區，並將其轉換為日期，以實現更有效的分割。例如，它可能會從時間戳記資料欄 `event_time` 建立 `event_date`，並在 `event_date` 上自動進行分割。在這種情況下，分割區**類型**是**日期**。

為了在使用分割區時獲得最佳查詢效能，請篩選全天範圍以啟用述詞下推。例如，下列查詢不會下推，因為範圍無法轉換為單一日期分割區，即使其恰到落在一天內：

```
WHERE event_time >= TIMESTAMP '2024-04-18 00:00:00' AND event_time < TIMESTAMP '2024-04-18 12:00:00'
```

相反地，請使用全天範圍來允許述詞下推，並提升查詢效能，如下列範例所示。

```
WHERE event_time >= TIMESTAMP '2024-04-18 00:00:00' AND event_time < TIMESTAMP '2024-04-19 00:00:00'
```

您也可以使用 `BETWEEN start_time AND end_time` 語法或使用多日範圍，只要時間戳記部分為 `00:00:00` 即可。

如需詳細資訊，請參閱 [Trino 部落格文章](https://trino.io/blog/2023/04/11/date-predicates.html)。

# DML 查詢、函數和運算子
<a name="dml-queries-functions-operators"></a>

Athena DML 查詢引擎通常支援 Trino 和 Presto 語法，並且自行對其進行了改進。Athena 不支援 Trino 或 Presto 的所有功能。如需詳細資訊，請參閱本節中特定陳述式的主題以及[考量和限制](other-notable-limitations.md)。如需有關函數資訊，請參閱 [Amazon Athena 中的函數](functions.md)。如需有關 Athena 引擎版本的資訊，請參閱[Athena 引擎版本控制](engine-versions.md)。

如需 DDL 陳述式的資訊，請參閱[DDL 陳述式](ddl-reference.md)。如需不支援的 DDL 陳述式之清單，請參閱[不支援的 DDL](unsupported-ddl.md)。

**Topics**
+ [SELECT](select.md)
+ [INSERT INTO](insert-into.md)
+ [VALUES](values-statement.md)
+ [DELETE](delete-statement.md)
+ [UPDATE](update-statement.md)
+ [合併為](merge-into-statement.md)
+ [OPTIMIZE](optimize-statement.md)
+ [VACUUM](vacuum-statement.md)
+ [EXPLAIN 和 EXPLAIN ANALYZE](athena-explain-statement.md)
+ [PREPARE](sql-prepare.md)
+ [UNLOAD](unload.md)
+ [函數](functions.md)
+ [使用支援的時區](athena-supported-time-zones.md)

# SELECT
<a name="select"></a>

從零個或多個資料表中擷取資料列。

**注意**  
本主題提供摘要資訊以供參考。關於使用 `SELECT` 和 SQL 語言的完整資訊已超出本文件的範圍。如需有關使用 Athena 特定 SQL 的資訊，請參閱[在 Amazon Athena 中進行 SQL 查詢的考量事項與限制](other-notable-limitations.md)和[在 Amazon Athena 中執行 SQL 查詢](querying-athena-tables.md)。如需在 Athena 建立資料庫、建立資料表和執行資料表 `SELECT` 查詢的範例，請參閱 [開始使用](getting-started.md)。

## 概要
<a name="synopsis"></a>

```
[ WITH with_query [, ...] ]
SELECT [ ALL | DISTINCT ] select_expression [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]
[ HAVING condition ]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST] [, ...] ]
[ OFFSET count [ ROW | ROWS ] ]
[ LIMIT [ count | ALL ] ]
```

**注意**  
SQL SELECT 陳述式中的保留字必須以雙引號括住。如需詳細資訊，請參閱[SQL SELECT 陳述式中要逸出的預留關鍵字](reserved-words.md#list-of-reserved-words-sql-select)。

## Parameters
<a name="select-parameters"></a>

**[ WITH with\$1query [, ....] ]**  
您可以使用 `WITH` 來展開巢狀查詢，或簡化子查詢。  
Athena 引擎版本 3 開始支援使用 `WITH` 子句建立遞迴查詢。最大遞歸深度為 10。  
`WITH` 子句位於查詢中的 `SELECT` 清單前面，可定義一或多個子查詢以用於 `SELECT` 查詢內。  
每個子查詢定義臨時資料表，類似於檢視定義，供您在 `FROM` 子句中參考。這些資料表只在查詢執行時才使用。  
`with_query` 語法是：  

```
subquery_table_name [ ( column_name [, ...] ) ] AS (subquery)
```
其中：  
+  `subquery_table_name` 是臨時資料表的唯一名稱，定義 `WITH` 子句子查詢的結果。每個 `subquery` 必須有可在 `FROM` 子句中參考的資料表名稱。
+  `column_name [, ...]` 是選用的輸出欄名稱清單。欄名稱的數目必須等於或少於 `subquery` 所定義的欄數。
+  `subquery` 是任何查詢陳述式。

**[ ALL \$1 DISTINCT ] select\$1expression**  
 `select_expression` 決定要選取的列。`select_expression` 可以使用下列其中一個格式：  

```
expression [ [ AS ] column_alias ] [, ...]
```

```
row_expression.* [ AS ( column_alias [, ...] ) ]
```

```
relation.*
```

```
*
```
+ `expression [ [ AS ] column_alias ]` 語法會指定輸出資料欄。選用的 `[AS] column_alias` 語法會指定要用於輸出中資料欄的自訂標題名稱。
+ 對於 `row_expression.* [ AS ( column_alias [, ...] ) ]`，`row_expression` 是資料類型 `ROW` 的任意表達式。資料列的欄位會定義要包含在結果中的輸出資料欄。
+ 對於 `relation.*`，`relation` 的資料欄會包含在結果中。此語法不允許使用資料欄別名。
+ 星號 `*` 會指定所有資料欄都會包含在結果集中。
+ 在結果集中，資料欄的順序與 select 表達式所指定的資料欄規範順序相同。如果 select 表達式傳回多個資料欄，則資料欄順序會遵循來源關係或資料列類型表達式中使用的順序。
+ 指定資料欄別名時，別名會覆寫預先存在的資料欄或資料列欄位名稱。如果 select 表達式沒有資料欄名稱，則輸出中會顯示零索引的匿名資料欄名稱 (`_col0`、`_col1`、`_col2, ...`)。
+  預設值為 `ALL`。`ALL` 使用與省略不用都一樣；所有欄的所有列都會選取，重複的列也會保留。
+ 當欄包含重複值時，可使用 `DISTINCT` 只傳回獨特值。

**FROM from\$1item [, ...]**  
指出查詢的輸入，其中 `from_item` 可以是檢視、聯結建構或子查詢，如下所示。  
`from_item` 可以是以下任一項：  
+  `table_name [ [ AS ] alias [ (column_alias [, ...]) ] ]` 

  其中，`table_name` 是從中選取列的目標表格的名稱，`alias` 是提供給 `SELECT` 陳述式輸出的名稱，`column_alias` 為指定的 `alias` 定義欄。
 **-或-**   
+  `join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]` 

  其中 `join_type` 是以下其中一個：
  +  `[ INNER ] JOIN` 
  +  `LEFT [ OUTER ] JOIN` 
  +  `RIGHT [ OUTER ] JOIN` 
  +  `FULL [ OUTER ] JOIN` 
  +  `CROSS JOIN` 
  +  `ON join_condition | USING (join_column [, ...])` 其中，使用 `join_condition` 可讓您指定多個資料表中聯結索引鍵的欄名稱，而使用 `join_column` 之前，兩個資料表中必須都有 `join_column`。

**[ WHERE condition ]**  
根據您指定的 `condition` 篩選結果，其中 `condition` 通常具有以下語法。  

```
column_name operator value [[[AND | OR] column_name operator value] ...]
```
*operator* 可以是其中一個比較子：`=`、`>`、`<`、`>=`、`<=`、`<>`、`!=`。  
下面的子查詢表達式也可以用在 `WHERE` 子句中。  
+ `[NOT] BETWEEN integer_A AND integer_B` – 指定兩個整數之間的範圍，如下列範例所示。如果資料欄資料類型是 `varchar`，則必須先將資料欄轉換為整數。

  ```
  SELECT DISTINCT processid FROM "webdata"."impressions"
  WHERE cast(processid as int) BETWEEN 1500 and 1800
  ORDER BY processid
  ```
+ `[NOT] LIKE value` – 搜尋指定的模式。使用百分比符號 (`%`) 作為萬用字元，如下列範例所示。

  ```
  SELECT * FROM "webdata"."impressions"
  WHERE referrer LIKE '%.org'
  ```
+ `[NOT] IN (value[, value[, ...])` – 指定資料欄可能的值之清單，如下列範例所示。

  ```
  SELECT * FROM "webdata"."impressions"
  WHERE referrer IN ('example.com','example.net','example.org')
  ```

**[ GROUP BY [ ALL \$1 DISTINCT ] grouping\$1expressions [, ...] ]**  
將 `SELECT` 陳述式的輸出分割成具有相符值的列。  
 `ALL` 和 `DISTINCT` 指定重複的分組集是否各產生相異的輸出列。如果省略，會採用 `ALL`。  
`grouping_expressions` 可讓您執行複雜的分組操作。您可以使用複雜的分組操作來執行需要對單一查詢中的多組資料欄進行彙總的分析。  
`grouping_expressions` 元素可以是任何函數，例如對輸入資料欄執行的 `SUM`、`AVG` 或 `COUNT`。  
`GROUP BY` 表達式可依未出現在 `SELECT` 陳述式輸出中的輸入欄名稱，將輸出分組。  
所有輸出表達式必須是彙總函數，或存在於 `GROUP BY` 子句中的欄。  
您可以使用單一查詢來執行需要彙總多個欄集的分析。  
Athena 支援使用 `GROUPING SETS`、`CUBE` 和 `ROLLUP` 的複雜彙總。`GROUP BY GROUPING SETS` 指定要分組的多個資料欄清單。`GROUP BY CUBE` 會針對一組給定的資料欄，產生所有可能的分組集。`GROUP BY ROLLUP` 會針對一組給定的資料欄，產生所有可能的小計。複雜的分組操作不支援對由輸入資料欄組成的表達式進行分組。只允許資料欄名稱。  
您通常可以使用 `UNION ALL` 來達到與這些 `GROUP BY` 操作相同的結果，但使用 `GROUP BY` 的查詢好處是只讀取資料一次，而 `UNION ALL` 會讀取基礎資料三次，而且當資料來源易於變更時，可能會產生不一致的結果。

**[ HAVING condition ]**  
與彙總函數和 `GROUP BY` 子句一起使用。控制要選取哪些群組，排除不符合 `condition` 的群組。計算群組和彙總之後會執行此篩選。

**[ \$1 UNION \$1 INTERSECT \$1 EXCEPT \$1 [ ALL \$1 DISTINCT ] union\$1query] ]**  
`UNION`、`INTERSECT` 和 `EXCEPT` 將一個以上的 `SELECT` 陳述式的結果結合為單一查詢。`ALL` 或 `DISTINCT` 控制最終結果集包含的資料行的唯一性。  
`UNION` 將第一個查詢產生的資料行與第二個查詢產生的資料行組合起來。為消除重複項，`UNION` 構建了一個消耗記憶體的雜湊資料表。為了更好的性能，如果您的查詢不需要消除重複項，則請考慮使用 `UNION ALL`。除非您使用括號來明確定義處理順序，否則多個 `UNION` 子句是由左向右處理。  
`INTERSECT` 只傳回存在於第一個和第二個查詢之結果中的資料行。  
`EXCEPT` 傳回第一個查詢之結果的資料行，不包括第二個查詢找到的資料行。  
`ALL` 會包含所有資料行，即使資料行都相同也一樣。  
`DISTINCT` 只會讓唯一的資料行包含在合併結果集中。

**[ ORDER BY expression [ ASC \$1 DESC ] [ NULLS FIRST \$1 NULLS LAST] [, ...] ]**  
依一或多個輸出 `expression` 排序結果集。  
當子句包含多個表達式時，結果集會根據第一個 `expression` 排序。然後，第二個 `expression` 套用的列有來自第一個表達式的相符值，以此類推。  
每個 `expression` 可以指定 `SELECT` 的輸出欄，或依位置指定輸出欄的序數 (從 1 開始)。  
`ORDER BY` 是在任何 `GROUP BY` 或 `HAVING` 子句之後當作最後一個步驟來評估。`ASC` 和 `DESC` 決定結果依遞增或遞減順序來排序。依預設，排序順序為遞增排序 (`ASC`)。無論是遞增或遞減排序，預設空值排序是 `NULLS LAST`。

**[ OFFSET count [ ROW \$1 ROWS ] ]**  
使用 `OFFSET` 子句來捨棄結果集中的數個前導列。如果 `ORDER BY` 子句存在時，`OFFSET` 子句會根據排序的結果集進行評估，並且該集會在跳過的資料列遭到捨棄後保持排序。如果查詢沒有 `ORDER BY` 子句，則可以任意捨棄資料列。如果 `OFFSET` 指定的計數等於或超過結果集的大小，則最終結果為空白。

**LIMIT [ count \$1 ALL ]**  
將結果集的列數限制為 `count`。`LIMIT ALL` 和省略 `LIMIT` 子句的效果相同。如果查詢沒有 `ORDER BY` 子句，則結果是任意順序。

**TABLESAMPLE [ BERNOULLI \$1 SYSTEM ] (percentage)**  
根據取樣方法從資料表中選擇列的選用運算子。  
 `BERNOULLI` 以機率 `percentage` 選取要放入資料表樣本中的每一列。將會掃描資料表的所有實體區塊，並根據範本 `percentage` 和執行時間計算的隨機值之間的比較，略過特定的資料行。  
使用 `SYSTEM` 時，資料表會分割為邏輯的資料區段，並以此精細程式來取樣資料表。  
將會選取特定區段的所有資料行，或根據取樣 `percentage` 和執行時間計算的隨機值之間的比較，略過區段。`SYSTEM` 取樣依賴連接器。這個方法不保證獨立取樣機率。

**[ UNNEST (array\$1or\$1map) [WITH ORDINALITY] ]**  
將陣列或映射展開成關係。陣列會展開成單一欄。映射會展開成兩欄 (*索引鍵*、*值*)。  
您可以使用 `UNNEST` 搭配多個參數，以展開成多個欄，且列數與最高基數引數相等。  
其他欄以空值填補。  
`WITH ORDINALITY` 子句會將基數欄新增至尾端。  
 `UNNEST` 通常與 `JOIN` 一起使用，且可以參考 `JOIN` 左側關係中的欄。

## 在 Amazon S3 中取得來源資料的檔案位置
<a name="select-path"></a>

若要查看資料表資料行中資料的 Amazon S3 檔案位置，可以使用 `SELECT` 查詢中的 `"$path"`，如下列範例所示：

```
SELECT "$path" FROM "my_database"."my_table" WHERE year=2019;
```

此舉會傳回如下所示的結果：

```
s3://amzn-s3-demo-bucket/datasets_mytable/year=2019/data_file1.json
```

若要傳回資料表中資料的 S3 檔案名稱路徑經排序的單一清單，可以使用 `SELECT DISTINCT` 和 `ORDER BY`，如下範例所示。

```
SELECT DISTINCT "$path" AS data_source_file
FROM sampledb.elb_logs
ORDER By data_source_file ASC
```

若要僅傳回沒有路徑的檔案名稱，則可將 `"$path"` 作為參數傳遞給 `regexp_extract` 函數，如下列範例所示。

```
SELECT DISTINCT regexp_extract("$path", '[^/]+$') AS data_source_file
FROM sampledb.elb_logs
ORDER By data_source_file ASC
```

若要從特定檔案傳回資料，請在 `WHERE` 子句中指定檔案，如下列範例所示。

```
SELECT *,"$path" FROM my_database.my_table WHERE "$path" = 's3://amzn-s3-demo-bucket/my_table/my_partition/file-01.csv'
```

如需詳細資訊和範例，請參閱知識中心文章：[如何查看 Athena 資料表中某資料行的 Amazon S3 來源檔案？](https://aws.amazon.com/premiumsupport/knowledge-center/find-s3-source-file-athena-table-row/)。

**注意**  
在 Athena 中，檢視不支援 Hive 或 Iceberg 隱藏的中繼資料欄 `$bucket`、`$file_modified_time`、`$file_size` 和 `$partition`。

## 逸出單引號
<a name="select-escaping"></a>

 若要逸出單引號，請在它前面加上另一個單引號，如下列範例所示。請勿將此與雙引號混淆。

```
Select 'O''Reilly'
```

**結果**  
`O'Reilly`

## 其他資源
<a name="select-additional-resources"></a>

如需有關使用 Athena 中 `SELECT` 陳述式的詳細資訊，請參閱以下資源。


| 如需有關以下內容的資訊 | 參閱以下資源 | 
| --- | --- | 
| 在 Athena 中執行查詢 | [在 Amazon Athena 中執行 SQL 查詢](querying-athena-tables.md) | 
| 使用 SELECT 建立資料表 | [從查詢結果建立資料表 (CTAS)](ctas.md) | 
| 將一個 SELECT 查詢的資料插入其他資料表 | [INSERT INTO](insert-into.md) | 
| 使用 SELECT 陳述式中內建的函數 | [Amazon Athena 中的函數](functions.md) | 
| 使用 SELECT 陳述式中使用者定義函數 | [利用使用者定義函式進行查詢](querying-udf.md) | 
| 查詢資料目錄中繼資料 | [查詢 AWS Glue Data Catalog](querying-glue-catalog.md) | 

# INSERT INTO
<a name="insert-into"></a>

根據來源資料表上執行的 `SELECT` 查詢陳述式，或根據作為該陳述式的一部分提供的一組 `VALUES`，將新資料行插入目標資料表。當來源資料表以某一格式 (例如 CSV 或 JSON) 的基礎資料為基礎時，而目標資料表以另一種格式 (例如 Parquet 或 ORC) 為基礎，則您可以使用 `INSERT INTO` 查詢，將選取的資料轉換為目標資料表的格式。

## 考量和限制
<a name="insert-into-limitations"></a>

搭配 Athena 使用 `INSERT` 查詢時，請考慮以下情況：
+ 在包含於 Amazon S3 中加密的基礎資料的資料表上執行 `INSERT` 查詢時，`INSERT` 查詢寫入的輸出檔案依預設不會加密。如果您要插入具有加密資料的資料表，建議您加密 `INSERT` 查詢結果。

  如需使用主控台加密查詢結果的詳細資訊，請參閱[加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)。若要使用 AWS CLI 或 Athena API 啟用加密，請使用 [StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) 動作的`EncryptionConfiguration`屬性，根據您的需求指定 Amazon S3 加密選項。
+ 對於 `INSERT INTO` 陳述式，預期的儲存貯體擁有者設定不適用於 Amazon S3 中的目的地資料表位置。預期的儲存貯體擁有者設定僅適用於您為 Athena 查詢結果指定的 Amazon S3 輸出位置。如需詳細資訊，請參閱[使用 Athena 主控台指定查詢結果位置](query-results-specify-location-console.md)。
+ 如需 ACID 合規 `INSERT INTO` 陳述式，則請參閱 [更新 Iceberg 資料表資料](querying-iceberg-updating-iceberg-table-data.md) 的 `INSERT INTO` 一節。

### 支援的格式和 SerDes
<a name="insert-into-supported-formats"></a>

您可以在使用下列格式和 SerDes 資料建立的資料表上，執行 `INSERT` 查詢。


| 資料格式 | SerDe | 
| --- | --- | 
|  Avro  |  org.apache.hadoop.hive.serde2.avro.AvroSerDe  | 
| Ion | com.amazon.ionhiveserde.IonHiveSerDe | 
|  JSON  |  org.apache.hive.hcatalog.data.JsonSerDe  | 
|  ORC  |  org.apache.hadoop.hive.ql.io.orc.OrcSerde  | 
|  Parquet  |  org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe  | 
|  文字檔案  |  org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  支援 TSV 和自訂分隔檔案。   | 
| CSV | org.apache.hadoop.hive.serde2.OpenCSVSerde 僅字串類型支援寫入。在 Athena 中，您無法寫入 Glue 結構描述中包含非字串類型的任何資料表。如需詳細資訊，請參閱 [CSV SerDe](csv-serde.md#csv-serde-opencsvserde-considerations-non-string)。  | 

### 不支援分區資料表
<a name="insert-into-bucketed-tables-not-supported"></a>

在分區資料表上不支援 `INSERT INTO`。如需詳細資訊，請參閱[使用分割和歸納](ctas-partitioning-and-bucketing.md)。

### 不支援聯合查詢
<a name="insert-into-federated-queries-not-supported"></a>

`INSERT INTO` 不支援聯合查詢。嘗試執行這項操作可能會產生錯誤訊息：外部目錄目前不支援此操作。如需聯合查詢的詳細資訊，請參閱[使用 Amazon Athena 聯合查詢](federated-queries.md)。

### 分割
<a name="insert-into-limitations-partitioning"></a>

搭配 `INSERT INTO` 或 `CREATE TABLE AS SELECT` 查詢使用分割區時，請將本章節的幾個重點納入考量。

#### 限制
<a name="insert-into-partition-limits"></a>

`INSERT INTO` 陳述式支援最多將 100 個分割區寫入目標資料表。如果您在分割區超過 100 個的資料表上執行 `SELECT` 子句，除非 `SELECT` 查詢限制在 100 個分割區或更少，否則查詢會失敗。

如需解決此限制的相關資訊，請參閱[使用 CTAS 和 INSERT INTO 來解決 100 個分割區限制](ctas-insert-into.md)。

#### 資料欄排序
<a name="insert-into-partition-detection"></a>

`INSERT INTO` 或 `CREATE TABLE AS SELECT` 陳述式會預期分割的資料欄為 `SELECT` 陳述式中投影資料欄清單的最後一個資料欄。

如果來源資料表未經分割，或與目標資料表相比在不同的資料欄上分割，則如 `INSERT INTO destination_table SELECT * FROM source_table` 的查詢會將來源資料表中的最後一個資料欄的值，認定為目標資料表中的分割區資料欄的值。嘗試從未分割的資料表建立分割的資料表時，請注意以上提醒。

#### Resources
<a name="insert-into-partition-resources"></a>

如需有關搭配分割使用 `INSERT INTO` 的詳細資料，請參閱以下資源。
+ 如需將分割的資料插入分割的資料表，請參閱[使用 CTAS 和 INSERT INTO 來解決 100 個分割區限制](ctas-insert-into.md)。
+ 如需將未分割的資料插入分割的資料表，請參閱[使用 CTAS 和 INSERT INTO 以進行 ETL 和資料分析](ctas-insert-into-etl.md)。

### 寫入 Amazon S3 的檔案
<a name="insert-into-files-written-to-s3"></a>

`INSERT` 命令執行之後，Athena 會將檔案寫入 Amazon S3 中的來源資料位置。每個 `INSERT` 操作都會建立新的檔案，而不是附加到現有的檔案。檔案位置取決於資料表和 `SELECT` 查詢的結構 (若有)。Athena 會為每個 `INSERT` 查詢生成一個資訊清單檔案。資訊清單會追蹤查詢寫入的檔案。它會儲存到 Amazon S3 中的 Athena 查詢結果位置。如需詳細資訊，請參閱[識別查詢輸出檔案](querying-finding-output-files.md#querying-identifying-output-files)。

### 避免高度交易更新
<a name="insert-into-transactional-caveat"></a>

當您使用 `INSERT INTO` 將資料列新增至 Amazon S3 中的資料表時，Athena 不會重寫或修改現有檔案。相反地，它會將這些資料列寫入一或多個新檔案中。由於資料表[擁有許多小型檔案，進而導致查詢效能降低](performance-tuning-data-optimization-techniques.md#performance-tuning-avoid-having-too-many-files)，以及寫入和讀取操作 (例如 `PutObject` 和 `GetObject`) 會導致 Amazon S3 的成本提高，因此使用 `INSERT INTO` 時請考慮下列選項：
+ 對於較大的資料列批次，降低執行 `INSERT INTO` 操作的頻率。
+ 對於大型資料擷取量，請考慮使用 [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html) 之類的服務。
+ 完全避免使用 `INSERT INTO`。相反地，請將資料列累積到較大的檔案中，然後直接上傳至 Amazon S3，其中 Athena 可以在其中查詢這些資料。

### 尋找孤立檔案
<a name="insert-into-files-partial-data"></a>

如果 `CTAS` 或 `INSERT INTO` 陳述式失敗，孤立的資料可以留在資料位置，並且可能會在後續查詢中讀取。若要尋找孤立檔案以進行檢測或刪除，您可以使用 Athena 提供的資料資訊清單檔案來追蹤要寫入的檔案清單。如需詳細資訊，請參閱[識別查詢輸出檔案](querying-finding-output-files.md#querying-identifying-output-files)和 [DataManifestLocation](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecutionStatistics.html#athena-Type-QueryExecutionStatistics-DataManifestLocation)。

## INSERT INTO...SELECT
<a name="insert-into-select"></a>

指定在一個資料表上執行的查詢：`source_table`，這會決定要插入第二個資料表的資料列：`destination_table`。如果 `SELECT` 查詢指定 `source_table` 中的資料欄，則該資料欄必須精確地符合 `destination_table` 中的資料欄。

如需 `SELECT` 查詢的詳細資訊，請參閱[SELECT](select.md)。

### 概要
<a name="insert-into-select-synopsis"></a>

```
INSERT INTO destination_table 
SELECT select_query 
FROM source_table_or_view
```

### 範例
<a name="insert-into-select-examples"></a>

選取 `vancouver_pageviews` 資料表中的所有列，並將其插入 `canada_pageviews` 資料表：

```
INSERT INTO canada_pageviews 
SELECT * 
FROM vancouver_pageviews;
```

僅選取 `vancouver_pageviews` 資料表中的列，其中 `date` 資料欄有介於 `2019-07-01` 到 `2019-07-31` 間的值，然後將其插入 `canada_july_pageviews`：

```
INSERT INTO canada_july_pageviews
SELECT *
FROM vancouver_pageviews
WHERE date
    BETWEEN date '2019-07-01'
        AND '2019-07-31';
```

請僅從 `country` 資料欄中 `usa` 的值選取 `cities_world` 資料表中 `city` 與 `state` 欄內的值，並將其插入 `cities_usa` 資料表中的 `city` 和 `state` 欄：

```
INSERT INTO cities_usa (city,state)
SELECT city,state
FROM cities_world
    WHERE country='usa'
```

## INSERT INTO... VALUES
<a name="insert-into-values"></a>

透過指定資料欄和值，將資料列插入現有的資料表。指定的資料欄和相關聯的資料類型必須精確地符合目標資料表中的資料欄和資料類型。

**重要**  
我們不建議使用 `VALUES` 插入資料行，因為 Athena 會為每個 `INSERT` 操作產生檔案。這可能會導致建立許多小型檔案，並降低資料表的查詢效能。若要識別 `INSERT` 查詢建立的檔案，請檢查資料資訊清單檔案。如需詳細資訊，請參閱[使用查詢結果和近期查詢](querying.md)。

### 概要
<a name="insert-into-values-synopsis"></a>

```
INSERT INTO destination_table [(col1,col2,...)] 
VALUES (col1value,col2value,...)[,
       (col1value,col2value,...)][,
       ...]
```

### 範例
<a name="insert-into-values-examples"></a>

在下列範例中，城市資料表有三個資料欄：`id`、`city`、`state`、`state_motto`。`id` 資料欄的類型是 `INT`，而其他所有欄的類型都是 `VARCHAR`。

將單一列插入 `cities` 資料表，並指定所有資料欄值：

```
INSERT INTO cities 
VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice')
```

在 `cities` 資料表中插入兩列：

```
INSERT INTO cities 
VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice'),
       (3,'Boise','ID','Esto perpetua')
```

# VALUES
<a name="values-statement"></a>

建立常值內嵌資料表。資料表可以是匿名的，或者您也可以使用 `AS` 子句來指定資料表名稱、資料欄名稱或兩者兼具。

## 概要
<a name="values-statement-synopsis"></a>

```
VALUES row [, ...]
```

## Parameters
<a name="values-statement-parameters"></a>

**資料列**  
`row` 參數可以是單一表達式，也可以是 `( column_expression [, ...] )`。

## 範例
<a name="values-statement-examples"></a>

傳回具有一個資料欄和三個資料列的資料表：

```
VALUES 1, 2, 3
```

傳回具有兩個資料欄和三個資料列的資料表：

```
VALUES
    (1, 'a'),
    (2, 'b'),
    (3, 'c')
```

傳回具有資料欄 `id` 和 `name` 的資料表：

```
SELECT * FROM (
    VALUES
        (1, 'a'),
        (2, 'b'),
        (3, 'c')
) AS t (id, name)
```

使用資料列 `id` 和 `name`，建立名為 `customers` 的資料表：

```
CREATE TABLE customers AS
SELECT * FROM (
    VALUES
        (1, 'a'),
        (2, 'b'),
        (3, 'c')
) AS t (id, name)
```

## 另請參閱
<a name="values-statement-see-also"></a>

[INSERT INTO... VALUES](insert-into.md#insert-into-values)

# DELETE
<a name="delete-statement"></a>

刪除 Apache Iceberg 資料表中的資料列。`DELETE` 是交易型的並且僅由 Apache Iceberg 資料表支援。

## 概要
<a name="delete-statement-synopsis"></a>

若要刪除 Iceberg 資料表中的資料列，請使用下列語法。

```
DELETE FROM [db_name.]table_name [WHERE predicate]
```

如需詳細資訊和範例，請參閱 [更新 Iceberg 資料表資料](querying-iceberg-updating-iceberg-table-data.md) 中的 `DELETE` 一節。

# UPDATE
<a name="update-statement"></a>

更新 Apache Iceberg 資料表中的資料列。`UPDATE` 是交易型的並且僅由 Apache Iceberg 資料表支援。該陳述式僅適用於現有資料列，且無法用於插入或附加資料列。

## 概要
<a name="update-statement-synopsis"></a>

若要更新 Iceberg 資料表中的資料列，請使用下列語法。

```
UPDATE [db_name.]table_name SET xx=yy[,...] [WHERE predicate]
```

如需詳細資訊和範例，請參閱 [更新 Iceberg 資料表資料](querying-iceberg-updating-iceberg-table-data.md) 中的 `UPDATE` 一節。

# 合併為
<a name="merge-into-statement"></a>

有條件地更新、刪除資料列或將其插入至 Apache Iceberg 資料表。單一陳述式可以組合更新、刪除和插入動作。

**注意**  
`MERGE INTO` 是交易型的並且僅由 Athena 引擎版本 3 中的 Apache Iceberg 資料表支援。

## 概要
<a name="merge-into-statement-synopsis"></a>

若要有條件地更新、刪除或插入 Iceberg 資料表中的資料列，請使用下列語法。

```
MERGE INTO target_table [ [ AS ]  target_alias ]
USING { source_table | query } [ [ AS ] source_alias ]
ON search_condition
when_clause [...]
```

*when\$1clause* 是下列其中一項：

```
WHEN MATCHED [ AND condition ]
    THEN DELETE
```

```
WHEN MATCHED [ AND condition ]
    THEN UPDATE SET ( column = expression [, ...] )
```

```
WHEN NOT MATCHED [ AND condition ]
    THEN INSERT (column_name[, column_name ...]) VALUES (expression, ...)
```

`MERGE` 支援具有不同 `MATCHED` 條件之任意數量的 `WHEN` 子句。條件子句會在由 `MATCHED` 狀態和符合條件選取的第一個 `WHEN` 子句中執行 `DELETE`、`UPDATE` 或 `INSERT` 運算。

針對每個來源資料列，會依序處理 `WHEN` 子句。只會執行第一個相符的 `WHEN` 子句。其餘子句會遭到忽略。當單一目標資料表資料列與多個來源資料列相符時，就會引起使用者錯誤。

如果來源資料列不與任何 `WHEN` 子句相符且沒有 `WHEN NOT MATCHED` 子句，則會忽略來源資料列。

在具有 `UPDATE` 運算的 `WHEN` 子句中，資料欄值表達式可以指代目標或來源的任何欄位。若是 `NOT MATCHED`，`INSERT` 表達式可以指代來源的任何欄位。

**範例**  
下列範例會將第二個資料表中的資料列合併至第一個資料表 (如果第一個資料表中不存在資料列)。請注意，`VALUES` 子句中列出的資料欄必須加上來源資料表別名的字首。`INSERT` 子句中列出的目標資料欄*不*得使用字首。

```
MERGE INTO iceberg_table_sample as ice1
USING iceberg2_table_sample as ice2
ON ice1.col1 = ice2.col1
WHEN NOT MATCHED 
THEN INSERT (col1)
      VALUES (ice2.col1)
```

如需更多 `MERGE INTO` 範例，請參閱 [更新 Iceberg 資料表資料](querying-iceberg-updating-iceberg-table-data.md)。

# OPTIMIZE
<a name="optimize-statement"></a>

根據相關刪除檔案的大小和數量，將資料檔案重寫成更好的版面配置，進而最佳化 Apache Iceberg 資料表中的列。

**注意**  
`OPTIMIZE` 是交易型的並且僅由 Apache Iceberg 資料表支援。

## 語法
<a name="optimize-statement-syntax"></a>

以下語法摘要說明最佳化處理 Iceberg 資料表的方式。

```
OPTIMIZE [db_name.]table_name REWRITE DATA USING BIN_PACK
  [WHERE predicate]
```

**注意**  
`WHERE` 子句*述詞*中只允許分割區資料欄。指定非分割區資料欄會導致查詢失敗。

壓縮動作按重寫過程中掃描的資料量計費。`REWRITE DATA` 動作使用述詞來選擇包含對應資料列的檔案。如果檔案中的任何資料列與述詞相對應，則會選擇該檔案進行最佳化處理。因此，為了控制壓縮時包含的文件數量，請指定 `WHERE` 子句。

## 設定壓縮屬性
<a name="optimize-statement-configuring-compaction-properties"></a>

為了控制要選擇進行壓縮的檔案大小以及壓縮後產生的檔案大小，請使用資料表屬性參數。您可以使用 [ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md) 命令來設定相關的[資料表屬性](querying-iceberg-creating-tables.md#querying-iceberg-table-properties)。

## 其他資源
<a name="optimize-statement-additional-resources"></a>

[最佳化 Iceberg 資料表](querying-iceberg-data-optimization.md)

# VACUUM
<a name="vacuum-statement"></a>

`VACUUM` 陳述式會執行[快照過期](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots)和[孤立檔案移除](https://iceberg.apache.org/docs/latest/spark-procedures/#remove_orphan_files)，進而在 Apache Iceberg 資料表上執行資料表維護。

**注意**  
`VACUUM` 是交易型的並且僅由 Athena 引擎版本 3 中的 Apache Iceberg 資料表支援。

`VACUUM` 陳述式會減少儲存消耗，進而最佳化 Iceberg 資料表。如需有關使用 `VACUUM` 的詳細資訊，請參閱 [最佳化 Iceberg 資料表](querying-iceberg-data-optimization.md)。請注意，由於 `VACUUM` 陳述式會對 Amazon S3 進行 API 呼叫，向 Amazon S3 發出相關請求需支付費用。

**警告**  
如果您執行快照過期操作，則無法再回溯至過期的快照。

## 概要
<a name="vacuum-statement-synopsis"></a>

若要移除 Iceberg 資料表中不再需要的資料檔案，請使用下列語法。

```
VACUUM [database_name.]target_table
```
+ `VACUUM` 預期 Iceberg 資料位於 Amazon S3 資料夾中，而非 Amazon S3 儲存貯體中。例如，如果您的 Iceberg 資料位於 `s3://amzn-s3-demo-bucket`/ 而非 `s3://amzn-s3-demo-bucket/myicebergfolder/`，則 `VACUUM` 陳述式會失敗，並顯示錯誤訊息 GENERIC\$1INTERNAL\$1ERROR：檔案系統位置中缺少路徑：`s3://amzn-s3-demo-bucket`。
+ 若要讓 `VACUUM` 能夠刪除資料檔案，您的查詢執行角色必須擁有對 Iceberg 資料表、中繼資料、快照和資料檔案所在儲存貯體的 `s3:DeleteObject` 許可。如果許可不存在，則 `VACUUM` 查詢會成功，但檔案不會刪除。
+ 若要在名稱以底線開頭 (例如 `_mytable`) 的資料表上執行 `VACUUM`，請以反引號括住資料表名稱，如下列範例所示。如果在資料表名稱前加上資料庫名稱作為字首，請勿以反引號括住資料庫名稱。請注意，雙引號不能取代反引號。

  此行為專屬於 `VACUUM`。對於以底線開頭的資料表名稱，`CREATE` 和 `INSERT INTO` 陳述式不需要反引號。

  ```
  VACUUM `_mytable`
  VACUUM my_database.`_mytable`
  ```

## 執行的操作
<a name="vacuum-statement-operations-performed"></a>

`VACUUM` 執行以下操作：
+ 移除早於 `vacuum_max_snapshot_age_seconds` 資料表屬性指定之時間的快照。依預設，此屬性已設為 432000 秒 (5 天)。
+ 移除不在保留期間內且超過 `vacuum_min_snapshots_to_keep` 資料表屬性所指定數目的快照。預設為 1。

  您可以在 `CREATE TABLE` 陳述式中指定這些資料表屬性。建立資料表之後，您就可以使用 [ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md) 陳述式來進行更新。
+ 移除任何因為快照移除而無法取得的中繼資料和資料檔案。您可以設定 `vacuum_max_metadata_files_to_keep` 資料表屬性，進而設定要保留的舊中繼資料檔案數目。預設值為 100.
+ 移除早於 `vacuum_max_snapshot_age_seconds` 資料表屬性中指定之時間的孤立檔案。孤立檔案是資料表的資料目錄中不屬於資料表狀態的檔案。

如需有關在 Athena 中建立和管理 Apache Iceberg 資料表的詳細資訊，則請參閱 [建立 Iceberg 資料表](querying-iceberg-creating-tables.md) 和 [管理 Iceberg 資料表](querying-iceberg-managing-tables.md)。

# 在 Athena 使用 EXPLAIN 和 EXPLAIN ANALYZE
<a name="athena-explain-statement"></a>

`EXPLAIN` 陳述式會顯示指定 SQL 陳述式的邏輯或分散式執行計劃，或驗證 SQL 陳述式。您可以以文字格式或資料格式輸出結果，以便轉譯成圖形。

**注意**  
您可以在 Athena 主控台中檢視查詢的邏輯和分散式計劃的圖形呈現，無需使用 `EXPLAIN` 語法。如需詳細資訊，請參閱[檢視 SQL 查詢的執行計畫](query-plans.md)。

`EXPLAIN ANALYZE` 陳述式會顯示指定 SQL 陳述式的分散式執行計劃，以及 SQL 查詢中每個操作的運算成本。您可以將結果輸出為文字或 JSON 格式。

## 考量和限制
<a name="athena-explain-statement-considerations-and-limitations"></a>

在 Athena 的 `EXPLAIN` 和 `EXPLAIN ANALYZE` 陳述式有下列限制。
+ `EXPLAIN` 查詢不會掃描任何資料，因此 Athena 不會為此收取費用。然而，由於 `EXPLAIN` 查詢會呼叫 AWS Glue 來擷取資料表中繼資料，如果呼叫超過 [Glue 免費方案限制](https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Categories=categories%23analytics&all-free-tier.q=glue&all-free-tier.q_operator=AND)的次數，則會從 Glue 收取費用。
+ 因為已執行 `EXPLAIN ANALYZE` 查詢，它們會掃描資料，並且 Athena 會針對掃描的資料量收取費用。
+ 在 Lake Formation 中定義的資料列或儲存格篩選資訊及查詢統計資料資訊未在 `EXPLAIN` 和 `EXPLAIN ANALYZE` 的輸出中顯示。

## EXPLAIN 語法
<a name="athena-explain-statement-syntax-athena-engine-version-2"></a>

```
EXPLAIN [ ( option [, ...]) ] statement
```

*option* 可為下列項目之一：

```
FORMAT { TEXT | GRAPHVIZ | JSON }
TYPE { LOGICAL | DISTRIBUTED | VALIDATE | IO }
```

如果未指定 `FORMAT` 選項，則輸出預設為 `TEXT` 格式。`IO` 類型提供有關查詢讀取的資料表和結構描述的資訊。

## EXPLAIN ANALYZE 語法
<a name="athena-explain-analyze-statement"></a>

除了包含在 `EXPLAIN`，`EXPLAIN ANALYZE` 輸出也包含指定查詢的執行時間統計數字，例如 CPU 用量、資料列輸入數目以及資料列輸出數目。

```
EXPLAIN ANALYZE [ ( option [, ...]) ] statement
```

*option* 可為下列項目之一：

```
FORMAT { TEXT | JSON }
```

如果未指定 `FORMAT` 選項，則輸出預設為 `TEXT` 格式。因為 `EXPLAIN ANALYZE` 的所有查詢為 `DISTRIBUTED`，則 `TYPE` 選項不可為 `EXPLAIN ANALYZE`。

*陳述式*可為下列其中之一：

```
SELECT
CREATE TABLE AS SELECT
INSERT
UNLOAD
```

## EXPLAIN 範例
<a name="athena-explain-statement-examples"></a>

下列針對 `EXPLAIN` 的範例從較簡單的內容進展到較複雜的內容。

### 範例 1：使用 EXPLAIN 陳述式以文字格式顯示查詢計畫
<a name="athena-explain-statement-example-text-query-plan"></a>

在下列範例中，`EXPLAIN` 會顯示對 Elastic Load Balancing 日誌的 `SELECT` 查詢的執行計劃。格式預設為文字輸出。

```
EXPLAIN 
SELECT 
   request_timestamp, 
   elb_name, 
   request_ip 
FROM sampledb.elb_logs;
```

#### 結果
<a name="athena-explain-statement-example-text-query-plan-results"></a>

```
- Output[request_timestamp, elb_name, request_ip] => [[request_timestamp, elb_name, request_ip]]
    - RemoteExchange[GATHER] => [[request_timestamp, elb_name, request_ip]]
        - TableScan[awsdatacatalog:HiveTableHandle{schemaName=sampledb, tableName=elb_logs, 
analyzePartitionValues=Optional.empty}] => [[request_timestamp, elb_name, request_ip]]
                LAYOUT: sampledb.elb_logs
                request_ip := request_ip:string:2:REGULAR
                request_timestamp := request_timestamp:string:0:REGULAR
                elb_name := elb_name:string:1:REGULAR
```

### 範例 2：使用 EXPLAIN 繪製查詢計畫的圖形
<a name="athena-explain-statement-example-graph-a-query-plan"></a>

您可以使用 Athena 主控台來繪製查詢計劃圖。在查詢編輯器中輸入類似以下的 `SELECT` 陳述式，然後選擇 **EXPLAIN**。

```
SELECT 
      c.c_custkey,
      o.o_orderkey,
      o.o_orderstatus
   FROM tpch100.customer c 
   JOIN tpch100.orders o 
       ON c.c_custkey = o.o_custkey
```

Athena 查詢編輯器的 **Explain** (解釋) 頁面隨即開啟，並顯示查詢的分散式計劃和邏輯計劃。下圖顯示範例的邏輯計劃。

![\[Athena 查詢編輯器轉譯的查詢計劃圖。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/athena-explain-statement-tpch.png)


**重要**  
目前，即使 Athena 確實將這些篩選條件套用至您的查詢，有些分割區篩選條件可能不會顯示在巢狀運算子樹狀結構圖形中。若要驗證此等篩選條件的效果，請在查詢上執行 `EXPLAIN` 或 `EXPLAIN ANALYZE` 並查看結果。

如需在 Athena 主控台中使用查詢計劃圖形功能的詳細資訊，請參閱 [檢視 SQL 查詢的執行計畫](query-plans.md)。

### 範例 3：使用 EXPLAIN 陳述式來驗證分割區剔除
<a name="athena-explain-statement-example-verify-partition-pruning"></a>

當您對分割的金鑰使用篩選述詞來查詢分割的資料表時，查詢引擎會將述詞套用至分割的金鑰，以減少讀取的資料量。

以下範例使用 `EXPLAIN` 查詢，對分割資料表上的 `SELECT` 查詢驗證分割區剔除。首先，`CREATE TABLE` 陳述式會建立 `tpch100.orders_partitioned` 資料表。該資料表在資料欄 `o_orderdate` 上分割。

```
CREATE TABLE `tpch100.orders_partitioned`(
  `o_orderkey` int, 
  `o_custkey` int, 
  `o_orderstatus` string, 
  `o_totalprice` double, 
  `o_orderpriority` string, 
  `o_clerk` string, 
  `o_shippriority` int, 
  `o_comment` string)
PARTITIONED BY ( 
  `o_orderdate` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/<your_directory_path>/'
```

`tpch100.orders_partitioned` 資料表在 `o_orderdate` 上有多個分割區，如 `SHOW PARTITIONS` 命令所示。

```
SHOW PARTITIONS tpch100.orders_partitioned;

o_orderdate=1994
o_orderdate=2015
o_orderdate=1998
o_orderdate=1995
o_orderdate=1993
o_orderdate=1997
o_orderdate=1992
o_orderdate=1996
```

下列 `EXPLAIN` 查詢會對指定 `SELECT` 陳述式驗證分割區剔除。

```
EXPLAIN 
SELECT 
   o_orderkey, 
   o_custkey, 
   o_orderdate 
FROM tpch100.orders_partitioned
WHERE o_orderdate = '1995'
```

#### 結果
<a name="athena-explain-statement-example-verify-partition-pruning-results"></a>

```
Query Plan
- Output[o_orderkey, o_custkey, o_orderdate] => [[o_orderkey, o_custkey, o_orderdate]]
    - RemoteExchange[GATHER] => [[o_orderkey, o_custkey, o_orderdate]]
        - TableScan[awsdatacatalog:HiveTableHandle{schemaName=tpch100, tableName=orders_partitioned, 
analyzePartitionValues=Optional.empty}] => [[o_orderkey, o_custkey, o_orderdate]]
                LAYOUT: tpch100.orders_partitioned
                o_orderdate := o_orderdate:string:-1:PARTITION_KEY
                    :: [[1995]]
                o_custkey := o_custkey:int:1:REGULAR
                o_orderkey := o_orderkey:int:0:REGULAR
```

結果中的粗體文字顯示述詞 `o_orderdate = '1995'` 已套用於 `PARTITION_KEY`。

### 範例 4：使用 EXPLAIN 查詢來檢查聯結順序和聯結類型
<a name="athena-explain-statement-example-check-join-order-and-type"></a>

下列 `EXPLAIN` 查詢會檢查 `SELECT` 陳述式的聯結順序和聯結類型。使用這樣的查詢來檢查查詢記憶體的使用情況，以便減少取得 `EXCEEDED_LOCAL_MEMORY_LIMIT` 錯誤的可能性。

```
EXPLAIN (TYPE DISTRIBUTED)
   SELECT 
      c.c_custkey, 
      o.o_orderkey,
      o.o_orderstatus
   FROM tpch100.customer c 
   JOIN tpch100.orders o 
       ON c.c_custkey = o.o_custkey 
   WHERE c.c_custkey = 123
```

#### 結果
<a name="athena-explain-statement-example-check-join-order-and-type-results"></a>

```
Query Plan
Fragment 0 [SINGLE]
    Output layout: [c_custkey, o_orderkey, o_orderstatus]
    Output partitioning: SINGLE []
    Stage Execution Strategy: UNGROUPED_EXECUTION
    - Output[c_custkey, o_orderkey, o_orderstatus] => [[c_custkey, o_orderkey, o_orderstatus]]
        - RemoteSource[1] => [[c_custkey, o_orderstatus, o_orderkey]]

Fragment 1 [SOURCE]
    Output layout: [c_custkey, o_orderstatus, o_orderkey]
    Output partitioning: SINGLE []
    Stage Execution Strategy: UNGROUPED_EXECUTION
    - CrossJoin => [[c_custkey, o_orderstatus, o_orderkey]]
            Distribution: REPLICATED
        - ScanFilter[table = awsdatacatalog:HiveTableHandle{schemaName=tpch100, 
tableName=customer, analyzePartitionValues=Optional.empty}, grouped = false, 
filterPredicate = ("c_custkey" = 123)] => [[c_custkey]]
                LAYOUT: tpch100.customer
                c_custkey := c_custkey:int:0:REGULAR
        - LocalExchange[SINGLE] () => [[o_orderstatus, o_orderkey]]
            - RemoteSource[2] => [[o_orderstatus, o_orderkey]]

Fragment 2 [SOURCE]
    Output layout: [o_orderstatus, o_orderkey]
    Output partitioning: BROADCAST []
    Stage Execution Strategy: UNGROUPED_EXECUTION
    - ScanFilterProject[table = awsdatacatalog:HiveTableHandle{schemaName=tpch100, 
tableName=orders, analyzePartitionValues=Optional.empty}, grouped = false, 
filterPredicate = ("o_custkey" = 123)] => [[o_orderstatus, o_orderkey]]
            LAYOUT: tpch100.orders
            o_orderstatus := o_orderstatus:string:2:REGULAR
            o_custkey := o_custkey:int:1:REGULAR
            o_orderkey := o_orderkey:int:0:REGULAR
```

查詢範例在交叉聯結中得到最佳化處理，以獲得更好的性能。結果顯示 `tpch100.orders` 將作為 `BROADCAST` 分佈類型進行分配。這意味著 `tpch100.orders` 資料表將分配到執行聯結操作的所有節點。`BROADCAST` 分佈類型會要求 `tpch100.orders` 資料表的所有篩選結果納入執行聯結操作的每個節點的記憶體。

不過，`tpch100.customer` 資料表比 `tpch100.orders` 小。由於 `tpch100.customer` 需要更少的記憶體，您可以將查詢重寫為 `BROADCAST tpch100.customer`，而非 `tpch100.orders`。這可減少查詢取得 `EXCEEDED_LOCAL_MEMORY_LIMIT` 錯誤的可能性。此策略假設下列要點：
+ 在 `tpch100.customer` 資料表中 `tpch100.customer.c_custkey` 為唯一。
+ 在 `tpch100.customer` 和 `tpch100.orders` 間有一對多的映射關係。

下列範例顯示重寫的查詢。

```
SELECT 
    c.c_custkey,
    o.o_orderkey,
    o.o_orderstatus
FROM tpch100.orders o
JOIN tpch100.customer c -- the filtered results of tpch100.customer are distributed to all nodes.
    ON c.c_custkey = o.o_custkey 
WHERE c.c_custkey = 123
```

### 範例 5：使用 EXPLAIN 查詢移除沒有效果的述詞
<a name="athena-explain-statement-example-remove-unneeded-predicates"></a>

您可以使用 `EXPLAIN` 查詢來檢查篩選述詞的有效性。您可以使用結果移除沒有效果的述詞，如下列範例所示。

```
EXPLAIN
   SELECT 
      c.c_name
   FROM tpch100.customer c
   WHERE c.c_custkey = CAST(RANDOM() * 1000 AS INT)
   AND c.c_custkey BETWEEN 1000 AND 2000
   AND c.c_custkey = 1500
```

#### 結果
<a name="athena-explain-statement-example-remove-unneeded-predicates-results"></a>

```
Query Plan
- Output[c_name] => [[c_name]]
    - RemoteExchange[GATHER] => [[c_name]]
        - ScanFilterProject[table = 
awsdatacatalog:HiveTableHandle{schemaName=tpch100, 
tableName=customer, analyzePartitionValues=Optional.empty}, 
filterPredicate = (("c_custkey" = 1500) AND ("c_custkey" = 
CAST(("random"() * 1E3) AS int)))] => [[c_name]]
                LAYOUT: tpch100.customer
                c_custkey := c_custkey:int:0:REGULAR
                c_name := c_name:string:1:REGULAR
```

結果中的 `filterPredicate` 顯示優化器將原始三個述詞合併為兩個述詞，並更改了應用程式的順序。

```
filterPredicate = (("c_custkey" = 1500) AND ("c_custkey" = CAST(("random"() * 1E3) AS int)))
```

因為結果顯示述詞 `AND c.c_custkey BETWEEN 1000 AND 2000` 沒有任何效果，您可以在不更改查詢結果的情況下移除此述詞。

如需有關 `EXPLAIN` 查詢結果中所使用術語的詳細資訊，請參閱[了解 Athena EXPLAIN 陳述式結果](athena-explain-statement-understanding.md)。

## EXPLAIN ANALYZE 範例
<a name="athena-explain-analyze-examples"></a>

下列範例將顯示範例 `EXPLAIN ANALYZE` 查詢和輸出。

### 範例 1：使用 EXPLAIN ANALYZE 以文字格式顯示查詢計畫和運算成本
<a name="athena-explain-analyze-example-cflogs-text"></a>

在下列範例中，`EXPLAIN ANALYZE` 會顯示對 CloudFront 日誌的 `SELECT` 查詢的執行計劃和運算成本。格式預設為文字輸出。

```
EXPLAIN ANALYZE SELECT FROM cloudfront_logs LIMIT 10
```

#### 結果
<a name="athena-explain-analyze-example-cflogs-text-results"></a>

```
 Fragment 1
     CPU: 24.60ms, Input: 10 rows (1.48kB); per task: std.dev.: 0.00, Output: 10 rows (1.48kB)
     Output layout: [date, time, location, bytes, requestip, method, host, uri, status, referrer,\
       os, browser, browserversion]
Limit[10] => [[date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
  browser, browserversion]]
             CPU: 1.00ms (0.03%), Output: 10 rows (1.48kB)
             Input avg.: 10.00 rows, Input std.dev.: 0.00%
LocalExchange[SINGLE] () => [[date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
 browser, browserversion]]
                 CPU: 0.00ns (0.00%), Output: 10 rows (1.48kB)
                 Input avg.: 0.63 rows, Input std.dev.: 387.30%
RemoteSource[2] => [[date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
  browser, browserversion]]
                     CPU: 1.00ms (0.03%), Output: 10 rows (1.48kB)
                     Input avg.: 0.63 rows, Input std.dev.: 387.30%

 Fragment 2
     CPU: 3.83s, Input: 998 rows (147.21kB); per task: std.dev.: 0.00, Output: 20 rows (2.95kB)
     Output layout: [date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
       browser, browserversion]
LimitPartial[10] => [[date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
  browser, browserversion]]
             CPU: 5.00ms (0.13%), Output: 20 rows (2.95kB)
             Input avg.: 166.33 rows, Input std.dev.: 141.42%
TableScan[awsdatacatalog:HiveTableHandle{schemaName=default, tableName=cloudfront_logs,\
  analyzePartitionValues=Optional.empty}, 
grouped = false] => [[date, time, location, bytes, requestip, method, host, uri, st
                 CPU: 3.82s (99.82%), Output: 998 rows (147.21kB)
                 Input avg.: 166.33 rows, Input std.dev.: 141.42%
                 LAYOUT: default.cloudfront_logs
                 date := date:date:0:REGULAR
                 referrer := referrer:string:9:REGULAR
                 os := os:string:10:REGULAR
                 method := method:string:5:REGULAR
                 bytes := bytes:int:3:REGULAR
                 browser := browser:string:11:REGULAR
                 host := host:string:6:REGULAR
                 requestip := requestip:string:4:REGULAR
                 location := location:string:2:REGULAR
                 time := time:string:1:REGULAR
                 uri := uri:string:7:REGULAR
                 browserversion := browserversion:string:12:REGULAR
                 status := status:int:8:REGULAR
```

### 範例 2：使用 EXPLAIN ANALYZE 以 JSON 格式顯示查詢計畫
<a name="athena-explain-analyze-example-cflogs-json"></a>

下列範例會顯示對 CloudFront 日誌的 `SELECT` 查詢的執行計劃和運算成本。此範例指定 JSON 作為輸出格式。

```
EXPLAIN ANALYZE (FORMAT JSON) SELECT * FROM cloudfront_logs LIMIT 10
```

#### 結果
<a name="athena-explain-analyze-example-cflogs-json-results"></a>

```
{ 
    "fragments": [{ 
        "id": "1", 
 
        "stageStats": { 
            "totalCpuTime": "3.31ms", 
            "inputRows": "10 rows", 
            "inputDataSize": "1514B", 
            "stdDevInputRows": "0.00", 
            "outputRows": "10 rows", 
            "outputDataSize": "1514B" 
        }, 
        "outputLayout": "date, time, location, bytes, requestip, method, host,\
           uri, status, referrer, os, browser, browserversion", 
 
        "logicalPlan": { 
            "1": [{ 
                "name": "Limit", 
                "identifier": "[10]", 
                "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host",\
                  "uri", "status", "referrer", "os", "browser", "browserversion"], 
                "details": "", 
                "distributedNodeStats": { 
                    "nodeCpuTime": "0.00ns", 
                    "nodeOutputRows": 10, 
                    "nodeOutputDataSize": "1514B", 
                    "operatorInputRowsStats": [{ 
                        "nodeInputRows": 10.0, 
                        "nodeInputRowsStdDev": 0.0 
                    }] 
                }, 
                "children": [{ 
                    "name": "LocalExchange", 
                    "identifier": "[SINGLE] ()", 
                    "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host",\
                      "uri", "status", "referrer", "os", "browser", "browserversion"], 
                    "details": "", 
                    "distributedNodeStats": { 
                        "nodeCpuTime": "0.00ns", 
                        "nodeOutputRows": 10, 
                        "nodeOutputDataSize": "1514B", 
                        "operatorInputRowsStats": [{ 
                            "nodeInputRows": 0.625, 
                            "nodeInputRowsStdDev": 387.2983346207417 
                        }] 
                    }, 
                    "children": [{ 
                        "name": "RemoteSource", 
                        "identifier": "[2]", 
                        "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host",\
                          "uri", "status", "referrer", "os", "browser", "browserversion"], 
                        "details": "", 
                        "distributedNodeStats": { 
                            "nodeCpuTime": "0.00ns", 
                            "nodeOutputRows": 10, 
                            "nodeOutputDataSize": "1514B", 
                            "operatorInputRowsStats": [{ 
                                "nodeInputRows": 0.625, 
                                "nodeInputRowsStdDev": 387.2983346207417 
                            }] 
                        }, 
                        "children": [] 
                    }] 
                }] 
            }] 
        } 
    }, { 
        "id": "2", 
 
        "stageStats": { 
            "totalCpuTime": "1.62s", 
            "inputRows": "500 rows", 
            "inputDataSize": "75564B", 
            "stdDevInputRows": "0.00", 
            "outputRows": "10 rows", 
            "outputDataSize": "1514B" 
        }, 
        "outputLayout": "date, time, location, bytes, requestip, method, host, uri, status,\
           referrer, os, browser, browserversion", 
 
        "logicalPlan": { 
            "1": [{ 
                "name": "LimitPartial", 
                "identifier": "[10]", 
                "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host", "uri",\
                  "status", "referrer", "os", "browser", "browserversion"], 
                "details": "", 
                "distributedNodeStats": { 
                    "nodeCpuTime": "0.00ns", 
                    "nodeOutputRows": 10, 
                    "nodeOutputDataSize": "1514B", 
                    "operatorInputRowsStats": [{ 
                        "nodeInputRows": 83.33333333333333, 
                        "nodeInputRowsStdDev": 223.60679774997897 
                    }] 
                }, 
                "children": [{ 
                    "name": "TableScan", 
                    "identifier": "[awsdatacatalog:HiveTableHandle{schemaName=default,\
                       tableName=cloudfront_logs, analyzePartitionValues=Optional.empty},\
                       grouped = false]", 
                    "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host", "uri",\
                       "status", "referrer", "os", "browser", "browserversion"], 
                    "details": "LAYOUT: default.cloudfront_logs\ndate := date:date:0:REGULAR\nreferrer :=\
                       referrer: string:9:REGULAR\nos := os:string:10:REGULAR\nmethod := method:string:5:\
                       REGULAR\nbytes := bytes:int:3:REGULAR\nbrowser := browser:string:11:REGULAR\nhost :=\
                       host:string:6:REGULAR\nrequestip := requestip:string:4:REGULAR\nlocation :=\
                       location:string:2:REGULAR\ntime := time:string:1: REGULAR\nuri := uri:string:7:\
                       REGULAR\nbrowserversion := browserversion:string:12:REGULAR\nstatus :=\
                       status:int:8:REGULAR\n", 
                    "distributedNodeStats": { 
                        "nodeCpuTime": "1.62s", 
                        "nodeOutputRows": 500, 
                        "nodeOutputDataSize": "75564B", 
                        "operatorInputRowsStats": [{ 
                            "nodeInputRows": 83.33333333333333, 
                            "nodeInputRowsStdDev": 223.60679774997897 
                        }] 
                    }, 
                    "children": [] 
                }] 
            }] 
        } 
    }] 
}
```

## 其他資源
<a name="athena-explain-statement-additional-resources"></a>

如需其他資訊，請參閱以下資源。
+  [了解 Athena EXPLAIN 陳述式結果](athena-explain-statement-understanding.md)
+  [檢視 SQL 查詢的執行計畫](query-plans.md)
+  [檢視已完成查詢的統計資料和執行詳細資訊](query-stats.md)
+ Trino [https://trino.io/docs/current/sql/explain.html](https://trino.io/docs/current/sql/explain.html) 文件
+ Trino [https://trino.io/docs/current/sql/explain-analyze.html](https://trino.io/docs/current/sql/explain-analyze.html) 文件
+  *AWS 大數據部落格*中的[使用 Amazon Athena 中的 EXPLAIN 和 EXPLAIN ANALYZE 優化聯合查詢效能](https://aws.amazon.com/blogs/big-data/optimize-federated-query-performance-using-explain-and-explain-analyze-in-amazon-athena/)。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/7JUyTqglmNU/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/7JUyTqglmNU)


# 了解 Athena EXPLAIN 陳述式結果
<a name="athena-explain-statement-understanding"></a>

本主題提供 Athena `EXPLAIN` 陳述式結果中使用的操作術語的簡要指南。

## EXPLAIN 陳述式輸出類型
<a name="athena-explain-statement-understanding-explain-plan-types"></a>

`EXPLAIN` 陳述式輸出可為以下兩種類型之一：
+ **邏輯計劃** – 顯示 SQL 引擎用來執行陳述式的邏輯計劃。此選項的語法為 `EXPLAIN` 或 `EXPLAIN (TYPE LOGICAL)`。
+ **分散式計劃** – 顯示分散式環境中的執行計劃。輸出顯示片段，這是處理階段。每個計劃片段會由一或多個節點處理。資料可以在處理片段的節點之間進行交換。此選項的語法為 `EXPLAIN (TYPE DISTRIBUTED)`。

  在分散式計畫的輸出中，用 `Fragment` *number* [*fragment\$1type*] 表示片段 (處理階段)，其中 *number* 是一個以零為起始的整數，以及 *fragment\$1type* 指定片段如何由節點執行。片段類型提供資料交換配置的深入資訊，如下表所述。  
**分散式計劃片段類型**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/athena-explain-statement-understanding.html)

## Exchange
<a name="athena-explain-statement-understanding-exchange-types"></a>

交換相關術語描述如何在工作節點之間交換資料。傳輸可以是本機或遠端。

**LocalExchange [*exchange\$1type*] **  
針對查詢的不同階段，在工作節點內本機傳輸資料。*exchange\$1type* 的值可以是邏輯或分散式交換類型其中一種，如本節後文所述。

**RemoteExchange [*exchange\$1type*] **  
針對查詢的不同階段，在工作節點之間傳輸資料。*exchange\$1type* 的值可以是邏輯或分散式交換類型其中一種，如本節後文所述。

### 邏輯 Exchange 類型
<a name="athena-explain-statement-understanding-exchange-types-logical"></a>

下列交換類型說明邏輯計劃的交換階段期間所採取的動作。
+ **`GATHER`** – 單一工作節點會收集所有其他工作節點的輸出。例如，選取查詢的最後階段會收集所有節點的結果，並將結果寫入 Amazon S3。
+ **`REPARTITION`** – 根據套用至下一個運算子所需的分割結構描述，將資料行資料傳送至特定工作者。
+ **`REPLICATE`** – 將資料行資料複製到所有工作者。

### 分散式交換類型
<a name="athena-explain-statement-understanding-exchange-types-distributed"></a>

下列交換類型指出在分散式計劃中的節點之間交換資料時的資料配置。
+ **`HASH`** – 交換會使用雜湊函數將資料分配到多個目的地。
+ **`SINGLE`** – 交換會將資料分配到單一目的地。

## 掃描
<a name="athena-explain-statement-understanding-scanning"></a>

下列術語描述查詢期間如何掃描資料。

**TableScan **  
掃描來自 Amazon S3 或 Apache Hive 連接器的資料表來源資料，並套用從篩選述詞產生的分割區剔除。

**ScanFilter **  
掃描來自 Amazon S3 或 Hive 連接器的資料表來源資料，並套用從篩選述詞產生的分割區剔除，以及從沒有透過分割區剔除套用的其他篩選述詞產生的分割區剔除。

**ScanFilterProject **  
首先，掃描來自 Amazon S3 或 Hive 連接器的資料表來源資料，並套用從篩選述詞產生的分割區剔除，以及從沒有透過分割區剔除套用的其他篩選述詞產生的分割區剔除。然後，將輸出資料的記憶體配置修改為新的投影，以改善後續階段的效能。

## Join
<a name="athena-explain-statement-understanding-join"></a>

聯結兩個資料表之間的資料。聯結可以依聯結類型和分佈類型來分類。

### 聯結類型
<a name="athena-explain-statement-understanding-join-types"></a>

聯結類型定義聯結操作發生的方式。

**CrossJoin** – 產生已聯結的兩個資料表的笛卡兒乘積。

**InnerJoin** – 選取兩個資料表中具有相符值的記錄。

**LeftJoin** – 選取左資料表中的所有記錄，以及右資料表中的相符記錄。如果沒有發生匹配，右側的結果是 NULL。

**RightJoin** – 選取右資料表中的所有記錄，以及左資料表中的相符記錄。如果沒有發生匹配，左側的結果是 NULL。

**FullJoin** – 選取左側或右側資料表記錄中有相符項目的所有記錄。聯結資料表包含來自兩個資料表的所有記錄，並在兩側不符的地方以 NULL 填充。

**注意**  
基於效能考量，查詢引擎可以將聯結查詢重新寫入不同的聯結類型，以產生相同的結果。例如，在一個資料表上具有述詞的內部聯結查詢可以重寫入 `CrossJoin`。這會將述詞推送到資料表的掃描階段，以便掃描較少的資料。

### 聯結分佈類型
<a name="athena-explain-statement-understanding-join-distribution-types"></a>

分佈類型定義執行聯結操作時，如何在工作節點之間交換資料。

**已分割** – 左側和右側資料表會在所有工作節點間進行雜湊分割。已分割分佈會在每個節點消耗較少的記憶體。已分割分佈可以比複寫的聯結慢得多。當您聯結兩個大資料表時適合使用已分割聯結。

**已複寫** – 一個資料表會在所有工作節點之間進行雜湊分割，另一個資料表會複寫到所有工作節點，以執行聯結操作。複寫的分佈可以比已分割聯結快得多，但它會在每個工作節點中耗用更多的記憶體。如果複寫的資料表太大，工作節點可能會遇到記憶體不足錯誤。當其中一個聯結的資料表很小時，就適合使用複寫的聯結。

# PREPARE
<a name="sql-prepare"></a>

使用名稱 `statement_name` 建立 SQL 陳述式，以供之後執行。陳述式可以包含以問號表示的參數。若要提供值給參數並執行預備陳述式，請使用 [EXECUTE](sql-execute.md)。

## 概要
<a name="sql-prepare-synopsis"></a>

```
PREPARE statement_name FROM statement
```

下表描述了參數。


****  

| 參數 | Description | 
| --- | --- | 
| statement\$1name | 要預備之陳述式的名稱。該名稱在工作群組內必須是唯一的。 | 
| statement | SELECT、CTAS 或 INSERT INTO 查詢。 | 

**注意**  
工作群組中預備陳述式的數量上限為 1000。

## 範例
<a name="sql-prepare-examples"></a>

以下範例準備一個不含參數的選擇查詢。

```
PREPARE my_select1 FROM 
SELECT * FROM nation
```

以下範例準備一個包含參數的選擇查詢。`productid` 和 `quantity` 的值將由 `EXECUTE` 陳述式的 `USING` 子句提供：

```
PREPARE my_select2 FROM 
SELECT order FROM orders WHERE productid = ? and quantity < ?
```

以下範例準備一個插入查詢。

```
PREPARE my_insert FROM 
INSERT INTO cities_usa (city, state) 
SELECT city, state 
FROM cities_world 
WHERE country = ?
```

## 其他資源
<a name="sql-prepare-additional-resources"></a>

[使用預備陳述式](querying-with-prepared-statements-querying.md)

[EXECUTE](sql-execute.md)

[DEALLOCATE PREPARE](sql-deallocate-prepare.md)

[INSERT INTO](insert-into.md)

# EXECUTE
<a name="sql-execute"></a>

執行名為 `statement_name` 的預備陳述式。預備陳述式中問號的參數值定義在以逗號分隔的清單的 `USING` 子句中。若要建立預備陳述式，使用 [PREPARE](sql-prepare.md)。

## 概要
<a name="sql-execute-synopsis"></a>

```
EXECUTE statement_name [ USING parameter1[, parameter2, ... ] ]
```

## 範例
<a name="sql-execute-examples"></a>

以下範例準備並執行不含任何參數的查詢。

```
PREPARE my_select1 FROM 
SELECT name FROM nation 
EXECUTE my_select1
```

以下範例準備並執行含有一個參數的查詢。

```
PREPARE my_select2 FROM 
SELECT * FROM "my_database"."my_table" WHERE year = ? 
EXECUTE my_select2 USING 2012
```

這相當於：

```
SELECT * FROM "my_database"."my_table" WHERE year = 2012
```

以下範例準備並執行含有兩個參數的查詢。

```
PREPARE my_select3 FROM 
SELECT order FROM orders WHERE productid = ? and quantity < ? 
EXECUTE my_select3 USING 346078, 12
```

## 其他資源
<a name="sql-execute-additional-resources"></a>

[使用預備陳述式](querying-with-prepared-statements-querying.md)

[PREPARE](sql-prepare.md)

[INSERT INTO](insert-into.md)

# DEALLOCATE PREPARE
<a name="sql-deallocate-prepare"></a>

從目前工作群組的預備陳述式中移除具有指定名稱的預備陳述式。

## 概要
<a name="sql-deallocate-prepare-synopsis"></a>

```
DEALLOCATE PREPARE statement_name
```

## 範例
<a name="sql-deallocate-prepare-examples"></a>

下列範例會從目前的工作群組中移除 `my_select1` 預備陳述式。

```
DEALLOCATE PREPARE my_select1
```

## 其他資源
<a name="sql-deallocate-prepare-additional-resources"></a>

[使用預備陳述式](querying-with-prepared-statements-querying.md)

[PREPARE](sql-prepare.md)

# UNLOAD
<a name="unload"></a>

從 `SELECT` 陳述式寫入查詢結果至指定的資料格式。針對 `UNLOAD` 支援的格式包括 Apache Parquet、ORC、Apache Avro 和 JSON。CSV 是 Athena `SELECT` 命令支援的唯一輸出格式，但您可以使用支援各種輸出格式的 `UNLOAD` 命令來括住 `SELECT` 查詢，並將其輸出重寫為 `UNLOAD` 支援的其中一種格式。

雖然您可以使用 `CREATE TABLE AS` (CTAS) 陳述式以 CSV 以外的格式輸出資料，但 CTAS 陳述式需要在 Athena 中建立資料表。`UNLOAD` 陳述式在您想以非 CSV 格式輸出 `SELECT` 查詢結果，但不要相關聯的資料表時十分有用。例如，下游應用程式可能需要 `SELECT` 查詢結果使用 JSON 格式，而且如果您打算對其他分析使用 `SELECT` 查詢結果，則 Parquet 或 ORC 的效能可能優於 CSV。

## 考量和限制
<a name="unload-considerations-and-limitations"></a>

當您在 Athena 中使用 `UNLOAD` 陳述式時，請謹記以下幾點：
+ **沒有檔案的全域排序** – `UNLOAD`結果會同時寫入多個檔案。如果 `UNLOAD` 陳述式中的 `SELECT` 查詢會指定排序順序，則每個檔案的內容會依排序順序排列，但檔案並不會彼此排序。
+ **未刪除孤立資料** – 在發生故障的情況下，Athena 不會嘗試刪除孤立的資料。此行為同於 CTAS 和 `INSERT INTO` 陳述式。
+ **分割區數量上限** – 可搭配 `UNLOAD` 使用的分割區數量上限為 100。
+ **中繼資料和資訊清單檔案** – Athena 會為每個 `UNLOAD` 查詢產生中繼資料檔案和資訊清單檔案。資訊清單會追蹤查詢寫入的檔案。這兩個檔案都會儲存到 Amazon S3 中的 Athena 查詢結果位置。如需詳細資訊，請參閱[識別查詢輸出檔案](querying-finding-output-files.md#querying-identifying-output-files)。
+ **加密** – `UNLOAD` 輸出檔案會根據用於 Amazon S3 的加密組態進行加密。若要設定加密組態來加密 `UNLOAD` 結果，您可以使用 [EncryptionConfiguration API](https://docs.aws.amazon.com/athena/latest/APIReference/API_EncryptionConfiguration.html)。
+ **預備陳述式** – `UNLOAD` 可以與預備的陳述式一起使用。如需有關 Athena 中的預備陳述式的資訊，請參閱[使用參數化查詢](querying-with-prepared-statements.md)。
+ **服務配額** – `UNLOAD` 會使用 DML 查詢配額。如需有關配額的資訊，請參閱 [Service Quotas](service-limits.md)。
+ **預期的儲存貯體擁有者** – 預期的儲存貯體擁有者設定不適用於 `UNLOAD` 查詢中指定的目的地 Amazon S3 位置。預期的儲存貯體擁有者設定僅適用於您為 Athena 查詢結果指定的 Amazon S3 輸出位置。如需詳細資訊，請參閱[使用 Athena 主控台指定查詢結果位置](query-results-specify-location-console.md)。

## 語法
<a name="unload-syntax"></a>

`UNLOAD` 陳述式使用下列語法。

```
UNLOAD (SELECT col_name[, ...] FROM old_table) 
TO 's3://amzn-s3-demo-bucket/my_folder/' 
WITH ( property_name = 'expression' [, ...] )
```

除了寫入分割區時，`TO` 目標必須在沒有資料的 Amazon S3 中指定位置。在 `UNLOAD` 查詢寫入指定位置之前，它會驗證儲存貯體位置是否為空。由於 `UNLOAD` 在指定位置已經有資料時不會將資料寫入該位置，`UNLOAD` 不會覆寫現有資料。若要重複使用儲存貯體位置作為 `UNLOAD` 的目標，請刪除儲存貯體位置中的資料，然後再次執行查詢。

請注意，當 `UNLOAD` 寫入分割區時，此行為會有所不同。如果您多次執行具有相同 `SELECT` 陳述式、相同 `TO` 位置和相同分割區的相同 `UNLOAD` 查詢，則每個 `UNLOAD` 查詢都會在指定的位置和分割區將資料卸載至 Amazon S3。

### Parameters
<a name="unload-parameters"></a>

*property\$1name* 可能的值如下。

** 格式 = '*file\$1format*'**  
必要。指定輸出的檔案格式。*file\$1format* 的可能值為 `ORC`、`PARQUET`、`AVRO`、`JSON` 或 `TEXTFILE`。

** 壓縮 = '*compression\$1format*'**  
選用。此選項僅適用於 ORC 和 Parquet 格式。ORC 的預設值為 `zlib`，而 Parquet 的預設值則為 `gzip`。如需有關支援的壓縮格式的資訊，請參閱 [Athena 壓縮支援](https://docs.aws.amazon.com/athena/latest/ug/compression-formats.html)。  
此選項不適用於 `AVRO` 格式。Athena 對 `JSON` 和 `TEXTFILE` 格式使用 `gzip`。

**compression\$1level = *compression\$1level* **  
選用。用於 ZSTD 壓縮的壓縮級別。此屬性僅適用於 ZSTD 壓縮。如需詳細資訊，請參閱[使用 ZSTD 壓縮級別](compression-support-zstd-levels.md)。

** field\$1delimiter = '*delimiter*'**  
選用。指定 CSV、TSV 和其他文字格式檔案的單一字元欄位分隔符號。以下範例指定逗點分隔符號。  

```
WITH (field_delimiter = ',')
```
目前不支援多字元欄位分隔符號。如果您未指定欄位分隔符號，系統會使用八進位制字元 `\001` (^A)。

** partitioned\$1by = ARRAY[ *col\$1name*[,...] ] **  
選用。資料欄的陣列清單，輸出依這些資料欄進行分割。  
在 `SELECT` 陳列式中，請確保已分割資料欄的名稱位於資料欄清單中的最後。

## 範例
<a name="unload-examples"></a>

下列範例會使用 JSON 格式，將 `SELECT` 查詢的輸出寫入 Amazon S3 位置 `s3://amzn-s3-demo-bucket/unload_test_1/`。

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/unload_test_1/' 
WITH (format = 'JSON')
```

下列範例會採用 Snappy 壓縮方式以 Parquet 格式寫入 `SELECT` 查詢的輸出。

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/' 
WITH (format = 'PARQUET',compression = 'SNAPPY')
```

下列範例會以文字格式寫入四個資料欄，且輸出依最後一個資料欄分割。

```
UNLOAD (SELECT name1, address1, comment1, key1 FROM table1) 
TO 's3://amzn-s3-demo-bucket/ partitioned/' 
WITH (format = 'TEXTFILE', partitioned_by = ARRAY['key1'])
```

下列範例會使用 Parquet 檔案格式、ZSTD 壓縮和 ZSTD 壓縮級別 4，將查詢結果卸載到指定的位置。

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/' 
WITH (format = 'PARQUET', compression = 'ZSTD', compression_level = 4)
```

## 其他資源
<a name="unload-additional-resources"></a>
+ *AWS 大數據部落格*中的[使用 Amazon Athena UNLOAD 特徵簡化 ETL 和 ML 管道](https://aws.amazon.com/blogs/big-data/simplify-your-etl-and-ml-pipelines-using-the-amazon-athena-unload-feature/)。

# Amazon Athena 中的函數
<a name="functions"></a>

如需有關 Athena 引擎版本之間函式的變更，請參閱 [Athena 引擎版本控制](engine-versions.md)。如需可與 `AT TIME ZONE` 運算子搭配使用的時區清單，請參閱[使用支援的時區](athena-supported-time-zones.md)。

**Topics**
+ [Athena 引擎版本 3](functions-env3.md)

# Athena 引擎版本 3 函式
<a name="functions-env3"></a>

Athena 引擎版本 3 中的函數以 Trino 為基礎。如需有關 Trino 函數、運算子和表達式的資訊，請參閱 Trino 文件中的 [Functions and operators](https://trino.io/docs/current/functions.html) (函數和運算子)，以及以下具體子節。
+  [Aggregate](https://trino.io/docs/current/functions/aggregate.html) 
+  [Array](https://trino.io/docs/current/functions/array.html) (陣列) 
+  [：二進位](https://trino.io/docs/current/functions/binary.html) 
+  [Bitwise](https://trino.io/docs/current/functions/bitwise.html) (位元) 
+  [Color (顏色)](https://trino.io/docs/current/functions/color.html) 
+  [Comparison](https://trino.io/docs/current/functions/comparison.html) (比較) 
+  [有條件](https://trino.io/docs/current/functions/conditional.html) 
+  [Conversion](https://trino.io/docs/current/functions/conversion.html) (轉換) 
+  [日期和時間](https://trino.io/docs/current/functions/datetime.html) 
+  [Decimal](https://trino.io/docs/current/functions/decimal.html) (小數) 
+  [Geospatial](https://trino.io/docs/current/functions/geospatial.html) (地理空間) 
+  [HyperLogLog](https://trino.io/docs/current/functions/hyperloglog.html) 
+  [IP Address](https://trino.io/docs/current/functions/ipaddress.html) (IP 地址) 
+  [JSON](https://trino.io/docs/current/functions/json.html) 
+  [Lambda](https://trino.io/docs/current/functions/lambda.html) 
+  [Logical](https://trino.io/docs/current/functions/logical.html) (邏輯) 
+  [Machine learning](https://trino.io/docs/current/functions/ml.html) (機器學習) 
+  [Map](https://trino.io/docs/current/functions/map.html) 
+  [Math](https://trino.io/docs/current/functions/math.html) 
+  [Quantile digest](https://trino.io/docs/current/functions/qdigest.html) (分位數摘要) 
+  [Regular expression](https://trino.io/docs/current/functions/regexp.html) (常規表達式) 
+  [Session](https://trino.io/docs/current/functions/session.html) (工作階段) 
+  [Set Digest](https://trino.io/docs/current/functions/setdigest.html) 
+  [：字串](https://trino.io/docs/current/functions/string.html) 
+  [資料表](https://trino.io/docs/current/functions/table.html) 
+  [Teradata](https://trino.io/docs/current/functions/teradata.html) 
+  [T-Digest](https://trino.io/docs/current/functions/tdigest.html) 
+  [URL](https://trino.io/docs/current/functions/url.html) 
+  [UUID](https://trino.io/docs/current/functions/uuid.html) 
+  [視窗](https://trino.io/docs/current/functions/window.html) 

## invoker\$1principal() 函式
<a name="functions-env3-invoker-principal"></a>

`invoker_principal` 函式是 Athena 引擎版本 3 所獨有的，Trino 中找不到該函式。

傳回包含主體 (IAM 角色或 Identity Center 身分) 的 ARN 的 `VARCHAR`，其中該主體可執行呼叫函式的查詢。例如，如果查詢調用者使用 IAM 角色的許可來執行查詢，則函式會傳回 IAM 角色的 ARN。執行查詢的角色必須允許 `LakeFormation:GetDataLakePrincipal` 動作。

### Usage
<a name="functions-invoker-principal-usage"></a>

```
SELECT invoker_principal()
```

下列資料表會顯示範例結果。


****  

| \$1 | \$1col0 | 
| --- | --- | 
| 1 | arn:aws:iam::111122223333:role/Admin | 

# 使用支援的時區
<a name="athena-supported-time-zones"></a>

您可以在 `SELECT timestamp` 陳述式中使用 `AT TIME ZONE` 運算子來指定傳回之時間戳記的時區，如以下範例所示：

```
SELECT timestamp '2012-10-31 01:00 UTC' AT TIME ZONE 'America/Los_Angeles' AS la_time;
```

**結果**

```
la_time

2012-10-30 18:00:00.000 America/Los_Angeles
```

如需 Athena 中支援的時區清單，請展開本主題結尾的 [支援的時區清單](#athena-supported-time-zones-list)。

## 時區函數和範例
<a name="athena-supported-time-zones-functions-examples"></a>

以下是一些其他與時區相關的函數和範例。
+ **at\$1timezone(*timestamp*, *zone*)** – 傳回*區域*相應當地時間的*時間戳記*值。

  **範例**

  ```
  SELECT at_timezone(timestamp '2021-08-22 00:00 UTC', 'Canada/Newfoundland')
  ```

  **結果**

  ```
  2021-08-21 21:30:00.000 Canada/Newfoundland
  ```
+ **timezone\$1hour(*timestamp*)** – 以 `bigint` 傳回時區偏離時間戳記的小時數。

  **範例**

  ```
  SELECT timezone_hour(timestamp '2021-08-22 04:00 UTC' AT TIME ZONE 'Canada/Newfoundland')
  ```

  **結果**

  ```
  -2
  ```
+ **timezone\$1minute(*timestamp*)** – 以 `bigint` 傳回時區偏離*時間戳記*的分鐘數 。

  **範例**

  ```
  SELECT timezone_minute(timestamp '2021-08-22 04:00 UTC' AT TIME ZONE 'Canada/Newfoundland')
  ```

  **結果**

  ```
  -30
  ```
+ **with\$1timezone(*timestamp*, *zone*)** – 從指定的*時間戳記*和*區域*值傳回時間戳記和時區。

  **範例**

  ```
  SELECT with_timezone(timestamp '2021-08-22 04:00', 'Canada/Newfoundland')
  ```

  **結果**

  ```
  2021-08-22 04:00:00.000 Canada/Newfoundland
  ```

## 支援的時區清單
<a name="athena-supported-time-zones-list"></a>

下列清單包含可搭配 Athena 中 `AT TIME ZONE` 運算子使用的時區。如需其他與時區相關的函數和範例，請參閱 [時區函數和範例](#athena-supported-time-zones-functions-examples)。

```
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
Africa/Blantyre
Africa/Brazzaville
Africa/Bujumbura
Africa/Cairo
Africa/Casablanca
Africa/Ceuta
Africa/Conakry
Africa/Dakar
Africa/Dar_es_Salaam
Africa/Djibouti
Africa/Douala
Africa/El_Aaiun
Africa/Freetown
Africa/Gaborone
Africa/Harare
Africa/Johannesburg
Africa/Juba
Africa/Kampala
Africa/Khartoum
Africa/Kigali
Africa/Kinshasa
Africa/Lagos
Africa/Libreville
Africa/Lome
Africa/Luanda
Africa/Lubumbashi
Africa/Lusaka
Africa/Malabo
Africa/Maputo
Africa/Maseru
Africa/Mbabane
Africa/Mogadishu
Africa/Monrovia
Africa/Nairobi
Africa/Ndjamena
Africa/Niamey
Africa/Nouakchott
Africa/Ouagadougou
Africa/Porto-Novo
Africa/Sao_Tome
Africa/Timbuktu
Africa/Tripoli
Africa/Tunis
Africa/Windhoek
America/Adak
America/Anchorage
America/Anguilla
America/Antigua
America/Araguaina
America/Argentina/Buenos_Aires
America/Argentina/Catamarca
America/Argentina/ComodRivadavia
America/Argentina/Cordoba
America/Argentina/Jujuy
America/Argentina/La_Rioja
America/Argentina/Mendoza
America/Argentina/Rio_Gallegos
America/Argentina/Salta
America/Argentina/San_Juan
America/Argentina/San_Luis
America/Argentina/Tucuman
America/Argentina/Ushuaia
America/Aruba
America/Asuncion
America/Atikokan
America/Atka
America/Bahia
America/Bahia_Banderas
America/Barbados
America/Belem
America/Belize
America/Blanc-Sablon
America/Boa_Vista
America/Bogota
America/Boise
America/Buenos_Aires
America/Cambridge_Bay
America/Campo_Grande
America/Cancun
America/Caracas
America/Catamarca
America/Cayenne
America/Cayman
America/Chicago
America/Chihuahua
America/Coral_Harbour
America/Cordoba
America/Costa_Rica
America/Creston
America/Cuiaba
America/Curacao
America/Danmarkshavn
America/Dawson
America/Dawson_Creek
America/Denver
America/Detroit
America/Dominica
America/Edmonton
America/Eirunepe
America/El_Salvador
America/Ensenada
America/Fort_Nelson
America/Fort_Wayne
America/Fortaleza
America/Glace_Bay
America/Godthab
America/Goose_Bay
America/Grand_Turk
America/Grenada
America/Guadeloupe
America/Guatemala
America/Guayaquil
America/Guyana
America/Halifax
America/Havana
America/Hermosillo
America/Indiana/Indianapolis
America/Indiana/Knox
America/Indiana/Marengo
America/Indiana/Petersburg
America/Indiana/Tell_City
America/Indiana/Vevay
America/Indiana/Vincennes
America/Indiana/Winamac
America/Indianapolis
America/Inuvik
America/Iqaluit
America/Jamaica
America/Jujuy
America/Juneau
America/Kentucky/Louisville
America/Kentucky/Monticello
America/Knox_IN
America/Kralendijk
America/La_Paz
America/Lima
America/Los_Angeles
America/Louisville
America/Lower_Princes
America/Maceio
America/Managua
America/Manaus
America/Marigot
America/Martinique
America/Matamoros
America/Mazatlan
America/Mendoza
America/Menominee
America/Merida
America/Metlakatla
America/Mexico_City
America/Miquelon
America/Moncton
America/Monterrey
America/Montevideo
America/Montreal
America/Montserrat
America/Nassau
America/New_York
America/Nipigon
America/Nome
America/Noronha
America/North_Dakota/Beulah
America/North_Dakota/Center
America/North_Dakota/New_Salem
America/Ojinaga
America/Panama
America/Pangnirtung
America/Paramaribo
America/Phoenix
America/Port-au-Prince
America/Port_of_Spain
America/Porto_Acre
America/Porto_Velho
America/Puerto_Rico
America/Punta_Arenas
America/Rainy_River
America/Rankin_Inlet
America/Recife
America/Regina
America/Resolute
America/Rio_Branco
America/Rosario
America/Santa_Isabel
America/Santarem
America/Santiago
America/Santo_Domingo
America/Sao_Paulo
America/Scoresbysund
America/Shiprock
America/Sitka
America/St_Barthelemy
America/St_Johns
America/St_Kitts
America/St_Lucia
America/St_Thomas
America/St_Vincent
America/Swift_Current
America/Tegucigalpa
America/Thule
America/Thunder_Bay
America/Tijuana
America/Toronto
America/Tortola
America/Vancouver
America/Virgin
America/Whitehorse
America/Winnipeg
America/Yakutat
America/Yellowknife
Antarctica/Casey
Antarctica/Davis
Antarctica/DumontDUrville
Antarctica/Macquarie
Antarctica/Mawson
Antarctica/McMurdo
Antarctica/Palmer
Antarctica/Rothera
Antarctica/South_Pole
Antarctica/Syowa
Antarctica/Troll
Antarctica/Vostok
Arctic/Longyearbyen
Asia/Aden
Asia/Almaty
Asia/Amman
Asia/Anadyr
Asia/Aqtau
Asia/Aqtobe
Asia/Ashgabat
Asia/Ashkhabad
Asia/Atyrau
Asia/Baghdad
Asia/Bahrain
Asia/Baku
Asia/Bangkok
Asia/Barnaul
Asia/Beirut
Asia/Bishkek
Asia/Brunei
Asia/Calcutta
Asia/Chita
Asia/Choibalsan
Asia/Chongqing
Asia/Chungking
Asia/Colombo
Asia/Dacca
Asia/Damascus
Asia/Dhaka
Asia/Dili
Asia/Dubai
Asia/Dushanbe
Asia/Gaza
Asia/Harbin
Asia/Hebron
Asia/Ho_Chi_Minh
Asia/Hong_Kong
Asia/Hovd
Asia/Irkutsk
Asia/Istanbul
Asia/Jakarta
Asia/Jayapura
Asia/Jerusalem
Asia/Kabul
Asia/Kamchatka
Asia/Karachi
Asia/Kashgar
Asia/Kathmandu
Asia/Katmandu
Asia/Khandyga
Asia/Kolkata
Asia/Krasnoyarsk
Asia/Kuala_Lumpur
Asia/Kuching
Asia/Kuwait
Asia/Macao
Asia/Macau
Asia/Magadan
Asia/Makassar
Asia/Manila
Asia/Muscat
Asia/Nicosia
Asia/Novokuznetsk
Asia/Novosibirsk
Asia/Omsk
Asia/Oral
Asia/Phnom_Penh
Asia/Pontianak
Asia/Pyongyang
Asia/Qatar
Asia/Qyzylorda
Asia/Rangoon
Asia/Riyadh
Asia/Saigon
Asia/Sakhalin
Asia/Samarkand
Asia/Seoul
Asia/Shanghai
Asia/Singapore
Asia/Srednekolymsk
Asia/Taipei
Asia/Tashkent
Asia/Tbilisi
Asia/Tehran
Asia/Tel_Aviv
Asia/Thimbu
Asia/Thimphu
Asia/Tokyo
Asia/Tomsk
Asia/Ujung_Pandang
Asia/Ulaanbaatar
Asia/Ulan_Bator
Asia/Urumqi
Asia/Ust-Nera
Asia/Vientiane
Asia/Vladivostok
Asia/Yakutsk
Asia/Yangon
Asia/Yekaterinburg
Asia/Yerevan
Atlantic/Azores
Atlantic/Bermuda
Atlantic/Canary
Atlantic/Cape_Verde
Atlantic/Faeroe
Atlantic/Faroe
Atlantic/Jan_Mayen
Atlantic/Madeira
Atlantic/Reykjavik
Atlantic/South_Georgia
Atlantic/St_Helena
Atlantic/Stanley
Australia/ACT
Australia/Adelaide
Australia/Brisbane
Australia/Broken_Hill
Australia/Canberra
Australia/Currie
Australia/Darwin
Australia/Eucla
Australia/Hobart
Australia/LHI
Australia/Lindeman
Australia/Lord_Howe
Australia/Melbourne
Australia/NSW
Australia/North
Australia/Perth
Australia/Queensland
Australia/South
Australia/Sydney
Australia/Tasmania
Australia/Victoria
Australia/West
Australia/Yancowinna
Brazil/Acre
Brazil/DeNoronha
Brazil/East
Brazil/West
CET
CST6CDT
Canada/Atlantic
Canada/Central
Canada/Eastern
Canada/Mountain
Canada/Newfoundland
Canada/Pacific
Canada/Saskatchewan
Canada/Yukon
Chile/Continental
Chile/EasterIsland
Cuba
EET
EST5EDT
Egypt
Eire
Europe/Amsterdam
Europe/Andorra
Europe/Astrakhan
Europe/Athens
Europe/Belfast
Europe/Belgrade
Europe/Berlin
Europe/Bratislava
Europe/Brussels
Europe/Bucharest
Europe/Budapest
Europe/Busingen
Europe/Chisinau
Europe/Copenhagen
Europe/Dublin
Europe/Gibraltar
Europe/Guernsey
Europe/Helsinki
Europe/Isle_of_Man
Europe/Istanbul
Europe/Jersey
Europe/Kaliningrad
Europe/Kiev
Europe/Kirov
Europe/Lisbon
Europe/Ljubljana
Europe/London
Europe/Luxembourg
Europe/Madrid
Europe/Malta
Europe/Mariehamn
Europe/Minsk
Europe/Monaco
Europe/Moscow
Europe/Nicosia
Europe/Oslo
Europe/Paris
Europe/Podgorica
Europe/Prague
Europe/Riga
Europe/Rome
Europe/Samara
Europe/San_Marino
Europe/Sarajevo
Europe/Simferopol
Europe/Skopje
Europe/Sofia
Europe/Stockholm
Europe/Tallinn
Europe/Tirane
Europe/Tiraspol
Europe/Ulyanovsk
Europe/Uzhgorod
Europe/Vaduz
Europe/Vatican
Europe/Vienna
Europe/Vilnius
Europe/Volgograd
Europe/Warsaw
Europe/Zagreb
Europe/Zaporozhye
Europe/Zurich
GB
GB-Eire
Hongkong
Iceland
Indian/Antananarivo
Indian/Chagos
Indian/Christmas
Indian/Cocos
Indian/Comoro
Indian/Kerguelen
Indian/Mahe
Indian/Maldives
Indian/Mauritius
Indian/Mayotte
Indian/Reunion
Iran
Israel
Jamaica
Japan
Kwajalein
Libya
MET
MST7MDT
Mexico/BajaNorte
Mexico/BajaSur
Mexico/General
NZ
NZ-CHAT
Navajo
PRC
PST8PDT
Pacific/Apia
Pacific/Auckland
Pacific/Bougainville
Pacific/Chatham
Pacific/Chuuk
Pacific/Easter
Pacific/Efate
Pacific/Enderbury
Pacific/Fakaofo
Pacific/Fiji
Pacific/Funafuti
Pacific/Galapagos
Pacific/Gambier
Pacific/Guadalcanal
Pacific/Guam
Pacific/Honolulu
Pacific/Johnston
Pacific/Kiritimati
Pacific/Kosrae
Pacific/Kwajalein
Pacific/Majuro
Pacific/Marquesas
Pacific/Midway
Pacific/Nauru
Pacific/Niue
Pacific/Norfolk
Pacific/Noumea
Pacific/Pago_Pago
Pacific/Palau
Pacific/Pitcairn
Pacific/Pohnpei
Pacific/Ponape
Pacific/Port_Moresby
Pacific/Rarotonga
Pacific/Saipan
Pacific/Samoa
Pacific/Tahiti
Pacific/Tarawa
Pacific/Tongatapu
Pacific/Truk
Pacific/Wake
Pacific/Wallis
Pacific/Yap
Poland
Portugal
ROK
Singapore
Turkey
US/Alaska
US/Aleutian
US/Arizona
US/Central
US/East-Indiana
US/Eastern
US/Hawaii
US/Indiana-Starke
US/Michigan
US/Mountain
US/Pacific
US/Pacific-New
US/Samoa
W-SU
WET
```

# DDL 陳述式
<a name="ddl-reference"></a>

直接在 Athena 中使用此處顯示的支援的資料定義語言 (DDL) 陳述式。Athena 查詢引擎部分以 [HiveQL DDL](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL) 為基礎。Athena 不支援所有 DDL 陳述式，而且 HiveQL DDL 和 Athena DDL 之間有一些差異。如需詳細資訊，請參閱本節中的參考主題和[不支援的 DDL](unsupported-ddl.md)。

**Topics**
+ [不支援的 DDL](unsupported-ddl.md)
+ [ALTER DATABASE SET DBPROPERTIES](alter-database-set-dbproperties.md)
+ [ALTER TABLE ADD COLUMNS](alter-table-add-columns.md)
+ [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)
+ [ALTER TABLE CHANGE COLUMN](alter-table-change-column.md)
+ [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)
+ [ALTER TABLE RENAME PARTITION](alter-table-rename-partition.md)
+ [ALTER TABLE REPLACE COLUMNS](alter-table-replace-columns.md)
+ [ALTER TABLE SET LOCATION](alter-table-set-location.md)
+ [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md)
+ [變更檢視方言](alter-view-dialect.md)
+ [CREATE DATABASE](create-database.md)
+ [CREATE TABLE](create-table.md)
+ [CREATE TABLE AS](create-table-as.md)
+ [CREATE VIEW](create-view.md)
+ [DESCRIBE](describe-table.md)
+ [DESCRIBE VIEW](describe-view.md)
+ [DROP DATABASE](drop-database.md)
+ [DROP TABLE](drop-table.md)
+ [DROP VIEW](drop-view.md)
+ [MSCK REPAIR TABLE](msck-repair-table.md)
+ [SHOW COLUMNS](show-columns.md)
+ [SHOW CREATE TABLE](show-create-table.md)
+ [SHOW CREATE VIEW](show-create-view.md)
+ [SHOW DATABASES](show-databases.md)
+ [SHOW PARTITIONS](show-partitions.md)
+ [SHOW TABLES](show-tables.md)
+ [SHOW TBLPROPERTIES](show-tblproperties.md)
+ [SHOW VIEWS](show-views.md)

# 不支援的 DDL
<a name="unsupported-ddl"></a>

Athena SQL 不支援下列 DDL 陳述式。如需 Athena 中 Iceberg 資料表支援的 DDL 陳述式，請參閱 [演進 Iceberg 資料表結構描述](querying-iceberg-evolving-table-schema.md) 和 [在 Iceberg 資料表上執行其他 DDL 操作](querying-iceberg-additional-operations.md)。
+ ALTER INDEX
+ ALTER TABLE *table\$1name* ARCHIVE PARTITION
+ ALTER TABLE *table\$1name* CLUSTERED BY
+ ALTER TABLE *table\$1name* DROP COLUMN (支援 Iceberg 資料表)
+ ALTER TABLE *table\$1name* EXCHANGE PARTITION
+ ALTER TABLE *table\$1name* CLUSTERED BY
+ ALTER TABLE *table\$1name* NOT SKEWED
+ ALTER TABLE *table\$1name* NOT SORTED
+ ALTER TABLE *table\$1name* NOT STORED AS DIRECTORIES
+ ALTER TABLE *table\$1name* partitionSpec CHANGE COLUMNS
+ ALTER TABLE *table\$1name* partitionSpec COMPACT
+ ALTER TABLE *table\$1name* partitionSpec CONCATENATE
+ ALTER TABLE *table\$1name* partitionSpec SET FILEFORMAT
+ ALTER TABLE *table\$1name* RENAME TO (支援 Iceberg 資料表)
+ ALTER TABLE*table\$1name*設定服務器屬性
+ ALTER TABLE *table\$1name* SET SKEWED LOCATION
+ ALTER TABLE *table\$1name* SKEWED BY
+ ALTER TABLE *table\$1name* TOUCH
+ ALTER TABLE *table\$1name* UNARCHIVE PARTITION
+ COMMIT
+ CREATE INDEX
+ CREATE ROLE
+ CREATE TABLE *table\$1name* LIKE *existing\$1table\$1name* 
+ CREATE TEMPORARY MACRO
+ DELETE FROM
+ DESCRIBE DATABASE
+ DFS
+ DROP INDEX
+ DROP ROLE
+ DROP TEMPORARY MACRO
+ EXPORT TABLE
+ GRANT ROLE
+ IMPORT TABLE
+ LOCK DATABASE
+ LOCK TABLE
+ REVOKE ROLE
+ ROLLBACK
+ SHOW COMPACTIONS
+ SHOW CURRENT ROLES
+ SHOW GRANT
+ SHOW INDEXES
+ SHOW LOCKS
+ SHOW PRINCIPALS
+ SHOW ROLE GRANT
+ SHOW ROLES
+ SHOW STATS
+ SHOW TRANSACTIONS
+ START TRANSACTION
+ UNLOCK DATABASE
+ UNLOCK TABLE

# ALTER DATABASE SET DBPROPERTIES
<a name="alter-database-set-dbproperties"></a>

為資料庫建立一或多個屬性。`DATABASE` 和 `SCHEMA` 可互換使用，兩者的意義相同。

## 概要
<a name="synopsis"></a>

```
ALTER {DATABASE|SCHEMA} database_name
  SET DBPROPERTIES ('property_name'='property_value' [, ...] )
```

## Parameters
<a name="parameters"></a>

**SET DBPROPERTIES ('property\$1name'='property\$1value' [, ...]**  
指定名為 `property_name` 之資料庫的一或多個屬性，並以 `property_value` 分別為每個屬性建立值。如果 `property_name` 已存在，`property_value` 會覆寫舊值。

## 範例
<a name="examples"></a>

```
ALTER DATABASE jd_datasets
  SET DBPROPERTIES ('creator'='John Doe', 'department'='applied mathematics');
```

```
ALTER SCHEMA jd_datasets
  SET DBPROPERTIES ('creator'='Jane Doe');
```

# ALTER TABLE ADD COLUMNS
<a name="alter-table-add-columns"></a>

將一個或多個資料欄新增至現有資料表中。使用選用的 `PARTITION` 語法時，會更新分割區中繼資料。

## 概要
<a name="synopsis"></a>

```
ALTER TABLE table_name 
  [PARTITION 
   (partition_col1_name = partition_col1_value
   [,partition_col2_name = partition_col2_value][,...])]
  ADD COLUMNS (col_name data_type)
```

## Parameters
<a name="parameters"></a>

**PARTITION (partition\$1col\$1name = partition\$1col\$1value [,...])**  
使用您指定的資料欄名稱/值組合來建立分割區。只有當資料欄的資料類型為字串時，才需要用引號括住 `partition_col_value`。

**ADD COLUMNS (col\$1name data\$1type [,col\$1name data\$1type,...])**  
將資料行新增在現有資料欄之後，但在分割區資料欄之前。

## 範例
<a name="examples"></a>

```
ALTER TABLE events ADD COLUMNS (eventowner string)
```

```
ALTER TABLE events PARTITION (awsregion='us-west-2') ADD COLUMNS (event string)
```

```
ALTER TABLE events PARTITION (awsregion='us-west-2') ADD COLUMNS (eventdescription string)
```

## 備註
<a name="alter-table-add-columns-notes"></a>
+ 若要於執行 `ALTER TABLE ADD COLUMNS` 之後在 Athena 查詢編輯器導覽窗格中查看新資料表資料欄，請手動重新整理編輯器中的資料表清單，然後再次展開資料表。
+ `ALTER TABLE ADD COLUMNS` 不適用於具有 `date` 資料類型的資料欄。若要解決這個問題，請轉為使用 `timestamp` 資料類型。

# ALTER TABLE ADD PARTITION
<a name="alter-table-add-partition"></a>

為資料表建立一或多個分割區欄。每個分割區由一或多個不同的欄名稱/值組合組成。每種指定的組合都會另外建立一個資料目錄，這樣可在某些情況下改善查詢效能。分割區的欄本身不存在於資料表的資料中，因此，如果您使用的分割區欄名稱和資料表中的欄名稱相同，就會發生錯誤。如需詳細資訊，請參閱[分割您的資料](partitions.md)。

在 Athena 中，資料表及其分割區必須使用相同的資料格式，但其結構描述可能不同。如需詳細資訊，請參閱[更新含有分割區的資料表](updates-and-partitions.md)。

如需有關 IAM 政策中所需資源層級許可的資訊 (包括 `glue:CreatePartition`)，請參閱《[AWS Glue API 許可：動作和資源參考](https://docs.aws.amazon.com/glue/latest/dg/api-permissions-reference.html)》以及 [在 中設定資料庫和資料表的存取權 AWS Glue Data Catalog](fine-grained-access-to-glue-resources.md)。如需有關使用 Athena 時許可的疑難排解資訊，請參閱 [對 Athena 中的問題進行疑難排解](troubleshooting-athena.md) 主題的 [許可](troubleshooting-athena.md#troubleshooting-athena-permissions) 章節。

## 概要
<a name="synopsis"></a>

```
ALTER TABLE table_name ADD [IF NOT EXISTS]
  PARTITION
  (partition_col1_name = partition_col1_value
  [,partition_col2_name = partition_col2_value]
  [,...])
  [LOCATION 'location1']
  [PARTITION
  (partition_colA_name = partition_colA_value
  [,partition_colB_name = partition_colB_value
  [,...])]
  [LOCATION 'location2']
  [,...]
```

## Parameters
<a name="parameters"></a>

當新增分割區時，您可以為分割區指定一或多個資料欄名稱/值組，以及該分割區的資料檔案所在的 Simple Storage Service (Amazon S3) 路徑。

**[IF NOT EXISTS]**  
如果已有相同定義的分割區，則會造成錯誤隱藏。

**PARTITION (partition\$1col\$1name = partition\$1col\$1value [,...])**  
使用您指定的資料欄名稱/值組合來建立分割區。只有當欄的資料類型是字串時，才需要以字串字元圍住 `partition_col_value`。

**[LOCATION 'location']**  
指定目錄，將在其中存放先前陳述式定義的分割區。當資料使用 Hive 樣式分割 (`pk1=v1/pk2=v2/pk3=v3`) 時，`LOCATION` 子句為選用的。使用 Hive 樣式分割時，會從資料表的位置、分割區索引鍵名稱和分割區索引鍵值自動建構完整的 Amazon S3 URI。如需詳細資訊，請參閱[分割您的資料](partitions.md)。

## 考量事項
<a name="alter-table-add-partition-considerations"></a>

對您可以在單一 `ALTER TABLE ADD PARTITION` DDL 陳述式中新增的分割區數量，Amazon Athena 不會施加特定限制。不過，如果您需要新增大量分割區，請考慮將操作分成較小的批次，以避免潛在的效能問題。下列範例使用連續命令來個別新增分割區，並使用 `IF NOT EXISTS` 來避免新增重複項目。

```
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-01')
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-02')
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-03')
```

 在 Athena 中使用分割區時，也請謹記以下幾點：
+ 雖然 Athena 支援查詢具有 1，000 萬個分割區的 AWS Glue 資料表，但 Athena 無法在單一掃描中讀取超過 100 萬個分割區。
+ 若要最佳化查詢並減少掃描的分割區數量，請考慮分割區剔除或使用分割區索引等策略。

如需有關在 Athena 中使用分割區的其他考量事項，請參閱 [分割您的資料](partitions.md)。

## 範例
<a name="examples"></a>

下列範例會將單一分割區新增至資料表，以取得 HIVE 樣式分割資料。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-14', country = 'IN');
```

下列範例會將多個分割區新增至資料表，以取得 HIVE 樣式分割資料。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-31', country = 'IN')
  PARTITION (dt = '2016-06-01', country = 'IN');
```

如果資料表不適用於 HIVE 樣式的分割資料，則 `LOCATION` 子句是必需的，且應該是包含分割區資料之字首的完整 Amazon S3 URI。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-31', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_31_May_2016/'
  PARTITION (dt = '2016-06-01', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_01_June_2016/';
```

若要在分割區已存在時忽略錯誤，請使用 `IF NOT EXISTS` 子句，如下列範例所示。

```
ALTER TABLE orders ADD IF NOT EXISTS
  PARTITION (dt = '2016-05-14', country = 'IN');
```

## 零位元組 `_$folder$` 檔案
<a name="alter-table-add-partition-zero-byte-folder-files"></a>

如果您執行 `ALTER TABLE ADD PARTITION` 語句並錯誤地指定已存在的分區和不正確的 Simple Storage Service (Amazon S3) 位置，則格式為 `partition_value_$folder$` 的零位元組預留位置檔案會在 Simple Storage Service (Amazon S3) 中建立。您必須手動移除這些檔案。

若要防止這種情況發生，請使用 `ALTER TABLE ADD PARTITION` 陳述式中的 `ADD IF NOT EXISTS` 語法，如下列範例所示。

```
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION […]
```

# ALTER TABLE CHANGE COLUMN
<a name="alter-table-change-column"></a>

變更資料表中資料欄的名稱、類型、順序或註解。

## 概要
<a name="alter-table-change-column-synopsis"></a>

```
ALTER TABLE [db_name.]table_name
  CHANGE [COLUMN] col_old_name col_new_name column_type 
  [COMMENT col_comment] [FIRST|AFTER column_name]
```

## 範例
<a name="alter-table-change-column-example"></a>

下列範例會將資料欄名稱 `area` 變更為 `zip`，使資料類型轉換為整數，並將重新命名的資料欄放置在 `id` 資料欄之後。

```
ALTER TABLE example_table CHANGE COLUMN area zip int AFTER id
```

下列範例會將註解新增至 `example_table` 的中繼資料中的 `zip` 資料欄。若要查看註解，請使用 AWS CLI [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/get-table-metadata.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/get-table-metadata.html) 命令或瀏覽 AWS Glue 主控台中資料表的結構描述。

```
ALTER TABLE example_table CHANGE COLUMN zip zip int COMMENT 'USA zipcode'
```

# ALTER TABLE DROP PARTITION
<a name="alter-table-drop-partition"></a>

捨棄指定資料表的一或多個指定分割區。

## 概要
<a name="synopsis"></a>

```
ALTER TABLE table_name DROP [IF EXISTS] PARTITION (partition_spec) [, PARTITION (partition_spec)]
```

## Parameters
<a name="alter-table-drop-partition-parameters"></a>

**[IF EXISTS]**  
如果指定的分割區不存在，會造成錯誤訊息隱藏。

**PARTITION (partition\$1spec)**  
每個 `partition_spec` 會以 `partition_col_name = partition_col_value [,...]` 的形式指定一個資料欄名稱/值組合。

## 範例
<a name="alter-table-drop-partition-examples"></a>

```
ALTER TABLE orders 
DROP PARTITION (dt = '2014-05-14', country = 'IN');
```

```
ALTER TABLE orders 
DROP PARTITION (dt = '2014-05-14', country = 'IN'), PARTITION (dt = '2014-05-15', country = 'IN');
```

## 備註
<a name="alter-table-drop-partition-notes"></a>

`ALTER TABLE DROP PARTITION` 陳述式不會提供單一語法來一次捨棄所有分割區，或支援篩選條件來指定要捨棄的分割區範圍。

作為解決方法，您可以在指令碼中使用 AWS Glue API [GetPartitions](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-partitions.html#aws-glue-api-catalog-partitions-GetPartitions) 和 [BatchDeletePartition](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-partitions.html#aws-glue-api-catalog-partitions-BatchDeletePartition) 動作。`GetPartitions` 動作支援類似於 SQL `WHERE` 表達式中的複雜篩選條件表達式。使用 `GetPartitions` 建立要刪除的分割區篩選清單後，您可以使用 `BatchDeletePartition` 動作以刪除以 25 為單位批次的分割區。

# ALTER TABLE RENAME PARTITION
<a name="alter-table-rename-partition"></a>

重新命名分割區值。

**注意**  
ALTER TABLE RENAME PARTITION 不會重新命名分割區資料欄。若要變更分割區資料欄名稱，您可以使用 AWS Glue 主控台。如需詳細資訊，請參閱本文件稍後的[在 中重新命名分割區資料欄 AWS Glue](#alter-table-rename-partition-column-name)。

## 概要
<a name="synopsis"></a>

對於名為 `table_name` 的資料表，將 `partition_spec` 指定的分割區值重新命名為 `new_partition_spec` 指定的值。

```
ALTER TABLE table_name PARTITION (partition_spec) RENAME TO PARTITION (new_partition_spec)
```

## Parameters
<a name="parameters"></a>

**PARTITION (partition\$1spec)**  
每個 `partition_spec` 會以 `partition_col_name = partition_col_value [,...]` 的形式指定一個資料欄名稱/值組合。

## 範例
<a name="examples"></a>

```
ALTER TABLE orders 
PARTITION (dt = '2014-05-14', country = 'IN') RENAME TO PARTITION (dt = '2014-05-15', country = 'IN');
```

## 在 中重新命名分割區資料欄 AWS Glue
<a name="alter-table-rename-partition-column-name"></a>

使用下列程序，在 AWS Glue 主控台中重新命名分割區資料欄名稱。

**在 AWS Glue 主控台中重新命名資料表分割區欄**

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

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

1. 在**資料表**頁面上，使用**篩選資料表**搜尋方塊，尋找您要變更的資料表。

1. 在**名稱**資料欄中，選擇您要變更的資料表的連結。

1. 在資料表的詳細資訊頁面，於**結構描述**區段中，執行下列其中一項動作：
   + 若要以 JSON 格式變更名稱，請選擇**以 JSON 格式編輯結構**。
   + 若要直接變更名稱，請選擇**編輯結構描述**。此程序選擇**編輯結構描述**。

1. 選取您要重新命名的分割資料欄的核取方塊，然後選擇**編輯**。

1. 在**編輯結構描述項目**對話方塊中，針對**名稱**，輸入分割區資料欄的新名稱。

1. 選擇**另存為新的資料表版本**。此動作會更新分割區資料欄名稱，並保留結構描述演變歷史記錄，而不會建立資料的單獨實體副本。

1. 若要比較資料表版本，請在資料表的詳細資訊頁面上，選擇**動作**，然後選擇**比較版本**。

## 其他資源
<a name="alter-table-rename-partition-additional-resources"></a>

 如需有關分割區的詳細資訊，請參閱 [分割您的資料](partitions.md)。

# ALTER TABLE REPLACE COLUMNS
<a name="alter-table-replace-columns"></a>

從透過 [LazySimpleSerDe](lazy-simple-serde.md) 建立的資料表中移除所有現有的資料欄，並用指定的一組資料欄取代它們。使用選用的 `PARTITION` 語法時，會更新分割區中繼資料。您也可以使用 `ALTER TABLE REPLACE COLUMNS` 透過僅指定您想要保留的資料欄來刪除其他資料欄。

## 概要
<a name="synopsis"></a>

```
ALTER TABLE table_name 
  [PARTITION 
   (partition_col1_name = partition_col1_value
   [,partition_col2_name = partition_col2_value][,...])]
  REPLACE COLUMNS (col_name data_type [, col_name data_type, ...])
```

## Parameters
<a name="parameters"></a>

**PARTITION (partition\$1col\$1name = partition\$1col\$1value [,...])**  
以您指定的資料欄名稱/值組合來指定分割區。只有當資料欄的資料類型為字串時，才需要用引號括住 `partition_col_value`。

**REPLACE COLUMNS (col\$1name data\$1type [,col\$1name data\$1type,...])**  
以指定的資料欄名稱和資料類型取代現有資料欄。

## 備註
<a name="alter-table-replace-columns-notes"></a>
+ 如需在執行 `ALTER TABLE REPLACE COLUMNS` 之後，查看 Athena 查詢編輯器導覽窗格中的資料表資料表欄位變更，請手動重新整理編輯器中的資料表清單，然後再次展開資料表。
+ `ALTER TABLE REPLACE COLUMNS` 不適用於具有 `date` 資料類型的資料欄。若要解決這個問題，請轉為使用資料表中的 `timestamp` 資料類型。
+ 請注意，即使您只取代單一資料欄，語法必須是 `ALTER TABLE table-name REPLACE COLUMNS`，以及複數形式的*資料欄*。您不僅必須指定要取代的資料欄，還必須指定要保留的資料欄 – 如果不是，您未指定的資料欄將會遭到捨棄。這種語法和行為從 Apache Hive DDL 衍生。如需參考，請參閱 Apache 文件中的[新增/取代資料欄](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Add/ReplaceColumns)。

## 範例
<a name="alter-table-replace-columns-example"></a>

在下列範例中，資料表 `names_cities` 是使用 [LazySimpleSerDe](lazy-simple-serde.md) 所建立的，並有三個名為 `col1`、`col2` 和 `col3` 的資料欄。所有資料欄均為 `string` 類型。若要顯示資料表中的資料欄，下列命令會使用 [SHOW COLUMNS](show-columns.md) 陳述式。

```
SHOW COLUMNS IN names_cities
```

查詢的結果：

```
col1
col2
col3
```

下列 `ALTER TABLE REPLACE COLUMNS` 命令將資料欄名稱取代為 `first_name`、`last_name` 和 `city`。基礎來源資料不受影響。

```
ALTER TABLE names_cities
REPLACE COLUMNS (first_name string, last_name string, city string)
```

若要測試結果，請重新執行 `SHOW COLUMNS`。

```
SHOW COLUMNS IN names_cities
```

查詢的結果：

```
first_name
last_name
city
```

顯示新資料欄名稱的另一種方法是在 Athena 查詢編輯器中[預覽資料表](creating-tables-showing-table-information.md)，或執行您自己的 `SELECT` 查詢。

# ALTER TABLE SET LOCATION
<a name="alter-table-set-location"></a>

變更名為 `table_name` 之資料表的位置，以及 (選擇性) 含 `partition_spec` 的分割區。

## 概要
<a name="synopsis"></a>

```
ALTER TABLE table_name [ PARTITION (partition_spec) ] SET LOCATION 'new location'
```

## Parameters
<a name="alter-table-set-location-parameters"></a>

**PARTITION (partition\$1spec)**  
以 `partition_spec` 參數指定您想要變更位置的分割區。`partition_spec` 以 `partition_col_name = partition_col_value` 的形式指定一個欄名稱/值組合。

**SET LOCATION 'new location'**  
指定新的位置，其必須是 Amazon S3 位置。如需有關語法的資訊，請參閱 [Amazon S3 中的資料表位置](tables-location-format.md)。

## 範例
<a name="alter-table-set-location-examples"></a>

```
ALTER TABLE customers PARTITION (zip='98040', state='WA') SET LOCATION 's3://amzn-s3-demo-bucket/custdata/';
```

# ALTER TABLE SET TBLPROPERTIES
<a name="alter-table-set-tblproperties"></a>

將自訂或預定義的中繼資料屬性新增到資料表中，並設定他們的指派值。若要查看資料表中的屬性，請使用 [SHOW TBLPROPERTIES](show-tblproperties.md) 命令。

由於不支援 Apache Hive [受管資料表](https://cwiki.apache.org/confluence/display/Hive/Managed+vs.+External+Tables)，設定 `'EXTERNAL'='FALSE'` 不會有任何作用。

## 概要
<a name="synopsis"></a>

```
ALTER TABLE table_name SET TBLPROPERTIES ('property_name' = 'property_value' [ , ... ])
```

## Parameters
<a name="parameters"></a>

**SET TBLPROPERTIES ('property\$1name' = 'property\$1value' [ , ... ])**  
指定以 `property_name` 新增的中繼資料屬性，以及以 `property value` 新增的個別值。如果 `property_name` 已存在，它的值會設定為新指定的 `property_value`。  
下列預先定義的資料表屬性有特殊用途。    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/alter-table-set-tblproperties.html)

## 範例
<a name="examples"></a>

下列範例會將註解附註新增至資料表屬性。

```
ALTER TABLE orders 
SET TBLPROPERTIES ('notes'="Please don't drop this table.");
```

下列範例會修改資料表 `existing_table`，以使用具有 ZSTD 壓縮和 ZSTD 壓縮級別 4 的 Parquet 檔案格式。

```
ALTER TABLE existing_table 
SET TBLPROPERTIES ('parquet.compression' = 'ZSTD', 'compression_level' = 4)
```

# 變更檢視方言
<a name="alter-view-dialect"></a>

從 AWS Glue Data Catalog 檢視新增或捨棄引擎方言。僅適用於 AWS Glue Data Catalog 檢視。需要 `Lake Formation` 管理員或定義程式許可。

如需 AWS Glue Data Catalog 檢視的詳細資訊，請參閱 [在 Athena 中使用 Data Catalog 檢視](views-glue.md)。

## 語法
<a name="alter-view-dialect-syntax"></a>

```
ALTER VIEW name [ FORCE ] [ ADD|UPDATE ] DIALECT AS query
```

```
ALTER VIEW name [ DROP ] DIALECT
```

**FORCE**  
`FORCE` 關鍵字會導致檢視中的衝突性引擎方言資訊被新的定義覆寫。當 Data Catalog 檢視更新導致現有引擎方言具有衝突性檢視定義時，`FORCE` 關鍵字非常有用。假設 Data Catalog 檢視同時具有 Athena 和 Amazon Redshift 方言，而且更新會導致檢視定義中與 Amazon Redshift 方言發生衝突。在此情況下，您可使用 `FORCE` 關鍵字允許更新完成，並將 Amazon Redshift 方言標記為過時。當引擎標記為過時查詢檢視時，查詢會失敗。引擎擲回例外狀況，以禁止過時的結果。若要更正此問題，請更新檢視中過時的方言。

**ADD**  
將新引擎方言新增至 Data Catalog 檢視。指定的引擎不得存在於 Data Catalog 檢視中。

**UPDATE**  
更新 Data Catalog 檢視中已存在的引擎方言。

**DROP**  
從 Data Catalog 檢視中捨棄現有的引擎方言。從 Data Catalog 檢視中捨棄引擎後，捨棄的引擎無法查詢 Data Catalog 檢視。檢視中的其他引擎方言仍可查詢檢視。

**DIALECT AS**  
引入引擎特定的 SQL 查詢。

## 範例
<a name="alter-view-dialect-syntax-examples"></a>

```
ALTER VIEW orders_by_date FORCE ADD DIALECT 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
GROUP BY orderdate
```

```
ALTER VIEW orders_by_date FORCE UPDATE DIALECT 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
GROUP BY orderdate
```

```
ALTER VIEW orders_by_date DROP DIALECT
```

# CREATE DATABASE
<a name="create-database"></a>

建立資料庫。`DATABASE` 和 `SCHEMA` 可互換使用。它們的意義相同。

**注意**  
如需在 Athena 建立資料庫、建立資料表和執行資料表 `SELECT` 查詢的範例，請參閱 [開始使用](getting-started.md)。

## 概要
<a name="synopsis"></a>

```
CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] database_name
  [COMMENT 'database_comment']
  [LOCATION 'S3_loc']
  [WITH DBPROPERTIES ('property_name' = 'property_value') [, ...]]
```

有關 Athena 中資料庫名稱的限制，請參閱 [為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)。

## Parameters
<a name="parameters"></a>

**[IF NOT EXISTS]**  
如果名為 `database_name` 的資料表已存在，會造成錯誤隱藏。

**[COMMENT database\$1comment]**  
為名為 `comment` 的內建中繼資料屬性以及您為 `database_comment` 提供的值，建立中繼資料值。在 中 AWS Glue，`COMMENT`內容會寫入資料庫屬性的 `Description` 欄位。

**[LOCATION S3\$1loc]**  
以 `S3_loc` 指定資料庫檔案和中繼存放區將存在的位置。此位置必須是 Amazon S3 位置。

**[WITH DBPROPERTIES ('property\$1name' = 'property\$1value') [, ...] ]**  
可讓您指定資料庫定義的自訂中繼資料屬性。

## 範例
<a name="examples"></a>

```
CREATE DATABASE clickstreams;
```

```
CREATE DATABASE IF NOT EXISTS clickstreams
  COMMENT 'Site Foo clickstream data aggregates'
  LOCATION 's3://amzn-s3-demo-bucket/clickstreams/'
  WITH DBPROPERTIES ('creator'='Jane D.', 'Dept.'='Marketing analytics');
```

## 檢視資料庫屬性
<a name="create-database-viewing-properties"></a>

若要使用 檢視您在 AWSDataCatalog 中建立之資料庫的資料庫屬性`CREATE DATABASE`，您可以使用 AWS CLI 命令 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-database.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-database.html)，如下列範例所示：

```
aws glue get-database --name <your-database-name>
```

在 JSON 輸出中，其結果看起來如下：

```
{
    "Database": {
        "Name": "<your-database-name>",
        "Description": "<your-database-comment>",
        "LocationUri": "s3://amzn-s3-demo-bucket",
        "Parameters": {
            "<your-database-property-name>": "<your-database-property-value>"
        },
        "CreateTime": 1603383451.0,
        "CreateTableDefaultPermissions": [
            {
                "Principal": {
                    "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
                },
                "Permissions": [
                    "ALL"
                ]
            }
        ]
    }
}
```

如需 的詳細資訊 AWS CLI，請參閱 [AWS Command Line Interface 使用者指南](https://docs.aws.amazon.com/cli/latest/userguide/)。

# CREATE TABLE
<a name="create-table"></a>

以您指定的名稱和參數建立資料表。

**注意**  
此頁包含摘要參考資訊。如需在 Athena 中建立資料表的詳細資訊和範例 `CREATE TABLE` 陳述式，請參閱[在 Athena 中建立資料表](creating-tables.md)。如需在 Athena 建立資料庫、建立資料表和執行資料表 `SELECT` 查詢的範例，請參閱 [開始使用](getting-started.md)。

## 概要
<a name="synopsis"></a>

```
CREATE EXTERNAL TABLE [IF NOT EXISTS]
 [db_name.]table_name [(col_name data_type [COMMENT col_comment] [, ...] )]
 [COMMENT table_comment]
 [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
 [CLUSTERED BY (col_name, col_name, ...) INTO num_buckets BUCKETS]
 [ROW FORMAT row_format]
 [STORED AS file_format] 
 [WITH SERDEPROPERTIES (...)]
 [LOCATION 's3://amzn-s3-demo-bucket/[folder]/']
 [TBLPROPERTIES ( ['has_encrypted_data'='true | false',] ['encryption_option'='SSE_S3 | SSE_KMS | CSE_KMS',] ['kms_key'='aws_kms_key_arn',] ['classification'='aws_glue_classification',] property_name=property_value [, ...] ) ]
```

## Parameters
<a name="parameters"></a>

**EXTERNAL**  
指定資料表依據您指定的 `LOCATION` 中 Amazon S3 現有的基礎資料檔案。除了在建立 [Iceberg](querying-iceberg-creating-tables.md) 資料表時，請始終使用 `EXTERNAL` 關鍵字。如果您在非 Iceberg 資料表上使用 `CREATE TABLE` 卻沒有帶 `EXTERNAL` 關鍵字，則 Athena 會發出錯誤。當您建立外部資料表，被參考的資料必須符合預設格式或您以 `ROW FORMAT`、`STORED AS` 及 `WITH SERDEPROPERTIES` 子句指定的格式。

**[IF NOT EXISTS]**  
此參數會檢查具有相同名稱的資料表是否已經存在。如果存在，參數會傳回 `TRUE`，Amazon Athena 會取消 `CREATE TABLE` 動作。由於取消會在 Athena 呼叫資料目錄之前發生，因此不會發出 AWS CloudTrail 事件。

**[db\$1name.]table\$1name**  
指定要建立的資料表名稱。選用的 `db_name` 參數可指定資料表所在的資料庫。如果省略，會採用目前的資料庫。如果資料表名稱包含號碼，以引號括住 `table_name`，例如 `"table123"`。如果 `table_name` 以底線開頭，請使用反引號，例如 ``_mytable``。不支援特殊字元 (底線除外)。  
Athena 資料表名稱不區分大小寫；不過，如果您使用 Apache Spark，則 Spark 的資料表名稱需為小寫字母。如需有關 Athena 中資料表名稱的限制，請參閱 [為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)。

**[ ( col\$1name data\$1type [COMMENT col\$1comment] [, ...] ) ]**  
指定要建立的每一欄名稱以及欄的資料類型。欄名稱不可使用底線 `(_)` 以外的特殊字元。如果 `col_name` 以底線開頭，以反引號括住欄名稱，例如 ``_mycolumn``。如需有關 Athena 中資料欄名稱的限制，請參閱 [為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)。  
`data_type` 可以是下列任何值：  
+ `boolean` – 值為 `true` 和 `false`。
+ `tinyint` – 以兩的補數格式表示的 8 位元的有號整數，最小值為 -2^7，最大值為 2^7-1。
+ `smallint` – 以兩的補數格式表示的 16 位元的有號整數，最小值為 -2^15，最大值為 2^15-1。
+ `int` – 在資料定義語言 (DDL) 查詢中，如 `CREATE TABLE`，請使用 `int` 關鍵字來表示整數。在其他查詢中，使用關鍵字 `integer`，該處為 `integer` 以兩的補數格式表示的 32 位元有號值，最小值為 -2^31，最大值為 2^31-1。在 JDBC 驅動程式中，會傳回 `integer`，以確保與商業分析應用程式的相容性。
+ `bigint` – 以兩的補數格式表示的 64 位元的有號整數，最小值為 -2^63，最大值為 2^63-1。
+ `double` – 64 位元雙精度浮點數。該範圍為 4.94065645841246544e-324d 至 1.79769313486231570e\$1308d，正極或負極。`double` 遵循浮點數運算的 IEEE 標準 (IEEE 754)。
+ `float` – 32 位元單精度浮點數。該範圍為 1.40129846432481707e-45 至 3.40282346638528860e\$138，正極或負極。`float` 遵循浮點數運算的 IEEE 標準 (IEEE 754)。等同於 Prestor 中的 `real`。在 Athena 中，請使用 DDL 陳述式中的 `float`，例如 `CREATE TABLE`，以及 SQL 函數中的 `real`，例如 `SELECT CAST`。 AWS Glue 爬蟲程式會傳回 中的值`float`，而 Athena 會在內部翻譯`real`和`float`輸入 （請參閱[2018 年 6 月 5 日](release-notes.md#release-note-2018-06-05)版本備註）。
+ `decimal [ (precision, scale) ]`，其中 `precision` 是位數的總數，`scale` (選用) 則是分數部分的位數總數，預設值為 0。例如，使用這些類型定義：`decimal(11,5)`、`decimal(15)`。最大*精確度*為 38，而最大*擴展*值為 38。

  若要指定小數值為常值，例如在查詢 DDL 表達式中以特定小數值選取列，可指定 `decimal` 類型定義，並 (在單引號中) 列出小數值為常值，如同此範例中的 `decimal_value = decimal '0.12'`。
+ `char` – 固定長度的字元資料，介於 1 到 255 的指定長度，例如 `char(10)`。如需詳細資訊，請參閱 [CHAR Hive 資料類型](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-char)。
+ `varchar` – 可變長度的字元資料，介於 1 到 65535 的指定長度，例如 `varchar(10)`。如需詳細資訊，請參閱 [VARCHAR Hive 資料類型](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-varchar)。
+ `string` – 用單引號或雙引號括住的字串文字。
**注意**  
非字串資料類型不能轉換為 Athena 中的 `string`；請改將它們轉換為 `varchar`。
+ `binary` – (用於 Parquet 的資料)
+ `date` – ISO 格式的日期，例如 `YYYY-MM-DD`。例如 `date '2008-09-15'`。一個例外是 OpenCSVSerDe，它使用自 1970 年 1 月 1 日以來經過的天數。如需詳細資訊，請參閱 [用於處理 CSV 的 Open CSV SerDe](csv-serde.md)。
+ `timestamp` – 在 [https://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html](https://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html) 相容格式下的日期和時間常數，最大解析度為毫秒，例如 `yyyy-MM-dd HH:mm:ss[.f...]`。例如 `timestamp '2008-09-15 03:04:05.324'`。一個例外是 OpenCSVSerDe，它使用 UNIX 數字格式的 `TIMESTAMP` 資料 (例如 `1579059880000`)。如需詳細資訊，請參閱[用於處理 CSV 的 Open CSV SerDe](csv-serde.md)。
+ `array` < data\$1type >
+ `map` < primitive\$1type, data\$1type >
+ `struct` < col\$1name : data\$1type [comment col\$1comment] [, ...] >

**[COMMENT table\$1comment]**  
建立 `comment` 資料表屬性，並填入您指定的 `table_comment`。

**[PARTITIONED BY (col\$1name data\$1type [ COMMENT col\$1comment ], ... ) ]**  
建立有分割區的資料表，具有包含指定的 `col_name`、`data_type`、`col_comment` 的一或多個分割區欄。資料表可以有一或多個分割區，各自由不同欄名稱和值組合而成。每種指定的組合都會另外建立一個資料目錄，這樣可在某些情況下改善查詢效能。資料表資料內並未包含分割資料欄。如果您使用的 `col_name` 值與資料表欄相同，則會發生錯誤。如需詳細資訊，請參閱[分割資料](partitions.md)。  
在您建立分割區資料表後，執行包含 [MSCK REPAIR TABLE](msck-repair-table.md) 子句的後續查詢 (例如，`MSCK REPAIR TABLE cloudfront_logs;`) 以重新整理分割區中繼資料。對於與 Hive 不相容的分割區，請使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 載入分割區，以便查詢資料。

**[CLUSTERED BY (col\$1name, col\$1name, ...) INTO num\$1buckets BUCKETS]**  
透過或不透過分割，將指定的 `col_name` 資料欄中的資料分割為稱為*儲存貯體*的資料子集。`num_buckets` 參數會指定要建立的儲存貯體數目。歸納可以改善對大型資料集的某些查詢的效能。

**[ROW FORMAT row\$1format]**  
指定資料表的列格式及其基礎來源資料 (如果適用)。在 `row_format` 可以使用 `DELIMITED` 子句來指定一個或多個分隔符號，或者，使用 `SERDE` 子句，如下所示。如果省略 `ROW FORMAT` 或指定 `ROW FORMAT DELIMITED`，會使用原生 SerDe。  
+ [DELIMITED FIELDS TERMINATED BY char [ESCAPED BY char]]
+ [DELIMITED COLLECTION ITEMS TERMINATED BY char]
+ [MAP KEYS TERMINATED BY char]
+ [LINES TERMINATED BY char]
+ [NULL DEFINED AS char]

  僅適用於 Hive 0.13 及 `TEXTFILE` 的 STORED AS 檔案格式。
 **--或--**   
+ SERDE 'serde\$1name' [WITH SERDEPROPERTIES ("property\$1name" = "property\$1value", "property\$1name" = "property\$1value" [, ...] )]

  `serde_name` 指出要使用 SerDe。`WITH SERDEPROPERTIES` 子句可讓您提供一個或多個 SerDe 允許的自訂屬性。

**[STORED AS file\$1format]**  
指定資料表中資料的檔案格式。如果省略，`TEXTFILE` 為預設值。`file_format` 的選項有：  
+ SEQUENCEFILE
+ TEXTFILE
+ RCFILE
+ ORC
+ PARQUET
+ AVRO
+ ION
+ INPUTFORMAT input\$1format\$1classname OUTPUTFORMAT output\$1format\$1classname

**[LOCATION 's3://amzn-s3-demo-bucket/[folder]/']**  
指定 Amazon S3 中基礎資料的位置，資料表根據此資料建立。位置路徑必須是儲存貯體名稱或儲存貯體和一或多個資料夾。如果您使用的是分割區，請指定分割資料的根目錄。如需資料表位置的詳細資訊，請參閱 [在 Amazon S3 中指定資料表位置](tables-location-format.md)。如需資料格式和許可的資訊，請參閱[Amazon S3 考量事項](creating-tables.md#s3-considerations)。  
為您的資料夾或儲存貯體使用尾隨斜線。請勿使用檔案名稱或 glob 字元。  
 **使用**：  
`s3://amzn-s3-demo-bucket/`  
`s3://amzn-s3-demo-bucket/folder/`  
`s3://amzn-s3-demo-bucket/folder/anotherfolder/`  
 **不要使用：**  
`s3://amzn-s3-demo-bucket`  
`s3://amzn-s3-demo-bucket/*`  
`s3://amzn-s3-demo-bucket/mydatafile.dat`

**【TBLPROPERTIES ( 【'has\$1encrypted\$1data'='true \$1 false'，】 【'encryption\$1option'='SSE\$1S3 \$1 SSE\$1KMS \$1 CSE\$1KMS'，】 【'kms\$1key'='aws\$1kms\$1key\$1arn'，】 【'classification'='classification\$1value'，】 property\$1name=property\$1value 【， ...】 ) 】**  
除了預先定義的資料表屬性 (例如 `"comment"`)，也為資料表定義指定自訂中繼資料鍵值組。  
**has\$1encrypted\$1data** – Athena 有一個內建的屬性 `has_encrypted_data`。將此屬性設定為 ，`true`表示 指定的基礎資料集`LOCATION`已加密 CSE-KMS。如果省略且工作群組的設定不會覆寫用戶端設定，則假定為 `false`。如果省略或設為 `false` 時基礎資料有加密，查詢會導致錯誤。如需詳細資訊，請參閱[靜態加密](encryption.md)。  
**encryption\$1option** – 將此屬性設定為 `SSE_S3`、 `SSE_KMS`或 `CSE_KMS`，以指出 指定的基礎資料集中使用的最高加密層級`LOCATION`。如需詳細資訊，請參閱[靜態加密](encryption.md)。  
**kms\$1key** – 將此屬性設定為用於加密和解密資料表資料檔案的 AWS KMS 金鑰 ARN。Athena 使用此金鑰來加密使用 `SSE_KMS`或 加密寫入的資料表資料檔案`CSE_KMS`，以及解密 CSE-KMS 加密的資料表資料檔案。只有在 `encryption_option` 設定為 `SSE_KMS`或 時，才需要此屬性`CSE_KMS`。如需詳細資訊，請參閱[靜態加密](encryption.md)。  
**分類** – CloudTrail 主控台中為 Athena 建立的資料表新增 `cloudtrail` 做為 `classification` 屬性的值。若要執行 ETL 任務， AWS Glue 會要求您使用 `classification` 屬性建立資料表，以將 的資料類型指定 AWS Glue 為 `csv`、`parquet`、`orc`、 `avro`或 `json`。例如 `'classification'='csv'`。如果您沒有指定此屬性，ETL 工作會失敗。之後，您可以使用 AWS Glue 主控台、API 或 CLI 來進行指定。如需詳細資訊，請參閱《 *AWS Glue 開發人員指南*》中的[建立用於 ETL 任務的資料表](schema-classifier.md)在 [AWS Glue 中編寫任務](https://docs.aws.amazon.com/glue/latest/dg/author-job.html)。  
**compression\$1level** – `compression_level` 屬性指定要使用的壓縮級別。此屬性僅適用於 ZSTD 壓縮。可能的值為 1 到 22。預設值為 3。如需詳細資訊，請參閱[使用 ZSTD 壓縮級別](compression-support-zstd-levels.md)。  
如需有關其他資料表屬性的詳細資訊，請參閱 [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md)。

## 範例
<a name="create-table-examples"></a>

下列範例 `CREATE TABLE` 陳述式會根據存放在 Amazon S3 中的製表符分隔行星資料建立資料表。

```
CREATE EXTERNAL TABLE planet_data (
  planet_name string,
  order_from_sun int,
  au_to_sun float,
  mass float,
  gravity_earth float,
  orbit_years float,
  day_length float
  )
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION 's3://amzn-s3-demo-bucket/tsv/'
```

請注意以下重點：
+ `ROW FORMAT DELIMITED` 子句指出，資料以特定字元分隔。
+ `FIELDS TERMINATED BY '\t'` 子句指定，TSV 資料中的欄位以製表符字元 ('\$1t') 分隔。
+ `STORED AS TEXTFILE` 子句指出，資料會以純文字檔案的形式存放在 Amazon S3 中。

若要查詢資料，您可以使用簡單的 `SELECT` 陳述式，如下所示：

```
SELECT * FROM planet_data
```

若要使用範例在 Athena 中建立您自己的 TSV 資料表，請將資料表和資料欄名稱取代為您自己的資料表和資料欄的名稱和資料類型，然後更新 `LOCATION` 子句以指向存放 TSV 檔案的 Amazon S3 路徑。

如需建立資料表的詳細資訊，請參閱 [在 Athena 中建立資料表](creating-tables.md)。

# CREATE TABLE AS
<a name="create-table-as"></a>

建立新的資料表並填入 [SELECT](select.md) 查詢的結果。若要建立空白資料表，請使用 [CREATE TABLE](create-table.md)。`CREATE TABLE AS` 結合使用 `CREATE TABLE` DDL 陳述式與 `SELECT` DML 陳述式，因此技術上同時包含 DDL 和 DML。請注意，雖然 `CREATE TABLE AS` 在此處與其他 DDL 陳述式一起分組，但是針對 Service Quotas 而言，Athena 中的 CTAS 查詢仍會被視為 DML。如需有關 Athena 中的 Service Quotas 的相關資訊，請參閱 [Service Quotas](service-limits.md)。

**注意**  
對於 CTAS 陳述式，預期的儲存貯體擁有者設定不適用於 Simple Storage Service (Amazon S3) 中的目的地資料表位置。預期的儲存貯體擁有者設定僅適用於您為 Athena 查詢結果指定的 Simple Storage Service (Amazon S3) 輸出位置。如需詳細資訊，請參閱[使用 Athena 主控台指定查詢結果位置](query-results-specify-location-console.md)。

如需有關超出此參考主題範圍的 `CREATE TABLE AS` 的其他資訊，請參閱 [從查詢結果建立資料表 (CTAS)](ctas.md)。

**Topics**
+ [概要](#synopsis)
+ [CTAS 資料表屬性](#ctas-table-properties)
+ [範例](#ctas-table-examples)

## 概要
<a name="synopsis"></a>

```
CREATE TABLE table_name
[ WITH ( property_name = expression [, ...] ) ]
AS query
[ WITH [ NO ] DATA ]
```

其中：

**WITH ( property\$1name = expression [, ...] )**  
CTAS 資料表選用屬性清單，其中一些是特定於資料儲存體格式。請參閱 [CTAS 資料表屬性](#ctas-table-properties)。

**query**  
用於建立新資料表的 [SELECT](select.md) 查詢。  
如果您打算以分割區建立查詢，在 `SELECT` 陳述式的欄清單最後指定分割區各欄的名稱。

**[ WITH [ NO ] DATA ]**  
如果使用 `WITH NO DATA`，新的空資料表具有的結構描述會與建立的原始資料表相同。

**注意**  
若要將資料欄標題包含在查詢結果輸出中，您可以使用簡單的 `SELECT` 查詢而不是 CTAS 查詢。您可以從查詢結果位置擷取結果，或直接使用 Athena 主控台下載結果。如需詳細資訊，請參閱[使用查詢結果和近期查詢](querying.md)。

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

Athena 中的每個 CTAS 資料表會有一個您使用 `WITH (property_name = expression [, ...] )` 指定的 CTAS 資料表選用屬性清單。如需這些參數的用法詳細資訊，請參閱 [CTAS 查詢的範例](ctas-examples.md)。

** `WITH (property_name = expression [, ...], )` **    
 `table_type = ['HIVE', 'ICEBERG']`   
選用。預設值為 `HIVE`。指定產生之資料表的資料表類型  
範例：  

```
WITH (table_type ='ICEBERG')
```  
 `external_location = [location]`   
由於 Iceberg 資料表並非外部資料表，因此此屬性不適用於 Iceberg 資料表。若要在 CTAS 陳述式中定義 Iceberg 資料表的根位置，請使用本節稍後所述的 `location` 屬性。
選用。Athena 在 Amazon S3 中儲存您的 CTAS 查詢的位置。  
範例：  

```
 WITH (external_location ='s3://amzn-s3-demo-bucket/tables/parquet_table/')
```
Athena 不會對查詢結果使用相同的路徑兩次。如果您手動指定位置，請確定您指定的 Amazon S3 位置沒有資料。Athena 絕不會嘗試刪除您的資料。如果您想要再次使用相同的位置，請手動刪除資料，否則您的 CTAS 查詢將會失敗。  
如果您執行一個在[強制執行查詢結果位置](workgroups-settings-override.md)的工作群組中指定 `external_location` 的 CTAS 查詢，則該查詢會失敗並顯示錯誤訊息。若要查看為工作群組指定的查詢結果位置，請[檢視工作群組的詳細資訊](viewing-details-workgroups.md)。  
如果您的工作群組覆寫查詢結果位置的用戶端設定，則 Athena 會在以下位置建立資料表：  

```
s3://amzn-s3-demo-bucket/tables/query-id/
```
如果您未使用 `external_location` 屬性來指定位置，且您的工作群組未覆寫用戶端設定，則 Athena 會使用查詢結果位置的[用戶端設定](query-results-specify-location-console.md)，在下列位置建立資料表：  

```
s3://amzn-s3-demo-bucket/Unsaved-or-query-name/year/month/date/tables/query-id/
```  
 `is_external = [boolean]`   
選用。指出資料表是否為外部資料表。預設值為 true。對於 Iceberg 資料表，必須將其設定為 false。  
範例：  

```
WITH (is_external = false)
```  
 `location = [location]`   
Iceberg 資料表的必要項目。指定要從查詢結果建立之 Iceberg 資料表的根位置。  
範例：  

```
WITH (location ='s3://amzn-s3-demo-bucket/tables/iceberg_table/')
```  
 `field_delimiter = [delimiter]`   
選用，專門用於文字型資料儲存格式。CSV、TSV、文字檔案中檔案的單一字元欄位分隔符號。例如 `WITH (field_delimiter = ',')`。目前，CTAS 查詢不支援多字元欄位分隔符號。如果不指定欄位分隔符號，預設會使用 `\001`。  
 `format = [storage_format]`   
CTAS 查詢結果的儲存格式，例如 `ORC`、`PARQUET`、`AVRO`、`JSON`、`ION` 或 `TEXTFILE`。對於 Iceberg 資料表，允許的格式為 `ORC`、`PARQUET` 和 `AVRO`。若省略，預設會使用 `PARQUET`。此參數名稱 `format` 必須小寫，否則您的 CTAS 查詢將會失敗。  
範例：  

```
WITH (format = 'PARQUET')
```  
 `bucketed_by = ARRAY[ column_name[,…], bucket_count = [int] ]`   
此屬性不適用於 Iceberg 資料表。對於 Iceberg 資料表，請使用含儲存貯體轉換的分割。
將歸納資料的儲存貯體陣列清單。如果省略，Athena 不會歸納此查詢中的資料。  
 `bucket_count = [int]`   
此屬性不適用於 Iceberg 資料表。對於 Iceberg 資料表，請使用含儲存貯體轉換的分割。
歸納您資料的儲存貯體數目。如果省略，Athena 不會歸納您的資料。範例：  

```
CREATE TABLE bucketed_table WITH (
  bucketed_by = ARRAY[column_name], 
  bucket_count = 30, format = 'PARQUET', 
  external_location ='s3://amzn-s3-demo-bucket/tables/parquet_table/'
) AS 
SELECT 
  * 
FROM 
  table_name
```  
 `partitioned_by = ARRAY[ col_name[,…] ]`   
此屬性不適用於 Iceberg 資料表。若要針對 Iceberg 資料表使用分割區轉換，請使用本節稍後所述的 `partitioning` 屬性。
選用。欄的陣列清單，CTAS 資料表將依此分割。請確定分割區各欄的名稱，是列 `SELECT` 陳述式中欄清單的最後一欄。  
 `partitioning = ARRAY[partition_transform, ...]`   
選用。指定要建立之 Iceberg 資料表的分割區。Iceberg 支援多種分割區轉換和分割區演變。下表總結說明了分割區轉換。    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/create-table-as.html)
範例：  

```
 WITH (partitioning = ARRAY['month(order_date)', 
                            'bucket(account_number, 10)', 
                            'country']))
```  
 `optimize_rewrite_min_data_file_size_bytes = [long]`   
選用。資料最佳化的專用組態。包括小於指定值的檔案以進行最佳化。預設為 `write_target_data_file_size_bytes` 值的 0.75 倍。此屬性僅適用於 Iceberg 資料表。如需詳細資訊，請參閱[最佳化 Iceberg 資料表](querying-iceberg-data-optimization.md)。  
範例：  

```
WITH (optimize_rewrite_min_data_file_size_bytes = 402653184)
```  
 `optimize_rewrite_max_data_file_size_bytes = [long]`   
選用。資料最佳化的專用組態。包括大於指定值的檔案以進行最佳化。預設為 `write_target_data_file_size_bytes` 值的 1.8 倍。此屬性僅適用於 Iceberg 資料表。如需詳細資訊，請參閱[最佳化 Iceberg 資料表](querying-iceberg-data-optimization.md)。  
範例：  

```
WITH (optimize_rewrite_max_data_file_size_bytes = 966367641)
```  
 `optimize_rewrite_data_file_threshold = [int]`   
選用。資料最佳化的專用組態。如果需要最佳化的資料檔案少於指定的閾值，則不會重寫這些檔案。這允許累積更多的資料檔案，從而產生更接近目標大小的檔案，並略過不必要的運算以節省成本。預設值為 5。此屬性僅適用於 Iceberg 資料表。如需詳細資訊，請參閱[最佳化 Iceberg 資料表](querying-iceberg-data-optimization.md)。  
範例：  

```
WITH (optimize_rewrite_data_file_threshold = 5)
```  
 `optimize_rewrite_delete_file_threshold = [int]`   
選用。資料最佳化的專用組態。如果與資料檔案關聯的刪除檔案少於閾值，則不會重寫資料檔案。這允許為每個資料檔案累積更多的刪除檔案，從而節省成本。預設為 2。此屬性僅適用於 Iceberg 資料表。如需詳細資訊，請參閱[最佳化 Iceberg 資料表](querying-iceberg-data-optimization.md)。  
範例：  

```
WITH (optimize_rewrite_delete_file_threshold = 2)
```  
 `vacuum_min_snapshots_to_keep = [int]`   
選用。清空特定組態。要保留之最新快照的數目下限。預設為 1。此屬性僅適用於 Iceberg 資料表。如需詳細資訊，請參閱[VACUUM](vacuum-statement.md)。  
`vacuum_min_snapshots_to_keep` 屬性需要 Athena 引擎版本 3。
範例：  

```
WITH (vacuum_min_snapshots_to_keep = 1)
```  
 `vacuum_max_snapshot_age_seconds = [long]`   
選用。清空特定組態。以秒為單位的期間，代表要保留之快照的存留期。預設為 432,000 (5 天)。此屬性僅適用於 Iceberg 資料表。如需詳細資訊，請參閱[VACUUM](vacuum-statement.md)。  
`vacuum_max_snapshot_age_seconds` 屬性需要 Athena 引擎版本 3。
範例：  

```
WITH (vacuum_max_snapshot_age_seconds = 432000)
```  
 `write_compression = [compression_format]`   
用於任何允許指定壓縮的儲存格式的壓縮類型。`compression_format` 值將指定資料寫入資料表時要使用的壓縮。您可以為 `TEXTFILE`、`JSON`、`PARQUET`，以及 `ORC` 檔案格式指定壓縮。  
例如，如果 `format` 屬性指定 `PARQUET` 作為儲存格式，則 `write_compression` 的值會指定 Parquet 的壓縮格式。在這種情況下，指定 `write_compression` 的值相當於為 `parquet_compression` 指定值。  
同樣地，如果 `format` 屬性指定 `ORC` 作為儲存格式，則 `write_compression` 的值會指定 ORC 的壓縮格式。在這種情況下，指定 `write_compression` 的值相當於為 `orc_compression` 指定值。  
無法在相同的 CTAS 查詢中指定多個壓縮格式資料表屬性。例如，您無法在相同查詢中同時指定 `write_compression` 和 `parquet_compression`。同樣適用於 `write_compression` 和 `orc_compression`。如需每種檔案格式支援之壓縮類型的詳細資訊，請參閱[在 Athena 中使用壓縮](compression-formats.md)。  
 `orc_compression = [compression_format]`   
將 `ORC` 資料寫入資料表時用於 `ORC` 檔案格式的壓縮類型。例如 `WITH (orc_compression = 'ZLIB')`。`ORC` 檔案中的區塊 (`ORC` Postscript 除外) 使用您指定的壓縮進行壓縮。若省略，`ORC` 預設使用 ZLIB 壓縮。  
為取得一致，我們建議您使用 `write_compression` 屬性，而不是 `orc_compression`。使用 `format` 屬性將儲存格式指定為 `ORC`，然後使用 `write_compression` 屬性指定 `ORC` 將使用的壓縮格式。  
 `parquet_compression = [compression_format]`   
將 Parquet 資料寫入資料表時，用於 Parquet 檔案格式的壓縮類型。例如 `WITH (parquet_compression = 'SNAPPY')`。此壓縮會套用至 Prquet 檔案中的資料欄區塊。若省略，Parquet 預設使用 GZIP 壓縮。  
為取得一致，我們建議您使用 `write_compression` 屬性，而不是 `parquet_compression`。使用 `format` 屬性將儲存格式指定為 `PARQUET`，然後使用 `write_compression` 屬性指定 `PARQUET` 將使用的壓縮格式。  
 `compression_level = [compression_level]`   
要使用的壓縮級別。此屬性僅適用於 ZSTD 壓縮。可能的值為 1 到 22。預設值為 3。如需詳細資訊，請參閱[使用 ZSTD 壓縮級別](compression-support-zstd-levels.md)。

## 範例
<a name="ctas-table-examples"></a>

如需 CTAS 查詢的範例，請參閱下列資源。
+  [CTAS 查詢的範例](ctas-examples.md) 
+  [使用 CTAS 和 INSERT INTO 以進行 ETL 和資料分析](ctas-insert-into-etl.md) 
+  [使用 CTAS 陳述式搭配 Amazon Athena 來降低成本並改善效能](https://aws.amazon.com/blogs/big-data/using-ctas-statements-with-amazon-athena-to-reduce-cost-and-improve-performance/) 
+  [使用 CTAS 和 INSERT INTO 來解決 100 個分割區限制](ctas-insert-into.md) 

# CREATE VIEW 和 CREATE PROTECTED MULTI DIALECT VIEW
<a name="create-view"></a>

檢視是可供未來查詢參考的一種邏輯資料表。檢視不會包含任何資料，而且不會寫入資料。相反地，檢視指定的查詢會在每次您透過另一個查詢參考該檢視時執行。
+ `CREATE VIEW` 會從指定的 `SELECT` 查詢建立 Athena 檢視。Athena 檢視可在 Athena 內部運作。如需有關 Athena 檢視的詳細資訊，請參閱 [使用檢視](views.md)。
+ `CREATE PROTECTED MULTI DIALECT VIEW` 在 AWS Glue Data Catalog. AWS Glue Data Catalog views 中建立 AWS Glue Data Catalog 檢視提供單一 AWS 服務 通用檢視，例如 Amazon Athena 和 Amazon Redshift。如需 AWS Glue Data Catalog 檢視的詳細資訊，請參閱 [在 Athena 中使用 Data Catalog 檢視](views-glue.md)。

## CREATE VIEW
<a name="create-view-ate"></a>

建立檢視以供 Athena 內部使用。

### 概要
<a name="synopsis"></a>

```
CREATE [ OR REPLACE ] VIEW view_name AS query
```

選用的 `OR REPLACE` 子句可讓您透過取代來更新現有的檢視。如需詳細資訊，請參閱[建立檢視](views-console.md#creating-views)。

### 範例
<a name="examples"></a>

若要從資料表 `orders` 建立檢視 `test`，請使用類似以下的查詢：

```
CREATE VIEW test AS
SELECT 
orderkey, 
orderstatus, 
totalprice / 2 AS half
FROM orders;
```

若要從資料表 `orders` 建立檢視 `orders_by_date`，請使用以下的查詢：

```
CREATE VIEW orders_by_date AS
SELECT orderdate, sum(totalprice) AS price
FROM orders
GROUP BY orderdate;
```

若要更新現有的檢視，請使用類似以下的範例：

```
CREATE OR REPLACE VIEW test AS
SELECT orderkey, orderstatus, totalprice / 4 AS quarter
FROM orders;
```

 如需有關使用 Athena 檢視的詳細資訊，請參閱 [使用檢視](views.md)。

## CREATE PROTECTED MULTI DIALECT VIEW
<a name="create-protected-multi-dialect-view"></a>

在 中建立 AWS Glue Data Catalog 檢視 AWS Glue Data Catalog。Data Catalog 檢視是一種單一檢視結構描述，可在 Athena 和其他 SQL 引擎 (例如 Amazon Redshift 和 Amazon EMR) 中運作。

### 語法
<a name="create-protected-multi-dialect-view-syntax"></a>

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW view_name 
SECURITY DEFINER 
[ SHOW VIEW JSON ]
AS query
```

**OR REPLACE**  
(選用) 透過取代來更新現有的檢視。如果檢視中存在其他引擎的 SQL 方言，則無法取代 Data Catalog 檢視。如果呼叫引擎只存取 SQL 方言，則可取代該檢視。

**受保護**  
必要的關鍵字。指定檢視受到保護，以防止資料洩漏。Data Catalog 檢視只能做為 `PROTECTED` 檢視來建立。

**多方言**  
指定檢視支援不同查詢引擎的 SQL 方言，因此這些引擎可讀取。

**安全定義程式**  
指定對此檢視有效的定義程式語意。定義程式語意意味著基礎資料表上的有效讀取許可屬於定義檢視的主體或角色，而不是執行實際讀取的主體。

**SHOW VIEW JSON**  
(選用) 傳回 Data Catalog 檢視規格的 JSON，而無需實際建立檢視。當您想要驗證檢視的 SQL 並傳回 AWS Glue 將使用的資料表中繼資料時，這個「試轉」選項非常實用。

### 範例
<a name="create-protected-multi-dialect-view-syntax-example"></a>

下列範例會根據 `orders` 資料表上的查詢，來建立 `orders_by_date` Data Catalog 檢視。

```
CREATE PROTECTED MULTI DIALECT VIEW orders_by_date 
SECURITY DEFINER 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
WHERE order_city = 'SEATTLE' 
GROUP BY orderdate
```

如需使用 AWS Glue Data Catalog 檢視的詳細資訊，請參閱 [在 Athena 中使用 Data Catalog 檢視](views-glue.md)。

# DESCRIBE
<a name="describe-table"></a>

顯示指定資料表的一個或多個資料欄，包括分割區欄位。此指令有助於檢查複雜資料欄的屬性。

## 概要
<a name="synopsis"></a>

```
DESCRIBE [EXTENDED | FORMATTED] [db_name.]table_name [PARTITION partition_spec] [col_name ( [.field_name] | [.'$elem$'] | [.'$key$'] | [.'$value$'] )]
```

**重要**  
此陳述式的語法是 `DESCRIBE table_name`，而不是 `DESCRIBE TABLE table_name`。使用後一種語法會導致錯誤訊息 FAILED: SemanticException [Error 10001]: Table not found table (失敗：SemanticException [Error 10001]：找不到資料表)。

## Parameters
<a name="parameters"></a>

**[EXTENDED \$1 FORMATTED]**  
判斷輸出的格式。省略這些參數會以表格格式顯示資料欄名稱及其對應的資料類型，包括分割區欄位。指定 `FORMATTED` 不僅以表格格式顯示資料欄名稱和資料類型，而且還顯示詳細的資料表和儲存資訊。`EXTENDED` 會以表格格式顯示資料欄和資料類型資訊，並以 Thrift 序列化格式顯示資料表的詳細中繼資料。此格式不易讀取，並且主要用於偵錯。

**[PARTITION partition\$1spec]**  
如果包含，則會列出由 `partition_spec` 指定之分割區中繼資料，其中 `partition_spec` 的格式為 `(partition_column = partition_col_value, partition_column = partition_col_value, ...)`。

**[col\$1name ( [.field\$1name] \$1 [.'\$1elem\$1'] \$1 [.'\$1key\$1'] \$1 [.'\$1value\$1'] )\$1 ]**  
指定要檢查的資料欄和屬性。您可以為結構的元素指定 `.field_name`，為陣列元素指定 `'$elem$'`，為對應金鑰指定 `'$key$'`，以及為對應值指定 `'$value$'`。您可以以遞迴的方式指定，以進一步探索複雜的資料欄。

### 範例
<a name="examples"></a>

```
DESCRIBE orders
```

```
DESCRIBE FORMATTED mydatabase.mytable PARTITION (part_col = 100) columnA;
```

以下查詢和輸出顯示了基於 Amazon EMR 範例資料的 `impressions` 資料表的資料欄和資料類型。

```
DESCRIBE impressions
```

```
requestbegintime          string                                         from deserializer   
adid                      string                                         from deserializer   
impressionid              string                                         from deserializer   
referrer                  string                                         from deserializer   
useragent                 string                                         from deserializer   
usercookie                string                                         from deserializer   
ip                        string                                         from deserializer   
number                    string                                         from deserializer   
processid                 string                                         from deserializer   
browsercokie              string                                         from deserializer   
requestendtime            string                                         from deserializer   
timers                    struct<modellookup:string,requesttime:string>  from deserializer   
threadid                  string                                         from deserializer   
hostname                  string                                         from deserializer   
sessionid                 string                                         from deserializer   
dt                        string

# Partition Information
# col_name                data_type                 comment             

dt                        string
```

以下範例查詢和輸出顯示了使用 `FORMATTED` 選項時相同資料表的結果。

```
DESCRIBE FORMATTED impressions
```

```
requestbegintime          string                                         from deserializer
adid                      string                                         from deserializer
impressionid              string                                         from deserializer
referrer                  string                                         from deserializer
useragent                 string                                         from deserializer
usercookie                string                                         from deserializer
ip                        string                                         from deserializer
number                    string                                         from deserializer
processid                 string                                         from deserializer
browsercokie              string                                         from deserializer
requestendtime            string                                         from deserializer
timers                    struct<modellookup:string,requesttime:string>  from deserializer
threadid                  string                                         from deserializer
hostname                  string                                         from deserializer
sessionid                 string                                         from deserializer
dt                        string

# Partition Information
# col_name                data_type                 comment

dt                        string

# Detailed Table Information
Database:                 sampledb
Owner:                    hadoop
CreateTime:               Thu Apr 23 02:55:21 UTC 2020
LastAccessTime:           UNKNOWN
Protect Mode:             None
Retention:                0
Location:                 s3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions
Table Type:               EXTERNAL_TABLE
Table Parameters:
        EXTERNAL                  TRUE
        transient_lastDdlTime     1587610521

# Storage Information
SerDe Library:                         org.openx.data.jsonserde.JsonSerDe
InputFormat:                           org.apache.hadoop.mapred.TextInputFormat
OutputFormat:                          org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat
Compressed:                            No
Num Buckets:                           -1
Bucket Columns:                        []
Sort Columns:                          []
Storage Desc Params:
        paths                                  requestbegintime, adid, impressionid, referrer, useragent, usercookie, ip
        serialization.format                   1
```

以下範例查詢和輸出顯示了使用 `EXTENDED` 選項時相同資料表的結果。資料表詳細資訊會在單一行上輸出，但在此處進行格式化以增加可讀性。

```
DESCRIBE EXTENDED impressions
```

```
requestbegintime          string                                         from deserializer
adid                      string                                         from deserializer
impressionid              string                                         from deserializer
referrer                  string                                         from deserializer
useragent                 string                                         from deserializer
usercookie                string                                         from deserializer
ip                        string                                         from deserializer
number                    string                                         from deserializer
processid                 string                                         from deserializer
browsercokie              string                                         from deserializer
requestendtime            string                                         from deserializer
timers                    struct<modellookup:string,requesttime:string>  from deserializer
threadid                  string                                         from deserializer
hostname                  string                                         from deserializer
sessionid                 string                                         from deserializer
dt                        string

# Partition Information
# col_name                data_type                 comment

dt                        string

Detailed Table Information       Table(tableName:impressions, dbName:sampledb, owner:hadoop, createTime:1587610521, 
lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:requestbegintime, type:string, comment:null), 
FieldSchema(name:adid, type:string, comment:null), FieldSchema(name:impressionid, type:string, comment:null), 
FieldSchema(name:referrer, type:string, comment:null), FieldSchema(name:useragent, type:string, comment:null), 
FieldSchema(name:usercookie, type:string, comment:null), FieldSchema(name:ip, type:string, comment:null), 
FieldSchema(name:number, type:string, comment:null), FieldSchema(name:processid, type:string, comment:null), 
FieldSchema(name:browsercokie, type:string, comment:null), FieldSchema(name:requestendtime, type:string, comment:null), 
FieldSchema(name:timers, type:struct<modellookup:string,requesttime:string>, comment:null), FieldSchema(name:threadid, 
type:string, comment:null), FieldSchema(name:hostname, type:string, comment:null), FieldSchema(name:sessionid, 
type:string, comment:null)], location:s3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions, 
inputFormat:org.apache.hadoop.mapred.TextInputFormat, 
outputFormat:org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, 
serdeInfo:SerDeInfo(name:null, serializationLib:org.openx.data.jsonserde.JsonSerDe, parameters:{serialization.format=1, 
paths=requestbegintime, adid, impressionid, referrer, useragent, usercookie, ip}), bucketCols:[], sortCols:[], parameters:{}, 
skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), 
storedAsSubDirectories:false), partitionKeys:[FieldSchema(name:dt, type:string, comment:null)], 
parameters:{EXTERNAL=TRUE, transient_lastDdlTime=1587610521}, viewOriginalText:null, viewExpandedText:null, 
tableType:EXTERNAL_TABLE)
```

# DESCRIBE VIEW
<a name="describe-view"></a>

顯示指定 Athena 或 AWS Glue Data Catalog 檢視的資料欄清單。適用於檢查複雜檢視的屬性。

 對於 Data Catalog 檢視，陳述式的輸出由 Lake Formation 存取控制控制，並僅顯示呼叫者有權存取的資料欄。

## 概要
<a name="synopsis"></a>

```
DESCRIBE [db_name.]view_name
```

## 範例
<a name="examples"></a>

```
DESCRIBE orders
```

另請參閱 [SHOW COLUMNS](show-columns.md)、[SHOW CREATE VIEW](show-create-view.md)、[SHOW VIEWS](show-views.md) 和 [DROP VIEW](drop-view.md)。

# DROP DATABASE
<a name="drop-database"></a>

從目錄中移除指定的資料庫。如果資料庫包含資料表，在執行 `DROP DATABASE` 之前，您必須捨棄資料表或使用 `CASCADE` 子句。`DATABASE` 和 `SCHEMA` 可互換使用。它們的意義相同。

## 概要
<a name="synopsis"></a>

```
DROP {DATABASE | SCHEMA} [IF EXISTS] database_name [RESTRICT | CASCADE]
```

## Parameters
<a name="parameters"></a>

**[IF EXISTS]**  
如果 `database_name` 不存在，則會造成錯誤隱藏。

**[RESTRICT\$1CASCADE]**  
決定在 `DROP` 操作期間，對待 `database_name` 內資料表的方式。如果您指定 `RESTRICT`，則當資料庫包含資料表時，不會將資料庫捨棄。這是預設行為。指定 `CASCADE` 會造成將資料庫及其所有資料表捨棄。

## 範例
<a name="examples"></a>

```
DROP DATABASE clickstreams;
```

```
DROP SCHEMA IF EXISTS clickstreams CASCADE;
```

**注意**  
當您嘗試刪除名稱包含特殊字元 (例如 `my-database`) 的資料庫時，可能會收到錯誤訊息。若要解決這個問題，請嘗試將資料庫名稱放在反引號 (`) 字元之間。如需有關 Athena 中命名資料庫的資訊，請參閱[為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)。

# DROP TABLE
<a name="drop-table"></a>

移除名為 `table_name` 資料表的中繼資料資料表定義。捨棄外部資料表時，基礎資料保持不變。

## 概要
<a name="synopsis"></a>

```
DROP TABLE [IF EXISTS] table_name
```

## Parameters
<a name="parameters"></a>

**[ IF EXISTS ]**  
如果 `table_name` 不存在，則會造成錯誤隱藏。

## 範例
<a name="examples"></a>

```
DROP TABLE fulfilled_orders
```

```
DROP TABLE IF EXISTS fulfilled_orders
```

使用 Athena 主控台查詢編輯器來捨棄具有底線 (\$1) 以外之特殊字元的資料表時，請使用反引號，如下列範例所示。

```
DROP TABLE `my-athena-database-01.my-athena-table`
```

使用 JDBC 連接器來卸除具有特殊字元的資料表時，不需要反引號字元。

```
DROP TABLE my-athena-database-01.my-athena-table
```

# DROP VIEW
<a name="drop-view"></a>

捨棄 （刪除） 現有的 Athena 或 AWS Glue Data Catalog 檢視。如果檢視不存在，則選用的 `IF EXISTS` 子句會造成錯誤隱藏。

對於 Data Catalog 檢視，只有在 Data Catalog 檢視中存在 Athena 檢視語法 (方言) 時，才會捨棄該檢視。例如，如果使用者從 Athena 呼叫 `DROP VIEW`，則只有在檢視中存在 Athena 方言時，才會捨棄該檢視。否則，操作會失敗。捨棄 Data Catalog 檢視需要 Lake Formation 管理員或檢視定義者許可。

如需詳細資訊，請參閱[使用檢視](views.md)及[在 Athena 中使用 Data Catalog 檢視](views-glue.md)。

## 概要
<a name="synopsis"></a>

```
DROP VIEW [ IF EXISTS ] view_name
```

## 範例
<a name="examples"></a>

```
DROP VIEW orders_by_date
```

```
DROP VIEW IF EXISTS orders_by_date
```

另請參閱[CREATE VIEW 和 CREATE PROTECTED MULTI DIALECT VIEW](create-view.md)、[SHOW COLUMNS](show-columns.md)、[SHOW CREATE VIEW](show-create-view.md)、[SHOW VIEWS](show-views.md)和[DESCRIBE VIEW](describe-view.md)。

# MSCK REPAIR TABLE
<a name="msck-repair-table"></a>

新增 Hive 相容分割區之後，請使用 `MSCK REPAIR TABLE` 命令來更新目錄中的中繼資料。

`MSCK REPAIR TABLE` 命令會掃描檔案系統（例如 Amazon S3），以查找在建立資料表後新增到檔案系統的 Hive 相容分隔區。`MSCK REPAIR TABLE` 會比較資料表中繼資料中的分割區和 S3 中的分割區。如果您在建立資料表時指定的 S3 位置有新的分割區，它會將這些分割區新增至中繼資料和 Athena 資料表中。

當您新增實體分割區時，目錄中的中繼資料會變得與檔案系統中的資料配置不一致，而且需要將新分割區的相關資訊新增至目錄。若要更新中繼資料，請執行 `MSCK REPAIR TABLE`，如此可讓您從 Athena 查詢新分割區中的資料。

**注意**  
`MSCK REPAIR TABLE` 只會將分割區新增至中繼資料，而不會刪除它們。若要在 Amazon S3 中手動刪除分割區後從中繼資料移除分割區，請執行 `ALTER TABLE table-name DROP PARTITION` 命令。如需詳細資訊，請參閱[ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)。

## 考量和限制
<a name="msck-repair-table-considerations"></a>

使用 `MSCK REPAIR TABLE` 時，請謹記以下幾點：
+ 新增所有分割區可能需要花一些時間。如果此操作逾時，則會處於不完整狀態，只有幾個分割區新增到目錄。您應該在同一個資料表上執行 `MSCK REPAIR TABLE`，直到所有分割區都已新增為止。如需詳細資訊，請參閱[分割您的資料](partitions.md)。
+ 對於與 Hive 不相容的分割區，請使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 載入分割區，以便查詢資料。
+ 要搭配 Athena 使用的分割區位置必須使用 `s3` 通訊協定 (例如，`s3://amzn-s3-demo-bucket/folder/`)。在 Athena 中，當在包含的資料表上執行 `MSCK REPAIR TABLE` 查詢時，使用其他通訊協定的位置 (例如 `s3a://bucket/folder/`) 會導致查詢失敗。
+ 由於 `MSCK REPAIR TABLE` 會同時掃描資料夾及其子資料夾，以尋找相符的分割區配置，請務必將個別資料表的資料留在不同的資料夾階層中。例如，假設您在 `s3://amzn-s3-demo-bucket1` 中有資料表 1 的資料，在 `s3://amzn-s3-demo-bucket1/table-2-data` 中有資料表 2 的資料。如果兩個資料表都以字串分割，`MSCK REPAIR TABLE` 會將資料表 2 的分割區新增至資料表 1 中。為避免此情況，請改用單獨的資料夾結構，如 `s3://amzn-s3-demo-bucket1` 和 `s3://amzn-s3-demo-bucket2`。請注意，此行為與 Amazon EMR 和 Apache Hive 一致。
+ 由於已知問題的緣故，只要分割區的值中含有冒號 (`:`) 字元 (例如分割區的值為時間戳記)，`MSCK REPAIR TABLE` 就會執行失敗且未出現任何提示。解決方法是使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。
+ `MSCK REPAIR TABLE` 不會新增以底線 (\$1) 開頭的分割區資料欄名稱。若要解決此限制，請使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。

## 概要
<a name="synopsis"></a>

```
MSCK REPAIR TABLE table_name
```

## 範例
<a name="examples"></a>

```
MSCK REPAIR TABLE orders;
```

## 疑難排解
<a name="msck-repair-table-troubleshooting"></a>

執行 之後`MSCK REPAIR TABLE`，如果 Athena 未將分割區新增至 中的資料表 AWS Glue Data Catalog，請檢查下列項目：
+ **AWS Glue 存取** – 確定 AWS Identity and Access Management (IAM) 角色具有允許 `glue:BatchCreatePartition`動作的政策。如需詳細資訊，請參閱本文件稍後的[允許 IAM 政策中的 glue:BatchCreatePartition](#msck-repair-table-troubleshooting-allow-gluebatchcreatepartition-in-the-policy)。
+ **Amazon S3 存取** – 確定角色具有足夠許可以存取 Amazon S3 的政策，包括 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html) 動作。如需允許哪些 Amazon S3 動作的範例，請參閱 [設定 Athena 中的 Amazon S3 儲存貯體跨帳戶存取權](cross-account-permissions.md) 中的儲存貯體政策範例。
+ **Amazon S3 物件金鑰大小寫** – 請確定 Amazon S3 路徑是小寫而不是小駝峰式命名法 (例如，`userid` 而非 `userId`)，或使用 `ALTER TABLE ADD PARTITION` 指定物件金鑰名稱。如需詳細資訊，請參閱本文件稍後的[變更或重新定義 Amazon S3 路徑](#msck-repair-table-troubleshooting-change-or-redefine-the-amazon-s3-path)。
+ **查詢逾時** – `MSCK REPAIR TABLE`最適合在第一次建立資料表時使用，或者在資料和分割區中繼資料之間存不確定的同位時使用。如果您經常使用 `MSCK REPAIR TABLE` 新增分割區（例如每天）並正經歷查詢逾時，請考慮使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。
+ **檔案系統中遺失分割區** - 如果您在 Amazon S3 中手動刪除分割區，然後執行 `MSCK REPAIR TABLE`，則您可能會收到錯誤訊息檔案系統中遺失分割區。這是因為 `MSCK REPAIR TABLE` 不會從資料表中繼資料中移除過時的分割區。若要從資料表中繼資料移除已刪除的分割區，請改為執行 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)。請注意，[SHOW PARTITIONS](show-partitions.md) 同樣地只會列出中繼資料中的分割區，而不會列出檔案系統中的分割區。
+ **"NullPointerException name is null" (NullPointerException 名稱為 null) 錯誤**

  如果您使用 AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) API 操作或 CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html) 範本來建立資料表以在 Athena 中使用，而不指定 `TableType` 屬性，然後執行 DDL 查詢，例如 `SHOW CREATE TABLE`或 `MSCK REPAIR TABLE`，您可以收到錯誤訊息 FAILED：NullPointerException Name 為 null。

  若要解決錯誤，請在 API 呼叫或[CloudFormation 範本](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)中 AWS Glue `CreateTable`指定 [TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 屬性的值。`TableType` 可能的值包括 `EXTERNAL_TABLE` 或 `VIRTUAL_VIEW`。

  此要求僅適用於使用 `CreateTable` API AWS Glue 操作或 `AWS::Glue::Table` 範本建立資料表時。如果您使用 DDL 陳述式或 AWS Glue 爬蟲程式建立 Athena 資料表，則系統會為您自動定義 `TableType` 屬性。

下列各節提供了一些額外的詳細資訊。

### 允許 IAM 政策中的 glue:BatchCreatePartition
<a name="msck-repair-table-troubleshooting-allow-gluebatchcreatepartition-in-the-policy"></a>

檢閱連接至您用來執行 `MSCK REPAIR TABLE` 之角色的 IAM 政策。當您[AWS Glue Data Catalog 搭配 Athena 使用 ](data-sources-glue.md)時，IAM 政策必須允許 `glue:BatchCreatePartition`動作。如需允許 `glue:BatchCreatePartition` 動作的 IAM 政策範例，請參閱 [AWS 受管政策：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)。

### 變更或重新定義 Amazon S3 路徑
<a name="msck-repair-table-troubleshooting-change-or-redefine-the-amazon-s3-path"></a>

如果 Amazon S3 路徑中的一或多個物件金鑰是駝峰式大小寫，則 `MSCK REPAIR TABLE` 可能不會將分割區新增到 AWS Glue Data Catalog。例如，如果您的 Amazon S3 路徑包含物件金鑰名稱 `userId`，則下列分割區可能不會新增到 AWS Glue Data Catalog：

```
s3://amzn-s3-demo-bucket/path/userId=1/

s3://amzn-s3-demo-bucket/path/userId=2/

s3://amzn-s3-demo-bucket/path/userId=3/
```

要解決此問題，請執行下列項目之一：
+ 建立 Amazon S3 物件金鑰時，請使用小寫字母而非駝峰式大小寫：

  ```
  s3://amzn-s3-demo-bucket/path/userid=1/
  
  s3://amzn-s3-demo-bucket/path/userid=2/
  
  s3://amzn-s3-demo-bucket/path/userid=3/
  ```
+ 使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 重新定義位置，如下列範例所示：

  ```
  ALTER TABLE table_name ADD [IF NOT EXISTS]
  PARTITION (userId=1)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=1/'
  PARTITION (userId=2)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=2/'
  PARTITION (userId=3)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=3/'
  ```

請注意，雖然 Amazon S3 物件金鑰名稱可以使用大寫，但 Amazon S3 儲存貯體名稱本身必須始終為小寫。如需詳細資訊，請參閱《*Amazon S3 使用者指南*》中的[物件金鑰命名準則](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines)和[儲存貯體命名規則](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html)。

# SHOW COLUMNS
<a name="show-columns"></a>

僅顯示單一指定資料表、Athena 檢視或 Data Catalog 檢視的資料欄名稱。若要取得 Athena 檢視的更多詳細資訊，請 AWS Glue Data Catalog 改為查詢 。如需資訊和範例，請參閱 [查詢 AWS Glue Data Catalog](querying-glue-catalog.md) 主題的下列章節：
+ 若要檢視資料欄的中繼資料 (例如資料類型)，請參閱 [列示或搜尋指定的資料表或檢視的資料欄](querying-glue-catalog-listing-columns.md)。
+ 若要檢視 `AwsDataCatalog` 中特定資料庫中的所有資料表的所有資料欄，請參閱 [列示或搜尋指定的資料表或檢視的資料欄](querying-glue-catalog-listing-columns.md)。
+ 若要檢視 `AwsDataCatalog` 中所有資料庫的所有資料表的所有資料欄，請參閱 [列出所有資料表的所有資料欄](querying-glue-catalog-listing-all-columns-for-all-tables.md)。
+ 若要檢視資料庫中特定資料表的共同資料欄，請參閱 [列出特定資料表共有的資料欄](querying-glue-catalog-listing-columns-in-common.md)。

對於 Data Catalog 檢視，陳述式的輸出由 Lake Formation 存取控制控制，並僅顯示呼叫者有權存取的資料欄。

## 概要
<a name="synopsis"></a>

```
SHOW COLUMNS {FROM|IN} database_name.table_or_view_name
```

```
SHOW COLUMNS {FROM|IN} table_or_view_name [{FROM|IN} database_name]
```

`FROM` 和 `IN` 關鍵字可互換使用。如果 *table\$1or\$1view\$1name* 或 *database\$1name* 具有如連字號的特殊字元，則請使用引號括住名稱 (例如 ``my-database`.`my-table``)。請勿使用單引號或雙引號括住 *table\$1or\$1view\$1name* 或 *database\$1name*。目前，不支援使用 `LIKE` 和模式比對表達式。

## 範例
<a name="examples"></a>

下列相等範例會顯示 `customers` 資料庫中 `orders` 資料表的資料欄。前兩個範例假設 `customers` 為目前的資料庫。

```
SHOW COLUMNS FROM orders
```

```
SHOW COLUMNS IN orders
```

```
SHOW COLUMNS FROM customers.orders
```

```
SHOW COLUMNS IN customers.orders
```

```
SHOW COLUMNS FROM orders FROM customers
```

```
SHOW COLUMNS IN orders IN customers
```

# SHOW CREATE TABLE
<a name="show-create-table"></a>

分析名為 `table_name` 的現有資料表，以產生建立此資料表的查詢。

## 概要
<a name="synopsis"></a>

```
SHOW CREATE TABLE [db_name.]table_name
```

## Parameters
<a name="parameters"></a>

**TABLE [db\$1name.]table\$1name**  
`db_name` 為選用參數。如果省略，內容會預設為目前的資料庫。  
資料表名稱是必要的。

## 範例
<a name="examples"></a>

```
SHOW CREATE TABLE orderclickstoday;
```

```
SHOW CREATE TABLE `salesdata.orderclickstoday`;
```

## 疑難排解
<a name="show-create-table-troubleshooting"></a>

如果您使用 AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) API 操作或 CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html) 範本建立資料表以在 Athena 中使用，而不指定 `TableType` 屬性，然後執行 DDL 查詢，例如 `SHOW CREATE TABLE`或 `MSCK REPAIR TABLE`，您可以收到錯誤訊息 FAILED：NullPointerException Name 為 null。

若要解決錯誤，請在 API 呼叫或[CloudFormation 範本](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)中 AWS Glue `CreateTable`指定 [TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 屬性的值。`TableType` 可能的值包括 `EXTERNAL_TABLE` 或 `VIRTUAL_VIEW`。

此要求僅適用於使用 `CreateTable` API AWS Glue 操作或 `AWS::Glue::Table` 範本建立資料表時。如果您使用 DDL 陳述式或 AWS Glue 爬蟲程式建立 Athena 資料表，則系統會為您自動定義 `TableType` 屬性。

# SHOW CREATE VIEW
<a name="show-create-view"></a>

顯示用於建立指定 Athena 或 Data Catalog 檢視的 SQL 陳述式。傳回的 SQL 會顯示 Athena 使用的建立檢視語法。在 Data Catalog 檢視上呼叫 `SHOW CREATE VIEW` 需要 Lake Formation 管理員或檢視定義者許可。

## 概要
<a name="synopsis"></a>

```
SHOW CREATE VIEW view_name
```

## 範例
<a name="examples"></a>

```
SHOW CREATE VIEW orders_by_date
```

另請參閱 [CREATE VIEW 和 CREATE PROTECTED MULTI DIALECT VIEW](create-view.md) 和 [DROP VIEW](drop-view.md)。

# SHOW DATABASES
<a name="show-databases"></a>

列出中繼存放區中定義的所有資料庫。您可以使用 `DATABASES` 或 `SCHEMAS`。它們的意義相同。

`SHOW DATABASES` 的程式設計對等項目是 [ListDatabases](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListDatabases.html) Athena API 動作。中的同等方法 適用於 Python (Boto3) 的 AWS SDK 為 [list\$1databases](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/athena/client/list_databases.html)。

## 概要
<a name="synopsis"></a>

```
SHOW {DATABASES | SCHEMAS} [LIKE 'regular_expression']
```

## Parameters
<a name="parameters"></a>

**[LIKE '*regular\$1expression*']**  
從資料庫清單中篩選符合您指定的 `regular_expression` 的資料庫。對於萬用字元比對，您可以使用 `.*` 組合，這會比對零到不限次數的任何字元。

## 範例
<a name="examples"></a>

```
SHOW SCHEMAS;
```

```
SHOW DATABASES LIKE '.*analytics';
```

# SHOW PARTITIONS
<a name="show-partitions"></a>

以未排序的順序列出 Athena 資料表中的所有分割區。

## 概要
<a name="synopsis"></a>

```
SHOW PARTITIONS table_name
```
+ 若要在表格中顯示分割區，並以特定順序列出，請參閱 [查詢 AWS Glue Data Catalog](querying-glue-catalog.md) 頁面上的 [列出特定資料表的分割區](querying-glue-catalog-listing-partitions.md) 部分。
+ 若要檢視分割區的內容，請參閱 [分割您的資料](partitions.md) 頁面上的 [查詢資料](partitions.md#query-the-data) 部分。
+ `SHOW PARTITIONS` 不會列出 Athena 投影但未在 AWS Glue 目錄中註冊的分割區。如需分割區投影的相關資訊，請參閱[透過 Amazon Athena 使用分割區投影](partition-projection.md)。
+  `SHOW PARTITIONS` 會列出中繼資料中的分割區，而非實際檔案系統中的分割區。若要在 Amazon S3 中手動刪除分割區後更新中繼資料，請執行 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)。

## 範例
<a name="examples"></a>

下列範例查詢會顯示 `flight_delays_csv` 資料表的分割區，該資料表顯示來自美國運輸部的航班表資料。如需有關 `flight_delays_csv` 資料表範例的詳細資料，請參閱[適用於 CSV、TSV 和自訂分隔檔案的 Lazy Simple SerDe](lazy-simple-serde.md)。資料表依年份進行分割。

```
SHOW PARTITIONS flight_delays_csv
```

**結果**

```
year=2007
year=2015
year=1999
year=1993
year=1991
year=2003
year=1996
year=2014
year=2004
year=2011
...
```

下列範例查詢會顯示 `impressions` 資料表的分割區，該資料表包含網頁瀏覽資料範例。如需有關 `impressions` 資料表範例的詳細資料，請參閱[分割您的資料](partitions.md)。該資料表依 `dt` (datetime) 資料欄進行分割。

```
SHOW PARTITIONS impressions
```

**結果**

```
dt=2009-04-12-16-00
dt=2009-04-13-18-15
dt=2009-04-14-00-20
dt=2009-04-12-13-00
dt=2009-04-13-02-15
dt=2009-04-14-12-05
dt=2009-04-14-06-15
dt=2009-04-12-21-15
dt=2009-04-13-22-15
...
```

### 以排序順序列出分割區
<a name="show-partitions-examples-ordering"></a>

若要在結果清單中排列分割區的順序，請使用下列 `SELECT` 語法，而非 `SHOW PARTITIONS`。

```
SELECT * FROM database_name."table_name$partitions" ORDER BY column_name
```

下列查詢按排序順序顯示 `flight_delays_csv` 範例的分割區清單。

```
SELECT * FROM "flight_delays_csv$partitions" ORDER BY year
```

**結果**

```
year
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
...
```

如需詳細資訊，請參閱[查詢 AWS Glue Data Catalog](querying-glue-catalog.md)頁面上的[列出特定資料表的分割區](querying-glue-catalog-listing-partitions.md)區段。

# SHOW TABLES
<a name="show-tables"></a>

列出資料庫中的所有基礎資料表和檢視。

**注意**  
[GetQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryExecution.html) API 操作中 `SHOW TABLES` 的 [StatementType](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecution.html#athena-Type-QueryExecution-StatementType) 參數會分類為 `UTILITY`，而非 `DDL`。

## 概要
<a name="synopsis"></a>

```
SHOW TABLES [IN database_name] ['regular_expression']
```

## Parameters
<a name="parameters"></a>

**[IN database\$1name]**  
指定將列出其中資料表的 `database_name`。如果省略，則假定為目前內容中的資料庫。  
如果 `database_name` 使用[不支援的字元](tables-databases-columns-names.md)，例如連字號，則 `SHOW TABLES` 可能會失敗。解決方法為可嘗試將資料庫名稱放在兩個反引號之間。

**['regular\$1expression']**  
從資料表清單中篩選符合您指定的 `regular_expression` 的資料表。若要指示 `AWSDataCatalog` 資料表中的任何字元，您可以使用 `*` 或 `.*` 萬用字元表達式。對於 Apache Hive 資料庫，請使用 `.*` 萬用字元表達式。若要指示字元之間的選擇，請使用 `|` 字元。

## 範例
<a name="examples"></a>

**Example - 顯示資料庫 `sampledb` 中的所有資料表**  

```
SHOW TABLES IN sampledb
```
`Results`  

```
alb_logs
cloudfront_logs
elb_logs
flights_2016
flights_parquet
view_2016_flights_dfw
```

**Example - 顯示 `sampledb` 中包含「航班」一詞的所有資料表的名稱**  

```
SHOW TABLES IN sampledb '*flights*'
```
`Results`  

```
flights_2016
flights_parquet
view_2016_flights_dfw
```

**Example - 顯示 `sampledb` 中以「日誌」結尾的所有資料表的名稱**  

```
SHOW TABLES IN sampledb '*logs'
```
`Results`  

```
alb_logs
cloudfront_logs
elb_logs
```

# SHOW TBLPROPERTIES
<a name="show-tblproperties"></a>

列出指名的資料表的資料表屬性。

## 概要
<a name="synopsis"></a>

```
SHOW TBLPROPERTIES table_name [('property_name')]
```

## Parameters
<a name="parameters"></a>

**[('property\$1name')]**  
如果包含，則只會列出名為 `property_name` 的屬性的值。

## 範例
<a name="examples"></a>

```
SHOW TBLPROPERTIES orders;
```

```
SHOW TBLPROPERTIES orders('comment');
```

# SHOW VIEWS
<a name="show-views"></a>

在 `STRING` 類型值清單中，列出 Athena 或 Data Catalog 檢視。清單中的每個值都是指定的資料庫或目前資料庫 (如果省略資料庫名稱) 中的檢視名稱。使用選用的 `LIKE` 子句搭配規則表達式，以限制檢視名稱的清單。對於 Data Catalog 檢視，僅會列出使用 Athena SQL 語法的檢視。其他 Data Catalog 檢視會被篩選掉。

## 概要
<a name="synopsis"></a>

```
SHOW VIEWS [IN database_name] [LIKE 'regular_expression']
```

### Parameters
<a name="parameters"></a>

**[IN database\$1name]**  
指定將列出其中檢視的 `database_name`。如果省略，則假定為目前內容中的資料庫。

**[LIKE 'regular\$1expression']**  
從檢視清單中篩選符合您指定的 `regular_expression` 的檢視。只能使用萬用字元 `*` (表示任何字元) 或 `|` (表示在字元之間選擇)。

## 範例
<a name="examples"></a>

```
SHOW VIEWS
```

```
SHOW VIEWS IN marketing_analytics LIKE 'orders*'
```

另請參閱 [SHOW COLUMNS](show-columns.md)、[SHOW CREATE VIEW](show-create-view.md)、[DESCRIBE VIEW](describe-view.md) 和 [DROP VIEW](drop-view.md)。

# 在 Amazon Athena 中進行 SQL 查詢的考量事項與限制
<a name="other-notable-limitations"></a>

在 Athena 中執行查詢時，請記住下列考量事項與限制：
+ **預存程序** – 不支援預存程序。
+ **分割區數量上限** – 您可以使用 `CREATE TABLE AS SELECT` (CTAS) 陳述式建立的分割區數量上限為 100。如需詳細資訊，請參閱 [CREATE TABLE AS](create-table-as.md)。如需因應措施，請參閱[使用 CTAS 和 INSERT INTO 來解決 100 個分割區限制](ctas-insert-into.md)。
+ **不支援的陳述式** – 不支援的陳述式如下所示。如需 Athena 中不支援的 DDL 陳述式的完整清單，請參閱 [不支援的 DDL](unsupported-ddl.md)。
  + 不支援 `CREATE TABLE LIKE`。
  + 不支援 `DESCRIBE INPUT` 和 `DESCRIBE OUTPUT`。
  + `MERGE` 陳述式僅支援交易型資料表格式。如需詳細資訊，請參閱[合併為](merge-into-statement.md)。
  + 不支援 `UPDATE` 陳述式。
  + 不支援 `DELETE FROM`。
+ **Trino 和 Presto 連接器** – 不支援 [Trino](https://trino.io/docs/current/connector.html) 和 [Presto](https://prestodb.io/docs/current/connector.html) 連接器。使用 Amazon Athena 聯合查詢來連接資料來源。如需詳細資訊，請參閱[使用 Amazon Athena 聯合查詢](federated-queries.md)。
+ **具有多個分割區的資料表逾時** – 在查詢具有數千個分割區的資料表時，Athena 可能會逾時。當資料表有許多非類型 `string` 的分割區時，就會發生這種情況。當您使用類型 `string` 時，Athena 會在中繼存放區層級剔除分割區。不過，在您使用其他資料類型時，Athena 會剔除伺服器端的分割區。您擁有的分割區越多，此程序所需的時間越長，您的查詢也越有可能逾時。如要解決此問題，請將您的分割區類型設定為 `string`，以便 Athena 在中繼存放區層級剔除分割區。這可以減少額外負荷，並防止查詢逾時。
+ **Amazon Glacier** 支援 – 如需有關查詢還原的 Amazon Glacier 物件的資訊，請參閱 [查詢還原的 Amazon Glacier 物件](querying-glacier.md)。
+ **檔案視為隱藏** – Athena 會將以底線 (`_`) 或點 (`.`) 開頭的來源檔案視為隱藏。如果要解決這個限制，請將檔案重新命名。
+ **資料列或資料欄大小限制** – 單一資料列或其資料欄的大小不可超過 32 MB。例如，當資料列包含 35 MB 的單一資料欄時，則會超過此限制。這是服務的硬性限制且無法被變更。
+ **文字檔案中一行長度上限** – 文字檔案中單一行的大小上限為 200 MB。超過此限制時也會產生錯誤訊息 TextLineLengthLimitExceededException：換行前位元組數過多。若要解決此限制，請確保文字檔案中的單一行都不會超過 200 MB。
+ **LIMIT 子句上限** – 可指定給 `LIMIT` 子句的資料列數上限為 

  9223372036854775807。使用 `ORDER BY` 時，LIMIT 子句所支援的資料列數上限為 2147483647。超過此限制會導致顯示錯誤訊息 NOT\$1SUPPORTED: ORDER BY LIMIT > 2147483647 is not supported (NOT\$1SUPPORTED：不支援 ORDER BY LIMIT > 2147483647)。
+ **information\$1schema** – 如果您有少量到中等數量的 AWS Glue 中繼資料，查詢`information_schema`效能最高。如果您有大量中繼資料，則可能會出現錯誤。如需查詢`information_schema`資料庫以取得 AWS Glue 中繼資料的資訊，請參閱 [查詢 AWS Glue Data Catalog](querying-glue-catalog.md)。
+  **陣列初始化** – 由於 Java 中的限制，無法在 Athena 中初始化具有超過 254 個引數的陣列。
+ **隱藏的中繼資料欄** – 檢視不支援 Hive 或 Iceberg 隱藏的中繼資料欄 `$bucket`、`$file_modified_time`、`$file_size` 和 `$partition`。如需有關在 Athena 中使用 `$path` 中繼資料欄的資訊，請參閱 [在 Amazon S3 中取得來源資料的檔案位置](select.md#select-path)。

如需查詢字串長度上限、查詢逾時配額，以及作用中 DML 查詢數量配額的相關資訊，請參閱[Service Quotas](service-limits.md)。

# 對 Athena 中的問題進行疑難排解
<a name="troubleshooting-athena"></a>

Athena 團隊收集了以下客戶問題的疑難排解資訊。雖然不是非常詳盡，但其中包括關於效能、逾時和記憶體不足等一些常見問題的建議。

**Topics**
+ [CREATE TABLE AS SELECT (CTAS)](#troubleshooting-athena-create-table-as-select-ctas)
+ [資料檔案問題](#troubleshooting-athena-data-file-issues)
+ [Linux Foundation Delta Lake 資料表](#troubleshooting-athena-delta-lake-tables)
+ [聯合查詢](#troubleshooting-athena-federated-queries)
+ [JSON 相關錯誤](#troubleshooting-athena-json-related-errors)
+ [MSCK REPAIR TABLE](#troubleshooting-athena-msck-repair-table)
+ [輸出問題](#troubleshooting-athena-output-issues)
+ [Parquet 問題](#troubleshooting-athena-parquet-issues)
+ [分割問題](#troubleshooting-athena-partitioning-issues)
+ [許可](#troubleshooting-athena-permissions)
+ [查詢語法問題](#troubleshooting-athena-query-syntax-issues)
+ [查詢逾時問題](#troubleshooting-athena-query-timeout-issues)
+ [調節問題](#troubleshooting-athena-throttling-issues)
+ [檢視](#troubleshooting-athena-views)
+ [工作群組](#troubleshooting-athena-workgroups)
+ [其他資源](#troubleshooting-athena-additional-resources)
+ [Athena 錯誤目錄](error-reference.md)

## CREATE TABLE AS SELECT (CTAS)
<a name="troubleshooting-athena-create-table-as-select-ctas"></a>

### 並行的 CTAS 陳述式發生重複的資料
<a name="troubleshooting-athena-duplicated-data-occurs-with-concurrent-ctas-statements"></a>

Athena 不會維持並行的 CTAS 驗證。請確定在同一時間相同的位置沒有重複的 CTAS 陳述式。即使 CTAS 或 INSERT INTO 陳述式失敗，孤立的資料仍可以留在陳述式中指定的資料位置。

### HIVE\$1TOO\$1MANY\$1OPEN\$1PARTITIONS
<a name="troubleshooting-athena-ctas-hive-too-many-open-partitions"></a>

當您使用 CTAS 陳述式建立具有超過 100 個分割區的資料表時，您可能會收到錯誤 HIVE\$1TOO\$1MANY\$1OPEN\$1PARTITIONS: Exceeded limit of 100 open writers for partitions/buckets (HIVE\$1TOO\$1MANY\$1OPEN\$1PARTITIONS：超過分割區／儲存貯體 100 個開啟寫入器的限制)。若要避開此限制，您可以使用 CTAS 陳述式和一系列的 `INSERT INTO` 陳述式，每個陳述式可建立或插入最多 100 個分割區。如需詳細資訊，請參閱[使用 CTAS 和 INSERT INTO 來解決 100 個分割區限制](ctas-insert-into.md)。

## 資料檔案問題
<a name="troubleshooting-athena-data-file-issues"></a>

### Athena 無法讀取隱藏的檔案
<a name="troubleshooting-athena-athena-cannot-read-hidden-files"></a>

Athena 會將以底線 (\$1) 或點 (.) 開頭的來源檔案視為隱藏。如果要解決這個限制，請將檔案重新命名。

### Athena 會讀取我從 AWS Glue 爬蟲程式中排除的檔案
<a name="troubleshooting-athena-athena-reads-files-that-i-excluded-from-the-glue-crawler"></a>

Athena 無法辨識[排除您指定爬蟲程式的模式](https://docs.aws.amazon.com/glue/latest/dg/define-crawler.html#crawler-data-stores-exclude)。 AWS Glue 例如，如果您的 Simple Storage Service (Amazon S3) 儲存貯體同時包含 `.csv` 和 `.json` 檔案，並且您將 `.json` 檔案從爬蟲程式中排除，Athena 會查詢這兩個檔案群組。若要避免這種情況，請將您要排除的檔案放在不同的位置。

### HIVE\$1BAD\$1DATA：剖析欄位值時發生錯誤
<a name="troubleshooting-athena-hive_bad_data-error-parsing-field-value"></a>

在下列情況下可能會發生這個錯誤：
+ 資料表中定義的資料類型與來源資料不相符，或單一欄位包含不同類型的資料。如需建議的解決方案，請參閱 AWS 知識中心中的[我的 Amazon Athena 查詢失敗，出現錯誤「HIVE\$1BAD\$1DATA：剖析欄位 X 的欄位值時發生錯誤：對於輸入字串："12312845691"」](https://aws.amazon.com/premiumsupport/knowledge-center/athena-hive-bad-data-parsing-field-value/)。
+ 整數欄位中存在 Null 值。一種解決方法是建立帶有 null 值的資料欄作為 `string`，然後使用 `CAST` 來轉換查詢中的欄位，並為 null 提供 `0` 預設值。如需詳細資訊，請參閱 AWS 知識中心中的[當我在 Athena 中查詢 CSV 資料時，出現錯誤「HIVE\$1BAD\$1DATA：剖析欄位 X 的欄位值時發生錯誤：對於輸入字符串：""」](https://aws.amazon.com/premiumsupport/knowledge-center/athena-hive-bad-data-error-csv/)。

### HIVE\$1CANNOT\$1OPEN\$1SPLIT：開啟 Hive 分割時發生錯誤 s3://amzn-s3-demo-bucket
<a name="troubleshooting-athena-hive_cannot_open_split-error-opening-hive-split-s3bucket-name"></a>

當您查詢具有大量物件的 Simple Storage Service (Amazon S3) 儲存貯體字首時，可能會發生此錯誤。如需詳細資訊，請參閱 AWS 知識中心中的[如何在 Athena 中解決「HIVE\$1CANNOT\$1OPEN\$1SPLIT：開啟 Hive 分割時發生錯誤 split s3://amzn-s3-demo-bucket/：減慢」錯誤？](https://aws.amazon.com/premiumsupport/knowledge-center/hive-cannot-open-split-503-athena/)。

### HIVE\$1CURSOR\$1ERROR：com.amazonaws.services.s3.model.AmazonS3Exception：指定的索引鍵不存在
<a name="troubleshooting-athena-hive_cursor_error-com.amazonaws.services.s3.model.amazons3exception-the-specified-key-does-not-exist"></a>

當查詢正在執行時移除檔案時，通常會發生這個錯誤。重新執行查詢，或檢查您的工作流程，以查看在查詢執行時是否有其他任務或程序正在修改檔案。

### HIVE\$1CURSOR\$1ERROR：輸入串流的意外結束
<a name="troubleshooting-athena-hive_cursor_error-unexpected-end-of-input-stream"></a>

此訊息表示檔案已損毀或空白。檢查檔案的完整性，並重新執行查詢。

### HIVE\$1FILESYSTEM\$1ERROR：檔案的不正確的檔案大小 *1234567*
<a name="troubleshooting-athena-hive_filesystem_error-incorrect-file-size"></a>

當檔案已在查詢規劃和查詢執行之間變更時，就會發生此訊息。這通常發生在就地取代 Simple Storage Service (Amazon S3) 上的檔案時 (例如 `PUT` 在物件已經存在的索引鍵上執行)。Athena 不支援在執行查詢時刪除或取代檔案的內容。若要避免此錯誤，請安排在查詢未執行時覆寫或刪除檔案的任務，或僅將資料寫入新的檔案或分割區。

### HIVE\$1UNKNOWN\$1ERROR：無法建立輸入格式
<a name="troubleshooting-athena-hive_unknown_error-unable-to-create-input-format"></a>

此錯誤可能是由以下問題所造成：
+  AWS Glue 爬蟲程式無法分類資料格式
+ 某些 AWS Glue 資料表定義屬性為空白
+ Athena 不支援 Simple Storage Service (Amazon S3) 中檔案的資料格式

如需詳細資訊，請參閱 AWS 知識中心中的[如何在 Athena 中解決「無法建立輸入格式」錯誤？](https://aws.amazon.com/premiumsupport/knowledge-center/athena-unable-to-create-input-format/)或觀看知識中心的[影片](https://www.youtube.com/watch?v=CGzXW3hRa8g)。

### 提供用於儲存查詢結果的 S3 位置無效。
<a name="troubleshooting-athena-the-s3-location-provided-to-save-your-query-results-is-invalid."></a>

請確保已為查詢結果指定有效的 S3 位置。如需詳細資訊，請參閱 [使用查詢結果和近期查詢](querying.md) 主題中的 [指定查詢結果位置](query-results-specify-location.md)。

## Linux Foundation Delta Lake 資料表
<a name="troubleshooting-athena-delta-lake-tables"></a>

### Delta Lake 資料表結構描述不同步
<a name="troubleshooting-athena-delta-lake-table-schema-out-of-sync"></a>

當您在 中查詢結構描述已過期的 Delta Lake 資料表 AWS Glue 時，您可能會收到下列錯誤訊息：

```
INVALID_GLUE_SCHEMA: Delta Lake table schema in Glue does not match the most recent schema of the 
Delta Lake transaction log. Please ensure that you have the correct schema defined in Glue.
```

如果在新增至 Athena AWS Glue 之後在 中修改結構描述，結構描述可能會過期。若要更新結構描述，請執行下列其中一個步驟：
+ 在 中 AWS Glue，執行[AWS Glue 爬蟲程式](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html)。
+ 在 Athena 中，[捨棄資料表](drop-table.md)並再次[創建](create-table.md)它。
+ 可以透過使用 Athena 中的 [ALTER TABLE ADD COLUMNS](alter-table-add-columns.md) 陳述式，或[編輯 AWS Glue中的資料表結構描述](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html#console-tables-details)，手動新增遺失的資料欄。

## 聯合查詢
<a name="troubleshooting-athena-federated-queries"></a>

### 呼叫 ListTableMetadata 時逾時
<a name="troubleshooting-athena-federated-queries-list-table-metadata-timeout"></a>

如果資料來源中有很多資料表、資料來源緩慢或網路速度慢，則呼叫 [ListTableMetadata](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListTableMetadata.html) API 可能會逾時。若要對此問題進行疑難排解，請嘗試下列步驟。
+ **檢查資料表數量** – 如果您有 1000 個以上的資料表，請嘗試減少資料表數量。為了最快獲得 `ListTableMetadata` 回應，我們建議每個目錄的資料表數量少於 1000。
+ **檢查 Lambda 組態** – 監控 Lambda 函數行為非常重要。使用聯合目錄時，請務必檢查 Lambda 函數的執行日誌。根據結果，相應地調整記憶體和逾時值。若要找出任何潛在的逾時問題，請重新檢視 Lambda 組態。如需詳細資訊，請參閱《*AWS Lambda 開發人員指南*》中的[設定 Lambda 函數逾時 (主控台)](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-timeout-console)。
+ **檢查聯合資料來源日誌** – 檢查來自聯合資料來源的日誌和錯誤訊息，以查看是否有任何問題或錯誤。日誌可以提供有關逾時原因的寶貴見解。
+ **使用 `StartQueryExecution` 擷取中繼資料** – 如果您有 1000 個以上的資料表，則使用聯合連接器擷取中繼資料可能需要比預期更長的時間。由於 [StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) 的非同步本質可確保 Athena 以最佳方式執行查詢，因此請考慮使用 `StartQueryExecution` 作為 `ListTableMetadata` 的替代。下列 AWS CLI 範例示範`StartQueryExecution`如何使用 ，而不是 `ListTableMetadata` 來取得資料目錄中資料表的所有中繼資料。

  首先，執行取得所有資料表的查詢，如下列範例所示。

  ```
  aws athena start-query-execution --region us-east-1 \
  --query-string "SELECT table_name FROM information_schema.tables LIMIT 50" \
  --work-group "your-work-group-name"
  ```

  接著，擷取個別資料表的中繼資料，如下列範例所示。

  ```
  aws athena start-query-execution --region us-east-1 \
  --query-string "SELECT * FROM information_schema.columns \
  WHERE table_name = 'your-table-name' AND \
  table_catalog = 'your-catalog-name'" \
  --work-group "your-work-group-name"
  ```

  取得結果所花費的時間取決於目錄中的資料表數量。

如需針對聯合查詢進行疑難排解的詳細資訊，請參閱 GitHub 於 awslabs/aws-athena-query-federation 一節中的 [Common\$1Problems](https://github.com/awslabs/aws-athena-query-federation/wiki/Common_Problems)，或是參閱有關各個 [Athena 資料來源連接器](connectors-available.md)的文件。

## JSON 相關錯誤
<a name="troubleshooting-athena-json-related-errors"></a>

### 嘗試讀取 JSON 資料時，發生 NULL 或資料不正確的錯誤
<a name="troubleshooting-athena-null-or-incorrect-data-errors-when-trying-to-read-json-data"></a>

當您嘗試讀取 JSON 資料時，NULL 或資料不正確的錯誤可能是由許多原因引發。若要找出在使用 OpenX SerDe 時造成錯誤的行，請將 `ignore.malformed.json` 設為 `true`。格式錯誤的記錄將以 NULL 的形式傳回。如需詳細資訊，請參閱 AWS 知識中心中的[當我嘗試在 Amazon Athena 中讀取 JSON 資料時出現錯誤](https://aws.amazon.com/premiumsupport/knowledge-center/error-json-athena/)或觀看知識中心的[影片](https://youtu.be/ME7Pv1qPFLM)。

### HIVE\$1BAD\$1DATA：剖析欄位 0 的欄位值時發生錯誤：java.lang.String 無法轉換為 org.openx.data.jsonserde.json.JSONObject
<a name="troubleshooting-athena-hive-bad-data-openx-json-serde"></a>

當 [OpenX JSON SerDe](openx-json-serde.md) 無法剖析 Athena 查詢中的資料欄時，會擲回此錯誤。如果您將資料欄定義為 `map` 或 `struct`，但基礎資料實際上是 `string`、`int` 或其他基本類型，就會發生此情況。

### HIVE\$1CURSOR\$1ERROR：資料行不是有效的 JSON 物件 - JSONException：重複索引鍵
<a name="troubleshooting-athena-hive_cursor_error-row-is-not-a-valid-json-object---jsonexception-duplicate-key"></a>

當您使用 Athena 查詢具有相同名稱之多個標籤 AWS Config 的資源時，會發生此錯誤。解決方案是使用 `WITH SERDEPROPERTIES 'case.insensitive'='false'` 執行 `CREATE TABLE` 並對應名稱。如需有關 `case.insensitive` 和映射的資訊，請參閱 [JSON SerDe 程式庫](json-serde.md)。如需詳細資訊，請參閱 AWS 知識中心的[如何在 Athena AWS Config 中讀取檔案時解析「HIVE\$1CURSOR\$1ERROR： Row 不是有效的 JSON 物件 - JSONException：複製金鑰」？](https://aws.amazon.com/premiumsupport/knowledge-center/json-duplicate-key-error-athena-config/)。

### 帶有適合列印 JSON 的 HIVE\$1CURSOR\$1ERROR 訊息
<a name="troubleshooting-athena-json-serde-hive-cursor-error"></a>

[Hive JSON SerDe](hive-json-serde.md) 和 [OpenX JSON SerDe](openx-json-serde.md) 程式庫預期每筆 JSON 文件都以單行文字表示，而且沒有行終止字元分隔記錄中的欄位。如果 JSON 文字是美化過的列印格式，則在建立資料表後嘗試在其中查詢時可能會收到下列錯誤訊息：HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object (HIVE\$1CURSOR\$1ERROR：資料列不是有效的 JSON 物件) 或 HIVE\$1CURSOR\$1ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT (HIVE\$1CURSOR\$1ERROR：JsonParseException：非預期的輸入結束：預期為 OBJECT 的關閉標記)。如需詳細資訊，請參閱 GitHub 上 OpenX SerDe 文件中的 [JSON 資料檔案](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files)。

### 多個 JSON 記錄傳回 1 的 SELECT COUNT
<a name="troubleshooting-athena-multiple-json-records-return-a-select-count-of-1"></a>

如果您使用的是 [OpenX JSON SerDe](openx-json-serde.md)，請確保記錄是以換行符號字元分隔。如需詳細資訊，請參閱 [Amazon Athena 中的 SELECT COUNT 查詢僅傳回一筆記錄，即使輸入 JSON 檔案在 知識中心有多筆記錄](https://aws.amazon.com/premiumsupport/knowledge-center/select-count-query-athena-json-records/)。 AWS 

### 無法查詢使用自訂 JSON 分類器的 AWS Glue 爬蟲程式所建立的資料表
<a name="troubleshooting-athena-cannot-query-a-table-created-by-a-glue-crawler-that-uses-a-custom-json-classifier"></a>

Athena 引擎不支援[自訂 JSON 分類器](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#custom-classifier-json)。若要解決此問題，請在不使用自訂分類器的情況下建立新的資料表。若要轉換 JSON，您可以使用 CTAS 或建立檢視。例如，如果您正在使用陣列，則可以使用 UNNEST 選項來將 JSON 扁平化。另一個選項是使用支援自訂分類器的 AWS Glue ETL 任務，將資料轉換為 Amazon S3 中的 parquet，然後在 Athena 中查詢。

## MSCK REPAIR TABLE
<a name="troubleshooting-athena-msck-repair-table"></a>

如需有關 MSCK REPAIR TABLE 相關問題的資訊，請參閱 [MSCK REPAIR TABLE](msck-repair-table.md) 頁面的[考量和限制](msck-repair-table.md#msck-repair-table-considerations)和[疑難排解](msck-repair-table.md#msck-repair-table-troubleshooting)章節。

## 輸出問題
<a name="troubleshooting-athena-output-issues"></a>

### 無法驗證/建立輸出儲存貯體
<a name="troubleshooting-athena-unable-to-verifycreate-output-bucket"></a>

如果指定的查詢結果位置不存在，或者如果沒有適當的許可，就會發生此錯誤。如需詳細資訊，請參閱 AWS 知識中心中的[如何解決 Amazon Athena 中的「無法驗證/建立輸出儲存貯體」錯誤？](https://aws.amazon.com/premiumsupport/knowledge-center/athena-output-bucket-error/)。

### TIMESTAMP 結果為空
<a name="troubleshooting-athena-timestamp-result-is-empty"></a>

Athena 需要 Java TIMESTAMP 格式。如需詳細資訊，請參閱 AWS 知識中心中的[當我在 Amazon Athena 中查詢資料表時，TIMESTAMP 結果為空](https://aws.amazon.com/premiumsupport/knowledge-center/query-table-athena-timestamp-empty/)。

### 以 CSV 以外的格式存放 Athena 查詢輸出
<a name="troubleshooting-athena-store-athena-query-output-in-a-format-other-than-csv"></a>

依預設，Athena 僅會以 CSV 格式輸出檔案。若要以不同的格式輸出 `SELECT` 查詢結果，您可以使用 `UNLOAD` 陳述式。如需詳細資訊，請參閱[UNLOAD](unload.md)。您也可以使用 CTAS 查詢，其使用 `format` [資料表屬性](create-table-as.md#ctas-table-properties)以設定輸出格式。不像 `UNLOAD`，CTAS 技術需要建立資料表。如需詳細資訊，請參閱 AWS 知識中心的[如何以 CSV 以外的格式存放 Athena 查詢輸出，例如壓縮格式？](https://aws.amazon.com/premiumsupport/knowledge-center/athena-query-output-different-format/)。

### 提供用於儲存查詢結果的 S3 位置無效
<a name="troubleshooting-athena-the-s3-location-provided-to-save-your-query-results-is-invalid"></a>

如果輸出儲存貯體位置與查詢執行所在的區域不同，則可能會收到此錯誤訊息。若要避免這種情況，請在您執行查詢的區域中指定查詢結果位置。如需這些步驟，請參閱 [指定查詢結果位置](query-results-specify-location.md)。

## Parquet 問題
<a name="troubleshooting-athena-parquet-issues"></a>

### org.apache.parquet.io.GroupColumnIO 不能轉換為 org.apache.parquet.io.PrimitiveColumnIO
<a name="troubleshooting-athena-org.apache.parquet.io.groupcolumnio-cannot-be-cast-to-org.apache.parquet.io.primitivecolumnio"></a>

此錯誤是由 parquet 結構描述不相符造成。具有非基本類型的資料欄 (例如 `array`) 已在 AWS Glue中被宣告為基本類型 (例如 `string`)。若要針對這個問題進行疑難排解，請檢查檔案中的資料結構描述，並將其與 AWS Glue中宣告的結構描述相比較。

### Parquet 統計資料問題
<a name="troubleshooting-athena-parquet-statistics-issues"></a>

當您讀取 Parquet 資料時，您可能會收到下列錯誤訊息：

```
HIVE_CANNOT_OPEN_SPLIT: Index x out of bounds for length y
HIVE_CURSOR_ERROR: Failed to read x bytes
HIVE_CURSOR_ERROR: FailureException at Malformed input: offset=x
HIVE_CURSOR_ERROR: FailureException at java.io.IOException: 
can not read class org.apache.parquet.format.PageHeader: Socket is closed by peer.
```

若要解決此問題，請使用 [CREATE TABLE](create-table.md) 或 [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md) 陳述式，將 Parquet SerDe `parquet.ignore.statistics` 屬性設定為 `true`，如下列範例所示。

CREATE TABLE 範例

```
...
ROW FORMAT SERDE  
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
WITH SERDEPROPERTIES ('parquet.ignore.statistics'='true')  
STORED AS PARQUET 
...
```

ALTER TABLE 範例

```
ALTER TABLE ... SET TBLPROPERTIES ('parquet.ignore.statistics'='true')
```

如需有關 Parquet Hive SerDe 的詳細資訊，請參閱 [Parquet SerDe](parquet-serde.md)。

## 分割問題
<a name="troubleshooting-athena-partitioning-issues"></a>

### MSCK REPAIR TABLE 不會移除過時的分割區
<a name="troubleshooting-athena-msck-repair-table-does-not-remove-stale-partitions"></a>

如果您在 Simple Storage Service (Amazon S3) 中手動刪除分割區，然後執行 MSCK REPAIR TABLE，就可能會收到錯誤訊息 Partitions missing from filesystem (檔案系統中遺失分割區)。這是因為 MSCK REPAIR TABLE 不會將過時的分割區從資料表中繼資料中移除。使用 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md) 以手動移除過時的分割區。如需詳細資訊，請參閱 [MSCK REPAIR TABLE](msck-repair-table.md) 主題中的「疑難排解」一節。

### MSCK REPAIR TABLE 失敗
<a name="troubleshooting-athena-msck-repair-table-failure"></a>

當大量的分割區 (例如，超過 100,000 個) 與特定資料表相關聯時，`MSCK REPAIR TABLE` 可能會因記憶體限制而失敗。若要解決此限制，請改用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。

### MSCK REPAIR TABLE 會偵測分割區，但不會將其新增至 AWS Glue
<a name="troubleshooting-athena-msck-repair-table-detects-partitions-but-doesnt-add-them-to-glue"></a>

如果 Simple Storage Service (Amazon S3) 路徑使用駝峰式大小寫而不是小寫，或者如果 IAM 政策不允許 `glue:BatchCreatePartition` 動作，就會發生這個問題。如需詳細資訊，請參閱《 AWS 知識中心》中的 [MSCK REPAIR TABLE 會偵測 Athena 中的分割區，但不會將其新增至 AWS Glue Data Catalog](https://aws.amazon.com/premiumsupport/knowledge-center/athena-aws-glue-msck-repair-table/)。

### 日期格式為 dd-MM-yyyy-HH-mm-ss 或 yyyy-MM-dd 的分割區投影範圍無法運作
<a name="troubleshooting-athena-partition-projection-ranges-with-the-date-format-of-dd-mm-yyyy-hh-mm-ss-or-yyyy-mm-dd-do-not-work"></a>

若要正常運作，必須將日期格式設定為 `yyyy-MM-dd HH:00:00`。如需詳細資訊，請參閱《堆疊溢出》帖文：[Athena 分割區投影無法如預期般運作](https://stackoverflow.com/questions/63943920/athena-partition-projection-not-working-as-expected)。

### PARTITION BY 不支援 BIGINT 類型
<a name="troubleshooting-athena-partition-by-doesnt-support-the-bigint-type"></a>

將資料類型轉換為 `string`，然後重試。

### 沒有可用的有意義分割區
<a name="troubleshooting-athena-no-meaningful-partitions-available"></a>

這個錯誤訊息通常表示分割區設定已損毀。若要解決這個問題，請捨棄該資料表，並建立具有新分割區的資料表。

### 分割區投影無法與範圍分割區搭配使用
<a name="troubleshooting-athena-partition-projection-does-not-work-in-conjunction-with-range-partitions"></a>

確認時間範圍單位 [projection.*<columnName>*.interval.unit](partition-projection-supported-types.md#partition-projection-date-type) 是否與分割區的分隔符號相符。例如，如果分割區以天分隔，則小時範圍單位將無法運作。

### 由連字號指定範圍時的分割區投影錯誤
<a name="troubleshooting-athena-partition-projection-range-issue-with-hyphen"></a>

使用連字號而不是逗號指定 `range` 資料表屬性會產生錯誤，例如 INVALID\$1TABLE\$1PROPERTY：針對輸入字串："*number*-*number*"。確定範圍值以逗號分隔，而非連字號。如需詳細資訊，請參閱[整數類型](partition-projection-supported-types.md#partition-projection-integer-type)。

### HIVE\$1UNKNOWN\$1ERROR：無法建立輸入格式
<a name="troubleshooting-athena-hive_unknown_error-unable-to-create-input-format-1"></a>

一或多個 glue 分割區以不同的格式宣告，因為每個 glue 分割區都有其自己的特定輸入格式。請檢查分割區的定義方式 AWS Glue。

### HIVE\$1PARTITION\$1SCHEMA\$1MISMATCH
<a name="troubleshooting-athena-hive_partition_schema_mismatch"></a>

如果分割區的結構描述與資料表的結構描述不同，查詢可能會失敗，並出現錯誤訊息 HIVE\$1PARTITION\$1SCHEMA\$1MISMATCH。

對於資料 AWS Glue 目錄中具有分割區資料欄的每個資料表，結構描述會存放在資料表層級，以及資料表中每個分割區的結構描述。 AWS Glue 爬蟲程式會根據在分割區中讀取的資料範例，填入分割區的結構描述。

當 Athena 執行查詢時，會驗證資料表的結構描述，以及查詢所需的任何分割區的結構描述。驗證會依序比較資料欄資料類型，並確認它們符合重疊的資料欄。這可避免意外的操作，例如從資料表中間新增或移除資料欄。如果 Athena 偵測到分割區的結構描述與資料表的結構描述不同，Athena 可能無法處理查詢，並且會在 `HIVE_PARTITION_SCHEMA_MISMATCH` 時操作失敗。

您有一些方式可以修正這個問題。首先，如果資料是意外新增，您可以移除造成結構描述中差異的資料檔案，捨棄分割區，並重新編目資料。第二，您可以捨棄個別分割區，然後在 Athena 內執行 `MSCK REPAIR`，以使用資料表的結構描述重新建立分割區。這個第二個選項只有在您確定套用的結構描述將可繼續正確讀取資料時才適用。

### SemanticException 資料表並未分割，但存在分割區規格
<a name="troubleshooting-athena-semanticexception-table-is-not-partitioned-but-partition-spec-exists"></a>

當未在 `CREATE TABLE` 陳述式中定義分割區時，就可能會發生此錯誤。如需詳細資訊，請參閱 AWS 知識中心中的[如何對 Athena 中的錯誤「FAILED： SemanticException 資料表未分割，但分割區規格存在」進行故障診斷？](https://aws.amazon.com/premiumsupport/knowledge-center/athena-failed-semanticexception-table/)。

### 零位元組 `_$folder$` 檔案
<a name="troubleshooting-athena-alter-table-add-partition-zero-byte-folder-files"></a>

如果您執行 `ALTER TABLE ADD PARTITION` 語句並錯誤地指定已存在的分區和不正確的 Simple Storage Service (Amazon S3) 位置，則格式為 `partition_value_$folder$` 的零位元組預留位置檔案會在 Simple Storage Service (Amazon S3) 中建立。您必須手動移除這些檔案。

若要防止這種情況發生，請使用 `ALTER TABLE ADD PARTITION` 陳述式中的 `ADD IF NOT EXISTS` 語法，如下所示：

```
ALTER TABLE table_name ADD IF NOT EXISTS PARTITIION […]
```

### 從分割資料傳回的零筆記錄
<a name="troubleshooting-athena-zero-records-returned-from-partitioned-data"></a>

基於各種原因，可能會發生此問題。如需可能的原因和解決方案，請參閱[我在 Amazon Athena 中使用定義的分割區建立資料表，但當我查詢資料表時， 知識中心會傳回零筆記錄](https://aws.amazon.com/premiumsupport/knowledge-center/athena-empty-results/)。 AWS 

另請參閱[HIVE\$1TOO\$1MANY\$1OPEN\$1PARTITIONS](#troubleshooting-athena-ctas-hive-too-many-open-partitions)。

## 許可
<a name="troubleshooting-athena-permissions"></a>

### 查詢 Amazon S3 時存取遭拒錯誤
<a name="troubleshooting-athena-access-denied-error-when-querying-amazon-s3"></a>

如果您沒有讀取儲存貯體中資料的許可、寫入結果儲存貯體的許可，或是 Simple Storage Service (Amazon S3) 路徑包含 `us-east-1.amazonaws.com` 之類的區域端點，就可能發生此狀況。如需詳細資訊，請參閱 AWS 知識中心中的[當我執行 Athena 查詢時，收到「存取遭拒」錯誤](https://aws.amazon.com/premiumsupport/knowledge-center/access-denied-athena/)。

### 在 Amazon S3 中對加密資料執行 DDL 查詢時發生存取遭拒，狀態碼：403 錯誤
<a name="troubleshooting-athena-access-denied-error-when-querying-amazon-s3-encrypted"></a>

如果以下條件為 true，您可能會收到錯誤訊息 AccessDenied (服務：Simple Storage Service (Amazon S3)；狀態碼：403；錯誤代碼：AccessDenied；請求 ID：*<request\$1id>*)：

1. 您執行 `ALTER TABLE ADD PARTITION` 或 `MSCK REPAIR TABLE` 這類 DDL 查詢。

1. 你有一個儲存貯體，其具有設定為使用 `SSE-S3` 的[預設加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/default-bucket-encryption.html)。

1. 該儲存貯體也有如下所示的儲存貯體政策，其會強制 `PutObject` 要求來指定 `PUT` 標頭 `"s3:x-amz-server-side-encryption": "true"` 和 `"s3:x-amz-server-side-encryption": "AES256"`。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Principal": "*",
               "Action": "s3:PutObject",
               "Resource": "arn:aws:s3:::<resource-name>/*",
               "Condition": {
                   "Null": {
                       "s3:x-amz-server-side-encryption": "true"
                   }
               }
           },
           {
               "Effect": "Deny",
               "Principal": "*",
               "Action": "s3:PutObject",
               "Resource": "arn:aws:s3:::<resource-name>/*",
               "Condition": {
                   "StringNotEquals": {
                       "s3:x-amz-server-side-encryption": "AES256"
                   }
               }
           }
       ]
   }
   ```

------

在這種情況下，建議的解決方案是移除像上面那樣的儲存貯體政策，因為儲存貯體的預設加密已經存在。

### 在另一個帳戶中查詢 Amazon S3 儲存貯體時發生存取遭拒，狀態碼：403
<a name="troubleshooting-athena-access-denied-with-status-code-403-when-querying-an-amazon-s3-bucket-in-another-account"></a>

當您嘗試查詢由另一個 撰寫的日誌 AWS 服務 ，而第二個帳戶是儲存貯體擁有者，但不擁有儲存貯體中的物件時，可能會發生此錯誤。如需詳細資訊，請參閱 AWS 知識中心[中的當我查詢另一個帳戶中的儲存貯體時，在 Amazon Athena 中取得「存取遭拒且狀態碼為：403」的 Amazon S3 例外 Amazon Athena](https://aws.amazon.com/premiumsupport/knowledge-center/athena-access-denied-status-code-403/)狀況。

### 使用 IAM 角色憑證來連接至 Athena JDBC 驅動程式
<a name="troubleshooting-athena-use-IAM-role-credentials-to-connect-to-the-athena-jdbc-driver"></a>

您可以擷取角色的臨時憑證，以驗證 [JDBC 與 Athena 的連線](connect-with-jdbc.md)。臨時憑證的使用壽命上限為 12 小時。如需詳細資訊，請參閱 AWS 知識中心中的[如何在使用 JDBC 驅動程式連線至 Athena 時使用 IAM 角色登入資料或切換到另一個 IAM 角色？](https://aws.amazon.com/premiumsupport/knowledge-center/athena-iam-jdbc-driver/)。

### 尚未填入必要的資料表儲存描述項
<a name="troubleshooting-athena-access-denied-table-storage"></a>

當您嘗試查詢或檢視您沒有相關許可的資料表時，就會發生這種情況。為此，建議的解決方案是透過 授予 資源的 `DESCRIBE`和 `SELECT`許可 AWS Lake Formation。如果您的資源是跨帳戶共用，其中原始資源存在於帳戶 A 中，而且您想要查詢帳戶 B 中的連結資源。您必須確保您的角色具有帳戶 A 中原始資源的 `DESCRIBE` 許可，以及帳戶 B 中連結資源的 `SELECT` 許可。

## 查詢語法問題
<a name="troubleshooting-athena-query-syntax-issues"></a>

### 失敗：NullPointerException 名稱為 null
<a name="troubleshooting-athena-nullpointerexception-name-is-null"></a>

如果您使用 AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) API 操作或 CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html) 範本建立資料表以在 Athena 中使用，而不指定 `TableType` 屬性，然後執行 DDL 查詢，例如 `SHOW CREATE TABLE`或 `MSCK REPAIR TABLE`，您可以收到錯誤訊息 FAILED：NullPointerException 名稱為 null。

若要解決錯誤，請在 API 呼叫或[CloudFormation 範本](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)中 AWS Glue `CreateTable`指定 [TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 屬性的值。`TableType` 可能的值包括 `EXTERNAL_TABLE` 或 `VIRTUAL_VIEW`。

此要求僅適用於您使用 `CreateTable` API AWS Glue 操作或 `AWS::Glue::Table` 範本建立資料表時。如果您使用 DDL 陳述式或 AWS Glue 爬蟲程式建立 Athena 資料表，則系統會為您自動定義 `TableType` 屬性。

### 未註冊函數
<a name="troubleshooting-athena-function-not-registered"></a>

當您嘗試使用 Athena 不支援的函數時，就會發生這個錯誤。如需 Athena 支援的函數清單，請參閱 [Amazon Athena 中的函數](functions.md) 或在查詢編輯器中執行 `SHOW FUNCTIONS` 陳述式。您也可撰寫自己的[使用者定義函數 (UDF)](querying-udf.md)。如需詳細資訊，請參閱 AWS 知識中心中的[如何解決 Athena 中的「未註冊函數」語法錯誤？](https://aws.amazon.com/premiumsupport/knowledge-center/athena-syntax-function-not-registered/)。

### GENERIC\$1INTERNAL\$1ERROR 例外狀況
<a name="troubleshooting-athena-generic-internal-error"></a>

`GENERIC_INTERNAL_ERROR` 例外狀況可能有各式各樣的原因，其中包括下列原因：
+ **GENERIC\$1INTERNAL\$1ERROR: Null** – 您可能會在下列任一種情況下看到此例外狀況：
  + 資料表定義中的資料欄的資料類型與資料集的實際資料類型之間存在結構描述不相符。
  + 您正在執行 `CREATE TABLE AS SELECT` (CTAS) 查詢的語法不正確。
+ **GENERIC\$1INTERNAL\$1ERROR：父系建置器為 null** – 當您查詢具有資料類型 `array` 的資料欄的資料表時，可能會看到此例外狀況，並且您正在使用 OpenCSVSerDe 程式庫。OpenCSVSerde 格式不支援 `array` 資料類型。
+ **GENERIC\$1INTERNAL\$1ERROR：值超過 MAX\$1INT** – 當來源資料欄使用資料類型 `INT` 進行定義時，您可能會看到此例外狀況，而且具有大於 2,147,483,647 的數值。
+ **GENERIC\$1INTERNAL\$1ERROR：值超過 MAX\$1BYTE** – 當來源資料欄的數值超過資料類型 `BYTE` 允許的大小時，您可能會看到此例外狀況。資料類型 `BYTE` 相當於 `TINYINT`。`TINYINT` 是以兩的補數格式表示的 8 位元帶正負號的整數，最小值為 -128 以及最大值為 127。
+ **GENERIC\$1INTERNAL\$1ERROR：分割區的值的數目與篩選的數目不相符** – 如果 Amazon Simple Storage Service(Amazon S3) 資料上有不一致的分割區，您可能會看到此例外狀況。在下列任種情況下，您可能有不一致的分割區：
  + Simple Storage Service (Amazon S3) 上的分割區已變更 (例如：已新增新的分割區)。
  + 資料表中的分割區資料欄數目與分割區中繼資料中的資料欄數目不相符。

如需這些錯誤的詳細資訊，請參閱 AWS 知識中心中的[如何在 Amazon Athena 中查詢資料表時解決錯誤「GENERIC\$1INTERNAL\$1ERROR」？](https://aws.amazon.com/premiumsupport/knowledge-center/athena-generic-internal-error/)。

### 相符群組的數目與資料欄數不符
<a name="troubleshooting-athena-number-of-matching-groups-doesnt-match-the-number-of-columns"></a>

當您在 CREATE TABLE 陳述式中使用 [Regex SerDe](regex-serde.md)，且 regex 相符群組的數量與您為資料表指定的資料欄數不相符時，就會發生此錯誤。如需詳細資訊，請參閱 AWS 知識中心中的[如何解決 amazon Athena 中的 RegexSerDe 錯誤「相符群組數量與資料欄數量不符」？](https://aws.amazon.com/premiumsupport/knowledge-center/regexserde-error-athena-matching-groups/)。

### queryString 無法滿足限制條件：成員的長度必須小於或等於 262144
<a name="troubleshooting-athena-querystring-failed-to-satisfy-constraint-member-must-have-length-less-than-or-equal-to-262144"></a>

Athena 中的最大查詢字串長度 (262，144 位元組） 不是可調整的配額。 AWS 支援 無法為您增加配額，但您可以透過將長查詢分割為較小的查詢來解決問題。如需詳細資訊，請參閱 AWS 知識中心中的[如何在 Athena 中增加最大查詢字串長度？](https://aws.amazon.com/premiumsupport/knowledge-center/athena-query-string-length/)。

### SYNTAX\$1ERROR：無法解析資料欄
<a name="troubleshooting-athena-syntax_error-column-cannot-be-resolved"></a>

當您從具有位元組順序標記 (BOM) 的 UTF-8 編碼 CSV 檔案查詢 AWS Glue 爬蟲程式建立的資料表時，可能會發生此錯誤。 AWS Glue 無法辨識 BOMs並將它們變更為 Amazon Athena 無法辨識的問號。解決方案是移除 Athena 或 AWS Glue中的問號。

### 函數呼叫的引數過多
<a name="troubleshooting-athena-too-many-arguments"></a>

在 Athena 引擎版本 3 中，函數接受的引數不能超過 127 個。此限制由設計所致。如果您使用具有 127 個以上參數的函數，則會出現如下錯誤訊息：

TOO\$1MANY\$1ARGUMENTS：行 *nnn*:*nn*：函數呼叫 *function\$1name*() 的引數過多。

要解決此問題，請在每次函數呼叫中減少參數的使用。

## 查詢逾時問題
<a name="troubleshooting-athena-query-timeout-issues"></a>

如果您的 Athena 查詢遇到逾時錯誤，請檢查 CloudTrail 日誌。查詢可能會因為調節 AWS Glue 或 Lake Formation APIs而逾時。發生這些錯誤時，對應的錯誤訊息可能會指出查詢逾時問題，而不是限流問題。若要疑難排解問題，您可以在聯絡 之前檢查您的 CloudTrail 日誌 支援。如需詳細資訊，請參閱[查詢 AWS CloudTrail 日誌](cloudtrail-logs.md)及[使用 記錄 Amazon Athena API 呼叫 AWS CloudTrail](monitor-with-cloudtrail.md)。

如需呼叫 `ListTableMetadata` API 時聯合查詢出現查詢逾時問題的相關資訊，請參閱 [呼叫 ListTableMetadata 時逾時](#troubleshooting-athena-federated-queries-list-table-metadata-timeout)。

## 調節問題
<a name="troubleshooting-athena-throttling-issues"></a>

如果您的查詢超過 Amazon S3 AWS KMS AWS Glue、 或 等相依服務的限制 AWS Lambda，則預期會發生下列訊息。若要解決這些問題，請減少來自相同帳戶的並行呼叫數目。


****  

| 服務 | 錯誤訊息 | 
| --- | --- | 
| AWS Glue | AWSGlueException︰超過費率。 | 
| AWS KMS | 您已超過可以呼叫 KMS 的費率。減少通話的頻率。 | 
| AWS Lambda |  已超過費率 TooManyRequestsException  | 
| Simple Storage Service (Amazon S3) | AmazonS3Exception︰請降低請求率。 | 

如需有關在使用 Athena 時防止 Amazon S3 限流的方法的資訊，請參閱 [防止 Amazon S3 限流](performance-tuning-s3-throttling.md)。

## 檢視
<a name="troubleshooting-athena-views"></a>

### 在 Apache Hive Shell 中建立的檢視在 Athena 中無法運作
<a name="troubleshooting-athena-views-created-in-hive-shell-do-not-work-in-athena"></a>

由於其實作方式完全不同，在 Apache Hive Shell 中建立的檢視與 Athena 不相容。若要解決此問題，請在 Athena 中重新建立檢視。

### 檢視已過時；必須重新建立
<a name="troubleshooting-athena-view-is-stale-it-must-be-re-created"></a>

如果作為檢視基礎的資料表已變更或遭到捨棄，您可能會收到此錯誤。解決方案是重新建立檢視。如需詳細資訊，請參閱 AWS 知識中心的[如何解決 Athena 中的「檢視過時；必須重新建立」錯誤？](https://aws.amazon.com/premiumsupport/knowledge-center/athena-view-is-stale-error/)。

## 工作群組
<a name="troubleshooting-athena-workgroups"></a>

如需針對工作群組問題進行疑難排解的相關資訊，請參閱[對工作群組錯誤進行疑難排解](workgroups-troubleshooting.md)。

## 其他資源
<a name="troubleshooting-athena-additional-resources"></a>

以下頁面提供針對 Amazon Athena 問題進行疑難排解的其他資訊。
+ [Athena 錯誤目錄](error-reference.md)
+ [Service Quotas](service-limits.md)
+ [在 Amazon Athena 中進行 SQL 查詢的考量事項與限制](other-notable-limitations.md)
+ [不支援的 DDL](unsupported-ddl.md)
+ [為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)
+ [Amazon Athena 中的資料類型](data-types.md)
+ [為您的資料選擇 SerDe](supported-serdes.md)
+ [在 Athena 中使用壓縮](compression-formats.md)
+ [在查詢中逸出預留關鍵字](reserved-words.md)
+ [對工作群組錯誤進行疑難排解](workgroups-troubleshooting.md)

下列 AWS 資源也可以提供幫助：
+  [AWS 知識中心的 Athena 主題](https://aws.amazon.com/premiumsupport/knowledge-center/#Amazon_Athena) 
+  [AWS re：Post 的 Amazon Athena 問題](https://repost.aws/tags/TA78iVOM7gR62_QqDe2-CmiA/amazon-athena)
+  [AWS 大數據部落格中的 Athena 貼文](https://aws.amazon.com/blogs/big-data/tag/amazon-athena/) 

疑難排解通常需要專家或小幫手社群的反覆查詢和探索。如果您在嘗試此頁面上的建議後仍遇到問題，請聯絡 AWS 支援 （在 中 AWS 管理主控台，按一下**支援**、**支援中心**) 或使用 **Amazon Athena** 標籤在 [AWS re：Post](https://repost.aws/tags/TA78iVOM7gR62_QqDe2-CmiA/amazon-athena) 上提出問題。

# Athena 錯誤目錄
<a name="error-reference"></a>

Athena 提供標準化的錯誤資訊，可協助您瞭解失敗的查詢並在查詢失敗發生後採取步驟。`AthenaError` 功能包含 `ErrorCategory` 欄位和 `ErrorType` 欄位。`ErrorCategory` 說明查詢失敗的原因是系統錯誤、使用者錯誤還是其他錯誤所引起。`ErrorType` 提供有關失敗來源的更詳細的資訊。藉由結合這兩個欄位，您可以更清楚地瞭解周圍的情況和發生的具體錯誤的原因。

## 錯誤類別
<a name="error-reference-error-category"></a>

下表列出 Athena 錯誤類別的值及其意義。


****  

| 錯誤類別 | 來源 | 
| --- | --- | 
| 1 | SYSTEM | 
| 2 | USER | 
| 3 | OTHER | 

## 錯誤類型參考
<a name="error-reference-error-type-reference"></a>

下表列出 Athena 錯誤類型的值及其意義。


****  

| 錯誤類型 | 描述 | 
| --- | --- | 
| 0 | 在此擴展因數下查詢耗盡的資源 | 
| 1 | 在此擴展因數下查詢耗盡的資源 | 
| 2 | 在此擴展因數下查詢耗盡的資源 | 
| 3 | 在此擴展因數下查詢耗盡的資源 | 
| 4 | 在此擴展因數下查詢耗盡的資源 | 
| 5 | 在此擴展因數下查詢耗盡的資源 | 
| 6 | 在此擴展因數下查詢耗盡的資源 | 
| 7 | 在此擴展因數下查詢耗盡的資源 | 
| 8 | 在此擴展因數下查詢耗盡的資源 | 
| 100 | 內部服務錯誤 | 
| 200 | 查詢引擎發生內部錯誤 | 
| 201 | 查詢引擎發生內部錯誤 | 
| 202 | 查詢引擎發生內部錯誤 | 
| 203 | 驅動程式錯誤 | 
| 204 | 中繼存放區發生錯誤 | 
| 205 | 查詢引擎發生內部錯誤 | 
| 206 | 查詢逾時 | 
| 207 | 查詢引擎發生內部錯誤 | 
| 208 | 查詢引擎發生內部錯誤 | 
| 209 | 無法取消查詢 | 
| 210 | 查詢逾時 | 
| 211 | 查詢引擎發生內部錯誤 | 
| 212 | 查詢引擎發生內部錯誤 | 
| 213 | 查詢引擎發生內部錯誤 | 
| 214 | 查詢引擎發生內部錯誤 | 
| 215 | 查詢引擎發生內部錯誤 | 
| 216 | 查詢引擎發生內部錯誤 | 
| 217 | 查詢引擎發生內部錯誤 | 
| 218 | 查詢引擎發生內部錯誤 | 
| 219 | 查詢引擎發生內部錯誤 | 
| 220 | 查詢引擎發生內部錯誤 | 
| 221 | 查詢引擎發生內部錯誤 | 
| 222 | 查詢引擎發生內部錯誤 | 
| 223 | 查詢引擎發生內部錯誤 | 
| 224 | 查詢引擎發生內部錯誤 | 
| 225 | 查詢引擎發生內部錯誤 | 
| 226 | 查詢引擎發生內部錯誤 | 
| 227 | 查詢引擎發生內部錯誤 | 
| 228 | 查詢引擎發生內部錯誤 | 
| 229 | 查詢引擎發生內部錯誤 | 
| 230 | 查詢引擎發生內部錯誤 | 
| 231 | 查詢引擎發生內部錯誤 | 
| 232 | 查詢引擎發生內部錯誤 | 
| 233 | Iceberg 錯誤 | 
| 234 | Lake Formation 錯誤 | 
| 235 | 查詢引擎發生內部錯誤 | 
| 236 | 查詢引擎發生內部錯誤 | 
| 237 | 序列化錯誤 | 
| 238 | 無法將中繼資料上傳至 Simple Storage Service (Amazon S3) | 
| 239 | 一般持久性錯誤 | 
| 240 | 無法提交查詢 | 
| 300 | 內部服務錯誤 | 
| 301 | 內部服務錯誤 | 
| 302 | 內部服務錯誤 | 
| 303 | 內部服務錯誤 | 
| 400 | 內部服務錯誤 | 
| 401 | 無法將查詢結果寫入 Simple Storage Service (Amazon S3) | 
| 402 | 無法將查詢結果寫入 Simple Storage Service (Amazon S3) | 
| 1000 | 使用者錯誤 | 
| 1001 | 資料錯誤 | 
| 1002 | 資料錯誤 | 
| 1003 | DDL 任務失敗 | 
| 1004 | 架構錯誤 | 
| 1005 | 序列化錯誤 | 
| 1006 | 語法錯誤 | 
| 1007 | 資料錯誤 | 
| 1008 | 查詢被拒絕 | 
| 1009 | 查詢失敗 | 
| 1010 | 內部服務錯誤 | 
| 1011 | 查詢被使用者取消 | 
| 1012 | 查詢引擎發生內部錯誤 | 
| 1013 | 查詢引擎發生內部錯誤 | 
| 1014 | 查詢被使用者取消 | 
| 1100 | 提供的自變數無效 | 
| 1101 | 提供的屬性無效 | 
| 1102 | 查詢引擎發生內部錯誤 | 
| 1103 | 提供的資料表屬性無效 | 
| 1104 | 查詢引擎發生內部錯誤 | 
| 1105 | 查詢引擎發生內部錯誤 | 
| 1106 | 提供的函數自變數無效 | 
| 1107 | 無效的檢視 | 
| 1108 | 無法註冊函數 | 
| 1109 | 找不到提供的 Simple Storage Service (Amazon S3) 路徑 | 
| 1110 | 提供的資料表或檢視不存在 | 
| 1200 | 不支援的查詢 | 
| 1201 | 不支持提供的解碼器 | 
| 1202 | 不支援的查詢類型 | 
| 1300 | 找不到一般錯誤 | 
| 1301 | 找不到一般實體 | 
| 1302 | 找不到檔案 | 
| 1303 | 找不到提供的函數或函數實施 | 
| 1304 | 查詢引擎發生內部錯誤 | 
| 1305 | 查詢引擎發生內部錯誤 | 
| 1306 | 找不到 Simple Storage Service (Amazon S3) 儲存貯體 | 
| 1307 | 找不到選取的引擎 | 
| 1308 | 查詢引擎發生內部錯誤 | 
| 1400 | 調節錯誤 | 
| 1401 |  AWS Glue 調節導致查詢失敗 | 
| 1402 | 查詢失敗，因為 中的資料表版本過多 AWS Glue | 
| 1403 | 查詢失敗，原因是 Simple Storage Service (Amazon S3) 調節 | 
| 1404 | 查詢失敗，原因是 Amazon Athena 調節 | 
| 1405 | 查詢失敗，原因是 Amazon Athena 調節 | 
| 1406 | 查詢失敗，原因是 Amazon Athena 調節 | 
| 1500 | 許可錯誤 | 
| 1501 | Simple Storage Service (Amazon S3) 許可錯誤 | 
| 1602 |  超過預留容量限制。沒有足夠的能力執行此查詢。  | 
| 1700 | 由於 Lake Formation 內部例外狀況，查詢失敗 | 
| 1701 | 由於 AWS Glue 內部例外狀況，查詢失敗 | 
| 9999 | 內部服務錯誤 | 

# 程式碼範例
<a name="code-samples"></a>

此主題中的範例使用 SDK for Java 2.x 做為起點來編寫 Athena 應用程式。

**注意**  
如需使用其他語言特定 AWS SDKs編寫 Athena 的詳細資訊，請參閱下列資源：  
AWS Command Line Interface (`[athena](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/index.html#cli-aws-athena)`)
適用於 .NET 的 AWS SDK ([https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Athena/NAthenaModel.html](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Athena/NAthenaModel.html)) 
適用於 C\$1\$1 的 AWS SDK (`[Aws::Athena::AthenaClient](https://sdk.amazonaws.com/cpp/api/LATEST/aws-cpp-sdk-athena/html/class_aws_1_1_athena_1_1_athena_client.html)`)
適用於 Go 的 AWS SDK ([https://docs.aws.amazon.com/sdk-for-go/api/service/athena/](https://docs.aws.amazon.com/sdk-for-go/api/service/athena/)) 
適用於 JavaScript 的 AWS SDK v3 ([https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/athena/](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/athena/)) 
適用於 PHP 的 AWS SDK 3.x ([https://docs.aws.amazon.com/aws-sdk-php/v3/api/namespace-Aws.Athena.html](https://docs.aws.amazon.com/aws-sdk-php/v3/api/namespace-Aws.Athena.html)) 
適用於 Python (Boto3) 的 AWS SDK ([https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/athena.html](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/athena.html)) 
適用於 Ruby 的 AWS SDK v3 ([https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/Athena/Client.html](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/Athena/Client.html)) 

如需有關本節中執行 Java 程式碼範例的詳細資訊，請參閱 GitHub 上的 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples)中的 [Amazon Athena Java 讀我檔案](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/example_code/athena)。如需 Athena 的 Java 程式設計參考，請參閱 AWS SDK for Java 2.x中的 [AthenaClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/athena/AthenaClient.html)。

**注意**  
這些範例會對在 `ExampleConstants.java` 類別宣告中定義的字串使用常數 (例如 `ATHENA_SAMPLE_QUERY`)。將這些常數取代為您自己的字串或定義的常數。

**Topics**
+ [常數](constants.md)
+ [建立用戶端以存取 Athena](create-a-client-to-access-athena.md)
+ [開始查詢執行](start-query-execution.md)
+ [停止查詢執行](stop-query-execution.md)
+ [列出查詢執行](list-query-executions.md)
+ [建立具名查詢](create-a-named-query.md)
+ [刪除具名查詢](delete-a-named-query.md)
+ [列出具名查詢](list-named-queries.md)

# 常數
<a name="constants"></a>

`ExampleConstants.java` 類別示範如何在 Athena 中查詢由 [開始使用](getting-started.md) 教學課程建立的資料表。

```
package aws.example.athena;

public class ExampleConstants {

    public static final int CLIENT_EXECUTION_TIMEOUT = 100000;
    public static final String ATHENA_OUTPUT_BUCKET = "s3://bucketscott2"; // change the Amazon S3 bucket name to match
                                                                           // your environment
    // Demonstrates how to query a table with a comma-separated value (CSV) table.
    // For information, see
    // https://docs.aws.amazon.com/athena/latest/ug/work-with-data.html
    public static final String ATHENA_SAMPLE_QUERY = "SELECT * FROM scott2;"; // change the Query statement to match
                                                                              // your environment
    public static final long SLEEP_AMOUNT_IN_MS = 1000;
    public static final String ATHENA_DEFAULT_DATABASE = "mydatabase"; // change the database to match your database

}
```

# 建立用戶端以存取 Athena
<a name="create-a-client-to-access-athena"></a>

`AthenaClientFactory.java` 類別說明如何建立和設定 Amazon Athena 用戶端。

```
package aws.example.athena;

import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.athena.AthenaClient;
import software.amazon.awssdk.services.athena.AthenaClientBuilder;

public class AthenaClientFactory {
    private final AthenaClientBuilder builder = AthenaClient.builder()
            .region(Region.US_WEST_2)
            .credentialsProvider(ProfileCredentialsProvider.create());

    public AthenaClient createClient() {
        return builder.build();
    }
}
```

# 開始查詢執行
<a name="start-query-execution"></a>

`StartQueryExample` 說明如何將查詢提交至 Athena，請等待結果產生，然後處理結果。

```
package aws.example.athena;

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.athena.AthenaClient;
import software.amazon.awssdk.services.athena.model.QueryExecutionContext;
import software.amazon.awssdk.services.athena.model.ResultConfiguration;
import software.amazon.awssdk.services.athena.model.StartQueryExecutionRequest;
import software.amazon.awssdk.services.athena.model.StartQueryExecutionResponse;
import software.amazon.awssdk.services.athena.model.AthenaException;
import software.amazon.awssdk.services.athena.model.GetQueryExecutionRequest;
import software.amazon.awssdk.services.athena.model.GetQueryExecutionResponse;
import software.amazon.awssdk.services.athena.model.QueryExecutionState;
import software.amazon.awssdk.services.athena.model.GetQueryResultsRequest;
import software.amazon.awssdk.services.athena.model.GetQueryResultsResponse;
import software.amazon.awssdk.services.athena.model.ColumnInfo;
import software.amazon.awssdk.services.athena.model.Row;
import software.amazon.awssdk.services.athena.model.Datum;
import software.amazon.awssdk.services.athena.paginators.GetQueryResultsIterable;
import java.util.List;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class StartQueryExample {

    public static void main(String[] args) throws InterruptedException {
        AthenaClient athenaClient = AthenaClient.builder()
                .region(Region.US_WEST_2)
                .build();

        String queryExecutionId = submitAthenaQuery(athenaClient);
        waitForQueryToComplete(athenaClient, queryExecutionId);
        processResultRows(athenaClient, queryExecutionId);
        athenaClient.close();
    }

    // Submits a sample query to Amazon Athena and returns the execution ID of the
    // query.
    public static String submitAthenaQuery(AthenaClient athenaClient) {
        try {
            // The QueryExecutionContext allows us to set the database.
            QueryExecutionContext queryExecutionContext = QueryExecutionContext.builder()
                    .database(ExampleConstants.ATHENA_DEFAULT_DATABASE)
                    .build();

            // The result configuration specifies where the results of the query should go.
            ResultConfiguration resultConfiguration = ResultConfiguration.builder()
                    .outputLocation(ExampleConstants.ATHENA_OUTPUT_BUCKET)
                    .build();

            StartQueryExecutionRequest startQueryExecutionRequest = StartQueryExecutionRequest.builder()
                    .queryString(ExampleConstants.ATHENA_SAMPLE_QUERY)
                    .queryExecutionContext(queryExecutionContext)
                    .resultConfiguration(resultConfiguration)
                    .build();

            StartQueryExecutionResponse startQueryExecutionResponse = athenaClient
                    .startQueryExecution(startQueryExecutionRequest);
            return startQueryExecutionResponse.queryExecutionId();

        } catch (AthenaException e) {
            e.printStackTrace();
            System.exit(1);
        }
        return "";
    }

    // Wait for an Amazon Athena query to complete, fail or to be cancelled.
    public static void waitForQueryToComplete(AthenaClient athenaClient, String queryExecutionId)
            throws InterruptedException {
        GetQueryExecutionRequest getQueryExecutionRequest = GetQueryExecutionRequest.builder()
                .queryExecutionId(queryExecutionId)
                .build();

        GetQueryExecutionResponse getQueryExecutionResponse;
        boolean isQueryStillRunning = true;
        while (isQueryStillRunning) {
            getQueryExecutionResponse = athenaClient.getQueryExecution(getQueryExecutionRequest);
            String queryState = getQueryExecutionResponse.queryExecution().status().state().toString();
            if (queryState.equals(QueryExecutionState.FAILED.toString())) {
                throw new RuntimeException(
                        "The Amazon Athena query failed to run with error message: " + getQueryExecutionResponse
                                .queryExecution().status().stateChangeReason());
            } else if (queryState.equals(QueryExecutionState.CANCELLED.toString())) {
                throw new RuntimeException("The Amazon Athena query was cancelled.");
            } else if (queryState.equals(QueryExecutionState.SUCCEEDED.toString())) {
                isQueryStillRunning = false;
            } else {
                // Sleep an amount of time before retrying again.
                Thread.sleep(ExampleConstants.SLEEP_AMOUNT_IN_MS);
            }
            System.out.println("The current status is: " + queryState);
        }
    }

    // This code retrieves the results of a query
    public static void processResultRows(AthenaClient athenaClient, String queryExecutionId) {
        try {
            // Max Results can be set but if its not set,
            // it will choose the maximum page size.
            GetQueryResultsRequest getQueryResultsRequest = GetQueryResultsRequest.builder()
                    .queryExecutionId(queryExecutionId)
                    .build();

            GetQueryResultsIterable getQueryResultsResults = athenaClient
                    .getQueryResultsPaginator(getQueryResultsRequest);
            for (GetQueryResultsResponse result : getQueryResultsResults) {
                List<ColumnInfo> columnInfoList = result.resultSet().resultSetMetadata().columnInfo();
                List<Row> results = result.resultSet().rows();
                processRow(results, columnInfoList);
            }

        } catch (AthenaException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    private static void processRow(List<Row> row, List<ColumnInfo> columnInfoList) {
        for (Row myRow : row) {
            List<Datum> allData = myRow.data();
            for (Datum data : allData) {
                System.out.println("The value of the column is " + data.varCharValue());
            }
        }
    }
}
```

# 停止查詢執行
<a name="stop-query-execution"></a>

`StopQueryExecutionExample` 會執行範例查詢、立即停止查詢，以及檢查查詢狀態，以確保已取消查詢。

```
package aws.example.athena;

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.athena.AthenaClient;
import software.amazon.awssdk.services.athena.model.StopQueryExecutionRequest;
import software.amazon.awssdk.services.athena.model.GetQueryExecutionRequest;
import software.amazon.awssdk.services.athena.model.GetQueryExecutionResponse;
import software.amazon.awssdk.services.athena.model.QueryExecutionState;
import software.amazon.awssdk.services.athena.model.AthenaException;
import software.amazon.awssdk.services.athena.model.QueryExecutionContext;
import software.amazon.awssdk.services.athena.model.ResultConfiguration;
import software.amazon.awssdk.services.athena.model.StartQueryExecutionRequest;
import software.amazon.awssdk.services.athena.model.StartQueryExecutionResponse;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class StopQueryExecutionExample {
    public static void main(String[] args) {
        AthenaClient athenaClient = AthenaClient.builder()
                .region(Region.US_WEST_2)
                .build();

        String sampleQueryExecutionId = submitAthenaQuery(athenaClient);
        stopAthenaQuery(athenaClient, sampleQueryExecutionId);
        athenaClient.close();
    }

    public static void stopAthenaQuery(AthenaClient athenaClient, String sampleQueryExecutionId) {
        try {
            StopQueryExecutionRequest stopQueryExecutionRequest = StopQueryExecutionRequest.builder()
                    .queryExecutionId(sampleQueryExecutionId)
                    .build();

            athenaClient.stopQueryExecution(stopQueryExecutionRequest);
            GetQueryExecutionRequest getQueryExecutionRequest = GetQueryExecutionRequest.builder()
                    .queryExecutionId(sampleQueryExecutionId)
                    .build();

            GetQueryExecutionResponse getQueryExecutionResponse = athenaClient
                    .getQueryExecution(getQueryExecutionRequest);
            if (getQueryExecutionResponse.queryExecution()
                    .status()
                    .state()
                    .equals(QueryExecutionState.CANCELLED)) {

                System.out.println("The Amazon Athena query has been cancelled!");
            }

        } catch (AthenaException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    // Submits an example query and returns a query execution Id value
    public static String submitAthenaQuery(AthenaClient athenaClient) {
        try {
            QueryExecutionContext queryExecutionContext = QueryExecutionContext.builder()
                    .database(ExampleConstants.ATHENA_DEFAULT_DATABASE)
                    .build();

            ResultConfiguration resultConfiguration = ResultConfiguration.builder()
                    .outputLocation(ExampleConstants.ATHENA_OUTPUT_BUCKET)
                    .build();

            StartQueryExecutionRequest startQueryExecutionRequest = StartQueryExecutionRequest.builder()
                    .queryExecutionContext(queryExecutionContext)
                    .queryString(ExampleConstants.ATHENA_SAMPLE_QUERY)
                    .resultConfiguration(resultConfiguration).build();

            StartQueryExecutionResponse startQueryExecutionResponse = athenaClient
                    .startQueryExecution(startQueryExecutionRequest);
            return startQueryExecutionResponse.queryExecutionId();

        } catch (AthenaException e) {
            e.printStackTrace();
            System.exit(1);
        }
        return null;

    }
}
```

# 列出查詢執行
<a name="list-query-executions"></a>

`ListQueryExecutionsExample` 說明如何取得查詢執行 ID 的清單。

```
package aws.example.athena;

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.athena.AthenaClient;
import software.amazon.awssdk.services.athena.model.AthenaException;
import software.amazon.awssdk.services.athena.model.ListQueryExecutionsRequest;
import software.amazon.awssdk.services.athena.model.ListQueryExecutionsResponse;
import software.amazon.awssdk.services.athena.paginators.ListQueryExecutionsIterable;
import java.util.List;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class ListQueryExecutionsExample {
    public static void main(String[] args) {
        AthenaClient athenaClient = AthenaClient.builder()
                .region(Region.US_WEST_2)
                .build();

        listQueryIds(athenaClient);
        athenaClient.close();
    }

    public static void listQueryIds(AthenaClient athenaClient) {
        try {
            ListQueryExecutionsRequest listQueryExecutionsRequest = ListQueryExecutionsRequest.builder().build();
            ListQueryExecutionsIterable listQueryExecutionResponses = athenaClient
                    .listQueryExecutionsPaginator(listQueryExecutionsRequest);
            for (ListQueryExecutionsResponse listQueryExecutionResponse : listQueryExecutionResponses) {
                List<String> queryExecutionIds = listQueryExecutionResponse.queryExecutionIds();
                System.out.println("\n" + queryExecutionIds);
            }

        } catch (AthenaException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}
```

# 建立具名查詢
<a name="create-a-named-query"></a>

`CreateNamedQueryExample` 說明如何建立具名查詢。

```
package aws.example.athena;

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.athena.AthenaClient;
import software.amazon.awssdk.services.athena.model.AthenaException;
import software.amazon.awssdk.services.athena.model.CreateNamedQueryRequest;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */

public class CreateNamedQueryExample {
    public static void main(String[] args) {
        final String USAGE = """

                Usage:
                    <name>

                Where:
                    name - the name of the Amazon Athena query.\s
                """;

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String name = args[0];
        AthenaClient athenaClient = AthenaClient.builder()
                .region(Region.US_WEST_2)
                .build();

        createNamedQuery(athenaClient, name);
        athenaClient.close();
    }

    public static void createNamedQuery(AthenaClient athenaClient, String name) {
        try {
            // Create the named query request.
            CreateNamedQueryRequest createNamedQueryRequest = CreateNamedQueryRequest.builder()
                    .database(ExampleConstants.ATHENA_DEFAULT_DATABASE)
                    .queryString(ExampleConstants.ATHENA_SAMPLE_QUERY)
                    .description("Sample Description")
                    .name(name)
                    .build();

            athenaClient.createNamedQuery(createNamedQueryRequest);
            System.out.println("Done");

        } catch (AthenaException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}
```

# 刪除具名查詢
<a name="delete-a-named-query"></a>

`DeleteNamedQueryExample` 說明如何使用具名查詢 ID 來刪除具名查詢。

```
package aws.example.athena;

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.athena.AthenaClient;
import software.amazon.awssdk.services.athena.model.DeleteNamedQueryRequest;
import software.amazon.awssdk.services.athena.model.AthenaException;
import software.amazon.awssdk.services.athena.model.CreateNamedQueryRequest;
import software.amazon.awssdk.services.athena.model.CreateNamedQueryResponse;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class DeleteNamedQueryExample {
    public static void main(String[] args) {
        final String USAGE = """

                Usage:
                    <name>

                Where:
                    name - the name of the Amazon Athena query.\s
                """;

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String name = args[0];
        AthenaClient athenaClient = AthenaClient.builder()
                .region(Region.US_WEST_2)
                .build();

        String sampleNamedQueryId = getNamedQueryId(athenaClient, name);
        deleteQueryName(athenaClient, sampleNamedQueryId);
        athenaClient.close();
    }

    public static void deleteQueryName(AthenaClient athenaClient, String sampleNamedQueryId) {
        try {
            DeleteNamedQueryRequest deleteNamedQueryRequest = DeleteNamedQueryRequest.builder()
                    .namedQueryId(sampleNamedQueryId)
                    .build();

            athenaClient.deleteNamedQuery(deleteNamedQueryRequest);

        } catch (AthenaException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    public static String getNamedQueryId(AthenaClient athenaClient, String name) {
        try {
            CreateNamedQueryRequest createNamedQueryRequest = CreateNamedQueryRequest.builder()
                    .database(ExampleConstants.ATHENA_DEFAULT_DATABASE)
                    .queryString(ExampleConstants.ATHENA_SAMPLE_QUERY)
                    .name(name)
                    .description("Sample description")
                    .build();

            CreateNamedQueryResponse createNamedQueryResponse = athenaClient.createNamedQuery(createNamedQueryRequest);
            return createNamedQueryResponse.namedQueryId();

        } catch (AthenaException e) {
            e.printStackTrace();
            System.exit(1);
        }
        return null;
    }
}
```

# 列出具名查詢
<a name="list-named-queries"></a>

`ListNamedQueryExample` 說明如何取得具名查詢 ID 的清單。

```
package aws.example.athena;

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.athena.AthenaClient;
import software.amazon.awssdk.services.athena.model.AthenaException;
import software.amazon.awssdk.services.athena.model.ListNamedQueriesRequest;
import software.amazon.awssdk.services.athena.model.ListNamedQueriesResponse;
import software.amazon.awssdk.services.athena.paginators.ListNamedQueriesIterable;
import java.util.List;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class ListNamedQueryExample {
    public static void main(String[] args) {
        AthenaClient athenaClient = AthenaClient.builder()
                .region(Region.US_WEST_2)
                .build();

        listNamedQueries(athenaClient);
        athenaClient.close();
    }

    public static void listNamedQueries(AthenaClient athenaClient) {
        try {
            ListNamedQueriesRequest listNamedQueriesRequest = ListNamedQueriesRequest.builder()
                    .build();

            ListNamedQueriesIterable listNamedQueriesResponses = athenaClient
                    .listNamedQueriesPaginator(listNamedQueriesRequest);
            for (ListNamedQueriesResponse listNamedQueriesResponse : listNamedQueriesResponses) {
                List<String> namedQueryIds = listNamedQueriesResponse.namedQueryIds();
                System.out.println(namedQueryIds);
            }

        } catch (AthenaException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}
```