2016-07-13 3 views
1
/*calculating average for itemssold(int) grouped by city */ 

a = LOAD 'sales.txt' USING PigStorage(','); /*loading sales data and it has 50 fields that are comma separated*/ 
b = FOREACH a GENERATE $3 as city:chararray, $4 as itemssold:int;/*defining schema for needed fields*/ 
c = GROUP b BY city; /*grouping by city*/ 
d = FOREACH c GENERATE group,AVG(b.itemssold); /*calculating average*/ 
dump d; /*writing output*/ 

Здесь я пытаюсь вычислить среднее значение по предметам, сгруппированным по городам.Среднее вычисление по сценарию свиньи

Error: Error while computing Average.

Может кто-нибудь, пожалуйста, помогите мне исправить эту ошибку?

Примечание: Поскольку sales.txt имеет 50 полей, разделенных запятой, я не хочу определять схему для всех полей при загрузке sales.txt в себя.

+0

Как выглядит свалка b? Индексы столбцов начинаются с $ 0.Вы уверены, что город и предметы - это 4-й и 5-й столбцы в файле данных. –

+0

свалка b; выглядит, как показано ниже, Чикаго, 12 Даллас, 20 Атланта, 22 Чикаго, 23 Атланте, 12 Даллас, 87 ..... так далее. Да, я знаю, что индексы начинаются с позиции $ 0. Они находятся на 4-м и 5-м месте соответственно. –

+0

Попробуйте c = GROUP b BY b.city; d = FOREACH c GENERATE b.city, AVG (b.itemssold); –

ответ

0

Может быть, ваши данные содержат некоторое отсутствующее значение, попробуйте отфильтровать его первым, как это:

no_nulls = FILTER b BY itemssold is not null; 
0
a = LOAD 'sales.txt' USING PigStorage(','); 
b = FOREACH a GENERATE (chararray) $3 as city, (int) $4 as itemssold; 
c = GROUP b BY city; 
d = FOREACH c GENERATE group,AVG(b.itemssold); 
dump d; 

Приведенный выше код работает. В отношении b GENERATE я пытался определить схему, а не кастинг, поэтому свиньи запутались. Исправлено, что сейчас & это сработало. Спасибо всем за ваши предложения.

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