0

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

例如,我有一个带有模式(user_id:long,order_id:long,product_id:long,gender: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_ids 上重复)?

如果我可以引用特定于每个分组的 user_id 和 order_id 的 product_id,我可以通过不加入原始表来访问该字段来节省自己的 mapreduce 工作。多谢你们。

4

1 回答 1

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,大小: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 作业中完成。

于 2012-11-21T10:29:11.600 回答