

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

# 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/)。