見出し画像

【AWS】 Athena で S3 データをクエリしてみた|1日1ハンズオン Day 36

こんにちは、ぽめら です。
本記事は1日1ハンズオン企画、第36回です!
今回は、Amazon Athena(アテナ、以下 Athena) に触れていきます🧮

Athenaは、S3上のデータをSQLで直接クエリできる分析サービスです。
今回は、Athenaの動作理解を目的に「S3上のCSVデータをSQLで検索してみる」ところまでを実施します。



1.はじめに

前回は、S3バケットのバージョニングと暗号化をCLIから設定しました。

今回は、S3に保存されたファイルをデータベースのように扱うことができるAthenaにチャレンジします。

Athenaはサーバレスアーキテクチャのため、データをS3に置くだけで分析可能です。データベースサーバーを介さずにクエリできる点で、コスト効率が高い分析が可能というのが特徴でしょうか👀

というわけで、レッツハンズオン!


2.AthenaでS3データをクエリしてみた

今回の主な流れは下記の通りです。

  • S3バケットの準備

  • CSVファイルのアップロード

  • Athenaのクエリ結果保存先を設定

  • データベース・テーブルの作成

  • クエリ実行

  • クリーンアップ


2-1.S3バケットを準備する

Athenaのクエリ対象・出力先の両方をS3で扱うバケットを用意します。

aws s3api create-bucket \
  --bucket pomera-handson-day36 \
  --region ap-northeast-1 \
  --create-bucket-configuration LocationConstraint=ap-northeast-1

確認👇

aws s3 ls

いつものように今日作業用として pomera-handson-day36 を作成しました。


2-2.CSVファイルをアップロードする

Athenaでは、CSV・JSON・Parquetなど様々な形式をクエリ対象にできます。今回は例としてシンプルなCSVをアップロードしてみます。

① まずはサンプルCSVを作成
サンプルでよく出てくる果物セットの価格表をイメージしました👇

echo "id,product,price" > sample.csv
echo "1,apple,120" >> sample.csv
echo "2,banana,150" >> sample.csv
echo "3,orange,200" >> sample.csv

確認👇

cat sample.csv
ちゃんと入っていることを確認✌️

② S3にアップロード

aws s3 cp sample.csv s3://pomera-handson-day36/data/

確認👇

aws s3 ls s3://pomera-handson-day36/data/
格納されたことを確認✌️

2-3.Athenaのクエリ結果保存先を設定する

Athenaのクエリ結果は、S3に自動保存されます。
まずはAthenaコンソールで保存先を指定しましょう。

コンソール手順:
① Athena クエリエディタを開く

AWS コンソールでAthenaを検索
Athena クエリエディタ画面

② 「設定」タブ>「管理」をクリック

③ s3://<保存先>/ を入力して保存
今回私は作成済みバケットの中で階層を分けて管理することを想定して「s3://pomera-handson-day36/athena-results/」を設定しました(設定した場所に自動出力される)。

設定したら「保存」をクリック

これで準備完了です。


2-4.Athenaでデータベースとテーブルを作成する

Athenaでは、S3上のデータを「テーブル」として定義する必要があります。
というわけでコンソールのクエリエディタで、下記DDLを実行👇

# データベースの作成
CREATE DATABASE IF NOT EXISTS pomera_day36;
# テーブルの作成
CREATE EXTERNAL TABLE IF NOT EXISTS pomera_day36.sample_data (
  id INT,
  product STRING,
  price INT
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  "separatorChar" = ",",
  "quoteChar" = "\""
)
LOCATION 's3://pomera-handson-day36/data/'
TBLPROPERTIES ("skip.header.line.count"="1");
こんな感じで「実行」をクリックすると実行される
(クエリは1つずつ実行する必要があるみたいです)

※ 間違ってテーブルを作成してしまった場合等はDROPして作り直すこと

DROP TABLE pomera_day36.sample_data;

👉 これで、S3上のsample.csvをテーブルとして参照可能になります!


2-5.Athenaでクエリを実行する

Athenaクエリエディタで、データベースをdefaultから先ほど作成したものに変更し、次のSQLを実行する。

SELECT * FROM pomera_day36.sample_data;

出力例👇

CSVとして入力した全部(ヘッダーを除く)が返ってきているはず

👉 S3上のCSVに対してSQLが実行され、結果が返ってきました!
データベースを構築していないのに検索できるのがAthenaの魅力ですね👀


2-6.簡単なWHERE句でフィルタしてみる

試しにフィルタクエリも実行してみましょう。

# price列が130より大きいデータを選択
SELECT * FROM pomera_day36.sample_data
WHERE price > 130;

出力例👇

bananaとorangeが返ってきた✌️

👉 通常のSQLと同じように条件検索ができます。ETL処理を挟まなくてもS3のデータを直接参照できるのがすごい!


2-7.クリーンアップ

作業が終わったら、バケットを削除してクリーンアップします。
練習として検証で使ったAthenaのデータベース構造も削除してみました。

# データベースごと全テーブル削除(これはAWSのAthenaクエリエディタで実行する)
DROP DATABASE pomera_day36 CASCADE;
# S3 バケットを削除(これはAWS CLIで実行する)
aws s3 rm s3://pomera-handson-day36 --recursive
aws s3api delete-bucket --bucket pomera-handson-day36 --region ap-northeast-1

3.まとめ

今回は、Athenaの基本動作を体験しました。

・バケット作成(Athenaのデータ置き場を用意)
👉create-bucket

・CSVアップロードS3へサンプルデータ登録
👉aws s3 cp

・クエリ実行(Athenaコンソール)
👉S3データをSQLで検索

Athenaに始めて触りましたが、データベースサーバーを立てずにSQLを実行できるのは便利そうですね。ただ個人的な感触としては、SQLを使用する以上、構造化が鍵になりそう(S3の運用自体は経験ないので感触だけ😇)。

DWHとの差別化ポイントはなんだろう?Redshiftは高額になりやすいという情報も目にしてはいるからデータ量と分析・集計頻度かな。
ここら辺も引き続き試してみたいと思います。

というわけで今日はここまで!
ではまた明日👋


4.参考リンク

・Athena とは

・Athena のテーブル作成方法

・Athena と S3 の統合設定


いいなと思ったら応援しよう!