2012-03-01 5 views
4

私は、データの準備のために豚を使用している、と私は簡単なようだが、私は対処できないという問題に直面:どのようにすることができる。例えば豚に行番号を生成するには?

を、私はその後、名前

name 
------ 
Alicia 
Ana 
Benita 
Berta 
Bertha 

の列を持っています私は各名前の行番号を追加しますか?結果は次のようになります。

name | id 
---------------- 
Alicia | 1 
Ana  | 2 
Benita | 3 
Berta | 4 
Bertha | 5 

この質問をお読みいただきありがとうございます。

答えて

3

残念ながら、Pig Latinの行を列挙する方法はありません。少なくとも、私は簡単な方法を見つけることができませんでした。 1つの解決策は、実際の列挙を行う1つのReduceタスクで個別のMapReduceジョブを実装することです。より正確には、

マップフェーズ:すべての行を同じキーに割り当てます。 単一のタスクを減らす:すべての行に対してイテレータを含む単一のキーを受け取ります。 reduceタスクは1台の物理マシン上でのみ実行され、 "reduce function"は1回だけ呼び出されるため、関数内のローカルカウンタが問題を解決します。

データが大量で、単一のリダクションマシンで処理することが不可能な場合は、マスターノードのデフォルトのMapReduceカウンタを使用することができます。

+0

はShatlykが、私はどちらも豚ラテン語で道を見つけませんでした、ありがとうございました。はい、実際には並列アルゴリズムではありませんが、削減ノードを1つだけ使用するという考えは問題を解決することができます – Breakinen

+0

減速器はマッパー入力全体と同じサイズのデータ​​を処理する必要があるため、 map-reduceプログラム。私はタスクトラッカーがグローバル変数を維持できないので、このような本当に並行プログラムを実装するのは非常に難しいと思っています^^ BTW、最後に私はただ一つのマシン上でJavaプログラムを使うだけでこの問題を解決しました。それは速いです:) – Breakinen

+0

まあ、私の場合、「列挙部分」は小さなステップでした。シングルリダクションマシンは長い時間がかかりましたが、他のステップが支配していました。 –

1

私たちが注文したい "名前"列が文字列ではなく数字であると仮定して、スケッチの考え方。 も非スキューの良い分布を仮定しています。

  1. WITH_GROUPS = foreach TABLE生成名、名前/ 100をgroup_id;
  2. グループWITH_GROUPS by group_id;
  3. PER_GROUP =グループを生成する、カウント(*);
  4. ACCUM_PER_GROUP = PER_GROUPとのクロス結合、グループごとの累積カウントの計算、
  5. group_idによるWITH_GROUPSを伴うcogroup ACCUM_PER_GROUP;減速中
  6. は、あなたがこの質問をしたときに、このグループaccumulative_count
10

豚から始まるIDはこれを行うための仕組みを持っていなかった各行を割り当て、UDFを実行します。しかしながら、Pig 0.11は、この目的のために使用することができるRANK operatorを導入した。

1

は、RANKのオペレータがうまくいくように見えるんが、あなたがあなたのデータにいくつかの制約を設けることなく、増やす行IDを持つことが保証されていない表面に

を@cabad。

問題は、同じランクを共有するランク付け演算子に提供されるすべての行から発生します。 2つの行に同じフィールドがランク付けに使用されていないという保証を満たすことができれば、このアプローチはうまくいくかもしれませんが、私はそれを「スクエア・ペグ・ラウンド・ホール」アプローチに入れます。

[ドキュメント] http://pig.apache.org/docs/r0.11.0/basic.html#rank(2、6、10位にランク)からこの例を参照してください:

C = rank A by f1 DESC, f2 ASC; 

dump C; 
(1,Tete,2,N) 
(2,Ranjit,3,M) 
(2,Ranjit,3,P) 
(4,Michael,8,T) 
(5,Jose,10,V) 
(6,Jillian,8,Q) 
(6,Jillian,8,Q) 
(8,JaePak,7,Q) 
(9,David,1,N) 
(10,David,4,Q) 
(10,David,4,Q)     
+0

OPで記述されたユースケースについては、単純なRANK A;うまくいくでしょう。 – cabad

関連する問題