2013-11-29 2 views
1

Я пытаюсь научиться свиньей себе и у меня есть следующий сценарий:свиньи присоединиться и средний

customer_ratings = LOAD 'customer_ratings.txt' as (i_id:int, customer_id:int, rating:int); 
item_data = LOAD 'item_data.txt' USING PigStorage(',') as (item_id:int,item_name:chararray, dummy:int,item_url:chararray); 
item_join = join item_data by item_id, customer_ratings by i_id; 
item_group = GROUP item_join ALL; 
item_foreach = foreach item_group generate item_id, item_name, item_url, AVG(item_join.rating); 
PRINT = limit item_foreach 40; 
dump PRINT; 

Еогеасп будет неисправный со следующей ошибкой:

Invalid field projection. Projected field [item_id] does not exist in schema: group:char array,item_join:bag{:tuple(item_data::item_id:int,item_data::item_name:char array,item_data::dummy:int,item_data::item_url:chararray,customer_ratings::i_id:int,customer_ratings::customer_id:int,customer_ratings::rating:int)}. 

Я знаю, что есть что-то я не понял через учебники, чтобы достичь этого ... Любая идея, как печатать то, что у меня есть в foreach?

Я также попытался generate item_data::item_id, item_data::item_name, etc., как описано в (pig - how to reference columns in a FOREACH after a JOIN?), но это тоже не работает ...

ответ

2
customer_ratings = LOAD 'customer_ratings.txt' as (i_id:int,customer_id:int, rating:int); 

item_data = LOAD 'item_data.txt' USING PigStorage(',') as (item_id:int,item_name:chararray, dummy:int,item_url:chararray); 

item_join = foreach (
      join item_data by item_id, 
      customer_ratings by i_id 
      ) 
      generate 
      item_data::item_id as item_id, 
      item_data::item_name as item_name, 
      cutsomer_rating::rating as rating 
      ; 

item_group = GROUP item_join by (item_id, item_url); 

item_foreach = foreach item_group generate 
       FLATTEN(group) as (item_id, item_url), 
       AVG(item_join.rating) 
       ; 

PRINT = limit item_foreach 40; 

dump PRINT; 

Что-то вроде этого, я думаю, работает. Хотя я его не тестировал. Есть две вещи, которые я сделал. Во-первых, после присоединения я пошел и назвал поля чем-то простым, так что нам не нужно носить с собой кучу полей с именами типа отношения.fieldname.

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

generate item_join.item_data::item_id 
+1

Perfect. Мне также нужно было напечатать item_name, поэтому я добавил это. Это делает его очень ясным. Спасибо! – rkh

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