Pigのin-mapper combining
以前in-mapper combiningについて書きました。
in-mapper combining - wyukawa’s blog
これはmapper内でなるべく集約してしshuffleフェーズの負荷を下げようというものです。
Hiveの場合はhive.map.aggrプロパティでこの機能のオン/オフを制御します。デフォルトはオンです。
Pigの場合はpig.exec.mapPartAggプロパティでこの機能のオン/オフを制御します。
もっともこの機能は0.10で実装されたようです。ただしデフォルトはオフです。
Pig Performance Optimization - Apache Pig - Apache Software Foundation
[PIG-2228] support partial aggregation in map task - ASF JIRA
CDH3u5の疑似分散でちょっと試してみました。
データはおなじみ?の郵便番号データです。
郵便番号データダウンロード 住所の郵便番号(ローマ字) zip形式 - 日本郵便
5列目に都道府県名があります。全部で123314レコードあります。
$ head KEN_ALL_ROME.CSV 01101,"0600000","IKANIKEISAIGANAIBAAI","CHUO-KU SAPPORO-SHI","HOKKAIDO",0,0,0,0,0,0 01101,"0640941","ASAHIGAOKA","CHUO-KU SAPPORO-SHI","HOKKAIDO",0,0,1,0,0,0 01101,"0600041","ODORIHIGASHI","CHUO-KU SAPPORO-SHI","HOKKAIDO",0,0,1,0,0,0 01101,"0600042","ODORINISHI(1-19-CHOME)","CHUO-KU SAPPORO-SHI","HOKKAIDO",1,0,1,0,0,0 01101,"0640820","ODORINISHI(20-28-CHOME)","CHUO-KU SAPPORO-SHI","HOKKAIDO",1,0,1,0,0,0 01101,"0600031","KITA1-JOHIGASHI","CHUO-KU SAPPORO-SHI","HOKKAIDO",0,0,1,0,0,0 01101,"0600001","KITA1-JONISHI(1-19-CHOME)","CHUO-KU SAPPORO-SHI","HOKKAIDO",1,0,1,0,0,0 01101,"0640821","KITA1-JONISHI(20-28-CHOME)","CHUO-KU SAPPORO-SHI","HOKKAIDO",1,0,1,0,0,0 01101,"0600032","KITA2-JOHIGASHI","CHUO-KU SAPPORO-SHI","HOKKAIDO",0,0,1,0,0,0 01101,"0600002","KITA2-JONISHI(1-19-CHOME)","CHUO-KU SAPPORO-SHI","HOKKAIDO",1,0,1,0,0,0 $ wc -l KEN_ALL_ROME.CSV 123314 KEN_ALL_ROME.CSV
都道府県ごとにどれだけ郵便番号があるかを考えてみます。
SQLでいうと
SELECT todoufuken_name, count(todoufuken_name) FROM postdata GROUP BY todoufuken_name
です。
まずはCDH3u5つまりPig-0.8.1で下記クエリを実行します。
A = load 'KEN_ALL_ROME.CSV' using PigStorage(',') as ( org_code:chararray, postcode:chararray, choiki_name:chararray, choson_name:chararray, todoufuken_name:chararray ); B = group A by todoufuken_name; X = foreach B generate group, COUNT(A); dump X;
そうするとMap input recordsとMap output recordsはどちらも入力ファイルの行数と同じ123314になります。
今度はPig-0.10をApacheのサイトからダウンロードしてクエリの上部に
set pig.exec.mapPartAgg true;
を追加して実行するとMap output recordsが47(都道府県数ですな)と大幅に減ります。
なおPig-0.10でpig.exec.mapPartAggをオフにして実行するとMap output recordsは入力ファイルの行数と同じ123314になります。
PigはHiveに比べて遅いという説もあるようですが集計処理に関して言えばこのオプションを試してみる価値があるかもしれません。