2016-08-07 9 views
0

出現回数をパーセンテージで表示するテーブルを作成しようとしています。例えば:私は、データが含まれているという名前のテーブル、持っている:ここでPIG:パーセンテージ(%)ベースのテーブルを作成するには?

class, value 
------ ------- 
1  , abc 
1  , abc 
1  , xyz 
1  , abc 
2  , xyz 
2  , abc 

を、クラス値1のために、「ABC」を3回発生し、「XYZ」は、総発生のうち、一度だけ発生しました4回クラス値2では、 'abc'と 'xyz'が1回発生しました(合計2回発生)。

ので、出力は次のようになります。

class, %_of_abc, %_of_xyz 
------ -------- -------- 
1  , 75  , 25 
2  , 50  , 50 

両方の列の値が変更されている場合、それを行うにはどのように任意のアイデア?私はGROUPを使ってやろうと考えていました。しかし、クラスの値でグループ化すれば、それがどのように私を助けることができるか分かりません。

答えて

0

少し複雑であるが、ここでは解決

grunt> Dump A; 
(1,abc) 
(1,abc) 
(1,xyz) 
(1,abc) 
(2,xyz) 
(2,abc) 
grunt> B = Group A by class; 
grunt> C = foreach B generate group as class:int, COUNT(A) as cnt; 
grunt> D = Group A by (class,value);   
grunt> E = foreach D generate FLATTEN(group), COUNT(A) as tot_cnt; 
grunt> F = foreach E generate $0 as class:int, $1 as value:chararray, tot_cnt; 
grunt> G = JOIN F BY class,C BY class; 
grunt> H = foreach G generate $0 as class,$1 as value,($2*100/$4) as perc; 
grunt> Dump H; 
(1,xyz,25) 
(1,abc,75) 
(2,xyz,50) 
(2,abc,50) 
I = grouy H by class; 
J = FOREACH I generate group as class, FLATTEN(BagToTuple(H.perc)); 
Dump J; 
(1,75,25) 
(2,50,50) 
+0

ありがとう!完璧に動作します! – Tanvir

関連する問題