如何在pig中完整的外部联接表和求和

zf9nrax1  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(310)

我在HDF上有两个数据集,如下所示,它们是以制表符分隔的:

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和b获得了2014/01/23的汇总数据,并包含了a而非b的记录,反之亦然。我知道这可以实现在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中提供一些指导,我们将不胜感激!谢谢!

8i9zcol2

8i9zcol21#

一种方法是:

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;
fcy6dtqo

fcy6dtqo2#

这是一个很好的使用时间 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` 这种情况下溶液更干净。

相关问题