【问题标题】:Aggregated information and projection in Pig LatinPig Latin 中的汇总信息和预测
【发布时间】:2012-11-21 00:51:04
【问题描述】:

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

作为示例,我有一个带有模式的表 blah(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_id 上重复)?

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

【问题讨论】:

    标签: hadoop apache-pig


    【解决方案1】:

    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:长,性别: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 作业中完成。

    【讨论】:

    • 谢谢阿列克谢,我会用这个方法试验一下,它看起来像我需要的。
    • 问题:在第二个示例中,您对 blah 的三个字段执行不同的操作,您是否可以参考原始大小值,以便基于这三个值发生不同但结果行仍然包含大小?
    • 已经存在了,dist 是和 blah 分开的包,distinct 没有改变 blah,因此 MAX(blah.size) 返回你想要的结果。
    • 啊,但可以这样做:grp = group blah by (user_id, order_id); result_table = foreach grp { dist = distinct blah.(user_id, order_id, product_id);生成 flatten(dist)、flatten(blah.size)、MAX(blah.size) 为 max_size; }
    • 小心“flatten(dist), flatten(blah.size)”,因为它会在 dist bag 和 blah bag 中的所有记录之间创建笛卡尔积,你会得到 blah.size blah.product_id 不等于 dist.product_id。根本的问题是,当 user_id、order_id、product_id 的相同值有不止一行的 size 值不同时,你会选择哪种尺寸?
    猜你喜欢
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    相关资源
    最近更新 更多