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件の返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です