2013-07-02 2 views
1

Итак, у меня есть данные, которые имеют два значения, строку и число.(hadoop.pig) несколько счетчиков в одной таблице

data(string:chararray, number:int) 

и я рассчитываю на 5 различных правил,

1: INT равно 0 ~ 1.

2: int 1 ~ 2.

5: int 4 ~ 5.

Так что я был в состоянии сосчитать их по отдельности,

zero_to_one = filter avg_user by average_stars >= 0 and average_stars <= 1; 
A = GROUP zero_to_one ALL; 
zto_count = FOREACH A GENERATE COUNT(zero_to_one); 

one_to_two = filter avg_user by average_stars > 1 and average_stars <= 2; 
B = GROUP one_to_two ALL; 
ott_count = FOREACH B GENERATE COUNT(one_to_two); 

two_to_three = filter avg_user by average_stars > 2 and average_stars <= 3; 
C = GROUP two_to_three ALL; 
ttt_count = FOREACH C GENERATE COUNT(two_to_three); 

three_to_four = filter avg_user by average_stars > 3 and average_stars <= 4; 
D = GROUP three_to_four ALL; 
ttf_count = FOREACH D GENERATE COUNT(three_to_four); 

four_to_five = filter avg_user by average_stars > 4 and average_stars <= 5; 
E = GROUP four_to_five ALL; 
ftf_count = FOREACH E GENERATE COUNT(four_to_five); 

Таким образом, это может быть сделано, но это только приводит к 5 отдельной таблице.

Я хочу посмотреть, есть ли какой-либо способ (это нормально, я люблю причудливые вещи) T может сделать результат в одном столе.

Что означает, если

zto_count = 1 
ott_count = 3 
. = 2 
. = 3 
. = 5 

, то таблица будет {1,3,2,3,5}

Это просто легко разобрать данные, и организовать их таким образом.

Есть ли способы?

ответ

2

Используя это в качестве входных данных:

foo 2 
foo 3 
foo 2 
foo 3 
foo 5 
foo 4 
foo 0 
foo 4 
foo 4 
foo 5 
foo 1 
foo 5 

(0 и 1 каждого появляются один раз, 2 и 3, каждый появляется дважды, 4 и 5, каждый появляются трижды)

Этот сценарий:

A = LOAD 'myData' USING PigStorage(' ') AS (name: chararray, number: int); 

B = FOREACH (GROUP A BY number) GENERATE group AS number, COUNT(A) AS count ; 

C = FOREACH (GROUP B ALL) { 
    zto = FOREACH B GENERATE (number==0?count:0) + (number==1?count:0) ; 
    ott = FOREACH B GENERATE (number==1?count:0) + (number==2?count:0) ; 
    ttt = FOREACH B GENERATE (number==2?count:0) + (number==3?count:0) ; 
    ttf = FOREACH B GENERATE (number==3?count:0) + (number==4?count:0) ; 
    ftf = FOREACH B GENERATE (number==4?count:0) + (number==5?count:0) ; 
    GENERATE SUM(zto) AS zto, 
      SUM(ott) AS ott, 
      SUM(ttt) AS ttt, 
      SUM(ttf) AS ttf, 
      SUM(ftf) AS ftf ; 
} 

Производит этот вывод:

C: {zto: long,ott: long,ttt: long,ttf: long,ftf: long} 
(2,3,4,5,6) 

Число FOREACHs в C не имеет никакого значения, потому что C будет только самое большее 5 элементов, но если после этого, то они могут быть объединены, как это:

C = FOREACH (GROUP B ALL) { 
    total = FOREACH B GENERATE (number==0?count:0) + (number==1?count:0) AS zto, 
           (number==1?count:0) + (number==2?count:0) AS ott, 
           (number==2?count:0) + (number==3?count:0) AS ttt, 
           (number==3?count:0) + (number==4?count:0) AS ttf, 
           (number==4?count:0) + (number==5?count:0) AS ftf ; 
    GENERATE SUM(total.zto) AS zto, 
      SUM(total.ott) AS ott, 
      SUM(total.ttt) AS ttt, 
      SUM(total.ttf) AS ttf, 
      SUM(total.ftf) AS ftf ; 
} 
+0

Это действительно полезно. – JaemyeongEo

+0

Большое спасибо mr2ert. Кажется, я все понял. Я ценю вашу помощь! – JaemyeongEo

+0

Одна вещь, которую вы не показывали, состоит в том, что этот код будет охватывать только данные, если данные не имеют десятичных знаков, но поскольку в моей части не было никаких спецификаций, указывающих, что данные могут иметь десятичную (я сказал int, что было моей ошибкой), ваш ответ идеально. Я могу исправить эту часть. Спасибо огромное! – JaemyeongEo

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