Join操作
MapReduce Join 操作:大表关联小表用 Map 端,大表关联大表用 Reduce 端
数据处理中,多表关联是家常便饭——订单关联用户、日志关联商品、销售关联库存。在 SQL 里一个 JOIN 就搞定,在 MapReduce 里得自己实现。
MapReduce 提供了两种 Join 方案:
- Reduce 端 Join:通用,任何规模都能用,但要走 Shuffle,性能一般
- Map 端 Join:快,但要求一张表足够小,能塞进内存
怎么选?就一句话:小表能装进内存就用 Map 端 Join,装不下就用 Reduce 端 Join。
Join 的核心难点:怎么让相同 Key 的数据到同一个地方
两个表关联,关键是把相同关联键的数据凑到一起。
- 订单表有商品 ID → 需要找到商品表里相同商品 ID 的信息
- 问题是:订单数据分散在不同节点,商品数据也分散在不同节点
- 怎么让同一个商品 ID 的订单数据和商品数据落到同一个节点?
这就是 Join 的核心挑战。MapReduce 用两种方式解决:
| 方案 | 怎么凑到一起 | 前提 |
|---|---|---|
| Reduce 端 Join | 通过 Shuffle,相同 Key 自动分到同一个 Reduce | 无限制 |
| Map 端 Join | 小表提前加载到每个 Map 任务的内存里 | 小表能装进内存 |
Reduce 端 Join:通用方案,任何规模都能用
实现原理
flowchart TD
A[表 A 数据] -->|Map 阶段| B["打标签 <Key, (A, ValueA)>"]
C[表 B 数据] -->|Map 阶段| D["打标签 <Key, (B, ValueB)>"]
B --> E[Shuffle 按 Key 分组]
D --> E
E --> F["Reduce 阶段合并 <Key, (A, B)>"]
F --> G[输出关联结果]
思路:
- Map 阶段:从不同表读数据,统一输出
<关联键, 来源标记 + 数据> - Shuffle 阶段:相同关联键自动分到同一个 Reduce
- Reduce 阶段:把同一 Key 的两张表数据合并
关键点:Map 阶段一定要标记数据来源。 Reduce 阶段收到的是同一个 Key 的 value 列表,不知道哪些来自订单表、哪些来自商品表,所以需要标记(比如用 “order” 和 “product” 前缀)。
代码骨架: