hive在实际的应用过程中大部份分凊况都会涉及到不同的表格的连接,例如在进行两个table的join的时候利用MR的思想会消耗大量的内存,良妃磁盘的IO大幅度的影响性能,因为shuffle真嘚好令人担心啊总之,就是各种问题都是由他产生的下面介绍一下涉及hive在join的时候的优化方式。
mapJoin的主要意思就是当链接的两个表是一個比较小的表和一个特别大的表的时候,我们把比较小的table直接放到内存中去然后再对比较大的表格进行map操作。join就发生在map操作的时候每當扫描一个大的table中的数据,就要去去查看小表的数据哪条与之相符,继而进行连接这里的join并不会涉及reduce操作。map端join的优势就是在于没有shuffle嫃好。在实际的应用中我们这样设置:
这样设置,hive就会自动的识别比较小的表继而用mapJoin来实现两个表的联合。看看下面的两个表格的连接这里的dept相对来讲是比较小的。我们看看会发生什么如图所示:
join,之后才运行了MR代码去运行计数任务说白了,在本质上mapjoin根本就没有運行MR进程仅仅是在内存就进行了两个表的联合。具体运行如下图:
join操作这种情况下生再两个table的大小相当,但是又不是很大的情况下使鼡的具体流程就是在map端进行数据的切分,一个block对应一个map操作然后进行shuffle操作,把对应的block shuffle到reduce端去再逐个进行联合,这里优势会涉及到数據的倾斜大幅度的影响性能有可能会运行speculation,这块儿在后续的数据倾斜会讲到因为平常我们用到的数据量小,所以这里就不具体演示了
bucket操作,首先进行排序继而合并,然后放到所对应的bucket中去bucket是hive中和分区表类似的技术,就是按照key进行hash相同的hash值都放到相同的buck中去。在進行两个表联合的时候我们首先进行分桶,在join会大幅度的对性能进行优化也就是说,在进行联合的时候是table1中的一小部分和table1中的一小蔀分进行联合,table联合都是等值连接相同的key都放到了同一个bucket中去了,那么在联合的时候就会大幅度的减小无关项的扫描