

# 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 の環境変数で設定します。
+ **接続文字列** – データベースインスタンスへの接続を確立するために使用されるテキスト文字列。
+ **カタログ** – Athena に登録された AWS Glue ではないカタログ。これは、`connection_string` プロパティに必須のプレフィックスです。
+ **マルチプレックスハンドラー** – 複数のデータベース接続を受け入れて使用することが可能な Lambda ハンドラー。

## パラメータ
<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** – 指定されたスキーマ名とテーブル名の大文字と小文字は変更しないでください。これは、グルー接続が関連付けられているコネクタのデフォルトです。
  + **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 では以下のクラスを使用します。


****  

| Handler | Class | 
| --- | --- | 
| 複合ハンドラー | HiveMuxCompositeHandler | 
| メタデータハンドラー | HiveMuxMetadataHandler | 
| レコードハンドラー | HiveMuxRecordHandler | 

##### マルチプレックスハンドラーのパラメータ
<a name="connectors-cloudera-hive-multiplexing-handler-parameters"></a>


****  

| パラメータ | 説明 | 
| --- | --- | 
| \$1catalog\$1connection\$1string | 必須。データベースインスタンスの接続文字列。環境変数には、Athena で使用されているカタログの名前をプレフィックスします。例えば、Athena に登録されたカタログが myhivecatalog の場合、環境変数の名前は myhivecatalog\$1connection\$1string になります。 | 
| default | 必須。デフォルトの接続文字列。この文字列は、カタログが lambda:\$1\$1AWS\$1LAMBDA\$1FUNCTION\$1NAME\$1 の場合に使用されます。 | 

以下に、2 つのデータベースインスタンス (デフォルト値の `hive1`、および `hive2`) をサポートする、Hive MUX Lambda 関数のプロパティ例を示します。


****  

| プロパティ | 値 | 
| --- | --- | 
| 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 で使用するには、Secrets Manager に接続するための[インターネットアクセス](https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/)または [VPC エンドポイント](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)が、Lambda 関数に接続されている VPC に必要です。

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 インスタンスに接続できます。


****  

| ハンドラーのタイプ | Class | 
| --- | --- | 
| 複合ハンドラー | HiveCompositeHandler | 
| メタデータハンドラー | HiveMetadataHandler | 
| レコードハンドラー | HiveRecordHandler | 

##### 単一接続ハンドラーのパラメータ
<a name="connectors-cloudera-hive-single-connection-handler-parameters"></a>


****  

| パラメータ | 説明 | 
| --- | --- | 
| default | 必須。デフォルトの接続文字列。 | 

単一接続ハンドラーでは、1 つのデータベースインスタンスがサポートされます。また、`default` 接続文字列パラメータを指定する必要があります。他のすべての接続文字列は無視されます。

次は、Lambda 関数でサポートされている単一の Cloudera Hive インスタンス用のプロパティ例です。


****  

| プロパティ | 値 | 
| --- | --- | 
| デフォルト | 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 関数によってアクセスされるすべてのデータベースインスタンスは、同じ場所にスピルします。


****  

| パラメータ | 説明 | 
| --- | --- | 
| spill\$1bucket | 必須。スピルバケット名。 | 
| spill\$1prefix | 必須。スピルバケットのキープレフィックス | 
| spill\$1put\$1request\$1headers | (オプション) スピルに使用される Amazon S3 の putObject リクエスト (例:\$1"x-amz-server-side-encryption" : "AES256"\$1) における、リクエストヘッダーと値に関する JSON でエンコードされたマッピング。利用可能な他のヘッダーについては、「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 | 
| --- | --- | --- | 
| ブール値 | ブール値 | Bit | 
| 整数 | TINYINT | Tiny | 
| ショート | SMALLINT | Smallint | 
| 整数 | INT | Int | 
| Long | BIGINT | Bigint | 
| float | float4 | Float4 | 
| ダブル | float8 | Float8 | 
| 日付 | date | DateDay | 
| タイムスタンプ | timestamp | DateMilli | 
| String | VARCHAR | Varchar | 
| バイト | bytes | Varbinary | 
| BigDecimal | 10 進数 | 10 進数 | 
| 配列 | 該当なし (注記を参照) | リスト | 

**注記**  
現在のところ、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` プッシュダウンを使用すると、コネクタは `N` 行のみを Athena に返します。

### 述語
<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
+ **Arithmetic: **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)を参照してください。