分享

Hive在左外关联(LEFTOUTERJOIN)上的一个重大缺陷

 饮茶仙人 2018-10-12

测试版本为Hive 0.6.0

新浪微博 @谢纯青 回复:老bug了,0.7版本已修复, id 1534

------------------------------------------------------------------------------

左外关联(或者右外关联、全外关联)最重要的特性与原则就是主表的数据不能丢,例如有ljn001ljn002两个表,都有ab两个字段:
hive> select * from ljn001 order by a,b;
OK
      b
      1
      2
      3
      3
      4
hive> select * from ljn002 order by a,b;
OK
      b
      1
      2
      3
那么以下这个左外关联查询应该得到以下的结果:
hive> select a.*,b.*
    > from ljn001 left outer join ljn002
    > on (ljn001.a = ljn002.a and ljn001.b = ljn002.b);
OK
     
             b
     
             1
     
             2
     
             3
     
       NULL    NULL
     
       NULL    NULL
但是接下来我将展示目前版本的Hive在外关联上的一个重要缺陷
select ljn001.*,ljn002.*
from ljn001 left outer join ljn002
on (ljn001.a = ljn002.a and ljn001.b = ljn002.b and ljn001.b = 2);
SQL较前面的SQL多了红色标识的条件。根据外关联的原则:主表数据不能丢失,即ljn001表的数据不能丢失,当on里面的条件为真时ljn002的数据进行关联,当on里面的条件为假时ljn002的列全部为NULL。因此这个SQL的结果应该是:
     
             b
     
       NULL    NULL
     
             2
     
       NULL    NULL
     
       NULL    NULL
     
       NULL    NULL
可以在Oracle中验证此SQL的结果。
但是在Hive中结果却如下:
hive> select ljn001.*,ljn002.*
    > from ljn001 left outer join ljn002
    > on (ljn001.a = ljn002.a and ljn001.b = ljn002.b and ljn001.b = 2);
OK
     
             b
     
             2
从执行计划中可以看出Hive在扫描ljn001表的map操作时就已经对b = 2进行了过滤。可见Hiveljn001.b = 2当成了一个where筛选条件而不是一个on关联条件。因此在做Hive开发时一定要注意这个问题,否则就会产生意想不到的数据错误,也希望Hive能尽快修复这个缺陷。 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多