在Pig中按袋值分组

时间:2012-02-04 00:49:22

标签: user-defined-functions apache-pig

我一直坚持这个问题。我有一个如下所示的数据文件:

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来获取逗号分隔的类别字段,并将其转换为Pig包。我的数据模式现在是这样的:     {date: chararray, name: chararray, categories: {t: (category:chararray)}}

我陷入了下一步 - 实际上通过嵌套行李值执行分组。我试过没有运气的嵌套FOREACH语句的变种。例如:

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

我的想法是这种语法可以生成(名称,类别)的元组,我可以运行GROUP。然而,实际的输出是整个包,让我回到正方形1.我不知道如何继续 - 帮助/反馈将是最受欢迎的。谢谢!

1 个答案:

答案 0 :(得分:5)

假设每个名称在您的数据文件中都是唯一的,您可以FLATTEN类别包,然后按类别GROUPCOUNT按类别划分的名称数量。

e.g。

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;