企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
如果不指定Map Join或者不符合Map Join的条件,那么Hive解析器会将join操作转换为Common Join,即在Reduce阶段完成join,容易发生数据倾斜。 <br/> 我们可以用Map Join把小表全部加载到内存中,让其在Map端进行join,避免reducer处理。 <br/> **开启Map Join:** ```sql -- 开启Map join。默认就是true,开启 hive(default)> set hive.auto.convert.join=true; -- 大表、小表的阈值设置,默认25M是就是小表 -- 单位为Byte hive(default)> set hive.mapjoin.smalltable.filesize=25000000; ``` <br/> **Map Join的工作机制:** ![](https://img.kancloud.cn/8f/75/8f7550f5b2bf6bc3318e675d58499b7c_1209x632.png) 首先是 Task A,它是一个 Local Task(在客户端本地执行的 Task),负责扫描小表 b 的数据,将其转换成一个 HashTable 的数据结构,并写入本地的文件中,之后将该文件加载到 DistributeCache 中。 <br/> 接下来是 Task B,该任务是一个没有 Reduce 的 MR,启动 MapTasks 扫描大表 a,在 Map 阶段,根据 a 的每一条记录去和 DistributeCache 中 b 表对应的HashTable 关联,并直接输出结果。 <br/> 由于 MapJoin 没有 Reduce,所以由 Map 直接输出结果文件,有多少个 Map Task,就有多少个结果文件。