

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

# AWS Glue または Athena コンソールを使用してテーブルを作成する
<a name="creating-tables-how-to"></a>

Athena でのテーブル作成には、AWS Glue やテーブルの追加フォームを使用するか、Athena クエリエディタで DDL ステートメントを実行します。

## 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. クエリエディタの **[Tables and views]** (テーブルとビュー) の横にある **[Create]** (作成) を選択し、その後 **[AWS Glue crawler]** を選択します。

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. クエリエディタ内で下記の例のように文に入力し、**[Run (実行)]** を選択します。

   ```
   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 はテーブルを Athena がメタデータを保存する AWS Glue データカタログに登録します。

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 ユーザーガイド」の「[Using Folders](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 ユーザーガイド」の「[Using a bucket-style alias for your access point](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 パターンを使用しないでください。
+ `s3.amazon.com` などの完全な HTTP 表記を 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 コンソール上で、テーブル名の横にある縦の 3 つのドットをクリックします。
+ **テーブルのプレビュー** – Athena クエリエディタで `SELECT * FROM "database_name"."table_name" LIMIT 10` ステートメントを実行して、すべてのカラムの最初の 10 行を表示します。
+ **テーブル DDL の生成** – Athena クエリエディタで `SHOW CREATE TABLE` *table\$1name* ステートメントを実行して、テーブルを再作成するための DDL ステートメントを生成します。
+ **パーティションのロード** – Athena クエリエディタで `MSCK REPAIR TABLE table_name` ステートメントを実行します。このオプションは、テーブルにパーティションがある場合にのみ使用できます。
+ **エディタへの挿入** – クエリエディタで現在編集を行っているか所に、テーブルの名前を挿入します。
+ **テーブルの削除** – テーブルを削除するかどうかを確認するダイアログボックスを表示します。同意すると、Athena クエリエディタで `DROP TABLE table_name` ステートメントが実行されます。
+ **テーブルのプロパティ** – テーブル名、データベース名、作成時刻、テーブルに暗号化されたデータがあるかどうかが表示されます。