如何完整的外连接表并在PIG中总结

时间:2014-01-28 11:08:34

标签: sql hadoop apache-pig hdfs outer-join

我在HDFS上有2个数据集如下所示:

A
--------
DATE          PAGE VIEWS      CLICKS
2014/01/21    200             50
2014/01/22    300             70
2014/01/23    150             100

B
--------
DATE          PAGE VIEWS      CLICKS
2014/01/23    50              25
2014/01/24    250             110

我想合并这两个数据集以产生以下结果:

C
--------
DATE          PAGE VIEWS      CLICKS
2014/01/21    200             50
2014/01/22    300             70
2014/01/23    200             125
2014/01/24    250             110

如您所见,最终数据集C已从A& A中获得了2014/01/23的汇总数据。 B,包括来自A而不是B的记录,反之亦然。我知道这可以使用FULL OUTER JOIN在PIG中实现,但我不确定是否有干净的解决方案。在SQL中,我可以实现如下:

SELECT 
COALESCE(A.DATE, B.DATE) AS DATE, 
SUM(COALESCE(A.PAGE_VIEWS, 0)+COALESCE(B.PAGE_VIEWS, 0)) AS PAGE_VIEWS,
SUM(COALESCE(A.CLICKS, 0)+COALESCE(B.CLICKS, 0)) AS CLICKS
FROM A FULL OUTER JOIN B 
ON A.DATE = B.DATE
GROUP BY COALESCE(A.DATE, B.DATE);

非常感谢如何在PIG 0.10中实现这一点!谢谢!

2 个答案:

答案 0 :(得分:1)

一种方法可以是:

 AB1 = UNION A, B;
 AB2 = GROUP AB1 BY DATE;
 C = FOREACH AB2 GENERATE group AS DATE, SUM(PAGE_VIEWS) AS PAGE_VIEWS, SUM(CLICKS) AS CLICKS;

答案 1 :(得分:1)

这是使用COGROUP的好时机。 COGROUPGROUP类似,只是您将分组应用于多个别名,因此每个分区都有一个记录包,而不只是一包记录。

修改

不幸的是,在这种情况下,由于Pig处理空袋行李袋的方式,如果AB没有给定DATE的记录,那么记录包将为空,列的投影将生成NULL行李,其中SUMNULL,然后当您将其添加到其他值时,将整个表达式转换为NULL。所以代码必须变得有点丑陋才能解释这一点。

C =
    FOREACH (COGROUP A BY DATE, B BY DATE)
    GENERATE
        group AS DATE,
        (IsEmpty(A)?0:SUM(A.PAGE_VIEWS))+(IsEmpty(B)?0:SUM(B.PAGE_VIEWS)) AS PAGE_VIEWS,
        (IsEmpty(A)?0:SUM(A.CLICKS))+(IsEmpty(B)?0:SUM(B.CLICKS)) AS CLICKS;

COGROUP是必不可少的,但是,如果您希望对不同的行李应用不同的操作,那么即使您认为UNION / GROUP解决方案更清洁,请记住这一点在这种情况下。