Порядок трансформаций Apache Pig - PullRequest
0 голосов
/ 27 июня 2018

Я читаю программирование свиней Аланом Гейтсом.

Рассмотрим код:

ratings = LOAD '/user/maria_dev/ml-100k/u.data' AS 
    (userID:int, movieID:int, rating:int, ratingTime:int);

metadata = LOAD '/user/maria_dev/ml-100k/u.item' USING PigStorage ('|') AS 
    (movieID:int, movieTitle:chararray, releaseDate:chararray, imdbLink: chararray);

nameLookup = FOREACH metadata GENERATE 
    movieID, movieTitle, ToDate(releaseDate, 'dd-MMM-yyyy') AS releaseYear;

nameLookupYear = FOREACH nameLookup GENERATE 
    movieID, movieTitle, GetYear(releaseYear) AS finalYear;

filterMovies = FILTER nameLookupYear BY finalYear < 1982;

groupedMovies = GROUP filterMovies BY finalYear;

orderedMovies = FOREACH groupedMovies {
    sortOrder = ORDER metadata by finalYear DESC;
    GENERATE GROUP, finalYear;
    };

DUMP orderedMovies;

В нем говорится, что

«Сортировка по картам, кортежам или сумкам приводит к ошибке».

Я хочу знать, как сортировать сгруппированные результаты.

Должны ли преобразования следовать определенной последовательности, чтобы они работали?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Поскольку вы пытаетесь отсортировать сгруппированные результаты, вам не нужен вложенный foreach. Вы бы использовали вложенный foreach, если пытаетесь, например, отсортировать каждый фильм в течение года по названию или дате выпуска. Попробуйте упорядочить как обычно (см. finalYear как group, поскольку в предыдущей строке вы сгруппировали finalYear):

orderedMovies = ORDER groupedMovies BY group ASC;

DUMP orderedMovies;
0 голосов
/ 27 июня 2018

Если вы хотите отсортировать сгруппированные значения, вам придется использовать вложенный foreach. Это позволит отсортировать годы в порядке убывания внутри группы.

orderedMovies = FOREACH groupedMovies {
      sortOrder = ORDER metadata by GetYear(ToDate(releaseDate, 'dd-MMM-yyyy')) DESC;
      GENERATE GROUP, movieID, movieTitle;
};
...