ゴールデンウィークだからエバラ焼き肉のたれ黄金の味で焼き肉をやるかわりにapache pigと戯れてやるよこの豚野郎 part 2

タイトルに特に意味はないシリーズ第二弾です。とりあえずいろいろ動かしてみたので、面白かったところをピックアップしてコメントしていきます。



とりあえず象本のサンプルから。

よくわかんなかったのが、

foreach grouped generate group, MAX(filtered.temperature);

という書き方です。gropuedからgenerateするので、grouped.groupとかgrouped.filtered.temperatureとかいう書き方の方が自然なきはしますが、そこは冗長にならないようにしてるんでしょう。前のデータを参照しているように見えたので、結構混乱しました。あと、予約語については大文字小文字を無視してくえるようですが、組み込み関数とUDFについては大文字小文字を識別するようです。

ちなみに、groupというプロパティはgroup演算子をつかうと自動的に生成されるらしいです。


MultiQueryというのが割と最近入ったらしく、複数のデータの出力を一回のMRジョブにしてくれます。

ポイントは、

store B into 'output/multiqury/b';
store C into 'output/multiqury/c';

のあたりですね。hadoopでMR書いてれば普通だと思いますが、まあ最適化してくれるらしいです。これはgruntでたたいてるときではなく、batch modeでスクリプトを渡してやるか、gruntでexecしたときに有効になる最適化ですね。


MultiQueryの最適化はfilterの条件によらないよ、という話。

これもhadoopのMRがわかっていれば自然ですね。


次はオリジナルネタです。親 - 子の対が保存されているデータから木、というかリーフからルートまでの経路を列挙する的な。Webのアクセスログとリファラの関係とか、そんなイメージです。下の方にinputとなるデータがおいてありますが、1がrootになるイメージです。

ほんとはleft outer joinすればすべての子がとれるのですが、やってないので8をleafとする経路がなくなってて微妙です。スキーマをつけないとleft outer joinできないらしいのですが、列の別名のつけ方がわからないので、スキーマつけて自己結合ができない的な。あとでやりかた調べます。

と、いずれにせよ繰り返しがサポートされてないので、木の経路列挙としては微妙感がある使い味です。まあtier決め打ちなら行けそうです。


で、これだと3段のMRになってて微妙なので、ちょっと最適化をしてもらいます。断片複製結合を使います。

断片複製結合っていうかMap Side Joinじゃんて感じですが、前3段だったのが2段で分析できてます。まあいい感じですね。戦略としては断片複製結合(fragment replicate join:replicated)以外にも、キーの分布が歪んでいるケースに強いskewedとソートを前提としてマージジョインするmergeがあるようです。あとで調べます。


最後に個別のネタですが、group化をするときにanyをつけるとグループのkeyであるgroupプロパティをランダムに生成してくれるらしいです。サンプリングに使うとか。



という感じですね。たぶんpigでそれなりのものは作れるようになった感じです。


以下残課題。
スキーマ付きで自己結合
・left outer join
・skew join
・merge join


あとは、ちょろっと http://wiki.apache.org/pig/ このへんを読んでみたり、象本を読み返したり、ASCII.technologied 2011/01で紹介されていたバスケット解析を実装してみたりしようかなあという感じです。