JOIN表之后产生的笛卡尔积问题

背景:inner join之后产生笛卡尔积

一、单表以及join之后产生的记录数

hiveContext.sql("select count(*) from d1.t1").show()
output:  6850
hiveContext.sql("select count(*) from d2.t2").show()
output:  10672512
hiveContext.sql("select count(*) from d2.t2 A inner join d1.t1 B 
on (A.account = B.mobile)").show()
output:  8433104

inner join之后产生了笛卡尔积问题,即产生的记录数多于其中两个表中最小的记录数。原因:join的两个表中都含有空行。

二、查看两个表的空值记录

详细说明:

hiveContext.sql("select count(*) from d2.t2 where mobile = ''").show()
output:  535
hiveContext.sql("select count(*) from d1.t1 where account = ''").show()
output:  15753

由此,空行匹配之后产生的多余记录535*15753=8427855

三、由非空行join之后的记录数

hiveContext.sql("SELECT COUNT(*) FROM (SELECT * FROM d2.t2 
WHERE account != '') A INNER JOIN (SELECT * FROM d1.t1 WHERE mobile != '') 
B on (A.account = B.mobile)").show()
output:  5249

我们发现:5249=8433104-8427855

即5249(非空值行join)=8433104(全表join) - 8427855(空值行产生的笛卡尔积记录数)。

完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • MySQL技术内幕:SQL编程 姜承尧 第1章 SQL编程 >> B是由MySQL创始人之一Monty分支的一个版...
    沉默剑士阅读 2,708评论 0 3
  • 最近一直忙着写SQLAlchemy的教程,但是在看到关系查询时,需要引入join的概念。也只怪的当初数据库没有学好...
    治部少辅阅读 17,165评论 6 37
  • 每年到过节的时候,朋友圈的妈妈就会转发很多类似不要这样逗我的孩子、不要给我孩子喂这些东西、不要给我的孩子尝酒这类的...
    文静hyw阅读 445评论 0 0
  • 这是真的吗?我攥着彩票,反复核对电视里的头奖彩票号码,我揉揉眼睛,别让自己眼花看错了。89456。。。,我又对了...
    林夕枫起阅读 343评论 0 1
  • 懒加载:需要的时候再去加载,并且只加载一次 原理:重写get方法 注意:在懒加载的过程中,不可用点语法,用点语法相...
    木子小静阅读 974评论 2 1

友情链接更多精彩内容