2016-08-10 4 views
1

I次のデータセットがあります。はどのようにsepatare行にセルを分割し、minial集計値を見つけるために

Movies : moviename, genre1, genre2, genre3 ..... genre19 

(全てのジャンルは、上記の1が映画は、そのジャンルであることを示し、値が0または1を持っている)
を これで、どの映画のジャンルが最も少ないのか探したいですか?

私は豚のスクリプトの下に試してみました:

items = load 'path' using PigStorage('|') as (mName:chararray,g1:int,g2:int,g3:int,g4:int,g5:int,g6:int,g7:int,g8:int,g9:int,g10:int,g11:int,g12:int,g13:int,g14:int,g15:int,g16:int,g17:int,g18:int,g19:int); 

sumGenre = foreach items generate mName, g1+g2+g3+g4+g5+g6+g7+g8+g9+g10+g11+g12+g13+g14+g15+g16+g17+g18+g19 as sumOfGenres; 

groupAll = group sumGenre All; 

MIN(sumGenre.sumofGenres)を使用して、次のステップでは、私は、MIN値であるジャンルを得ることができますが、何を探していますと、取得することです最も少ない番号を持つmovienameです。のジャンルの数、その映画のジャンルの数。

誰かが助けてくれますか?
1.私はg1 + g2 + ... g19の合計を得る他の簡単な方法があることを知りたいですか?
2.ジャンル:ジャンルが最も少ない映画も出力しますか?

答えて

1

groupAll

r1 = minGenre = foreach groupAll generate MIN(sumGenre.sumOfGenres) as minG; 

左外側を行うがsumOfGenresによってsumGenreminGによってr1間の結合後、

。これが役立つ

希望を少なくともジャンルを持つ映画のリストを取得するには...

ダイナミック行フィールド和のためのuは次のようにUDFを使用することができます。..で

public class DynRowSum extends EvalFunc<Integer> 
{ 
public Integer exec(Tuple v) throws IOException 
{ 
List<Object> olist = v.getAll(); 
int sum = 0; 
int cnt=0; 
for(Object o : olist){ 
    cnt++; 
    if (cnt!=1) { 
       int val= (Integer)o; 
       sum = sum + val; 
    } 
} 
return new Integer(sum); 
} 

} 

を豚はこのようなスクリプトを更新します..

grunt>sumGenre = foreach items generate mName,DynRowSum(*) as sumOfGenres; 

ここでは、genre incコードを変更するか減らすかは変わりません。

+0

助けてくれてありがとうございます、それは働いていますが、私はあなたと同じロジックで内部結合を取った。再度、感謝します!!!また、(g1 + g2 + g3..g19)がコーディングの良い方法であるか、私はUDFのために行くかどうか私にお勧めしますか? –

+0

@ValarMorghulis g1 + g2 + g3..g19は、削除する新しい列や古い列を持つことができますが、間違っています。 – Alex

+0

@Alex:返信いただきありがとうございます。多くの列の巨大な和、またはUDFを使用するか? –

0
a = LOAD 'path'; 
b = FOREACH a generate FLATTEN(STRSPLIT($0, '\\|')); 
c = FOREACH b generate $0 as movie, FLATTEN(TOBAG(*)) as genre; 
d = FILTER c BY movie!=genre; 
e = GROUP d BY $0; 
f = FOREACH e GENERATE group, SUM(d); 
i = ORDER f BY $1; 
j = LIMIT i 1; 
+0

こんにちは@Alex:ステップ2と3であなたのロジックが何であるか説明してください。私はそれらのステップを得ていませんでした... –

+0

@ValarMorghulisタプルを{movie、g1、g2、g3 .. gn}から{映画、映画}、{映画、g1}、{映画、g2}、{映画、g3}、...、{映画、gn}次のステップは{映画、映画}を削除します。あなたの最初の質問に対する答えです。そのため、動的なジャンルのジャンルを持つことができ、ジャンルの数が変化するたびにクエリを変更する必要はありません。 – Alex

+0

説明をありがとう、私は論理を理解した!! –

関連する問題