Pig Latin中的汇总信息和投影

时间:2012-11-21 00:51:04

标签: hadoop apache-pig

我正在尝试通过对某些字段进行分组并进行投影来将最大聚合函数应用于表格。我可以在聚合投影中引用原始表中的其他非分组字段吗?

作为示例,我有一个带有架构的表格(user_id:long,order_id:long,product_id:long,性别:chararray,size:int),其中user_id,order_id和product_id创建复合键但是可以有多个用户ID和订单ID。为了获得每个订单的最大尺寸,我使用

result_table = foreach (group blah by (user_id, order_id)) generate
   FLATTEN(group) as (user_id, order_id),
   MAX(blah.size) as max_size;

我是否还可以通过某种方式将product_id添加到result_table的创建中,因此我有一个包含user_id,order_id,product_id和max_size的表(max_size会在不同的product_id上重复)?

如果我可以引用每个分组的user_id和order_id特定的product_id,我可以通过不与原始表连接来访问该字段来保存自己的mapreduce作业。谢谢你们。

1 个答案:

答案 0 :(得分:0)

Pig很适合这样的东西,它有一些包,可以让它在SQL中做一些需要额外连接的东西。

如果您执行以下操作:

grp = group blah by (user_id, order_id);
describe grp;

你会看到有一个包的架构与“blah”的架构相同(类似于group:(user_id:long,order_id:long),blah:{(user_id:long,order_id:long, product_id:long,性别:chararray,size:int)})。这是一个非常强大的功能,因为它将允许我们创建一个输出,其中包含每行中包含组摘要的所有原始行,而不使用内部联接:

grp = group blah by (user_id, order_id);
result_table = foreach grp generate 
   FLATTEN(blah.(user_id, order_id, product_id)), -- flatten the bag created by original group
   MAX(blah.size) as max_size;

如果同一product_id在user_id组中出现多次,order_id比重复项多,为避免它,我们可以使用嵌套在FOREACH中的DISTINCT:

grp = group blah by (user_id, order_id);
result_table = foreach grp {
    dist = distinct blah.(user_id, order_id, product_id); -- remove duplicates
    generate flatten(dist), MAX(blah.size) as max_size;
}

它将在一个MapReduce作业中完成。