ビューの使用 - Amazon Athena

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

ビューの使用

Amazon Athena のビューは、物理的なテーブルではなく、論理的なテーブルです。ビューを定義するクエリは、1 つのクエリでビューが参照されるたびに実行されます。

SELECT クエリからビューを作成でき、今後のクエリでこのビューを参照できます。詳細については、「CREATE VIEW」を参照してください。

どのようなときにビューを使うのでしょう。

以下の目的でビューを作成できます。

  • データのサブネットをクエリする。例えば、元のテーブルからの列のサブネットでビューを作成して、データのクエリを単純化できます。

  • 複数のテーブルを 1 つのクエリに結合する。複数のテーブルを持ち、それらを UNION ALLと組み合わせる場合は、その式でビューを作成して、結合テーブルに対するクエリを簡素化できます。

  • 既存の基本クエリの複合型を解消して、ユーザーによるクエリの実行を単純化する。基本クエリには、テーブル間の結合、列リストの表現や他の SQL 構文が含まれていることより、その理解とデバッグが困難なことがよくあります。複合型を解消して、クエリを単純化するビューを作成できます。

  • 最適化手法を試用して、最適化されたクエリを作成する。たとえば、WHERE 条件、JOIN 順序、あるいはベストパフォーマンスを示す他の表現の組み合わせを見つけた場合には、これらの句および表現でビューを作成することができます。こうして、アプリケーションはこのビューに対して比較的な単純なクエリを実行できます。後に、元のクエリを最適化するためのより良い方法を見つけた場合には、ビューを再作成するときに、すべてのアプリケーションは最適化された基本クエリを即時に採用します。

  • 基礎となるテーブルおよび列の名前を隠し、メンテナンス問題を最小限に抑える (この名前が変更された場合)。この場合、新しい名前を使用して、ビューを再作成します。基礎となるテーブルではなく、このビューを使用するすべてのクエリは、変更なしで実行を続けます。

Athena のビューでサポートされているアクション

Athena は、ビューで次のアクションをサポートします。このコマンドはクエリエディタで実行できます。

Statement 説明
CREATE VIEW

指定する SELECT クエリから新しいビューを作成します。詳細については、「ビューの作成」を参照してください。

オプションの OR REPLACE 句は、既存のビューを更新して置き換えます。

DESCRIBE VIEW

名前が付けられたビューの列のリストを表示します。これにより、複合型のビューの属性を確認できます。

DROP VIEW

既存のビューを削除します。オプションの IF EXISTS 句は、ビューが存在しない場合に、エラーを抑制します。

SHOW CREATE VIEW

指定するビューを作成する SQL ステートメントを表示します。

SHOW VIEWS

指定するデータベース、あるいは、データベース名を省略する場合の現在のデータベースのビューのリスト。オプションの LIKE 句を正規表現で使用して、ビュー名のリストを制限します。コンソールの左ペインでビューのリストを表示することもできます。

SHOW COLUMNS

ビュー用のスキーマの列を一覧表示します。

ビューの考慮事項

Athena でビューを作成して使用する場合は、次の考慮事項が適用されます。

  • Athena では、Athena コンソールで作成されたビューをプレビューして操作できます。Athena コンソールを使用するよう移行した場合は AWS Glue Data Catalog、で、または同じカタログに接続された Amazon EMR クラスターで実行されている Presto で作成したビューをプレビューして操作できます。これら以外の方法で作成された Athena ビューをプレビューしたり、ビューに追加したりすることはできません。

  • AWS Glue Data Catalog を使用してビューを作成する場合は、次のように、PartitionKeysパラメータを含めてその値を空のリストに設定する必要があります。"PartitionKeys":[]そうしない場合、ビューは Athena で失敗します。以下の例は、"PartitionKeys":[] を使用してデータカタログから作成されたビューを示しています。

    aws glue create-table --database-name mydb --table-input '{ "Name":"test", "TableType": "EXTERNAL_TABLE", "Owner": "hadoop", "StorageDescriptor":{ "Columns":[{ "Name":"a","Type":"string"},{"Name":"b","Type":"string"}], "Location":"s3://xxxxx/Oct2018/25Oct2018/", "InputFormat":"org.apache.hadoop.mapred.TextInputFormat", "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat", "SerdeInfo":{"SerializationLibrary":"org.apache.hadoop.hive.serde2.OpenCSVSerde", "Parameters":{"separatorChar": "|", "serialization.format": "1"}}},"PartitionKeys":[]}'
  • データカタログで Athena ビューを作成した場合、データカタログはビューをテーブルとして扱います。データカタログでテーブルレベルのきめ細かなアクセスコントロールを使用して、これらのビューへのアクセスを制限できます。

  • Athena は再帰的なビューの実行を妨げ、そのような場合にはエラーメッセージを表示します。再帰的なビューとは、Athena 自体を参照するビュークエリです。

  • Athena は、古いビューを検出するとエラーメッセージを表示します。以下のいずれかが発生すると、古いビューが報告されます。

    • このビューは、存在しないテーブルまたはデータベースを参照します。

    • スキーマまたはメタデータの変更は、参照されるテーブルで行われます。

    • 参照されるテーブルは削除され、異なるスキーマまたは設定で再度作成されます。

  • ネストされたビューのクエリが有効であり、テーブルおよびデータベースが存在する限り、ネストされたビューを作成して実行できます。

