

# Athena でテーブルを作成する
<a name="creating-tables"></a>

テーブルを作成するには、Athena コンソールで DDL ステートメントを実行するか、Athena の[**テーブル作成**フォーム](creating-tables-how-to.md#to-create-a-table-using-the-wizard)を使用するか、JDBC または ODBC ドライバーを使用します。Athena は、Apache Hive を使用してテーブルを定義し、本質的にテーブルの論理名前空間であるデータベースを作成します。Athena は、特定のデータ形式のテーブルを作成するためのさまざまなシリアライザ-デシリアライザ (SerDe) ライブラリをサポートしています。サポートされている SerDe ライブラリのリストについては、「[データ用に SerDe を選択する](supported-serdes.md)」を参照してください。

Athena でデータベースとテーブルを作成するときは、read-time クエリのために、スキーマと、テーブルデータが格納されている Amazon S3 内の場所を記述することになります。Athena は、Amazon S3 内のデータを変更しません。このため、Athena のデータベースとテーブルには、従来のリレーショナルデータベースシステムのデータベースとテーブルとは少し異なる意味があります。データがデータベースとテーブルのスキーマ定義と共に保存されないからです。

Athena はスキーマを AWS Glue Data Catalog に保存し、SQL を使用してテーブルをクエリする際に、それを使用してデータを読み取ります。クエリの実行時にスキーマをデータに射影するこの *Schema-on-Read* アプローチにより、データのロードや変換が不要になります。

## 考慮事項と制限事項
<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 内の異なるストレージクラス (スタンダード、標準、およびインテリジェントティアリング) で保存されたオブジェクトのデータをクエリできます。
+ 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)」を参照してください。

  ストレージクラスについては、「*Amazon Simple Storage Service ユーザーガイド*」の、「[ストレージクラス](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)」、および「[リクエスタ支払いバケット](https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html)」を参照してください。
+ 多数のオブジェクトがあり、データがパーティションされていない Amazon S3 バケットに対してクエリを発行する場合、このようなクエリは Amazon S3 の リクエストレート制限に影響を及ぼし、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 準拠であることが保証されます。たとえば、複数のユーザーやクライアントが同時に既存のテーブルを作成または変更しようとした場合、成功するのは 1 つのユーザーまたはクライアントのみです。
+ **テーブルは EXTERNAL です** - [Iceberg](querying-iceberg-creating-tables.md) テーブルを作成する場合を除き、常に `EXTERNAL` キーワードを使用します。Iceberg 以外のテーブルで、`EXTERNAL` キーワードを指定せずに `CREATE TABLE` を使用すると、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) テンプレートを使用して、`TableType` プロパティを指定せずに Athena で使用するテーブルを作成し、`SHOW CREATE TABLE` または `MSCK REPAIR TABLE` などの DDL クエリを実行すると、「失敗: NullPointerException 名は null です」というエラーメッセージを受け取る場合があります。

  このエラーを解決するには、[TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 属性の値を AWS Glue `CreateTable` API コール、または [CloudFormation テンプレート](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)の一部として指定します。`TableType` に使用できる値には、`EXTERNAL_TABLE` や `VIRTUAL_VIEW` が含まれます。

  この要件は、AWS Glue `CreateTable` API 操作や `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)