最近学习时发现 Hive 中还有一种 SMB Join,即 Sort Merge Bucket Join ,赶紧找资料学习了一波。。
map join
我们知道在 Hive 中当小表 join 大表时可以通过 map join 将小表中的数据读入内存,在 map 端 join 大表,从而省略 reduce 过程,大大加快连接的速度,但是当小表数据量过大内存放不下时就无法使用 map join 了,由此引出了 Sort Merge Bucket Join。
SMB join
要使用 SMB Join,所有的表都必须按相同的列进行分桶并使用相同的桶数(或一个表桶数是另一个表桶数的倍数)且保证数据有序。这样才能确保 hash 值相同的 key 被分到同一个桶中,SMB join 的结果才是有效的。可以在建表时通过使用 CLUSTERED BY user_id INTO 256 BUCKETS
来对某一列进行分桶并指定桶数。
分桶后在插入时需要:
set hive.enforce.bucketing=true
强制 hive 为目标分桶表设置正确的reducer数,如果不指定,需要自己设置正确的reducer数:</