Goalist Developers Blog

Amazon Athena でS3上の求人データファイルにクエリを実行する

こんにちは、鈴木です。
今回は AWS re:Invent 2016 で発表されたAmazon Athena(以下、Athenaと記載)を触ってみた感想をまとめました。

f:id:suzutt:20170113111346p:plain

aws.amazon.com

具体的にどういうことができるのかについて知りたい場合はAWS公式ブログがわかりやすいので、読むと理解が深まると思います。

Amazon QuickSight についてまとめた記事もあるので、よかったら見てみてください。 developers.goalist.co.jp

Athenaとは

Athenaとは「サーバレスで、S3上の膨大なデータをSQLで分析できる」ツールです。

淡々と書きましたがこれってすごいですよね。

唯一必要なエンジニアっぽい技術がSQLだけですから、SQL使えるなら膨大なデータの分析ができるんですよ。
(もちろん、クロール、スクレイプ、データクレンジング、S3上への配置は事前に実施しないといけないですが)
分散処理用のもろもろ環境構築が不要ってことです。

いろいろ書きましたが、一言でいうとGoogle BigQueryのAWS版です。

利用手順

以下の手順で利用できます。めちゃくちゃ簡単です。順に説明していきます。

  1. S3上にデータ保存
  2. データベース(スキーマ)の作成
  3. テーブルの作成
  4. クエリ実行

S3上にデータ保存

2017年1月13日現在、Athenaは東京リージョンでは提供されていません。 Athenaはオレゴンリージョンで利用していますが、東京リージョンのS3のデータを使うことは可能です。

分析可能なデータ形式はこちらをご参照ください。
ちなみに今回、対象データがzip形式でs3上に保存されていたため、その状態では文字化けにより分析できませんでした。展開後、gzip形式で再圧縮することで分析できました。

データベース(スキーマ)の作成

データベースの作成前に、ブラウザ上に表示されるAthenaの画面を説明します。
赤枠で囲った箇所がクエリエディタです。ここにSQLを入力し実行することができます。
青枠で囲った箇所がクエリ実行結果が表示される領域です。

f:id:suzutt:20170113140746p:plain

ここからは、クエリエディタからSQLを実行していきます。
なお、SQLを作成するためのウィザードが用意されているので、ウィザードに沿ってデータベースやテーブルを作ることも可能です。(通常はウィザードを利用するかと思います。)

サンプルとして既にSampledbというデータベースが作成されていますが、今回は新しくデータベースを作成します。 ちなみに、Athenaにおいてデータベースとスキーマは同じ意味です。ドキュメントを見る限りテーブルの名前空間程度の理解でいいかと思います。

以下のSQLをクエリエディタから実行します。

CREATE DATABASE blogdb

テーブルの作成

作成したデータベースにテーブルを作成します。テーブルには、列名、列の型、ファイル形式、分析対象データが格納されているS3上のフォルダのパスなどを定義します。
以下のSQLをクエリエディタから実行します。こちらもウィザードを利用すればSQLを自動生成できます。

CREATE EXTERNAL TABLE IF NOT EXISTS blogdb.xxxx_sampledata (
  `target_date` string,
  `company_name` string,
  `job_type` string 
  ・・・(略)
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'field.delim' = ','
) LOCATION 's3://xxxx/sampledata/';

お待たせしました。以上で準備完了です。

クエリを実行する

それでは、作成したテーブルにSQLを実行してみます。

たとえば、職種大分類(job_type)ごとの求人件数について知りたいなら、以下のようなSQLをクエリエディタから実行します。

SELECT job_type,count(*) count FROM xxxx_sampledata GROUP BY job_type ORDER BY job_type DESC;

実行すると、画面下部に実行結果が表示されます。こんな感じ。

f:id:suzutt:20170113144005p:plain

以上がAmazon Athena でS3上の求人データにクエリを実行する手順になります。

その他の機能

クエリの実行結果をcsv形式でダウンロードすることも可能です。
また、今回はクエリエディタからクエリを実行しましたが、JDBCを使ったDBアクセスもできるようなので、システム間の連携もしやすそうです。

料金

2017年1月12日現在、以下のような料金体系になっています。
S3の対象バケットとAthenaのリージョンが違うと、データ転送量が高くなりそうです。

  • 1TBの読み込みごとに5USD
  • S3の使用料

詳しくはこちらをご参照ください。

まとめ

いかがでしたでしょうか。

使ってみた感想は、

  1. 元々S3上にデータを格納していた方は、データベースとテーブルを作成するだけで使用できるのはお手軽でよい。
  2. 圧縮、パーティション機能、列形式のデータに変換することで30%〜90%くらい安くなるとのことなので、できれば使うべき。 (クエリ実行時に読み込むデータが少なくなるため安くなります)
  3. S3上にzip形式で圧縮したファイルを分析する場合は、gzip形式で圧縮し直さないといけないのが面倒くさい。
    (展開後に圧縮しなくてもよいですが、料金を考えるとgzip形式にするのが普通かと思います。)
  4. テーブル作成時に列ごとに型を定義するのが面倒くさい。
    (たしかQuickSightはいい感じにやってくれたのでAthenaもそうだと嬉しい)

です。

個人的には1のメリットが大きく、AWS全体でみると、

「あとで分析に使うかもしれないデータ(形式問わず)はS3にぶちこんでおけばOK」

な流れがきている気がします。
とはいえ、サービスによって使えるデータ形式が異なるのでどの形式で保存するかは迷う所です。

すでにAthenaだけでなく、Amazon QuickSight(BIツール)や、Amazon Rekognition(画像分析)などの分析方法があるので、次は何がくるのか楽しみです。
また、現時点ではそのデータを有効利用するサービスがなかったとしても、世の中のニーズにあわせて後々提供してくれるんじゃないかなと期待してしまいます。

個人的に、今年のre:inventでは、さらにS3にデータを貯めたくなるようなサービスが発表されるのではないかと思います。
データを持っている企業がS3上にデータを置いて、ユーザにデータを提供(販売)する用のAPIを簡単に作れたりすると面白いですね〜

引き続き、AWSの情報発信をしていくので、ご期待ください。