2014-09-28 3 views
0

У меня проблема со свиным сценарием, я пробовал много разных способов. Может ли кто-нибудь указать, что именно я делаю неправильно? Это должно быть довольно прямо вперед, я пытаюсь получить максимум после вычисления среднего.ошибка пигмента не вычисляется max

a = LOAD 'default.books' using org.apache.hcatalog.pig.HCatLoader(); 
b = LOAD 'default.book_rating' using org.apache.hcatalog.pig.HCatLoader(); 

books_and_ratings = join a by isbn, b by isbn; 

by_isbn = GROUP books_and_ratings BY (a::isbn); 

DESCRIBE by_isbn; 

average_book_rating = FOREACH by_isbn 
     GENERATE books_and_ratings.book_title, books_and_ratings.a::isbn as isbn1, 
     books_and_ratings.book_author, books_and_ratings.publisher, 
     AVG(books_and_ratings.book_rating) as AVG_RATING; 

DESCRIBE average_book_rating; 

group_avg = GROUP average_book_rating ALL; 

DESCRIBE group_avg; 

max_avg_rating = FOREACH group_avg 
    GENERATE FLATTEN average_book_rating.a::book_title, isbn1, 
      average_book_rating.a::book_author, average_book_rating.a::publisher, MAX(AVG_RATING); 

dump max_avg_rating; 

Не удалось разобрать: несоответствующие ввод '' average_book_rating ожидая LEFT_PAREN

+0

Вы получаете ошибку, или это просто не вычисляет max правильно? – Eyal

+0

@eyal, получив ошибку на самом деле .... – Hades

+0

Неверный результат вычисления max_avg_rating. Можете ли вы вставить точную ошибку? –

ответ

2

Вы можете попробовать, как это.

max_avg_rating = ORDER average_book_rating BY AVG_RATING DESC; 
top_most_rating = LIMIT max_avg_rating 1; 
dump top_most_rating; 
0

После просмотра Аид последний комментарий («может быть несколько книг с наивысшим средним рейтингом»), я думаю, вам нужен другой группировке, после первого, который группирует рейтингов ISBN, чтобы получить то, что вы хотите.

Начать с чем-то вроде этого:

grouped_rating = GROUP average_book_rating по AVG_RATING;

Затем вы можете использовать код, подобный @ Sivasakthi'S:

ordered_avg_rating = ORDER BY grouped_rating группы DESC;
top_most_rating = LIMIT ordered_avg_rating 1;
dump top_most_rating;

Таким образом, при наличии нескольких результатов с равным, высоким рейтингом, top_most_rating будет иметь мешок всей информации для книг, которые получили эту высокую оценку. Конечно, вы можете проецировать это, чтобы получить что-то более удобное, если вы не хотите, чтобы он был мешком.

UPDATE:

Вот как я хотел бы изменить свой код, указанный выше. Одна вещь, которая не является чисто функциональной, заключается в том, что я сначала оцениваю рейтинги и только потом присоединяюсь к информации о книге/автору - это будет лучше, чем разумно, потому что в противном случае вы увеличиваете размер рейтингов (из которых есть многие) при переходе через них.

Так это выглядит следующим образом:

-- assume a: book_title, isbn, book_author, publisher (and maybe more, which we'll ignore) 
    a = LOAD 'default.books' using org.apache.hcatalog.pig.HCatLoader(); 

    -- assume b: isbn, book_rating (and maybe more, which we'll ignore) 
    b = LOAD 'default.book_rating' using org.apache.hcatalog.pig.HCatLoader(); 

    by_isbn = GROUP b BY isbn; 

    average_book_rating = FOREACH by_isbn GENERATE AVG(b.book_rating) AS AVG_RATING, group AS isbn; 

    group_avg = GROUP average_book_rating BY AVG_RATING; 

    ordered_avg_rating = ORDER group_avg BY group DESC; 

    top_most_rating = LIMIT ordered_avg_rating 1; 

    b = FOREACH top_most_rating GENERATE flatten(average_book_rating); 

    -- now add the book information 

    books_and_ratings = JOIN a BY isbn, b BY isbn; 

    books_and_ratings = FOREACH books_and_ratings GENERATE a::book_title AS title, a::isbn AS isbn, a::book_author AS author,a::publisher AS publisher, b::average_book_rating::AVG_RATING AS max_rating; 

Надеется, что это работает для вас.

+0

спасибо за ваш ответ, я редактировал мой вопрос ... можете ли вы посмотреть и посмотреть, что не так ли? – Hades

+0

В коде, который вы отредактировали (в вашем исходном описании), вы сгруппированы по ALL, а не AVG_RATING, как в моем ответе. Это означает, что все строки будут сгруппированы в один мешок. Я все еще не уверен, что вы пытаетесь сделать, но FLATTEN использует круглые скобки, и это является непосредственной причиной ошибки.Код в моем ответе действительно доставит вам сумку всех книг, получивших самый высокий средний рейтинг. – Eyal

+0

Мне просто нужен самый высокий средний .... исправьте мой код, и я дам вам щедрость – Hades