我在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中提供一些指导,我们将不胜感激!谢谢!
2条答案
按热度按时间8i9zcol21#
一种方法是:
fcy6dtqo2#
这是一个很好的使用时间
COGROUP
.COGROUP
就像GROUP
,除非您将分组应用于多个别名,结果是每个别名都有一袋记录,而不是只有一袋记录。编辑:
不幸的是,在这种情况下,由于Pig处理空袋袋投影的方式,如果
A
或者B
没有特定记录DATE
,则该记录袋将为空,列的投影将导致NULL
袋子,那个SUM
其中之一就是NULL
,然后将其添加到另一个值时,它会将整个表达式转换为NULL
. 因此,代码必须变得更加丑陋才能解释这一点。