2014-08-29 1 views
1

Я пытаюсь использовать некоторые функции Pig на Titanic data. В какой-то момент я сузить ее до пассажирского класса и тарифа (цена билета):Как отличить поле свиньи для функции AVG

Вот код:

sh echo "1. create FarePclass with two fields" 
FarePclass = FOREACH train GENERATE Pclass,Fare ; 
DUMP FarePclass; 

sh echo "2. create FareByClass grouping by Pclass" 
FareByPclass = GROUP FarePclass BY Pclass ; 
--FareByPclass = GROUP FarePclass ALL; 
--DUMP FareByPclass; 

DESCRIBE FareByPclass; 

sh echo "3. get average" 
AvgFareByPclass = FOREACH FareByPclass GENERATE (float) SUM(FarePclass.Fare); 

Вот некоторые примеры строк из заявления DUMP на шаге 1 и выход:

(2,10.5) 
(3,7.05) 
(3,29.125) 
(2,13) 
(1,30) 
(3,23.45) 
(1,30) 
(3,7.75) 
2. create FareByClass grouping by Pclass 
FareByPclass: {group: chararray,FarePclass: {(Pclass: chararray,Fare: chararray)}} 
3. get average 
2014-08-28 20:56:23,288 ERROR org.apache.pig.tools.grunt.Grunt: ERROR 1045: 
<file titanic_dypler_datafu.pig, line 36, column 56> Could not infer the matching function for org.apache.pig.builtin.SUM as multiple or none of them fit. Please use an explicit cast. 

У меня есть этот скрипт, и я пытаюсь запустить последнюю строку. AvgFareByPclass = FOREACH FareByPclass GENERATE (float) SUM (FarePclass.Fare);

Я получаю эту ошибку при попытке ее запуска: Нельзя бросать мешок со схемой: bag {: tuple (Fare: chararray)} плавать.

Можете ли вы предложить, как бросить FarePclass.Fare? Мне что-то не хватает концептуально о том, как это сделать?

ответ

0

После того, как вы уже пробовали суммировать их, слишком поздно, чтобы попытаться преобразовать Chararray Fares в числа с плавающей запятой; они должны быть номерами, прежде чем вы сможете взять их сумму. Вероятно, наиболее разумным местом для преобразования является то, что первая проекция на FarePclass:

FarePclass = FOREACH train GENERATE Pclass,(float)Fare ; 
+0

Спасибо, Джонатан, который решил мою проблему. И в случае, если кому-то интересно, средняя стоимость билета на билеты на «Титанике» составляет: Первый класс: 84,15 долларов США. Второй класс: 21,66 доллара США. Третий класс: 13,67 доллара. И BTW, мои первоначальные цели состояли в том, чтобы вычислить среднее значение, но я решил заставить SUM работать первым, если вы заметили несоответствие между именами и вызовами функций. Еще раз спасибо. – Jazzmine

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