我一直坚持这个问题。我有一个如下所示的数据文件:
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.我不知道如何继续 - 帮助/反馈将是最受欢迎的。谢谢!
答案 0 :(得分:5)
假设每个名称在您的数据文件中都是唯一的,您可以FLATTEN类别包,然后按类别GROUP和COUNT按类别划分的名称数量。
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;