美文网首页
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