SQL常说用小表驱动大表,网上很多帖子也是说hive也是小表驱动大表。
但实际用expalin执行计划测的时候,大表写在前面执行了mapjoin,小表写前面反而没采用MapJoin,为了确定确实是表大小的顺序原因,我更改了set hive.mapjoin.smalltable.filesize; 将其调小,则两种方案都无法mapJoin。
这是不是意味着:hive中为了采用MapJoin优化,在leftJoin时确实应该将大表写在前面,这和业务SQL数据库是相反了?
答:
保留大表还是小表取决于业务逻辑,并不是语法上可以优化的。
mapJoin并不存在什么书写顺序,只要开启了mapJoin,在成本评估合适的时候就会启用MapJoin。这具体表现在,InnerJoin不关心书写顺序;LeftJoin在小表在左侧,即小表完全保留的时候不会开启MapJoin,因为会产生很多空值连接的键值对,后续依旧要通过一个Reduce计算去除,且数据量很大不划算;RighJoin同理。 所谓的“小表驱动大表”和这里的MapJoin并不是一个概念,他指的是单服务器将小表加载内存,大表建立索引的过程;和这里的MapJoin减少网络传输,避免数据倾斜是不同的,设计理念就不同。
标签:MapJoin,小表,hive,mapJoin,驱动,大表 From: https://www.cnblogs.com/averyve/p/16714383.html