美文网首页
JOIN表之后产生的笛卡尔积问题

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

作者: 小甜瓜Melon | 来源:发表于2017-07-19 17:38 被阅读0次

背景: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(空值行产生的笛卡尔积记录数)。

完。

相关文章

网友评论

      本文标题:JOIN表之后产生的笛卡尔积问题

      本文链接:https://www.haomeiwen.com/subject/kktrkxtx.html