DynamoDB + S3 + EMRでコホート分析(cohort analysis)をする(2)
ちょっと前回から間が空いてしまったけど、DynamoDB上のデータやその他のデータをS3に集めて、EMR上のHiveを使ってコホート分析をするという話の第2回。今回はHiveの話を中心に書いていく。
※Hiveを使うのは今回が実質初めてで、EMRについてもあまり経験は豊富ではないので、何かおかしい点などがあったらご指摘頂けると幸いです。
HiveテーブルとS3の「フォルダ」構成
初めに書いておくと、S3には厳密には「フォルダ」という概念はなく、ファイル名に「/」が含まれていると、AWS Management Consoleやその他ツールからフォルダのように見える、というだけ。
Hiveのexternal tableでは、テーブルと「フォルダ」が1対1で対応する。例えばHiveで以下のようにS3上にtable_aを作成するケースを考える。
CREATE EXTERNAL TABLE table_a ( col1 string, col2 string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://bucket/hive/table_a/';
この場合、table_aに書き込みを行った場合、s3://bucket/hive/table_a/ 以下にファイルが書き込まれる。その際、ファイルは1つとは限らず複数の場合もあるので要注意。
逆に、Hive以外のプログラムからS3上にファイルを作成して、それをHiveのテーブルと認識させたい場合、上のようなフォルダ構成を守っておけばOK(ファイル名は任意で構わない)。
パーティション
Hiveではテーブルを「パーティション化」することができる。詳しくはHiveのWikiを参照して欲しいが、例えば、時系列データを月毎に違うパーティションにすると言った使い方が考えられる。メリットは、大雑把に言えばRDBMSのテーブルのパーティション化と同じようなもの。
Wikiの例に倣って、以下の様なテーブルを考える(少しだけ改変)。
CREATE TABLE table_name ( id int, name string ) PARTITIONED BY (date string) -- yyyy-mm-dd 形式 LOCATION 's3://bucket/hive/table_name/';
この場合、テーブルにデータを投入すると、以下のような「フォルダ」にファイルが作成される。
- s3://bucket/hive/table_name/date=2013-10-01/
- s3://bucket/hive/table_name/date=2013-10-02/
以下の様な複数のパーティションの場合、
CREATE TABLE page_view(viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ip STRING COMMENT 'IP Address of the User') COMMENT 'This is the page view table' PARTITIONED BY(dt STRING, country STRING) LOCATION 's3://bucket/hive/table_name/';
以下の様なフォルダが作成される。
- s3://bucket/hive/table_name/dt=2013-10-01/country=US/
- s3://bucket/hive/table_name/dt=2013-10-02/country=US/
- s3://bucket/hive/table_name/dt=2013-10-02/country=JP/
Hiveのexternal tableとファイル形式
上の方で、以下のようなCREATE TABLE文を載せた。
CREATE EXTERNAL TABLE table_a ( col1 string, col2 string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://bucket/hive/table_a/';
後半の ROW FORMAT 以降だが、これは、s3://bucket/hive/table_a/ 以下にあるファイルに対し
- \nを行(レコード)区切り
- \tをフィールド区切り
とみなして、データを読み込んでテーブルとして扱うということを意味している。つまり、TSVファイルをテーブルとして扱う場合に、こうしたexternal tableを定義する必要がある。
recover partitions
Hive以外のプログラムでS3上にファイルを作成して、Hiveからパーティション付きのexternal tableを定義する際、以下のステートメントを実行する必要がある。
ALTER TABLE table_name RECOVER PARTITIONS;
これは、Hiveに対するAmazon Elastic MapReduce独自の拡張。詳細はこの辺。
まとめ
今回はS3上に置いたデータをHiveから扱う方法について主に説明した。次回で、具体的なコホート分析を実施していく。
“DynamoDB + S3 + EMRでコホート分析(cohort analysis)をする(2)” への2件の返信