S3のデータをAmazon Athenaで取得する時にAWS Glueを使うとすごい楽

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんばんは、菅野です。
今回のブログでは AWS Glue と Amazon Athena を使います。

はじめに

前回のブログエントリー「GoogleスプレッドシートのデータをS3へCSVとして保存する」で Google スプレッドシートのデータを S3 へ CSV ファイルとして保存しました。
今回はそのデータを Amazon Athena で取得するのですが、AWS Glue を使う事でテーブルの作成までが簡単にできますのでご紹介します。

Amazon Athena で ヘッダー付き CSV を扱う

前回 S3 に作成した CSV ファイルは、1行目がヘッダとなっていました。
Amazon Athena でこのタイプのファイルを扱うと、ヘッダー行もデータとして扱われて余計な処理や SQL が必要になります。
Amazon Athena で素直に扱えるように、前回のブログで作成した Google Apps Script を以下のように変更して json 形式のファイルを S3 に保存するようにしました。

function myFunction() {
  // 使ったS3ライブラリ
  // MB4837UymyETXyn8cv3fNXZc9ncYTrHL9

  // スプレッドシートを取得
  var ss = SpreadsheetApp.openById('スプレッドシートのID');

  // シートのオブジェクトを取得
  var sheet = ss.getSheetByName('price-list');

  // データを取得
  var data = sheet.getRange('A:C').getValues();

  // 送信データ用の配列を用意
  var json = '';

  // データをチェックしながら
  for ( var i = 1; i < data.length; i++ )
  {
    // id があれば
    if ( data[i][0] != '' ) {
      // データを作成
      json += '{"' + data[0][0] + '":' + data[i][0] + ',"' + data[0][1] + '":"' + data[i][1] + '","' + data[0][2] + '":' + data[i][2] + '}' + "\n";
    }
  }

  // バイナリに変換
  json = Utilities.newBlob( json );

  var s3 = S3.getInstance( 'アクセスキー', 'シークレットアクセスキー' );
  s3.putObject( 'バケット名', 'test-data/price-list.csv', json, {logRequests:true} );
}
  • ファイル名は IAM ポリシーの関係上変更していません。
  • 変数「csv」を「json」へ変更
  • データ作成ループはスプレッドシートの1行目は飛ばして2行目からのデータ部分のみを処理
  • データは1行毎の json とする

S3 に作成されたファイルの内容はこのようになります。

AWS Glue のクローラーを作成する

クローラーを作成して実行することで、指定した場所にあるデータを自動で解析して Amazon Athena のデータベースとテーブルを作成してくれます。
まずはクローラーを作成してみましょう。

リージョン

AWS Glue はまだ東京リージョンで使えません。

今回はバージニアリージョンで作成します。

作成

  • AWS Glue のサービスページへ行き、左袖の「Crawlers」をクリックします
  • 「Add Crawler」ボタンをクリックします

  • クローラーに名前を付けます

  • 元になるデータの場所を指定します
  • 「Data Store」は S3 のままとします
  • 「Include Path」の右にあるフォルダアイコンをクリックにします

  • バケットやフォルダが表示されるのでデータの保存してあるフォルダを指定

  • 他のデータは無いので No のまま

  • クローラーが S3 にアクセスするために必要な IAM ロールを指定します
  • IAM ロールがまだ無ければ「Create an IAM role」を選択して名前を決定します

  • クローラーの起動方法を指定します
  • 今回は1回きりでいいので「Run on demand」とします

  • Amazon Athena の Database を作成します
  • この Database の中に今回のデータが Table として登録されます
  • 「Add database」ボタンをクリックすると以下のポップアップが表示されますので名前を入力しましょう

  • 確認画面です
  • 問題が無ければ「Finish」ボタンをクリックしてください

作成したクローラーを実行する

クローラーの一覧で実行すれば、自動でデータを調べてテーブルを作成してくれます

作成が完了したらこのようなメッセージが表示されます

作成されたテーブルを確認する

では完成したテーブルのデータを見てみましょう

  • テーブル一覧で今回作成したテーブルを選択します
  • 「Action」をクリックします
  • 「View data」をクリックします
  • そうすると、以下のように Amazon Athena のページが表示されます。
    もしデータが表示されなかった時はデータベースを指定した後、テーブル名の後ろにある点をクリックし「Preview table」をクリックしてください。

まとめ

以上で、Google スプレッドシートのデータを AWS へ持ってきて AWS Glue を使ってテーブルを作成し、Amazon Athena で検索できるところまでできました。

最後に

いかがでしたでしょうか。
AWS Glue を使う事で Amazon Athena のテーブル作成の手間が簡略化できますので是非お試しください。
re:Invent 2017 の開催中に東京リージョンで AWS Glue が使えるようになるのではないかと期待していたのですが・・・残念です。
今のうちに AWS Glue を試しておいて、東京リージョンでのサービス開始にすぐ使えるように備えましょう!
この記事がそのお役に立てれば幸いです。

参考ページ

これらのページを参考にさせていただきました。
ありがとうございました。
AWS Glue と Amazon S3 を使用してデータレイクの基礎を構築する