【发布时间】: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