我在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中实现这一点!谢谢!
答案 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
的好时机。 COGROUP
与GROUP
类似,只是您将分组应用于多个别名,因此每个分区都有一个记录包,而不只是一包记录。
修改强>
不幸的是,在这种情况下,由于Pig处理空袋行李袋的方式,如果A
或B
没有给定DATE
的记录,那么记录包将为空,列的投影将生成NULL
行李,其中SUM
为NULL
,然后当您将其添加到其他值时,将整个表达式转换为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
解决方案更清洁,请记住这一点在这种情况下。