立春をすぎて、暖かく感じる日も増えてきた今日この頃です。さて春といえばミツバチ、ミツバチといえばHiveですが、今日はHiveを使わないで純粋なMapReduceで、巨大データ同士をJOINするための一つの方法を書き留めたいと思います。
具体的に考えるために、状況を想定してみます。例えば以下の2つのテーブル、アクセスログ(日時,ユーザID,アクセスURL)とユーザマスタ(ユーザID,年齢,性別,住所)があるとします。これらのテーブルをユーザIDで結合したいとしましょう。
SQLで言えば次のような処理ということになります。
SELECT * FROM access_log LEFT OUTER JOIN user USING (user_id);
つまり何ということはない普通のJOINなのですが、この2つのデータがとても大きなものであるとき、私たちは問題に直面します。
このようなとき、まず思い浮かぶのはHiveを使うことです。SQLに慣れているならば、極めて直感的に処理を書くことができます。(先述のSQLを書くだけです)
ただしHiveを使わず、純粋なMapReduceを書いて処理したいこともあるでしょう。その場合次の図に示すような手順が考えられます。ここでは3つのMapReduceを使います。
重要なことは、3つ目のMapReduceでレコードを識別するために、予め「テーブル番号」を追加しておくということです。今回は0と1を使用していますが、テーブル一意であればもちろん番号でなくても構いません。