hadoop - pig 拉丁文的汇总信息和预测

标签 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_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/

相关文章:

hadoop - Hdfs 文件行数

hadoop - 将多个目录中的多个文件加载到 Pig 中

hadoop - 如何处理 pig 的溢出内存

hadoop - Flink 转换为 parquet 错误

xml - 当我添加hive-site.xml时,Hive Shell无法打开

hadoop - 使用Pig从HBase加载数据时出错

hadoop - 对Pig Latin命令参数执行SUBSTRING

hadoop - 使用 SPLIT 和 COGROUP 的 Pig LOAD 以及映射器的数量

hadoop - 纱 : Could not find or load main class org. apache.hadoop.mapreduce.v2.app.MRAppMaster

hadoop - 在 ambari 中使用 hbase 时出现连接问题