はじめる前に
- 必須AWS アカウントを持っていること
- 必須マネジメントコンソールにサインインできること
- 必須S3バケットの作成・ファイルのアップロードをしたことがある
- あると良い簡単なSQL(SELECT文)の読み書き経験
※ このハンズオンは すべてコンソールだけで完結します。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
CSVファイルの中身を調べたいとき、通常はデータベースに読み込んでからSQLを実行する、という流れを思い浮かべるかもしれません。しかしAmazon Athenaを使うと、S3に置いたファイルを読み込まずに、そのままSQLで問い合わせることができます。
今回はS3にCSVファイルを置き、Athenaでテーブルを手動定義(列名・型・S3の場所を指定)して、SELECT文で検索する基本を体験します。
テーブルを作ると、データがAthena側にコピーされるの?
いいえ。Athenaのテーブルは「メタデータ」(列名・型・S3の場所などの定義)だけを持ち、実際のデータはS3に置かれたままです。クエリを実行するたびに、Athenaがその定義に従ってS3のファイルを直接読みに行きます。
Excelで開けばいいのでは?SQLを使う意味は?
ファイルが小さいうちはExcelでも十分です。SQLを使う利点は、条件を組み合わせた絞り込みや集計(合計・グループ化など)を、ファイルサイズが大きくなっても同じ書き方で実行できることです。複数のファイルをまとめて1つのテーブルとして扱えることも利点です。
S3に配置したCSVファイルに対してAthenaでテーブルを手動定義し、SELECT文を使って条件付きの絞り込みクエリを実行し、結果が返ることを確認する。
つくる構成
S3に置いたCSVファイルに対してテーブルを定義し、SQLクエリで問い合わせる、という流れを作ります。
要件
以下の要件を満たし、テーブルの定義からクエリ実行までをひととおり体験してください。
| No | 要件 |
|---|---|
| 1 | S3バケットにCSVファイルを1つアップロードする(東京リージョン、ヘッダー行あり、例:3列程度のサンプルデータ)。 |
| 2 | Athenaのクエリ結果の保存先となるS3の場所を設定する(初回のみ必要)。 |
| 3 | データベースを1つ作成する(名前は自由、例:handson_db)。 |
| 4 | アップロードしたCSVに対応するテーブルを手動で作成する(列名・型・区切り文字・S3の場所・ヘッダー行のスキップ設定を指定)。 |
| 5 | SELECT文で全件取得を確認し、WHERE句で絞り込んだクエリも実行して結果を確認する。 |
構築の進め方
「データを置く」→「初期設定をする」→「テーブルを定義する」→「SQLで問い合わせる」という順番で進めます。
- フェーズ1 — S3にデータを置く
-
マネジメントコンソールにサインインし、リージョンを合わせる
ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。
-
CSVファイルを作成してアップロードする
ローカルで、ヘッダー行付きの簡単なCSVファイルを作成します(例:商品名・カテゴリ・価格の3列、5〜10行程度)。S3バケットを1つ作成し(名前は一意に、例:
athena-demo-yourname)、そのバケット内のフォルダ(例:data/)にアップロードします。 - フェーズ2 — Athenaの初期設定をする
-
クエリ結果の保存先を設定する
Athenaコンソールを開きます。初回はクエリ結果の保存先(S3の場所)の設定を求められるので、手順2のバケット内に別フォルダ(例:
athena-results/)を指定します。この設定をしないとクエリが実行できないAthenaは、クエリの結果を必ずS3に保存する仕組みになっています。保存先が未設定のままだとクエリの実行時にエラーになるため、最初に済ませておきましょう。
- フェーズ3 — テーブルを手動定義する
-
データベースを作成する
エディタ画面で、新しいデータベースを作成します(名前は自由、例:
handson_db)。 -
テーブルを手動で作成する
「テーブルを作成」のウィザード(または
CREATE EXTERNAL TABLE文)を使い、列名・型、データの場所(s3://athena-demo-yourname/data/)、区切り文字(カンマ)、ヘッダー行をスキップする設定を指定します。 - フェーズ4 — SQLで問い合わせる
-
全件取得のクエリを実行する
エディタで次のクエリを実行し、CSVの内容が表として表示されることを確認します。
SELECT * FROM handson_db.<作成したテーブル名>;
-
絞り込みクエリを実行する
WHERE句を使って、特定の条件に合う行だけを取得するクエリを実行します(例:価格が一定額以上の商品だけを取得)。
SELECT * FROM handson_db.<作成したテーブル名> WHERE price >= 1000;
これがゴール条件に合った行だけが返ってくることを確認できたら、このハンズオンの目的は達成です。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直すか」の手がかりとして使ってください。
「クエリの結果の保存先が設定されていません、というエラーが出る」
フェーズ2の初期設定が完了しているか見直しましょう。設定画面はAthenaコンソールの「設定」タブから後でも変更できます。
「テーブルを作ったのに、データが正しく表示されない」
テーブル作成時に指定した区切り文字・ヘッダー行のスキップ設定・列の順序と型が、実際のCSVファイルの内容と一致しているか見直しましょう。
完了チェック
要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。
- データベース一覧に、作成したデータベースが表示されている。
- テーブル一覧に作成したテーブルが表示され、プレビューでデータが見える。
SELECT *で全件取得できる。- WHERE句を使った絞り込みクエリの結果が、正しい件数になっている。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- テーブル定義(メタデータ)と実際のデータ(S3上のファイル)が分かれている設計には、どんな利点があるでしょうか。
ヒント
データを移動・コピーせずに、複数の見方(テーブル定義)を後から追加できる、という点を考えてみましょう。元のファイルに手を加えない、という安全性もヒントです。 - CSVファイルが何百個もある場合、1つずつExcelで開くのとAthenaで問い合わせるのとでは、何が変わるでしょうか。
ヒント
同じフォルダに置かれた複数のファイルを「1つのテーブル」として扱える、という性質を踏まえて考えてみましょう。 - 列の型をすべて文字列(STRING)にしてしまうと、どのようなクエリが書きにくくなるでしょうか。
ヒント
数値の大小比較や合計・平均などの集計関数を、文字列のままで正しく使えるか考えてみましょう。
後片づけ
作成したリソースを順番に削除します。
- テーブルを削除する:Athenaのエディタで
DROP TABLEを実行するか、テーブル一覧から削除します。 - データベースを削除する:テーブルをすべて削除した後、データベースを削除します。
- S3バケットを空にして削除する:アップロードしたCSVファイル、クエリ結果のファイルをすべて削除してから、バケット本体を削除します。
コストに関する注意: Amazon Athenaは、クエリが実際にスキャンしたデータ量に応じて課金されます。今回のような少量のCSVファイルへの問い合わせであれば、料金はごく小さく済みます。S3の保存容量・リクエストにも別途料金がかかりますが、少量であれば無料利用枠の範囲内に収まることが多いです。データベース・テーブルの定義(メタデータ)自体には料金はかかりません。検証が終わったら、上の「後片づけ」に沿って忘れずに削除しましょう。最新の料金は AWS の公式料金ページで確認してください。