我试图通过对某些字段进行分组和投影将最大聚合函数应用于表。我可以在汇总投影中引用原始表中的其他非分组字段吗?
举例来说,我有一个带有模式的表(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_ids上重复)?
如果我可以引用特定于每个分组的user_id和order_id的product_id,则可以通过不与原始表重新联接来访问此字段来节省自己的mapreduce作业。谢谢你们。
最佳答案
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作业中完成。
关于hadoop - pig 拉丁文的汇总信息和预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13484718/