Amazon Athena がついにビュー(CREATE VIEW)をサポートしました!

2018.06.07

はじめに

超嬉しいアップデート、Amazon Athena がついにビュー(CREATE VIEW)をサポートしました。朝起きて、Amazon Athenaのコンソールを見ると「ビュー」というメニューが追加されているのを見つけました。

つべこべ言わず実際に試してみたいと思います。

CREATE VIEW

構文

指定した名前とパラメータでビューを作成します。

CREATE [ OR REPLACE ] VIEW view_name AS query

CREATE VIEW の例

一般的な構文と変わりません

CREATE VIEW test AS
SELECT 
orderkey, 
orderstatus, 
totalprice / 2 AS half
FROM orders

既存のビューを更新するには、CREATE OR REPLACE VIEW と指定することも可能です。

執筆時点では、日本語マニュアルは公開されていませんので、詳細は英語マニュアルCREATE VIEWを参照してください。

実際にビューを作成する

Athenaコンソールからビューを作成する方法は2つあります。

1. CREATE VIEW のDDLを実行する方法

上記の構文に従い、DDLを実行してビューを作成します。

2. クエリ結果からビューを作成する方法

Athenaコンソールでは、クエリ結果からビューを作成することも可能です。

最初にクエリを実行して、結果を確認します。

このクエリをビューにしたい場合は、[クエリからビューを作成]ボタンを押すと、「ビューの作成」というダイアログが表示されますので、ビューの名前を指定して、[作成]ボタンを押します。

CREAE VIEWのDDLが生成、自動的に実行されます。ビューの作成が成功すると、左下の「ビュー」に追加されていることが確認できます。

実験

ビューから更にビューを作成できるか?

通常のテーブルと同様にビューから更にビューを作成することが可能です。作成したビューに対してクエリを実行できることも確認済みです。

Amazon Redshift Spectrum から参照するとどうなるか?

Amazon Redshift Spectrum から Glueデータカタログに登録されている Athena のビューを参照するとエラーになります。Amazon Redshift Spectrum の外部テーブルに対して、ビューを作成したい場合は、Late-Binding ビューを利用してください。

cmdb=> select * from cmdb.orders_ip_top10;
ERROR:  Invalid DataCatalog response for external table "cmdb"."orders_ip_top10": Cannot deserialize Table. Error:
  -----------------------------------------------
  error:  false
  code:      1000
  context:   rapidjson::GenericValue<Encoding, Allocator>& rapidjson::GenericValue<Encoding, Allocator>::operator[](const rapidjson::Gener

Glueデータカタログからどの様に見えるか?

テーブルの一覧では、データソースは空白となり、ClassificationはUnknownという扱いになっています。

Glueデータカタログに登録されている情報は以下のとおりです。コメントにPresto Viewと記載されています。やはり、このView定義はAthenaのクエリエンジンPrestoが実行時に解釈する構文ということなのでしょう。

GlueのJobのデータソースに指定するとどうなるか?

データソース指定に指定できますが、ビューのClassificationはUnknownという扱いになっているため、Jobを実行するとエラーになります。

最後に

これまでは実際のテーブルに対して直接クエリする以外に選択肢がなく、複雑なクエリを簡単に呼び出すにはSaved Queryとして事前登録する必要がありました。アドホックなクエリの結果を確認して、その流れで素早くビューを作成できるのはとても便利です。

データレイクのデータ更新は、時間を要するものです。アプリケーションからはビューを参照するように作成しておけば、ビューが参照しているテーブルをスワップすることで瞬時にメンテすることができるようになります。これでデータレイクに対するクロールやETLジョブ、パーティションの追加など、テーブル更新に要する時間を気にせずに利用できるようになります。