

# 外部の Hive メタストアを使用する
<a name="connect-to-data-source-hive"></a>

Apache Hive メタストアを使用する Amazon S3 内のデータセットをクエリするには、外部 Hive メタストア用の Amazon Athena データコネクタを使用できます。AWS Glue Data Catalog へのメタデータの移行は不要です。Athena マネジメントコンソールでプライベート VPC 内の Hive メタストアと通信する Lambda 関数を設定してから、それをメタストアに接続します。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 実行ロールを使用して Hive メタストアに Athena を接続する](connect-data-source-hive-existing-iam-role.md)
+ [デプロイ済みの Hive メタストアコネクタを使用するように Athena を設定する](connect-data-source-hive-existing-lambda.md)
+ [外部 Hive メタストアクエリでカタログ名を省略する](datastores-hive-default-catalog.md)
+ [Hive ビューを使用する](hive-views.md)
+ [Hive メタストアで AWS CLI を使用する](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 クエリでそれらを結合する。
+ AWS Glue Data Catalog と外部 Hive メタストアを同じ Athena クエリで使用する。
+ クエリ実行コンテキストのカタログを現在のデフォルトカタログとして指定する。これにより、クエリのデータベース名にカタログ名のプレフィックスを付ける必要がなくなります。構文 `catalog.database.table` を使用する代わりに、`database.table` を使用できます。
+ さまざまなツールを使用して、外部 Hive メタストアを参照するクエリを実行する。これには、Athena コンソール、AWS CLI、AWS SDK、Athena API、更新された Athena JDBC および ODBC ドライバーを使用できます。更新されたドライバーは、カスタムカタログをサポートしています。

### API サポート
<a name="connect-to-a-data-source-hive-features-api"></a>

外部 Hive メタデータ用の Athena データコネクタには、カタログ登録 API オペレーションとメタデータ API オペレーションのサポートが含まれています。
+ **カタログ登録** – 外部 Hive メタストアと[フェデレーティッドデータソース](federated-queries.md)用のカスタムカタログを登録します。
+ **メタデータ** – メタデータ API を使用して、AWS Glue と、Athena に登録した任意のカタログのデータベースとテーブル情報を提供します。
+ **Athena JAVA SDK クライアント** – 更新された Athena Java SDK クライアントのカタログ登録 API、メタデータ API、および `StartQueryExecution` オペレーションでのカタログのサポートを使用します。

### リファレンス実装
<a name="connect-to-a-data-source-hive-features-reference-implementation"></a>

Athena は、外部 Hive メタストアに接続する Lambda 関数のリファレンス実装を提供します。リファレンス実装は、[Athena Hive メタストア](https://github.com/awslabs/aws-athena-hive-metastore)のオープンソースプロジェクトとして GitHub で提供されています。

リファレンス実装は、AWS SAM (SAR) で次の 2 つの AWS Serverless Application Repository アプリケーションとして利用できます。これらのアプリケーションのいずれかを SAR で使用して、独自の Lambda 関数を作成できます。
+ `AthenaHiveMetastoreFunction` – Uber Lambda 関数 `.jar` ファイルです。「uber」JAR (fat JAR、または依存関係が含まれる JAR としても知られています) は、Java プログラムとその依存関係の両方を単一のファイルに収めた `.jar` ファイルです。
+ `AthenaHiveMetastoreFunctionWithLayer` – Lambda レイヤーと thin Lambda 関数 `.jar` ファイルです。

## ワークフロー
<a name="connect-to-data-source-hive-workflow"></a>

以下の図は、Athena が外部 Hive メタストアとどのようにやり取りするかを説明しています。

![\[Athena が外部の Hive メタストアとやり取りする方法です。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/connect-to-data-source-hive-workflow.png)


このワークフローでは、データベースに接続された Hive メタストアが VPC 内にあります。Hive Server2 を使用して、Hive CLI を使用して Hive メタストアを管理します。

Athena から外部 Hive メタストアを使用するワークフローには、以下のステップが含まれます。

1. VPC 内の Hive メタストアに Athena を接続する Lambda 関数を作成します。

1. Hive メタストアの一意のカタログ名をアカウントに登録し、対応する関数名を登録します。

1. カタログ名を使用する Athena DML または DDL クエリを実行すると、Athena クエリエンジンがそのカタログ名に関連付けられた Lambda 関数名を呼び出します。

1. AWS PrivateLink を使用すると、Lambda 関数が VPC 内の外部 Hive メタストアと通信し、メタデータリクエストに対する応答を受け取ります。Athena は、デフォルトの AWS Glue Data Catalogからのメタデータを使用する場合と同様に、外部 Hive メタストアからのメタデータを使用します。

## 考慮事項と制限事項
<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 認証はサポートされていません。
+ 外部 Hive メタストア、または[フェデレーティッドクエリ](federated-queries.md)で JDBC ドライバーを使用するには、JDBC 接続文字列に `MetadataRetrievalMethod=ProxyAPI` を含めます。JDBC ドライバーの詳細については、「[JDBC で Amazon Athena に接続する](connect-with-jdbc.md)」を参照してください。
+ Hive の非表示列 である `$path`、`$bucket`、`$file_size`、`$file_modified_time`、`$partition`、`$row_id` はきめ細かいアクセス制御フィルタリングには使用できません。
+ `example_table$partitions` や `example_table$properties` などの Hive 非表示システムテーブルでは、きめ細かなアクセス制御はサポートされていません。

### アクセス許可
<a name="connect-to-a-data-source-hive-considerations-permissions"></a>

構築済みのデータソースコネクタは、正しく機能するために、次のリソースへのアクセスが必要になる場合があります。使用するコネクタの情報をチェックして、VPC が正しく設定されていることを確認します。Athena でクエリを実行してデータソースコネクタを作成するために必要な IAM 許可については、「[外部 Hive メタストア用の Athena データコネクタへのアクセスを許可する](hive-metastore-iam-access.md)」および「[外部 Hive メタストアへの Lambda 関数アクセスを許可する](hive-metastore-iam-access-lambda.md)」を参照してください。
+ **Simple Storage Service (Amazon S3)** – データコネクタは、Athena のクエリ結果が保存される Amazon S3 内の場所にクエリ結果を書き込むほか、Amazon S3 のスピルバケットにも書き込みます。この 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 でのアイデンティティとアクセス権の管理](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 関数の作成時に指定する Amazon S3 の場所にスピルされます。Athena は、これらのレスポンスを Amazon S3 から直接読み込みます。

**注記**  
Athena は 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 実行ロールを使用して Hive メタストアに Athena を接続する](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/ja_jp/athena/latest/ug/images/nav-pane-expansion.png)

1. **[データソースとカタログ]** を選択します。

1. コンソールの右上で、[**Create data source**] (データソースの作成) を選択します。

1. [**Choose a data source**] (データソースの選択) ページの [**Data sources**] (データソース) で、**[S3 - Apache Hive metastore]** (S3 – Apache Hive メタストア) を選択します。

1. [**次へ**] を選択します。

1. **[Data source details]** (データソースの詳細) セクションの **[Data source name]** (データソース名) に、Athena からデータソースをクエリする際に SQL ステートメントで使用する名前を入力します。名前は最大 127 文字で、アカウント内で一意である必要があります。この設定は、作成後に変更することはできません。有効な文字は、a～z、A～Z、0～9、\$1 (アンダースコア)、@ (at マーク)、および - (ハイフン) です。`awsdatacatalog`、`hive`、`jmx`、および `system` の名前は Athena によって予約されており、データソース名には使用できません。

1. **[Lambda 関数]** で **[Lambda 関数の作成]** を選択してから、**[AWS Lambda で新しい関数を作成]** を選択します。

   AWS Lambda コンソールに [**AthenaHiveMetastoreFunction**] ページが開きます。このページには、コネクタに関する詳細情報が表示されます。  
![\[AWS Lambda コンソールの[AthenaHiveMetastoreFunction] ページ。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/connect-to-data-source-hive-4.png)

1. [**Application settings**] (アプリケーションの設定) で Lambda 関数のパラメータを入力します。
   + **[LambdaFuncName]** – 関数の名前を指定します。たとえば、**myHiveMetastore** です。
   + **[SpillLocation]** (スピル場所) - Lambda 関数のレスポンスサイズが 4 MB を超える場合にスピルオーバーメタデータを保持するための、このアカウント内の Amazon S3 の場所を指定します。
   + **[HMSUris]** – ポート 9083 で Thrift プロトコルを使用する Hive メタストアホストの URI を入力します。`thrift://<host_name>:9083` 構文を使用してください。
   + **[LambdaMemory]** - 128 MB から 3,008 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 and resource policies]** (このアプリがカスタム IAM ロールとリソースポリシーを作成することを承認します) を選択した後、**[Deploy]** (デプロイ) を選択します。  
![\[AWS Lambda コンソールから Lambda 関数アプリをデプロイします。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/connect-to-data-source-hive-4a.png)

   デプロイが完了すると、Lambda アプリケーションのリストにこの関数が表示されます。Hive メタストア関数がアカウントにデプロイされたところで、それを使用するように Athena を設定できます。

1. Athena コンソールの [**Connect data sources**] (データソースを接続) ページに戻ります。

1. [**Lambda function**] セクションで、Lambda 関数の検索ボックスの横にある更新アイコンをクリックします。利用できる関数のリストを更新すると、新しく作成した関数がリストに表示されます。

1. Lambda コンソールで作成した関数の名前を選択します。Lambda 関数の ARN が表示されます。

1. (オプション) **[Tags]** (タグ) でキーと値のペアを追加して、このデータソースに関連付けます。タグの詳細については、[Athena リソースにタグ付けする](tags.md)を参照してください。

1. [**次へ**] を選択します。

1. [**Review and create**] (確認と作成) ページで、データソースの詳細について確認し、[**Add data source**] (データソースの追加) を選択します。

1. データソースのページの [**データソースの詳細**] セクションには、新しいコネクタに関する情報が表示されます。

   これで、指定した **[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 データソースコネクタをデプロイする際は、Athena コンソールから始める代わりに [AWS Serverless Application Repository](https://aws.amazon.com/serverless/serverlessrepo/) を使用できます。AWS Serverless Application Repository により、使用する対象のコネクタを検索し、コネクタに必要なパラメータを指定した上で、そのコネクタをアカウントにデプロイします。コネクタのデプロイが完了したら、Athena コンソールを使用して Athena がデータソースを使用できるようにします。

**AWS Serverless Application Repository を使用して Hive のデータソースコネクタをアカウントにデプロイするには**

1. AWS マネジメントコンソール にサインインし、**サーバーレスアプリケーションリポジトリ**を開きます。

1. ナビゲーションペインで、[**Available applications**] (利用可能なアプリケーション) を選択します。

1. **[Show apps that create custom roles or resource policies]** (カスタム IAM ロールまたはリソースポリシーを作成するアプリを表示する) オプションを選択します。

1. 検索ボックスに「**Hive**」と入力します。表示されるコネクタには、次の 2 つがあります。
   + **AthenaHiveMetastoreFunction** – Uber Lambda 関数の `.jar` ファイル。
   + **AthenaHiveMetastoreFunctionWithLayer** – Lambda レイヤーと thin Lambda 関数の `.jar` ファイル。

    2 つのアプリケーションの機能は同じで、実装のみが異なります。どちらか 1 つを使用して、Athena を Hive メタストアに接続する Lambda 関数を作成できます。

1. 使用するコネクタの名前を選択します。このチュートリアルでは **AthenaHiveMetastoreFunction** を使用します。  
![\[Hive 用の Athena データソースコネクタの名前を選択します。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/connect-data-source-sar-hive-1.png)

1. [**Application settings**] (アプリケーションの設定) で Lambda 関数のパラメータを入力します。
   + **[LambdaFuncName]** – 関数の名前を指定します。たとえば、**myHiveMetastore** です。
   + **[SpillLocation]** (スピル場所) - Lambda 関数のレスポンスサイズが 4 MB を超える場合にスピルオーバーメタデータを保持するための、このアカウント内の Amazon S3 の場所を指定します。
   + **[HMSUris]** – ポート 9083 で Thrift プロトコルを使用する Hive メタストアホストの URI を入力します。`thrift://<host_name>:9083` 構文を使用してください。
   + **[LambdaMemory]** - 128 MB から 3,008 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**] (デプロイ) をクリックします。

この時点で、Lambda 関数を使用して Hive メタストアに接続するように Athena を設定できます。手順については、「[デプロイ済みの Hive メタストアコネクタを使用するように Athena を設定する](connect-data-source-hive-existing-lambda.md)」を参照してください。

# 既存の IAM 実行ロールを使用して Hive メタストアに Athena を接続する
<a name="connect-data-source-hive-existing-iam-role"></a>

既存の IAM ロールを使用する Lambda 関数を使用して外部 Hive メタストアを Athena に接続するには、外部 Hive メタストア用の Athena コネクタのリファレンス実装を使用できます。

以下は、3 つの主なステップです。

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 ロールを作成するアクセス許可がすでにある場合は、Lambda 関数の作成と設定に Athena コンソールと AWS Serverless Application Repository を使用する、よりシンプルなワークフローを使用できます。詳細については、「[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 実行ロールがある。詳細については、「」を参照してください[外部 Hive メタストアへの Lambda 関数アクセスを許可する](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>

このステップでは、既存の IAM ロールを使用する関数を AWS Lambda コンソールで作成します。

**既存の IAM ロールを使用する Lambda 関数を作成する**

1. AWS マネジメントコンソール にサインインして AWS Lambda コンソール ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) を開きます。

1. ナビゲーションペインで、[**Functions**] (関数) を選択します。

1. **関数の作成** を選択します。

1. **Author from scratch** (製作者を最初から) を選択します。

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. **[詳細設定]** を展開します。

1. **[Enable Network]** (ネットワークの有効化) を選択します。

1. **[VPC]** で、関数がアクセスする VPC を選択します。

1. **[Subnets]** (サブネット) には、Lambda が使用する VPC サブネットを選択します。

1. **[Security groups]** (セキュリティグループ) には、Lambda が使用する VPC セキュリティグループを選択します。

1. [**Create function**] (関数の作成) をクリックします。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 関数] ページで、[**設定**] タブを選択します。

1. 左側のペインで、**[Environment variables]** (環境変数) をクリックします。

1. [**環境変数**] セクションで、[**編集**] を選択します。  
![\[[Edit] (編集) をクリックして Lambda 関数の環境変数を編集します。\]](http://docs.aws.amazon.com/ja_jp/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** - Lambda 関数のレスポンスサイズが 4 MB を超える場合、スピルオーバーメタデータを保持するために Amazon Web Services アカウントの Amazon S3 ロケーションを指定します。  
![\[Lambda 関数環境変数の値を指定します。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/connect-data-source-hive-existing-iam-role-6.png)

1. **[保存]** を選択します。

これで、Lambda 関数を使用して Hive メタストアに接続するように、Athena を設定するための準備ができました。手順については、「[デプロイ済みの Hive メタストアコネクタを使用するように Athena を設定する](connect-data-source-hive-existing-lambda.md)」を参照してください。

# デプロイ済みの Hive メタストアコネクタを使用するように Athena を設定する
<a name="connect-data-source-hive-existing-lambda"></a>

アカウントに `AthenaHiveMetastoreFunction` のような Lambda データソースコネクタをデプロイした後、その使用を Athena に設定します。これを行うには、Athena クエリで使用する外部 Hive メタストアを参照するためのデータソース名を作成します。

**既存の Lambda 関数を使用して Athena を Hive メタストアに接続するには**

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) で Athena コンソールを開きます。

1. コンソールのナビゲーションペインが表示されない場合は、左側の展開メニューをクリックします。  
![\[展開メニューを選択します。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/nav-pane-expansion.png)

1. **[データソースとカタログ]** を選択します。

1. **[データソースとカタログ]** ページで **[データソースを作成]** を選択します。

1. [**Choose a data source**] (データソースの選択) ページの [**Data sources**] (データソース) で、**[S3 - Apache Hive metastore]** (S3 – Apache Hive メタストア) を選択します。

1. [**次へ**] を選択します。

1. **[Data source details]** (データソースの詳細) セクションの **[Data source name]** (データソース名) に、Athena からデータソースをクエリする際に SQL ステートメントで使用する名前 (例えば `MyHiveMetastore`) を入力します。名前は最大 127 文字で、アカウント内で一意である必要があります。この設定は、作成後に変更することはできません。有効な文字は、a～z、A～Z、0～9、\$1 (アンダースコア)、@ (at マーク)、および - (ハイフン) です。`awsdatacatalog`、`hive`、`jmx`、および `system` の名前は Athena によって予約されており、データソース名には使用できません。

1. [**接続の詳細**] セクションで、[**Lambda 関数を選択または入力**] ボックスを使って、先ほど作成した関数の名前を選択します。Lambda 関数の ARN が表示されます。

1. (オプション) **[Tags]** (タグ) でキーと値のペアを追加して、このデータソースに関連付けます。タグの詳細については、[Athena リソースにタグ付けする](tags.md)を参照してください。

1. [**次へ**] を選択します。

1. [**Review and create**] (確認と作成) ページで、データソースの詳細について確認し、[**Add data source**] (データソースの追加) を選択します。

1. データソースのページの [**データソースの詳細**] セクションには、新しいコネクタに関する情報が表示されます。

   これで、指定した **[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/ja_jp/athena/latest/ug/images/datastores-hive-default-catalog-2.png)

1. クエリで複数のデータソースを使用する場合、デフォルトのデータソース名のみ省略が可能で、デフォルト以外のすべてのデータソースについては、フルネームを指定する必要があります。

   例えば、クエリエディタでデフォルトのデータソースとして `AwsDataCatalog` が選択されているとします。次に抜粋した、クエリの `FROM` ステートメントでは、最初の 2 つのデータソース名については完全修飾名で指定していますが、3 番目のデータソースの名前は、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` が選択されています。クエリ自体から、プレフィックス `hms-catalog-1` と データベース名 `hms_tpch` が省略されていても、`show create table customer` ステートメントは成功します。

![\[デフォルトのカタログを使用する DDL ステートメント。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/datastores-hive-default-catalog-4.png)


## JDBC 接続文字列でのデフォルトデータソースの指定
<a name="datastores-hive-default-catalog-jdbc"></a>

Athena JDBC ドライバーを使用して Athena を外部 Hive メタストアに接続する場合、[SQL Workbench](https://www.sql-workbench.eu/index.html) などの SQL エディタで、`Catalog` パラメータを使用して接続文字列にデフォルトのデータソース名を指定します。

**注記**  
最新の Athena JDBC ドライバーをダウンロードするには、「[Athena での JDBC ドライバーの使用](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/ja_jp/athena/latest/ug/images/datastores-hive-default-catalog-jdbc-1.jpg)


# Hive ビューを使用する
<a name="hive-views"></a>

Athena を使用して、外部 Apache Hive メタストア内の既存のビューをクエリできます。Athena は、元のビューを変更したり、翻訳を保存したりすることなく、ランタイムにその場でビューを翻訳します。

例えば、Athena ではサポートされていない構文 (`LATERAL VIEW explode()`) を使用する次のような Hive ビューがあるとします。

```
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)」(Athena データコネクタを外部の Hive メタストアに使用する) を参照してください。

## 考慮事項と制限事項
<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 関数、および特別な処理が必要な Hive 関数について取り上げます。現在、Athena は主に Hive 2.2.0 の関数をサポートしているため、上位バージョン (Hive 4.0.0 など) でのみ有効な関数を使用することはできません。Hive 関数の全リストについては、Hive の「[LanguageManual UDF](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf)」(言語マニュアル UDF) を参照してください。

### 集計関数
<a name="hive-views-aggregate-functions"></a>

#### 特別な処理を必要とする集計関数
<a name="hive-views-aggregate-functions-special-handling"></a>

Hive ビューの次の集計関数では、特別な処理が必要です。
+ **平均** — `avg(INT i)` の代わりに `avg(CAST(i AS DOUBLE))` を使用します。

#### サポートされていない集計関数
<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 ビューでは、`mask()` や `mask_first_n()` などの Hive マスク関数はサポートされていません。

### その他の関数
<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 ビューの次の演算子では、特別な処理が必要です。
+ **Mod 演算子 (%)** – `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 マッピングでは、`INT` ではなく `BIGINT` が返されるため、次の構文を使用します。

  ```
  CAST(instr(string str, string substr) as INT)         
  ```

  このステップがない場合、ビューは古いものと見なされます。
+ **length(string a)** – `length` 関数の Athena マッピングでは、`INT` ではなく `BIGINT` が返されるため、ビューが古いものと見なされないように、次の構文を使用します。

  ```
  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 ビューでは、`xpath`、`xpath_short`、`xpath_int` などの Hive XPath 関数はサポートされていません。

## トラブルシューティング
<a name="hive-views-troubleshooting"></a>

Athena で Hive ビューを使用すると、次の問題が発生する場合があります。
+ **View *<view name>* is stale** (ビュー <ビュー名> が古くなっています) – このメッセージは通常、Hive と Athena のビューで型の不一致が存在することを示します。Hive の「[LanguageManual UDF](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf)」(言語マニュアル UDF) ドキュメントと Presto の「[Functions and Operators](https://prestodb.io/docs/current/functions.html)」(関数と演算子) ドキュメントの同じ関数が異なるシグネチャを持つ場合は、不一致のデータ型をキャストしてみてください。
+ **Function not registered** (関数が登録されていません) – 現在、Athena では、この関数をサポートしていません。詳細については、このドキュメントの前述の情報を参照してください。

# Hive メタストアで AWS CLI を使用する
<a name="datastores-hive-cli"></a>

`aws athena` CLI コマンドを使用して、Athena で使用する Hive メタストアデータカタログを管理できます。Athena で使用するカタログを 1 つ、または複数定義したら、`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` パラメータを、スペースで区切った 1 つ以上の `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 文を実行する場合、次の 2 つの方法のいずれかで 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` ステートメントの例では、`Catalog` の `--query-execution-context` パラメータを使用して 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` ステートメントの例では、`Catalog` の `--query-execution-context` パラメータを使用して 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` – すべての Hive メタストア API コールを処理する一連のデフォルト Lambda ハンドラーです。クラス `MetadataHandler` は、すべての API コールのディスパッチャーです。このパッケージを変更する必要はありません。
+ `hms-lambda-func` – 以下のコンポーネントを持つ Lambda 関数の例です。
  + `HiveMetaStoreLambdaFunc` – `MetadataHandler` を拡張する Lambda 関数の例。
  + `ThriftHiveMetaStoreClient` – Hive メタストアと通信する Thrift クライアント。このクライアントは Hive 2.3.0 用に書かれています。別の Hive バージョンを使用する場合は、このクラスを更新して、応答オブジェクトに互換性があることを確認する必要があります。
  + `ThriftHiveMetaStoreClientFactory` – Lambda 関数の動作を制御します。たとえば、 `getHandlerProvider()` メソッドをオーバーライドして、独自のハンドラープロバイダーを提供できます。
  + `hms.properties` – Lambda 関数を設定します。ほとんどの場合、次の 2 つのプロパティのみを更新する必要があります。
    + `hive.metastore.uris` – `thrift://<host_name>:9083` 形式の Hive メタストアの URI。
    + `hive.metastore.response.spill.location` - レスポンスオブジェクトのサイズが所定のしきい値 (4 MB など) を超える場合にこれらを保存する Amazon S3 の場所。しきい値はプロパティ `hive.metastore.response.spill.threshold` で定義されます。デフォルト値を変更することは推奨されません。
**注記**  
これら 2 つのプロパティは、[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 の場所にアップロードできます。

アーティファクトを構築する前に、`hive.metastore.uris` モジュール内の `hive.metastore.response.spill.location` ファイルにあるプロパティ `hms.properties` および `hms-lambda-func` を更新します。

アーティファクトを構築するには、Apache Maven をインストールし、`mvn install` コマンドを実行する必要があります。これは、モジュール `hms-lambda-layer` の `target` と呼ばれる出力フォルダにレイヤー `.zip` ファイルを生成し、モジュール `hms-lambd-func` に Lambda 関数 `.jar` ファイルを生成します。