Sql 如何在PIG中完整外部联接表和汇总

Sql 如何在PIG中完整外部联接表和汇总,sql,hadoop,apache-pig,hdfs,outer-join,Sql,Hadoop,Apache Pig,Hdfs,Outer Join,我在HDFS上有如下两个数据集,它们是以制表符分隔的: 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

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

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中的记录,反之亦然。我知道这可以在猪身上实现,使用完全的外部连接,但不确定是否有干净的解决方案。在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中实现这一点提供一些指导,我们将不胜感激!谢谢

一种方法可以是:

 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;

这是使用
COGROUP
的好时机
COGROUP
GROUP
类似,不同之处在于您将分组应用于多个别名,因此每个别名都有一包记录,而不仅仅是一包记录

编辑:

不幸的是,在这种情况下,由于清管器处理空袋投影的方式,如果
A
B
没有给定
日期的记录,则该记录袋将为空,列的投影将导致
NULL
袋,其
总和为
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
是必不可少的,但是,如果您希望对不同的行李应用不同的操作,请记住,即使您认为在这种情况下,
联合
/
解决方案更干净。

感谢您的反馈。让我试试这个,看起来很简单。谢谢你的输入。在上面使用联合方法还是使用COGROUP,哪种方法的性能更好?源数据集不是很大。由于您的数据集很小,主要考虑的是启动了多少map reduce作业--我没有尝试过,但是
UNION
GROUP
/
COGROUP
都需要reduce阶段,我认为Pig无法组合它们,因此,
UNION
/
GROUP
方法需要2个MR作业,而
COGROUP
方法只需要1个MR作业。但是你可以试试看。谢谢。我尝试了COGROUP方法,但是它似乎在进行内部连接。结果输出仅包含2014/01/23的数据。我尝试了语法“FOREACH(COGROUP A BY DATE OUTER,B BY DATE OUTER)”,但仍然只返回2014/01/23数据。使用COGROUP时,正确的语句应该是什么来确保完全的外部联接?有关
COGROUP
如何工作的详细信息,请参阅<代码>外部
在此上下文中没有意义。它没有像内部的
连接那样进行任何类型的过滤,但是当包是空的时,它试图获取一个
总和,这让它感到困惑。我更新了答案以反映这一点。另外,我尝试了这两种方法,结果表明,Pig可以在1 MR作业中优化这两种方法。太好了,谢谢你的解释。我们将在未来牢记这一点。