Athena で売上集計を作成する

Beginner
オンラインで実践に進む

はじめに

店舗には共有できる月別売上 CSV が必要です。Athena で合計を計算し、S3 の実際の出力を取得し、金額を訂正して新しい集計を作ります。二つの出力から、結果が実行時の入力に対応することを確認します。

先に Query Partitioned Sales Data を完了してください。独立した環境は二つの月別 S3 ファイル、登録済み Glue パーティション、AWS ID、ローカルの訂正版 September を提供します。個人アカウントや以前の VM リソースは不要です。Terminal で公式 AWS CLI を使い、AWS View でファイル、場所、結果を確認します。

認定試験との関連

認定 試験タスク 実践内容
Cloud Practitioner (CLF-C02) Task 3.7 Athena と Glue で S3 データを分析し、計算結果を取得します。

概念図:新しい実行は訂正入力から新規 CSV を作り、以前の出力は以前の値を保持します。

月別集計を計算する

このステップでは、現在の売上を集計します。Glue がスキーマと各月の場所を記録し、Athena がデータを読んで月別にまとめます。各実行には独自の ID とファイルがあります。

プロジェクトで ID を確認します:

cd /home/labex/project
aws sts \
  get-caller-identity

ARN は labex-an04-operator で終わります。jq -r は JSON 文字列、$(...) は出力を変数へ保存します:

INPUT_BUCKET=$(jq -r .input_bucket resources.json)
echo "$INPUT_BUCKET"
DATABASE=$(jq -r .database resources.json)
echo "$DATABASE"
RESULT_LOCATION=$(jq -r .output_location resources.json)
echo "$RESULT_LOCATION"

登録済み場所を確認します:

aws glue \
  get-partitions \
  --database-name "$DATABASE" \
  --table-name sales \
  --query 'Partitions[*].{Month:Values[0],Location:StorageDescriptor.Location}'

両月が登録済みです。整数のセントで total_cents を合計すると丸めを避けられます。COUNT(*) は注文数、GROUP BY month は月別グループ、ORDER BY month は比較順です。引用符付き heredoc で SQL をそのまま書きます:

cat > monthly-summary.sql <<'EOF'
SELECT month, SUM(total_cents) AS revenue_cents, COUNT(*) AS orders
FROM sales
GROUP BY month
ORDER BY month;
EOF

データベースと S3 出力先で送信します。file:// は SQL ファイルを読み、CLI の --query と --output text が ID を取得します:

SUMMARY_QUERY_ID=$(aws athena \
  start-query-execution \
  --query-string file://monthly-summary.sql \
  --query-execution-context "Database=$DATABASE" \
  --result-configuration "OutputLocation=$RESULT_LOCATION" \
  --query QueryExecutionId \
  --output text)
echo "$SUMMARY_QUERY_ID"

QUEUED、RUNNING は繰り返し、SUCCEEDED で続け、FAILED は Reason を読みます:

aws athena \
  get-query-execution \
  --query-execution-id "$SUMMARY_QUERY_ID" \
  --query 'QueryExecution.{State:Status.State,Reason:Status.StateChangeReason}'

入れ子の [*] は行ごとの列構造を保ちます:

aws athena \
  get-query-results \
  --query-execution-id "$SUMMARY_QUERY_ID" \
  --query 'ResultSet.Rows[*].Data[*].VarCharValue' \
  --output table

September は 3500 セント/3 件、October は 2000/3 件。AWS View の SQL と行を月別場所と比較します。

実際の S3 結果をダウンロードする

このステップでは、この実行の CSV を取得します。結果 API は行を表示し、実行メタデータは S3 場所を示します。バケット名や ID を推測せず正確な場所を読みます。

URI を取得・表示します:

SUMMARY_OUTPUT=$(aws athena \
  get-query-execution \
  --query-execution-id "$SUMMARY_QUERY_ID" \
  --query QueryExecution.ResultConfiguration.OutputLocation \
  --output text)
echo "$SUMMARY_OUTPUT"

末尾は /queries/<your-execution-id>.csv。ID がクエリとファイルを結びます。summary.csv にダウンロードします:

aws s3 \
  cp "$SUMMARY_OUTPUT" summary.csv

内容を確認します:

cat summary.csv

ヘッダーと二件の行です:

month,revenue_cents,orders
2026-09,3500,3
2026-10,2000,3

API と同じ値です。手書きのレポートではなく、S3 から取得したファイルです。ローカル summary.csv と元の S3 出力を比較用に保持します。

入力訂正後に再計算する

このステップでは、September の一件を訂正し同じ SQL を再実行します。以前の結果は入力変更で自動更新されず、新規実行が現在の入力を読む必要があります。

訂正版を確認します:

cat september-revised.csv

S01 は 1000 から 1100 セント、ほかは同じなので合計は 3600。既存オブジェクトを更新し、October と reference/notes.txt は保ちます:

aws s3 \
  cp september-revised.csv "s3://$INPUT_BUCKET/sales/month=2026-09/orders.csv"

読み戻して確認します:

aws s3 \
  cp "s3://$INPUT_BUCKET/sales/month=2026-09/orders.csv" -

末尾 - が内容を表示します。場所とスキーマは同じなので Glue 定義は有効です。同じ SQL を新規実行します:

REVISED_QUERY_ID=$(aws athena \
  start-query-execution \
  --query-string file://monthly-summary.sql \
  --query-execution-context "Database=$DATABASE" \
  --result-configuration "OutputLocation=$RESULT_LOCATION" \
  --query QueryExecutionId \
  --output text)
echo "$REVISED_QUERY_ID"

成功を確認します。待機・実行中は繰り返し、失敗なら理由を確認します:

aws athena \
  get-query-execution \
  --query-execution-id "$REVISED_QUERY_ID" \
  --query 'QueryExecution.{State:Status.State,Reason:Status.StateChangeReason}'

行を取得します:

aws athena \
  get-query-results \
  --query-execution-id "$REVISED_QUERY_ID" \
  --query 'ResultSet.Rows[*].Data[*].VarCharValue' \
  --output table

September は 3600/3 件、October は 2000/3 件のまま。変更が計算に反映されました。

新規実行の出力先を取得します:

REVISED_OUTPUT=$(aws athena \
  get-query-execution \
  --query-execution-id "$REVISED_QUERY_ID" \
  --query QueryExecution.ResultConfiguration.OutputLocation \
  --output text)
echo "$REVISED_OUTPUT"

旧ローカル集計を上書きせず取得します:

aws s3 \
  cp "$REVISED_OUTPUT" summary-revised.csv

新しい CSV を確認します:

cat summary-revised.csv

S3 の元の出力を読みます:

aws s3 \
  cp "$SUMMARY_OUTPUT" -

元の September は 3500 のままです。別々の ID とファイルが旧入力と訂正入力に対応します。AWS View で現在の入力と両結果を確認します。これは正確性の検証で、本番費用や性能測定ではありません。

実際の例:S01=1100、新規 September=3600、旧結果=3500。バケット名と ID は異なります。

まとめ

登録済み S3 データを集計し、正確な CSV を取得し、入力訂正後に再計算しました。September は 3500 から 3600、October は 2000 のまま。以前の結果は値を保持するため、入力変更後は再実行が必要です。

詳しくは、AWS 公式ドキュメントを参照してください:クエリ実行ごとの出力ファイルを探す; SELECT のフィルター、グループ化、並べ替え。