Athena でのテーブルの作成 - Amazon Athena

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Athena でのテーブルの作成

Athena コンソールでの DDL ステートメントの実行は、JDBC もしくは ODBC ドライバー、または Athena の [Create table] (テーブルを作成) フォームを使用して行うことができます。

Athena で新しいテーブルスキーマを作成すると、Athena はこのスキーマをデータカタログに保存して、クエリの実行時に使用します。

Athena は schema-on-read として知られるアプローチを使用します。これは、クエリを実行するときにスキーマがデータに反映されることを意味し、データのロードや変換が不要になります。

Athena は、Amazon S3 内のデータを変更しません。

Athena は、Apache Hive を使用してテーブルを定義し、本質的にテーブルの論理名前空間であるデータベースを作成します。

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

クエリを実行する場合は、標準 SQL を使用してテーブルをクエリし、その時点でデータが読み取られます。データベースとテーブルの作成方法に関するガイダンスはApache Hive のドキュメントで参照できますが、以下は Athena に固有のガイダンスを提供します。

クエリ文字列の最大長は 256 KB です。

Hive では、シリアライザー/デシリアライザー (SerDe) ライブラリの使用を通じて複数のデータ形式をサポートします。正規表現を使用して複合型のスキーマを定義することもできます。サポートされている SerDe ライブラリのリストについては、「サポートされる SerDes とデータ形式」を参照してください。

考慮事項と制約事項

以下は、Athena のテーブルに関する重要な制限事項と考慮事項です。

Athena のテーブルと Amazon S3 のデータに関する要件

テーブルを作成するときは、LOCATION 句を使用して、基盤となるデータが格納される Amazon S3 バケットの場所を指定します。以下の点を考慮してください。

  • Athena は、バージョン管理された Amazon S3​ バケットの最新バージョンのデータしかクエリできず、以前のバージョンのデータはクエリできません。

  • Amazon S3 内のデータを使用するには、適切なアクセス許可が必要です。詳細については、「Amazon S3 へのアクセス権」を参照してください。

  • Athena は、LOCATION 句で指定されたものと同じバケット内にある、複数のストレージクラスを使って保存されたオブジェクトのクエリをサポートします。例えば、Amazon S3 内の異なるストレージクラス (スタンダード、標準、およびインテリジェントティアリング) で保存されたオブジェクトのデータをクエリできます。

  • Athena では、リクエスタ支払いバケットがサポートされています。Athena でクエリする予定のソースデータが含まれるバケットに対してリクエスタ支払いを有効にする方法については、「ワークグループの作成」を参照してください。

  • Athena は、S3 Glacier Flexible Retrieval または S3 Glacier Deep Archive ストレージクラス内にあるデータへのクエリをサポートしていません。S3 Glacier Flexible Retrieval、または S3 Glacier Deep Archive ストレージクラスにアーカイブされたオブジェクトは無視されます。代替方法として、Athena によってクエリ可能な Amazon S3 Glacier Instant Retrieval ストレージクラスを使用できます。詳細については、「Amazon S3 Glacier Instant Retrieval storage class」(Amazon S3 Glacier Instant Retrieval ストレージクラス) を参照してください。

    ストレージクラスの詳細については、「Amazon Simple Storage Service ユーザーガイド」の、「Storage Classes」(Amazon S3 ストレージクラスを使用する)、「Changing the Storage Class of an Object in Amazon S3」(Amazon S3 のオブジェクトのストレージクラスの変更)、「Transitioning to the GLACIER Storage Class (Object Archival)」(Glacier ストレージクラス (オブジェクトアーカイブ) へのオブジェクトの移行)、および「Requester Pays Buckets」(リクエスタ支払いバケット) を参照してください。

  • 多数のオブジェクトがあり、データがパーティションされていない Amazon S3 バケットに対してクエリを発行する場合、このようなクエリは Amazon S3 の リクエストレート制限に影響を及ぼし、Amazon S3 例外を引き起こす可能性があります。エラーを防ぐには、データをパーティションします。また、Amazon S3 のリクエストレートをチューニングすることも検討してください。詳細については、「リクエスト率およびリクエストパフォーマンスに関する留意事項」を参照してください。

  • AWS Glue CreateTable API 操作や AWS CloudFormation AWS::Glue::Table テンプレートを使用して、TableType プロパティを指定せずに Athena で使用するテーブルを作成し、SHOW CREATE TABLE または MSCK REPAIR TABLE などの DDL クエリを実行すると、「失敗: NullPointerException 名は null です」というエラーメッセージを受け取る場合があります。

    このエラーを解決するには、TableInput TableType 属性の値を AWS Glue CreateTable API コール、または AWS CloudFormation テンプレートの一部として指定します。TableType に使用できる値には、EXTERNAL_TABLEVIRTUAL_VIEW が含まれます。

    この要件は、AWS Glue CreateTable API 操作や AWS::Glue::Table テンプレートを使用してテーブルを作成する場合にだけ適用されます。DDL ステートメントや AWS Glue クローラを使用して Athena のテーブルを作成すると、TableType プロパティが自動的に定義されます。

