はじめる前に
- 必須AWS アカウントを持っていること
- 必須マネジメントコンソールにサインインできること
- 必須Glueクローラーの作成・実行経験、Athenaでのクエリ実行経験
- あると良いS3のフォルダ(プレフィックス)構造についての理解
※ このハンズオンは すべてコンソールだけで完結します。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
データが増えてくると、クエリのたびに全件をスキャンするのは無駄が大きくなります。データを年・月ごとのフォルダに分けて配置しておくと、クローラーはこの構造を「パーティション」として認識し、Athenaは問い合わせ時に必要なフォルダだけを読みにいくようになります。
今回は年/月ごとのフォルダにデータを分けて配置し、クローラーでパーティションを認識させ、Athenaで絞り込みクエリを実行してスキャン量の違いを確認します。
パーティションって、テーブルの列とは違うものなの?
パーティションは、S3上のフォルダ構造に基づく特別な列のようなものです。例えば year=2026/month=01/ というフォルダ名から、year・month という列がテーブルに追加され、その値で絞り込めるようになります。データの中身を読まなくても、フォルダ名だけで対象を絞れるのが特徴です。
なぜフォルダ名を見るだけでスキャン量が減るの?
Athenaは、パーティションを指定したクエリを実行すると、該当しないフォルダのファイルを読みにいきません。データの中身を確認する前に、対象外のフォルダを丸ごと除外できるため、読み込むデータ量自体が減ります。
年/月ごとのフォルダに分けたデータをクローラーでパーティション認識させ、Athenaでパーティションを指定した絞り込みクエリを実行し、スキャン量が減ることを確認する。
つくる構成
S3のフォルダ構造をこのように分けます(year=年/month=月/ の形式)。クローラーはこの構造から year・month という2つのパーティション列を自動的に作成します。
要件
以下の要件を満たし、パーティションによる絞り込みを体験してください。
| No | 要件 |
|---|---|
| 1 | S3に、year=年/month=月/ の形式のフォルダを3つ以上作り、各フォルダに同じ列構成のCSVファイルを1つずつ配置する(例:直近2〜3ヶ月分)。 |
| 2 | Glueクローラーを実行し、データカタログのテーブルに year・month のパーティション列が認識されていることを確認する。 |
| 3 | Athenaで SHOW PARTITIONS テーブル名; 相当の操作を行い、認識されたパーティションの一覧を確認する。 |
| 4 | パーティション列を条件にした絞り込みクエリ(例:特定の year と month のみ)を実行する。 |
| 5 | 絞り込みクエリと全件クエリのそれぞれで、Athenaの実行結果に表示されるスキャンしたデータ量を比較する。 |
構築の進め方
「フォルダ構造を作る」→「クローラーでパーティションを認識させる」→「絞り込みクエリでスキャン量を比較する」という順番で進めます。
- フェーズ1 — フォルダ構造を作る
-
マネジメントコンソールにサインインし、リージョンを合わせる
ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。
-
年/月ごとのフォルダにCSVファイルを配置する
S3バケットを1つ作成し(名前は一意に、例:
athena-partition-demo-yourname)、sales/year=2025/month=11/のような形式のフォルダを3つ以上作り、それぞれに同じ列構成のCSVファイルを1つずつアップロードします。フォルダ名の形式が重要key=valueという形式(例:year=2025)のフォルダ名にすることで、クローラーがこれをパーティションとして認識します。 - フェーズ2 — クローラーでパーティションを認識させる
-
クローラーを作成・実行する(または既存のクローラーの対象を変更する)
Glueコンソールでクローラーを作成し、データソースに手順2のS3パス(
sales/フォルダ全体)を指定して実行します。 -
生成されたテーブルでパーティション列を確認する
データカタログのテーブル詳細を開き、「スキーマ」タブで
year・monthという列が、通常の列とは区別された「パーティションキー」として表示されていることを確認します。 - フェーズ3 — 絞り込みクエリでスキャン量を比較する
-
Athenaでパーティションの一覧を確認する
Athenaのクエリエディタで次のクエリを実行し、認識されたパーティションの一覧を確認します。
-- テーブル名は実際のものに置き換える SHOW PARTITIONS sales_table; -
全件クエリと絞り込みクエリのスキャン量を比較する
まず全件取得のクエリを実行し、画面に表示される「スキャンしたデータ」の量を確認します。続いて、
year・monthを条件にした絞り込みクエリを実行し、同じ項目を比較します。-- 全件 SELECT * FROM sales_table; -- 絞り込み SELECT * FROM sales_table WHERE year = '2026' AND month = '01';
これがゴール絞り込みクエリの方が、スキャンしたデータ量が少なく表示されている——この違いを確認できたら、このハンズオンの目的は達成です。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直すか」の手がかりとして使ってください。
「クローラーを実行しても、year・monthが通常の列になる、または現れない」
フォルダ名が key=value の形式になっているか、データソースに指定したS3パスが、パーティションフォルダより上の階層(親フォルダ)を指しているかを見直しましょう。
「WHERE句で絞り込んだのに、スキャン量が全件と同じになる」
WHERE 句で指定している列名・値が、認識されたパーティションキーの表記(大文字・小文字や引用符の付け方)と一致しているかを見直しましょう。
完了チェック
要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。
- テーブルの「スキーマ」タブで、
year・monthが「パーティションキー」として区別表示されている。 SHOW PARTITIONSの実行結果に、作成したフォルダの数だけ行が表示されている。- 全件クエリと絞り込みクエリで、画面に表示される「スキャンしたデータ」の量が異なっている。
- クエリ実行履歴に、それぞれのクエリの実行時間とステータス「成功」が記録されている。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- パーティション分割によってスキャン量が減ることは、どのような場面で大きな効果を生むでしょうか。
ヒント
データの総量が今回の検証よりもはるかに多い場合を想像してみましょう。スキャン量とクエリのコストの関係を考えてみましょう。 - パーティションの粒度(年単位・月単位・日単位など)は、どのように決めるとよいでしょうか。
ヒント
粒度を細かくしすぎた場合、フォルダやパーティションの数自体が増えすぎることで起こる影響を考えてみましょう。 - 新しい月のフォルダを追加したのに、クローラーを再実行しないとどうなるでしょうか。
ヒント
データカタログは、クローラーが最後にスキャンした時点の情報を保持しています。スキャンしていないフォルダは、Athenaからどう見えるか考えてみましょう。
後片づけ
作成したリソースを順番に削除します。
- Athenaのクエリ結果(S3)を削除する:クエリ結果の出力先に保存されたファイルを削除します。
- テーブル・データベースを削除する:クローラーが生成したテーブルとデータベースを削除します。
- クローラー・IAMロールを削除する:使用したクローラーや専用のIAMロールを削除します。
- S3バケットを空にして削除する:アップロードしたCSVファイルとフォルダを削除してから、バケット本体を削除します。
コストに関する注意: Athenaは、クエリでスキャンしたデータ量に応じて課金されます。今回のように少量データであれば料金はごく小さく済みますが、検証が終わったらデータは削除しておきましょう。Glueクローラーは、実行時間に応じて課金されます(無料利用枠の対象外です)。少量データのクローラー実行であれば数分程度で完了するため、料金はごく小さく済みます。Glueデータカタログ自体の保存・アクセスは、一定数まで無料利用枠の対象になっています。S3の保存容量・リクエストにも別途料金がかかりますが、少量であれば無料利用枠の範囲内に収まることが多いです。検証が終わったら、上の「後片づけ」に沿って忘れずに削除しましょう。最新の料金は AWS の公式料金ページで確認してください。