hive的各种jion

Hive中Join主要有三类:
1、map join
2、reduce join 也叫shuffle join、common join
3、smb join是sort merge bucket


【1、在map端产生join】
mapJoin的主要意思就是,当链接的两个表是一个比较小的表和一个特别大的表的时候,我们把比较小的table直接放到内存中去,然后再对比较大的表格进行map操作。join就发生在map操作的时候,每当扫描一个大的table中的数据,就要去去查看小表的数据,哪条与之相符,继而进行连接。这里的join并不会涉及reduce操作。
在实际的应用中,我们这样设置:


第一种:手动指定小表
select /*+ MAPJOIN(time_dim) */ count(*) from time_dim join store_sales on (ss_sold_time_sk = t_time_sk) ;
*** time_dim: 小表


第二种:自动识别小表,开启mapJoin自动转换
如果表数据小于25M,会自动启用mapjoiin
set hive.auto.convert.join=true ;






【2、reduce join】
这种情况下生再两个table的大小相当,但是又不是很大的情况下使用的。具体流程就是在map端进行数据的切分,一个block对应一个map操作,然后进行shuffle操作,把对应的block shuffle到reduce端去,再逐个进行联合


2.1 参数1
这种情况下,如果出现数据倾斜,可以设置以下参数:
hive.exec.reducers.bytes.per.reducer = 1000000000
也就是每个节点的reduce 默认是处理1G大小的数据,如果你的join 操作也产生了数据倾斜,那么你可以在hive 中设定


2.2 参数2
set hive.optimize.skewjoin = true; 
set hive.skewjoin.key = skew_key_threshold (default = 100000)
hive 在运行的时候没有办法判断哪个key 会产生多大的倾斜,所以使用这个参数控制倾斜的阈值,如果超过这个值,新的值会发送给那些还没有达到的reduce, 一般可以设置成你
(处理的总记录数/reduce个数)的2-4倍都可以接受.
倾斜是经常会存在的,一般select 的层数超过2层,翻译成执行计划多于3个以上的mapreduce job 都很容易产生倾斜,建议每次运行比较复杂的sql之前都可以设一下这个参数.

2.3 参数3
set hive.groupby.skewindata = true ;
设置true以后,当语句有groupby的时候,会进行进行两次mr job,第一次会将相同key分布到不同reduce中,从而达到负载均衡。第二次会在根据预处理的数据结果按照group by key分布到reduce中。最终完成Join







【3、smb是sort merge bucket】
bucket操作,首先进行排序,继而合并,然后放到所对应的bucket中去,bucket是hive中和分区表类似的技术,就是按照key进行hash,相同的hash值都放到相同的bucket中去。在进行两个表联合的时候。我们首先进行分桶,在join会大幅度的对性能进行优化。也就是说,在进行联合的时候,是table1中的一小部分和table1中的一小部分进行联合,table联合都是等值连接,相同的key都放到了同一个bucket中去了,那么在联合的时候就会大幅度的减小无关项的扫描。
set hive.auto.convert.sortmerge.join=true; 
set hive.optimize.bucketmapjoin = true;  
set hive.optimize.bucketmapjoin.sortedmerge = true;  
set hive.enforce.bucketing = true


创建带桶的table 
create table student(id INT, age INT, name STRING)
partitioned by(stat_date STRING) 
clustered by(id) sorted by(age) into 2 buckets
row format delimited fields terminated by ',';



















你可能感兴趣的:(hive的各种jion)