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