SMB Join(Sort-Merge-Bucket Join) 是 Hive 中一种高效的大表与大表 JOIN 优化策略,适用于两张表都按相同字段分桶(Bucketed)且有序(Sorted) 的场景。
它的核心思想是:利用预排序和分桶结构,在 Reduce 阶段直接合并(Merge)数据,避免全量 Shuffle 和排序开销。
✅ 一、SMB Join 的前提条件(必须同时满足)
-
两张表都是分桶表(Bucketed)
CREATE TABLE user ( id STRING, name STRING ) CLUSTERED BY (id) INTO 32 BUCKETS -- 按 id 分 32 桶 STORED AS ORC; -
分桶字段 = JOIN 字段
- 如
JOIN ON a.id = b.id,则两张表必须都按id分桶。
- 如
-
两张表的桶数成倍数关系
- 如 A 表 32 桶,B 表可以是 32、64、16 等(Hive 能一一对应或合并)。
-
(可选但推荐)表内数据按分桶字段有序
CLUSTERED BY (id) SORTED BY (id) INTO 32 BUCKETS
🔧 二、如何开启 SMB Join?
-- 开启自动转换(Hive 会自动识别符合条件的 SMB Join)
SET hive.optimize.bucketmapjoin=true;
SET hive.optimize.bucketmapjoin.sortedmerge=true;
-- 强制使用 SMB MapJoin(更高效)
SET hive.auto.convert.sortmerge.join=true;
SET hive.auto.convert.sortmerge.join.noconditionaltask=true;
💡 Hive 0.13+ 默认支持自动 SMB Join,只要表结构符合,无需改写 SQL。
🔄 三、SMB Join vs 普通 Join vs MapJoin
| 类型 | 适用场景 | 是否需要 Shuffle | 性能 |
|---|---|---|---|
| MapJoin | 小表 + 大表 | ❌ 无 Shuffle | ⭐⭐⭐⭐⭐(最快) |
| Common Join | 任意表 | ✅ 全量 Shuffle + 排序 | ⭐(最慢) |
| SMB Join | 大表 + 大表(分桶有序) | ✅ 仅桶间 Shuffle,无全局排序 | ⭐⭐⭐⭐(高效) |
✅ SMB 的优势:
- 每个 Reducer 只处理对应桶的数据(如 A 表桶1 + B 表桶1);
- 因数据已有序,直接 Merge 而非 Sort-Merge,省去排序开销。
📊 四、执行流程简示
- 每个 Reducer 只拉取同一个桶编号的数据;
- 因桶内数据已按 JOIN Key 排序,直接线性合并即可。
⚠️ 五、注意事项
- 建表时必须显式指定
CLUSTERED BY和SORTED BY; - 插入数据时需开启分桶:
SET hive.enforce.bucketing=true; SET hive.enforce.sorting=true; INSERT OVERWRITE TABLE user SELECT id, name FROM src DISTRIBUTE BY id SORT BY id; - 若桶数不匹配或未排序,Hive 会退化为普通 Join。
📌 面试总结(一句话):
SMB Join 是 Hive 针对“大表 JOIN 大表”的高性能方案,要求两张表按 JOIN 字段分桶且有序,通过桶对齐和预排序,实现 Reduce 阶段的高效 Merge,避免全量 Shuffle 和排序。
适用于数仓 DWD/DWS 层宽表构建等场景,是高级 Hive 优化的重要手段。
3208

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



