Hadoop Advent Calendar 27日目 PigでJOINできない!
Hadoop Advent Calendarの27日目を担当します、showyouです。今日は自分とHadoopの1年でも書こうと思いましたが、誰もそんなの読みたいと思わないので軽いTipsでも書きます。
自分は業務や趣味でPigとかHive(を少し)とExcelを(大量に)使っています。個人的に今まで触った感じを書いてみます。主観に基づくので話半分に聞いてください。
Hive
まずHiveのいい点を書いておきます。
Pig
次にHiveに比べるとユーザ数が少なそうですが、PigのHiveと比べた特徴を書いときます
- クエリとは違った書き方なので、人によってはクエリより書きやすい
- 事前にテーブルを作る必要がない。
- カラムの一部がNULLのものをJOINすると強制排除。しかもエラー出して止まったりしない。
- 実行中にうまくJOINできなくて終了する
- エラーの場所がわかりにくい
特にPig側の3が結構くせもので値の整合性を取るときになってやっと気づくこともあります。
例えば以下のようなpigを使って、JOINをしようとします。
A = LOAD '$input' AS ( a:chararray, b:chararray, num:int ); B = LOAD '$input2' AS ( a:chararray, b:chararray, num:int ); C = JOIN A BY (a,b), B BY (a,b); C = FOREACH C GENERATE A::a as a, A::b as b, A::num as num_a, B::num as num_b; dump C;
データは以下の物を用意します。
a 1 a b 2 a 1 a b 100
このデータでJOINをすると、
a 1 1 a b 2 100
と出てくるのが理想的ですが、
実行してみるとこうなります。
> pig --param input=test_null1.txt --param input2=test_null2.txt join.pig (中略) 2011-12-27 01:30:00,220 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Success! 2011-12-27 01:30:00,231 [main] INFO org.apache.hadoop.mapreduce.lib.input.FileInputFormat - Total input paths to process : 1 2011-12-27 01:30:00,231 [main] INFO org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths to process : 1 (a,b,2,100)
1行足りない・・
ちなみにこれは対策として、nullになる要素に対して、事前に
(b is null ? "": b) as b
とかやっておくことで回避はできますが・・常にnullが出そうなとこって(特にデータが汚いと)有りうるんで、せめてエラーがを出して落ちるくらいしてほしいです。
この辺はid:a_bicky神がここで*1まとめているので、興味があるかたは見てみてください。
という訳でPigの利用者を遠ざけそうな話なのですが、かと言ってHiveも1つの処理で中間データの使い回しが出来なそうだし、残念な書き方するとMapがすぐに10000超えたりするので、正直どっちもどっち感はあります。かと言ってMap-Reduceも多段は面倒です。Pigで値チェックをする為にUnitTest入れたいとか言ったらそもそもJavaで書けやという話もありました。
ところで話は変わりますが、今ビッグデータと騒がれてるわけですが、最近のExcelすごいです。100万行まで使えます。なので70000行のデータをフィルタする為にHadoop入れたいと思ってる人はまず最新のExcel入れてピボット使いましょう。
終わり