2013-10-25 3 views
0

Я пытаюсь выполнить операцию суммирования со свиньями.Как сделать «подведение итогов» на латинском языке?

К примеру, у меня есть таблица с именем t3:

product price country 

A 5 Italy 

B 4 USA 

C 12 France 

A 5 Italy 

B 7 Russia 

мне нужно сделать операцию реферирования, используя 2 ключа: product и country.

  1. я операцию конкатенации, используя product и country
  2. Я должен рассчитать цену, суммируя значения цен только где CONCAT результат повторяет
  3. Где CONCAT результат не повторяется, цена остается такой же, как в t3 таблица.

Ожидаемый выход может быть:

CONCAT Price_1 
AItaly 10 
BUSA 4 
CFrance 12 
BRussia 7 

В свинью я пишу следующий скрипт (код неправильно, а просто показать идею):

t3 = LOAD '/home/Desktop/3_table/3_table.data' AS (product:chararray, price:int, country:chararray); 



c1 = FOREACH t3 GENERATE CONCAT(product, country); 


c2 = FOREACH t3 GENERATE *, c1; 

product_1 = GROUP c2 BY c1; 
price_1 = FOREACH product_1 GENERATE group, SUM(product_1.price); 

STORE price_1 INTO 'summarise_by_2_ID' USING PigStorage('\t'); 

Может быть кто-то может объяснить как достичь ожидаемого результата? Большое спасибо!

ответ

0

Если вы хотите рассчитать сумму платежа на продукт и в страну, вам не нужно использовать функцию concat. Просто группируйтесь по этим двум полям.

A = LOAD 's.txt' USING PigStorage('\t') AS (product:chararray, price:int, country:chararray); 
B = GROUP A BY (product, country); 
C = FOREACH B GENERATE CONCAT(group.product,group.country), SUM(A.price); 

На самом деле, конкат не нужен здесь, это только формат вывода, как ожидалось.

DUMP C 

(AItaly,10) 
(BUSA,4) 
(BRussia,7) 
(CFrance,12) 
+0

Могу ли я спросить только об одном? Если мне нужно «классифицировать» ту же таблицу. Ожидаемый результат может быть: A (A, 5, Италия), (A, 5, Италия) B (B, 4, США), (B, 7, Россия) C (C, 12, Франция) \t КОД: t2 = LOAD '/home/Desktop/2_table/2_table.data' AS (продукт: chararray, цена: int, страна: chararray); A = GROUP t2 BY product; C = FOREACH A GENERATE группа $ 1, COUNT ($ 1); STORE C INTO 'Classify' ИСПОЛЬЗОВАНИЕ PigStorage ('\ t'); Но я получаю сообщение об ошибке, свиньи не нравится diffinition $ 1. Есть ли другой способ определить первый элемент в: (A, 5, Italy), (A, 5, Italy), так что я могу считать, что A repeatc 2 раза? – Ale

+0

Я не понимаю, что вы хотите сделать, но что-то вроде этого может помочь: 'C = FOREACH A GENERATE group, $ 1, COUNT ($ 1);' – Frederic

+0

возвращает: '' (A, {(A, 5, Italy)), (A, 5, Италия)}, 2) (B, {(B, 4, США), (B, 7, Россия)}, 2) (C, {(C, 12, France)} , 1) '' – Frederic

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