hive中多表full join主键重复问题

目录

0. 其他

1. 问题描述

2. 问题复现

2.1. 建表语句

2.2. 插入数据

2.3. 查询SQL以及问题

3. 问题原因

4. 问题解决


0. 相关文章链接

 开发随笔文章汇总 

1. 问题描述

        在Hive中(其他类似SQL,比如PostgreSQL可能也存在此问题),当对多张表(3张及以上)进行full join时,会存在每张表的主键都是唯一,但当full join后,会发现主键可能有重复。

2. 问题复现

2.1. 建表语句

create table realtime_dw.table_a
(
	id int,
	name int
);

create table realtime_dw.table_b
(
	id int,
	name int
);

create table realtime_dw.table_c
(
	id int,
	name int
);

2.2. 插入数据

-- a表      -- b表      -- c表
1,111       1,111       1,111
2,222       3,333       4,444
3,333       4,444       5,555

2.3. 查询SQL以及问题

select
    coalesce(a.id, b.id, c.id) as id
    , a.name
    , b.name
    , c.name
from table_a as a

full join table_b as b
on a.id = b.id

full join table_c as c
on a.id = c.id
;

当执行如上查询SQL时,会发现其中 id = 4 的数据有重复,如下图所示:

3. 问题原因

        之所以会出现这样的问题,是因为是以a表为主表,但a表中只有 id 为 1、2、3 的数据,但在b表中有id为4,c表中也有id为4,此时full join时,a表会以空值和b表、c表中id为4的数据join,这样关联后的表中就会出现2条id为4的数据。

4. 问题解决

        在后续的表full join时,不单单使用第一张表的主键full join(因为是full join,所以肯定会存在第一张表为null,而其他表有值的数据),而使用 coalesce 方法对所有前面已经full join了的主键进行条件关联,如下代码:

select
    coalesce(a.id, b.id, c.id) as id
    , a.name
    , b.name
    , c.name
from table_a as a

full join table_b as b
on a.id = b.id

full join table_c as c
on coalesce(a.id, b.id) = c.id
;

此时,结果就不会有主键重复,如下查询结果所示:


注:其他相关文章链接由此进 ->      开发随笔文章汇总 


评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电光闪烁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值