2016-05-17 4 views
1

私はPigを使って質問したいセンサス情報を含むファイルを持っています。次のようにPigを使ってユニークな値を返す方法

ファイル形式は次のとおりです。

ID Name Year Gender State Count 

1 Jones 1980 M  MA 100 
私は、ファイル内の各年のその年にその状態のための各名の割合を取得したいと思い

はどうすればよいのループを介して各それぞれの州ごとに、各名前の出現率を計算します。

1901 Jones MA 2% 
    1901 Jones VT 3% 
    1901 Smith MA 1% 
    1901 Lee VT 4% 
    .... 
    .... 

    2016 Jones MA 2% 
    2016 Jones VT 3% 
    2016 Smith MA 1% 
    2016 Lee VT 4% 

を私は状態によって、私はカウント情報与えられた名前ごとに割合を計算するために必要なすべての状態の中にそれを打破する必要があり、テーブル内のすべての年のために次のように

結果が見えるはずです。

+0

は、あなたが例えば、私は割合が決定される方法 –

+0

オリジナルのポストを期待している結果のフォーマットを投稿してくださいできますか? – TheGoat

+0

を探していた結果、2%を含めるように修正さ –

答えて

2

年齢別にグループ化して別のリレーションシップを生成し、年ごとに新しいリレーションを持つデータセットに参加させてから、割合を取得する必要があります。

以下を参照してください。

A = LOAD 'census_data' USING PigStorage('\t') as (int:id,name:chararray,year:chararray,gender:chararray,state:chararray,int:count); 
B = GROUP A by (year,state); 
C = FOREACH B GENERATE FLATTEN(group) as (year,state),SUM(A.count) as occurances; 
D = JOIN A BY (year,state),C BY (year,state); 
E = FOREACH D GENERATE A::year,A::name,A::state,CONCAT(A::count/C::occurances,'%'); --If you get an error try A.year,A.name,A.state,CONCAT(A.count/C.occurances,'%'); 
DUMP E; 
+0

それは問題を解決する非常にスマートな方法です。 3行目では、フラットンはグループのためではなくAのためにあるべきですか? – TheGoat

+0

@PigWolfいいえ、私たちは2つのフィールドでグループAになっているのでグループのためにする必要がありますし、グループからフィールドを分割したいと思います。私はそれをテストしませんでしたが、 –

関連する問題