HIVE优化系列之数据倾斜
数据倾斜
在hive表中 进行一系列join关联时经常会出现数据倾斜问题,可以通过hint将小表进行广播,从而提高查询的执行效率。
- 第一种hint方法:/*+ BROADCAST(small_table) */
SELECT /*+ BROADCAST(small_table) */
*
FROM large_table
JOIN small_table ON large_table.id = small_table.id;
这个用法时告诉 Hive 在执行连接操作时将表 small_table 进行广播(即在所有的 Mapper 节点上复制一份),以便在连接时避免数据倾斜。
括号里的 small_table 通常指的是小表。因为广播小表可以减少 Shuffle 操作,提高查询性能。
- 第二种hint方法:/*+ BROADCASTJOIN(small_table) */
SELECT /*+ BROADCASTJOIN(small_table) */
*
FROM large_table
LEFT JOIN small_table ON large_table.id = small_table.id;
这个用法跟上边一样都是指示Hive 在执行连接时使用广播连接的方式,避免大表和小表之间的 Shuffle 操作,减少网络传输和计算时间。
- 第三种hint方法:/*+ MAPJOIN(small_table) */
SELECT /*+ MAPJOIN(small_table) */
*
FROM large_table
LEFT JOIN small_table ON large_table.id = small_table.id;
这个用法与上边两个不同,他会强制Hive 将表small_table 作为MapJoin 处理,即在 Mapper 阶段直接连接,而不需要进行Shuffle 操作。通过将小表放入每个Mapper,可以加快连接速度,尤其是在小表较小且能够被完全加载到内存中的情况下。
结论:
三者都用于优化连接操作,尤其在数据倾斜的情况下。
使用这些提示时,需要确保选择的表确实是小表(一般小于200M),以避免内存溢出或性能问题。