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以及问题
selectcoalesce(a.id, b.id, c.id) as id, a.name, b.name, c.name
from table_a as afull join table_b as b
on a.id = b.idfull 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了的主键进行条件关联,如下代码:
selectcoalesce(a.id, b.id, c.id) as id, a.name, b.name, c.name
from table_a as afull join table_b as b
on a.id = b.idfull join table_c as c
on coalesce(a.id, b.id) = c.id
;
此时,结果就不会有主键重复,如下查询结果所示:
注:其他相关文章链接由此进 -> 开发随笔文章汇总
hive中多表full join主键重复问题相关推荐
- 数仓工具—Hive语法之连续full join主键重复(24)
文章目录 连续full join 主键重复 问题复现 Hive 版本的问题 执行顺序的问题 写法有问题 解决方案 严格限制关联条件顺序 合并去重 关联coalesce 总结 连续full join 主 ...
- java获取表主外键_通过 jdbc 分析数据库中的表结构和主键外键
文章转自:http://ivan4126.blog.163.com/blog/static/20949109220137753214811/ 在某项目中用到了 hibernate ,大家都知道 hib ...
- mysql中复合主键指什么作用_MySQL中什么是数据表的复合主键
MySQL中什么是数据表的复合主键 发布时间:2020-11-23 14:03:11 来源:亿速云 阅读:108 作者:小新 这篇文章主要介绍MySQL中什么是数据表的复合主键,文中介绍的非常详细,具 ...
- mysql一个表中可以有几个主键_数据库的单个数据表中有几个主键?
数据库的单个数据表中只能有一个主键.数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性:主键主要是用与其他表的外键关联,以及本记录的修改与删除. 数据库的单 ...
- 如何在oracle中查询所有用户表的表名、主键名称、索引、外键等
使用select * from user_tables 可以查询出所有的用户表. 查所有用户的表在all_tables 主键名称.外键在all_constraints 索引在all_i ...
- 如何列出引用SQL Server中给定表的所有外键?
我需要在SQL Server数据库中删除一个高度引用的表. 我如何获取要删除表需要删除的所有外键约束的列表? (与在Management Studio的GUI中单击相比,SQL的答案更好.) #1楼 ...
- HIVE中的表以及语法
2019独角兽企业重金招聘Python工程师标准>>> HIVE中的表以及语法 一.HIVE的表 HIVE使用的功能性的表格分为四种:内部表.外部表.分区表.分桶表. 1.内部表.外 ...
- MySQL中myisam和innodb的主键索引有什么区别?
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索 ...
- 061 hive中的三种join与数据倾斜
一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...
最新文章
- R 回归 虚拟变量na_工具amp;方法 | R语言机器学习包大全(共45个包)
- DNS Tunneling及相关实现——总之,你发起攻击都需要一个DNS server,下载一些工具作为client发起数据,server收集数据并响应...
- 飞鸽传书为我们提供了方便的聊天工具
- html中使用style设置背景
- Delphi 常用API 函数
- 453. Minimum Moves to Equal Array Elements 一次改2个数,变成统一的
- netsh命令改IP和重置winsock(可解决能上QQ不能上网的问题)
- idea下载Mybatis插件
- 扫描转换html,HTML5/CSS3 3D雷达扫描动画
- FloydFest 19 大赛冠军歌曲 Roll With Me,使用Peluso话筒录制
- 网易云信发送短信工具类
- html的nofollow标签,nofollow标签有什么用,网站怎么添加nofollow
- 双软企业的税收优惠政策怎么样?
- Oracle EBS R12 - Application patch可不可以reapply
- Ps 中英文版本切换批处理文件
- 1758 生成交替二进制字符串的最少操作数
- linux解压安装包失败了怎么办,解压文件出错怎么办?百度网盘、Winrar等解压文件出错解决办法...
- NVT平台PWM配置
- TD-SCDMA和2G互操作实现指导手册
- TeamViewer 连接不上