崩壊現実-全てはvirtualに収束する-

この日記について|本棚|ブックマーク|Wiki|ついったー部日記
Twitter用人工無脳http://twitter.com/ha_ma寄付
crochet(凍結中)http://d.hatena.ne.jp/showyou/20000101
twitter bot アンケートhttp://d.hatena.ne.jp/showyou/20091225/1261712029

2011-12-27

Hadoop Advent Calendar 27日目 PigでJOINできない!

Hadoop Advent Calendarの27日目を担当ます、showyouです。今日自分Hadoopの1年でも書こうと思いましたが、誰もそんなの読みたいと思わないので軽いTipsでも書きます


自分は業務や趣味でPigとかHive(を少し)とExcelを(大量に)使っています。個人的に今まで触った感じを書いてみます主観に基づくので話半分に聞いてください。

Hive

まずHiveのいい点を書いておきます

  1. SQLっぽい言語で、SQLに慣れてれば割と書きやすい
  2. 実行時にエラーが出ている場所が(Pigと比べて)わかりやすい
  3. partitionで高速化できる
  4. クエリがでかいと途中でこける場合がある
  5. テーブル作るのが面倒。間違ったテーブル定義すると検索できなくてエラーになることもある

Pig

次にHiveに比べるとユーザ数が少なそうですが、PigのHiveと比べた特徴を書いときます

  1. クエリとは違った書き方なので、人によってはクエリより書きやすい
  2. 事前にテーブルを作る必要がない。
  3. カラムの一部がNULLのものをJOINすると強制排除。しかもエラー出して止まったりしない
  4. 実行中にうまくJOINできなくて終了する
  5. エラー場所がわかりにくい

特に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入れてピボット使いましょう。

終わり

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/showyou/20111227/1324997143
筆者:Showyou http://www3.to/showyou