【问题标题】:Grouping by bag value in PigPig中按包值分组
【发布时间】:2012-02-04 00:49:22
【问题描述】:

我在这个问题上纠结了一段时间。我有一个如下所示的数据文件:

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;
}

我的想法是这种语法可以生成 (Name, category) 的元组,我可以在上面运行 GROUP。但是,实际输出是整个袋子,带我回到第 1 格。我对如何进行没有想法 - 非常感谢帮助/反馈。谢谢!

【问题讨论】:

    标签: user-defined-functions apache-pig


    【解决方案1】:

    假设每个名称在您的数据文件中都是唯一的,您可以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;
    

    【讨论】:

    • 我不知道 FLATTEN 在包上的行为是生成多个元组——这正是我想要实现的。谢谢!
    猜你喜欢
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多