Группировка по значению сумки в Pig - PullRequest
4 голосов
/ 04 февраля 2012

Я застрял в этом вопросе на некоторое время.У меня есть файл данных, который выглядит следующим образом:

2012/01/01        Name1      "Category1,Category2,Category3"
2012/01/01        Name2      "Category2,Category3"
2012/01/01        Name3      "Category1,Category5"

Каждый элемент связан с разделенным запятыми списком категорий.Я хотел бы иметь возможность группировать по названию категории, чтобы получить вывод, подобный этому:

Category1    Name1, Name3
Category2    Name1, Name2
...
Category5    Name3

(более конкретно, мне не нужны имена предметов - только подсчет количества предметовв этой категории будет)

В итоге я написал UDF, чтобы взять разделенное запятыми поле категории и преобразовать его в пакет "Свинья".Моя схема данных теперь выглядит примерно так: {date: chararray, name: chararray, categories: {t: (category:chararray)}}

Я застрял на следующем шаге - фактически выполняю группирование по значению вложенной сумки.Я попробовал варианты вложенного оператора FOREACH без какой-либо удачи.Например:

x = FOREACH myData
{
categoryNames = FOREACH categories GENERATE category;
GENERATE myData.Name, categoryNames;
}

Я думал, что этот вид синтаксиса может генерировать кортежи (имя, категория), которые я могу запустить GROUP.Однако, фактический результат - целая сумка, возвращающая меня на круги своя. У меня нет идей о том, как поступить - помощь / обратная связь была бы очень признательна.Спасибо!

1 Ответ

5 голосов
/ 05 февраля 2012

Предполагая, что каждое имя уникально в вашем файле данных, вы можете FLATTEN сумка категории, затем GROUP по категории и COUNT количество имен по категория.

, например

name_category = 
    FOREACH data
    GENERATE
        name,
        FLATTEN(categories) AS category;

category_group =
    GROUP name_category
    BY category;

category_count =
    FOREACH category_group
    GENERATE
        FLATTEN(group) AS category,
        COUNT(name_category) AS count;
...