Hive 中的 Left Join 未返回预期结果
Left Join in Hive is not returning expected results
我有3个table,一个是datetable只包含日期,另外2个有如下数据。
日期table:
表 1:
表 2:
我正在对日期 table 进行左连接,如下所示:
select * from
(select distinct t.d,
coalesce(tab1.name,tab2.name,"") as name,
coalesce(tab1.id,tab2.id,"") as id,
coalesce(tab1.tgt_cnt,0) as tgt_cnt,
coalesce(tab2.a_cnt,0) as a_cnt,
coalesce(tab2.b_cnt,0) as b_cnt,
coalesce(tab2.c_cnt,0) as v_cnt
from datetable t
LEFT JOIN (select * from table1) tab1 on t.d = tab1.dt
LEFT JOIN (select * from table2) tab2 on t.d = tab2.dt) a
where (tgt_cnt <> 0 or a_cnt <> 0 or b_cnt <> 0 or c_cnt <> 0);
我得到了以下结果。
我的问题是记录 TOM 发生了什么。我不确定为什么 CG 和 Bob 重复两次。我的查询有问题吗?
请问为什么 TOM 记录没有进入 Left Join 以及为什么 CG 和 BOB 重复。
我期待以下结果。
非常感谢您的帮助。
谢谢巴布
coalesce(tab1.name,tab2.name,"") as name
会将table2中的名字替换为table1中的名字,所以TOM没有出现,因为它被CG或BOB替换了。
我猜你想在这里实现什么...你似乎想合并 table1 和 table2。我认为完全加入是合适的。
select * from (
select distinct
coalesce(t1.dt, t2.dt) as dt,
coalesce(t1.desc, t2.desc) as desc,
coalesce(t1.name, t2.name) as name,
coalesce(t1.id, t2.id) as id,
coalesce(t1.tgt_cnt, 0) as tgt_cnt,
coalesce(t2.a_cnt, 0) as a_cnt,
coalesce(t2.b_cnt, 0) as b_cnt,
coalesce(t2.c_cnt, 0) as c_cnt
from table1 t1
full join table2 t2
on t1.name = t2.name and t1.dt = t2.dt
) a
where (tgt_cnt <> 0 or a_cnt <> 0 or b_cnt <> 0 or c_cnt <> 0);
这会给
dt desc name id tgt_cnt a_cnt b_cnt c_cnt
6/29/2020 NULL Tom 3 0 0 0 1
6/29/2020 AA CG 1 3 1 1 0
6/29/2020 AA Bob 2 3 0 0 0
我有3个table,一个是datetable只包含日期,另外2个有如下数据。
日期table:
表 1:
表 2:
我正在对日期 table 进行左连接,如下所示:
select * from
(select distinct t.d,
coalesce(tab1.name,tab2.name,"") as name,
coalesce(tab1.id,tab2.id,"") as id,
coalesce(tab1.tgt_cnt,0) as tgt_cnt,
coalesce(tab2.a_cnt,0) as a_cnt,
coalesce(tab2.b_cnt,0) as b_cnt,
coalesce(tab2.c_cnt,0) as v_cnt
from datetable t
LEFT JOIN (select * from table1) tab1 on t.d = tab1.dt
LEFT JOIN (select * from table2) tab2 on t.d = tab2.dt) a
where (tgt_cnt <> 0 or a_cnt <> 0 or b_cnt <> 0 or c_cnt <> 0);
我得到了以下结果。
我的问题是记录 TOM 发生了什么。我不确定为什么 CG 和 Bob 重复两次。我的查询有问题吗?
请问为什么 TOM 记录没有进入 Left Join 以及为什么 CG 和 BOB 重复。
我期待以下结果。
非常感谢您的帮助。
谢谢巴布
coalesce(tab1.name,tab2.name,"") as name
会将table2中的名字替换为table1中的名字,所以TOM没有出现,因为它被CG或BOB替换了。
我猜你想在这里实现什么...你似乎想合并 table1 和 table2。我认为完全加入是合适的。
select * from (
select distinct
coalesce(t1.dt, t2.dt) as dt,
coalesce(t1.desc, t2.desc) as desc,
coalesce(t1.name, t2.name) as name,
coalesce(t1.id, t2.id) as id,
coalesce(t1.tgt_cnt, 0) as tgt_cnt,
coalesce(t2.a_cnt, 0) as a_cnt,
coalesce(t2.b_cnt, 0) as b_cnt,
coalesce(t2.c_cnt, 0) as c_cnt
from table1 t1
full join table2 t2
on t1.name = t2.name and t1.dt = t2.dt
) a
where (tgt_cnt <> 0 or a_cnt <> 0 or b_cnt <> 0 or c_cnt <> 0);
这会给
dt desc name id tgt_cnt a_cnt b_cnt c_cnt
6/29/2020 NULL Tom 3 0 0 0 1
6/29/2020 AA CG 1 3 1 1 0
6/29/2020 AA Bob 2 3 0 0 0