最近学习时发现 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数:</

Hive中的Sort Merge Bucket Join(SMB Join)是一种优化小表与大表连接的方法,当小表数据量过大无法使用map join时,SMB Join通过分桶和排序加速join过程。要使用SMB Join,需确保所有表按相同列分桶且数据有序。创建分桶表时,可使用`BUCKETED BY`指定列和桶数。在执行前,需设置正确的reducer数,以保证每个mapper能正确处理对应bucket的数据,从而提高效率。
最低0.47元/天 解锁文章
4361

被折叠的 条评论
为什么被折叠?