サポートされている関数

Athena クエリでサポートされる関数は、Trino と Presto の関数に対応しています。各関数の詳細については、「Trino ドキュメント」あるいは「Presto ドキュメント」の関数と演算子のセクションを参照してください。

トランザクションデータ変換はサポート対象外

Athena は、テーブルデータに対するトランザクションベースのオペレーション (Hive または Presto のものなど) をサポートしません。サポートされないキーワードの詳細なリストについては、「サポートされない DDL」を参照してください。

テーブルの状態を変更するオペレーションは ACID

テーブルを作成、更新、または削除する場合、これらのオペレーションは ACID 対応であることが保証されます。たとえば、複数のユーザーやクライアントが同時に既存のテーブルを作成または変更しようとした場合、成功するのは 1 つのユーザーまたはクライアントのみです。

テーブルは EXTERNAL

Iceberg テーブルの作成時を除いて、常に EXTERNAL キーワードが使用されます。Iceberg 以外のテーブルで、EXTERNAL キーワードを指定せずに CREATE TABLE を使用すると、Athena でエラーが発生します。Athena でテーブルをドロップすると、テーブルメタデータのみが削除され、データは Amazon S3 に残ります。

AWS Glue または Athena コンソールを使用したテーブルの作成

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

AWS Glue クローラを使用してテーブルを作成するには

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

  2. クエリエディタの [Tables and views] (テーブルとビュー) の横にある [Create] (作成) を選択し、その後 [AWS Glue crawler] を選択します。

  3. AWS Glue コンソールの [Add crawler] (クローラの追加) ページで、次のステップに従いクローラを作成します。

    詳細については、「AWS Glue クローラーの使用」を参照してください。

Athena のテーブル作成フォームを使用してテーブルを作成するには

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

  2. クエリエディタで、[Tables and views] (テーブルとビュー) の横にある [Create] (作成) をクリックし、次に [S3 bucket data] (S3 バケットデータ) をクリックします。

  3. [Create Table From S3 bucket data] (S3 バケットデータからテーブルを作成) フォームで、テーブルを作成するための情報を入力し、[Create table] (テーブルを作成) を選択します。フォーム内の各フィールドの詳細については、「フォームを使用したテーブルの追加」を参照してください。

Hive DDL を使用してテーブルを作成する

  1. [Database (データベース)] メニューから、テーブルを作成するデータベースを選択します。CREATE TABLE ステートメントでデータベースを指定しない場合、テーブルはクエリエディタで現在選択されているデータベースに作成されます。

  2. クエリエディタで次のようなステートメントを入力した後に、[[Run] (実行) をクリックするか、Ctrl+ENTER を押し下げます。

    CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs ( `Date` Date, Time STRING, Location STRING, Bytes INT, RequestIP STRING, Method STRING, Host STRING, Uri STRING, Status INT, Referrer STRING, OS String, Browser String, BrowserVersion String ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "^(?!#)([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+[^\(]+[\(]([^\;]+).*\%20([^\/]+)[\/](.*)$" ) LOCATION 's3://athena-examples-MyRegion/cloudfront/plaintext/';

テーブル情報の表示

Athena で作成が完了したテーブルは、その名前が左側の [Tables] (テーブル) リスト内に表示されます。テーブルの情報を表示し管理を行うには、Athena コンソール上で、テーブル名の横にある縦の 3 つのドットをクリックします。

  • テーブルのプレビュー – Athena クエリエディタで SELECT * FROM "database_name"."table_name" LIMIT 10 ステートメントを実行して、すべてのカラムの最初の 10 行を表示します。

  • テーブル DDL の生成 – Athena クエリエディタで SHOW CREATE TABLE table_name ステートメントを実行して、テーブルを再作成するための DDL ステートメントを生成します。

  • パーティションのロード – Athena クエリエディタで MSCK REPAIR TABLE table_name ステートメントを実行します。このオプションは、テーブルにパーティションがある場合にのみ使用できます。

  • エディタへの挿入 – クエリエディタで現在編集を行っているか所に、テーブルの名前を挿入します。

  • テーブルの削除 – テーブルを削除するかどうかを確認するダイアログボックスを表示します。同意すると、Athena クエリエディタで DROP TABLE table_name ステートメントが実行されます。

  • テーブルのプロパティ – テーブル名、データベース名、作成時刻、テーブルに暗号化されたデータがあるかどうかが表示されます。