軽めの集計操作をS3+Athenaで完結させてみる

S3とAthenaで集計を手軽く完結させる手順についてまとめてみました。
2019.08.29

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

はじめに

データ集計にAthenaを用いる場合、S3にアップしたファイルをGlueでデータベースとして作成 + Athenaからクエリをかける というやり方がありますが、データ量自体がそこまで大きくなかったり、手軽く実施したい場合に直接AthenaでS3のデータを元にテーブルを作成する手段もあります。

Amazon S3 のテーブルの場所 - Amazon Athena

公式ドキュメントにも詳細は記載されていますが、実際にやってみた内容を元に手順としてみました。

S3にファイルをアップする

ファイルアップ用のbucketを追加します。

% aws s3api create-bucket --bucket BUCKET-NAME --region ap-northeast-1 --create-bucket-configuration LocationConstraint=ap-northeast-1
{
    "Location": "http://BUCKET-NAME.s3.amazonaws.com/"
}

CSVファイルを追加します。

% cat << EOF > text.csv
id, name, descriotion
1, aaa, bbbbb
2, bbb, bbbbb
EOF
% gzip test.csv
% aws s3 cp test.csv.gz s3://BUCKET-NAME/test.csv.gz
upload: ./test.csv.gz to s3://BUCKET-NAME/test.csv.gz

Athena上でテーブルを作成する

テーブル作成先のデータベースを追加します。

% aws athena start-query-execution \
    --query-string "CREATE DATABASE test;" \
    --result-configuration OutputLocation=s3://BUCKET-NAME/
{
    "QueryExecutionId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}

アップしたデータを元にテーブルを作成します。一行目がヘッダのため、'skip.header.line.count'='1'を指定しています。

% aws athena start-query-execution \
  --query-string "
  CREATE EXTERNAL TABLE test.test_data (id int, name string, description string) 
  ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
  STORED AS INPUTFORMAT
    'org.apache.hadoop.mapred.TextInputFormat'
  OUTPUTFORMAT
    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
  LOCATION
    's3://BUCKET-NAME/'
  TBLPROPERTIES (
    'skip.header.line.count'='1', 
    'has_encrypted_data'='false'
  )" \
  --result-configuration OutputLocation=s3://BUCKET-NAME/
{
    "QueryExecutionId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}

テーブルが作成されているか確認する

全件SELECTして、結果をダウンロードしてみます。

% aws athena start-query-execution \
  --query-string "select * from test.test_data;" \
  --result-configuration OutputLocation=s3://BUCKET-NAME/
{
    "QueryExecutionId": "YYYYYYYY-XXXX-XXXX-ZZZZ-XXXXXXXXXXXX"
}
% aws s3 cp s3://BUCKET-NAME/YYYYYYYY-XXXX-XXXX-ZZZZ-XXXXXXXXXXXX.csv -
"id","name","description"
"1"," aaa"," bbbbb"
"2"," bbb"," bbbbb"

あとがき

実行時のオプションが若干長文にはなりましたが、事前にテキストとして編集しておくことでコピーペーストの実行も問題ありません。また、一度テーブルを作成した後は管理コンソールからクエリを実施するのも手です。

環境の設定を省いて手軽な集計をおこないたい場合等で参考になれば幸いです。