【问题标题】:Difference between SAS merge and full outer join [duplicate]SAS合并和完全外连接之间的区别[重复]
【发布时间】:2015-11-15 13:09:44
【问题描述】:

表 t1:

person | visit | code_num1 | code_desc1
     1       1         100         OTD
     1       2         101         SED
     2       3         102         CHM
     3       4         103         OTD 
     3       4         103         OTD
     4       5         101         SED

表 t2:

 person | visit | code_num2 | code_desc2
     1       1         104         DME
     1       6         104         DME
     3       4         103         OTD 
     3       4         103         OTD
     3       7         103         OTD
     4       5         104         DME

我有以下 SAS 代码,按人员合并两个表 t1 和 t2 并访问:

DATA t3;
    MERGE t1 t2;
    BY person visit;
RUN;

产生以下输出:

person | visit | code_num1 | code_desc1 |code_num2 | code_desc2
      1       1         100         OTD        104          DME
      1       2         101         SED   
      1       6                                104          DME           
      2       3         102         CHM 
      3       4         103         OTD        103          OTD
      3       4         103         OTD        103          OTD
      3       7                                103          OTD
      4       5         101         SED        104          DME

我想在 hive 查询中复制它,并尝试使用完全外连接:

create table t3 as 
select case when a.person is null then b.person else a.person end as person,
       case when a.visit is null then b.visit else a.visit end as visit,
       a.code_num1, a.code_desc1, b.code_num2, b.code_desc2
       from t1 a 
       full outer join t2 b
       on a.person=b.person and a.visit=b.visit

生成表格:

person | visit | code_num1 | code_desc1 |code_num2 | code_desc2
      1       1         100         OTD        104          DME
      1       2         101         SED        null        null
      1       6         null        null       104          DME           
      2       3         102         CHM        null        null
      3       4         103         OTD        103          OTD
      3       4         103         OTD        103          OTD
      3       4         103         OTD        103          OTD
      3       4         103         OTD        103          OTD
      3       7         null        null       103          OTD
      4       5         101         SED        104          DME

这与 SAS 几乎相同,但我们为 (person=3, visit=4) 多出了 2 行。我认为这是因为 hive 将一个表中的每一行与另一个表中的两行匹配,在 t3 中产生 4 行,而 SAS 没有。关于如何让我的查询与 SAS 合并的输出相匹配的任何建议?

【问题讨论】:

  • 如果有帮助,SAS 的做法是将左表和右表限制为一组特定的行,这些行都共享一个共同的键值(比如你的两个 3-4 行在每张桌子上),然后在每张桌子上一次走一行 - 所以 A.r1 = B.r1 和 A.r2 = B.r2 - 然后如果一张桌子用完行,则保留最后一行,所以如果 A 有更多 3-4 行,则有效 A.r3=B.r2 A.r4=B.r2 等。
  • 另外,HiveQL 没有 Coalesce 功能吗?做生意时似乎比所有情况都容易。
  • 这确实有助于我更好地了解正在发生的事情。此外,关于合并的好主意。 @乔
  • 我想如果你在每个上添加一个行号,然后过滤到 [a.rownum=b.rownum 或 a.rownum>max(b.rownum) 或 b.rownum>max(a. rownum)] 或类似的东西?

标签: merge hive sas outer-join hiveql


【解决方案1】:

如果您合并两个数据集并且它们具有相同名称的变量(除了 by 变量),那么来自第二个数据集的变量将覆盖第一个数据集中具有相同名称的所有变量。因此,您的 sas 代码会创建一个重叠数据集。完全外连接不会这样做。

在我看来,如果您首先对右侧表进行重复数据删除,然后进行完全外部联接,您应该在 hive 中获得等效的表。正如乔所指出的那样,我认为不需要这种情况下的陈述。只需对键值进行连接:

create table t3 as 
select  coalesce(a.person, b.person) as person
      , coalesce(a.visit, b.visit) as visit
      , a.code_num1
      , a.code_desc1
      , b.code_num2
      , b.code_desc2
   from 
   (select * from t1) a 
   full outer join
   (select person, visit, code_num2, code_desc2
       group by person, visit, code_num2, code_desc2 from t2) b
   on a.person=b.person and a.visit=b.visit
   ;

我目前无法测试此代码,因此请务必对其进行测试。祝你好运。

【讨论】:

  • 虽然与 SAS 表相比,这确实为我提供了正确的表,但我预见到当 t2 具有不在 t1 中的重复列时会出现问题。 SAS 会将所有这些都包括在决赛桌中,但上面只会包括一个,不是吗? @invoketheshell
  • 我同意你上面写的。你问的这个问题很好,所以我投了赞成票。有时间我会再考虑的。
  • 谢谢,我自己还在寻找解决方案@invoketheshell
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2014-09-23
  • 2012-09-02
  • 2014-05-17
  • 2015-04-01
  • 2011-06-10
相关资源
最近更新 更多