Amazon AthenaでCloudFrontのログにクエリを投げたメモ


AWS re:Invent 2016 で発表された新サービス Amazon Athenaを早速(?)使ってみました。
S3にログを置いたままサーバレスでクエリが発行できるので集計等が捗ります。
すでに同様の記事も見かけましたが、デリミタの指定でうまくいかずにハマったのでメモ。
なお、CloudFrontのLogging設定はこの記事では触れません。

Databaseの作成

CREATE DATABASE CloudFrontLogs;

Tableの作成

マネージメントコンソール上でも定義できますが、
DDL書くほうが楽な気がしたので、2つくらいカラム定義したあたりでそっとキャンセルしました。

CREATE EXTERNAL TABLE IF NOT EXISTS <TableName> (
  date DATE,
  time STRING,
  xEdgeLocation STRING,
  scBytes INT,
  cIp STRING,
  csMethod STRING,
  csHost STRING,
  csUriStem STRING,
  scStatus INT,
  csReferer STRING,
  csUserAgent STRING,
  csUriQuery STRING,
  csCookie STRING,
  xEdgeResultType STRING,
  xEdgeRequestId STRING,
  xHostHeader STRING,
  csProtocol STRING,
  csBytes INT,
  timeTaken INT,
  xForwardedFor STRING,
  sslProtocol STRING,
  sslCipher STRING,
  xEdgeResponseResultType STRING,
  csProtocolVersion STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = "\t",
  'field.delim' = "\t"
) LOCATION 's3://<LogBacketName>/<LogPrefix>/'
;

CloudFrontのログフォーマットはTSVです。
serialization.formatfield.delim' ' --タブ文字みたいに表記している記事がいくつかありましたが、ドキュメントを見たら普通に"\t"でよいと書いてありました。
カラム名はお好みに合わせてよしなに変更してください。

Queryの発行

SELECT * FROM <TableName> limit 10;

期待通りResultsが返ってくればOK。