Hive中Mapjoin的使用

本文介绍了MapJoin技术的应用场景,包括如何利用小表进行不等值Join操作,以及如何通过优化排序关键字来改善查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        顾名思义 MapJoin是在Map端完成Join操作,需要将Join操作中的小表读入到内存,在Map阶段拿另外一个表一个表的数据和内存中表数据做匹配,这种情况下即使笛卡尔积也不会对任务运行速度造成太大的效率影响。

应用1:共同点:

1、有个较小的表(<1000);

2、需要做不等值join操作(a.x < b.y 或者 a.x like b.y等);

而且hive的where条件本身就是在map阶段进行的操作,所以在where里写入不等值比对的话,也不会造成额外负担。如此看来,使用MapJoin开发的程序仅仅使用map一个过程就可以完成不等值join操作,效率还会有很大的提升。

代码示例:

   1: select /*+ MAPJOIN(a) */
   2: a.start_level, b.*
   3: from dim_level a
   4: join (select * from test) b
   5: where b.xx>=a.start_level and b.xx<end_level;

应用2:hive的排序关键字是sort by,与order by区别在于sort by只能在单机范围内排序。

如:create table pv_users(

pages_id int,

username string,

time datetime,

visit_count int,

stay_time string

) partition by(ds string);

在表中查询所有记录,并按访问次数和id排序:

set mapred.reduce.tasks=2;

select * from pv_users sort by visit_count,pages_id;

这一查询可能指定的2个reducer分发到的数据可能是各自排序,因为没有reduce key,hive会随机生成作为reduce key,因为这样也被随机分发到不同的机子上个了。但依然存在问题。

解决:

1.不分发数据,使用单个reducer;

set mapred.reduce.tasks=1;

但容易造成性能瓶颈,数据量大的时候一般无法得到

2.在select关键词加/*+mapjoin(tablelist)*/提示优化器转化成为MapJoin(目前Hive优化器不能自动转化MapJoin)。其中tablelist可以是一个表,或逗号连接的表的列表,此表会被读入内存,因此小表写在这里。

注:给join添加join key,规避笛卡尔积时出现的Bug。



ps:内容参考量子恒道博客内容,致以感谢。


Hive中的Map Join是一种优化技术,用于在执行连接操作时减少数据倾斜和提高查询性能。Map Join通过在Map阶段完成连接操作,避免了Reducer阶段的处理,从而加快了查询速度。 ### 开启Map Join的方法 1. **自动Map Join**: Hive可以根据查询的实际情况自动选择使用Map Join。可以通过设置以下参数来启用自动Map Join: ```sql set hive.auto.convert.join=true; set hive.auto.convert.join.noconditionaltask=true; set hive.auto.convert.join.noconditionaltask.size=10000000; -- 设置小表的最大字节数 ``` 2. **手动Map Join**: 可以在SQL查询中使用提示(Hint)来手动指定Map Join。语法如下: ```sql SELECT /*+ MAPJOIN(table_name) */ columns FROM table1 JOIN table2 ON table1.column = table2.column; ``` ### 注意事项 - **小表大小**:Map Join适用于小表与大表之间的连接操作。小表的大小应小于`hive.auto.convert.join.noconditionaltask.size`参数设置的值。 - **资源消耗**:Map Join会将小表的数据加载到内存中,因此需要确保集群有足够的内存资源。 ### 示例 假设我们有两个表`orders`和`customers`,其中`customers`表是小表,我们可以使用Map Join优化连接操作: ```sql set hive.auto.convert.join=true; set hive.auto.convert.join.noconditionaltask=true; set hive.auto.convert.join.noconditionaltask.size=10000000; SELECT /*+ MAPJOIN(customers) */ o.order_id, c.customer_name FROM orders o JOIN customers c ON o.customer_id = c.customer_id; ``` 在上述示例中,`customers`表被标记为Map Join的小表,Hive会在Map阶段完成连接操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值