2015-09-27 2 views
0

У меня есть файл, как показано нижеHadoop процент свинех в пределах каждой подгруппы

имя оценка
John аа
Джона аа
джон Aa
Джона еще Bb

мэри куб.см
MaRy куб.сма
mary dd

Я бы хотел (а) получить их оценку за centage по количеству баллов для каждого человека так будет выглядеть следующим образом

сортире ÄÂ 75
John Bb 25
мэри куб.см 66,6
мэри дд 33,3

Джон имеет 3 AA и 1 BB, так аа% = 75 и бб% = 25 Я хочу сделать это в Hadoop свинью, пожалуйста, помогите, спасибо

-Troy

+0

Спасибо за размещение - Вы могли бы использовать инструменты редактирования, чтобы сегодня ваш код немного ? Благодарю. –

+0

Также вы можете предоставить более подробную информацию о своей проблеме. Заявление о проблемах непонятно. –

+0

в основном для каждого имени (john, mary) производит процент от числа баллов. Например: john имеет 3 aa и одну bb, тогда это 75% для aa и 23% для bb. Надеюсь, это ясно, спасибо также на стороне отметить, сколько UDF может одна программа свиньи? если более одного, то какой синтаксис .. РЕГИСТРАЦИЯ .... спасибо –

ответ

1

Можете ли вы попробовать это?

Вход: file.dat

john aa 
john aa 
john aa 
john bb 
mary cc 
mary cc 
mary dd 

Код:

A = LOAD 'file.dat' USING PigStorage(' ') as (name:chararray,score:chararray); 
N = CUBE A BY CUBE(name,score);  
N2 = FOREACH N GENERATE FLATTEN(group) AS (name,score), ((float)COUNT_STAR(cube)) As (totcnt:float); 
N3 = FILTER N2 BY name!='null'; 
N4 = GROUP N3 BY name; 
N5 = FOREACH N4 {                   
fil = order N3 BY score;                 
fil1 = LIMIT fil 1;                  
fil2 = FILTER N3 BY score!='null';              
generate FLATTEN(fil2) AS (name:chararray,score:chararray,indcount:float),FLATTEN(fil1.totcnt) as (totcnt:float); 
} 
N6 = FOREACH N5 GENERATE name,score,(indcount/totcnt)*100; 
DUMP N6; 

Выход:

(john,aa,75.0) 
(john,bb,25.0) 
(mary,cc,66.66667) 
(mary,dd,33.333336) 
+0

Ничего себе !! Могучий CUBE работает, спасибо! Вигнеш. –

+0

Добро пожаловать .. :) –

Смежные вопросы