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

原文链接:http://www.jianshu.com/p/7aa5be8143e5

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

完。

展开阅读全文

没有更多推荐了,返回首页