ビューの制限

  • Athena ビューの名前には、アンダースコア (_) 以外の特殊文字を使用できません。詳細については、「テーブル、データベース、および列の名前」を参照してください。

  • ビューの名前に予約キーワードを使用しないようにします。予約キーワードを使用している場合、ビューでのクエリでは予約キーワードを二重引用符で囲みます。「予約済みキーワード」を参照してください。

  • Athena で作成したビューを外部 Hive メタストア、UDF で使用することはできません。Hive で外部で作成したビューを使用する方法については、「Hive ビューの使用」を参照してください。

  • 地理空間関数ではビューを使用できません。

  • Amazon S3 のデータに対するアクセスコントロールを管理するためにビューを使用することはできません。ビューをクエリするには、Amazon S3 に保存されているデータにアクセスするためのアクセス許可が必要です。詳細については、「Amazon S3 へのアクセス権」を参照してください。

  • アカウント間でのビューのクエリは Athena エンジンバージョン 2 と Athena エンジンバージョン 3 の両方でサポートされていますが、クロスアカウント AWS Glue Data Catalogを含むビューを作成することはできません。クロスアカウントデータカタログへのアクセスについては、「AWS Glue データカタログへのクロスアカウントアクセス」を参照してください。

  • Hive または Iceberg の非表示メタデータ列 $bucket$file_modified_time$file_size、および $partition は Athena のビューでサポートされていません。Athena の $pathメタデータ列の使用方法については「Amazon S3 内にあるソースデータのファイルの場所の取得 」を参照してください。

コンソールでビューを操作する

Athena コンソールでは、以下を実行することができます。

  • 左側のペインで、テーブルがリストされているすべてのビューを見つける。

  • ビューをフィルタリングする。

  • ビューをプレビューしてそのプロパティを表示し、編集または削除する。

ビューのアクションを表示するには

ビューは、既に作成してある場合にのみコンソールに表示されます。

  1. Athena コンソールで [Views] (ビュー) を選択し、ビューを選択して展開し、ビュー内の列を表示します。

  2. ビューの横にある 3 つの縦のドットを選択して、ビューのアクションのリストを表示します。

    
                        ビューのアクションメニュー。
  3. アクションを選択して、ビューのプレビュー、クエリエディタへのビュー名の挿入、ビューの削除、ビューのプロパティの表示、またはクエリエディタでのビューの表示と編集を行います。

ビューの作成

Athena コンソールでテンプレートを使用するか、既存のクエリを実行して、ビューを作成できます。

テンプレートを使用してビューを作成するには
  1. Athena コンソールで、[Tables and views] (テーブルとビュー) の横にある [Create] (作成) を選択してから、[Create view] (ビューの作成) を選択します。

    
                        ビューの作成

    このアクションにより、編集可能なビューテンプレートがクエリエディタに配置されます。

  2. 要件に応じてビューテンプレートを編集します。ステートメントにビューの名前を入力するときは、ビュー名にアンダースコア (_) 以外の特殊文字を含めることはできません。「テーブル、データベース、および列の名前」を参照してください。ビューの名前に 予約済みキーワード を使用しないようにします。

    ビューの作成の詳細については、「CREATE VIEW」および「ビューの例」を参照してください。

  3. [Run] (実行) をクリックしてビューを作成します。Athena コンソールのビューのリストにビューが表示されます。

既存のクエリからビューを作成するには
  1. Athena クエリエディタを使用して、既存のクエリを実行します。

  2. クエリエディタウィンドウで、[Create] (作成) を選択してから、[View from query] (クエリから表示する) を選択します。

    
                        [Create] (作成)、[View from query] (クエリから表示する) を選択します。
  3. [Create View] (ビューの作成) ダイアログボックスにビュー名を入力し、[Create] (作成) を選択します。ビュー名にはアンダースコア (_) 以外の特殊文字は使用できません。「テーブル、データベース、および列の名前」を参照してください。ビューの名前に 予約済みキーワード を使用しないようにします。

    Athena はコンソール内のビューのリストにビューを追加し、クエリエディタのビューの CREATE VIEW ステートメントを表示します。

メモ
  • テーブルの基になるテーブルを削除してからそのビューの実行を試みると、Athena がエラーメッセージを表示します。

  • ネストされたビューを作成することができます。これは、既存のビューの上にあるビューです。Athena は、それ自体を参照する再帰的なビューの実行を妨げます。

ビューの例

ビュークエリの構文を表示するには、SHOW CREATE VIEW を使用します。

例 1

次の 2 つのテーブルを考えてみます。2 つの列 (employeesid) がある name テーブルと 2 つの列 (salariesid) がある salary テーブルです。

この例では、name_salary という名前のビューを SELECT テーブル および employees テーブルから給料にマッピングされた ID のリストを取得する salaries クエリとして作成します。

CREATE VIEW name_salary AS SELECT employees.name, salaries.salary FROM employees, salaries WHERE employees.id = salaries.id
例 2

次の例では、view1 という名前のビューを作成して、複合型のクエリ構文を非表示にします。

このビューは 2 つのテーブル (table1 および table2) の上部で実行され、各テーブルは異なる SELECT クエリです。このビューは、table1 からの列を選択し、結果を table2 に結合します。この結合は、両方のテーブルにある a 列に基づいています。

CREATE VIEW view1 AS WITH table1 AS ( SELECT a, MAX(b) AS the_max FROM x GROUP BY a ), table2 AS ( SELECT a, AVG(d) AS the_avg FROM y GROUP BY a) SELECT table1.a, table1.the_max, table2.the_avg FROM table1 JOIN table2 ON table1.a = table2.a;

フェデレーティッドビューの詳細については、「フェデレーションされたビューのクエリ」を参照してください。