【hive】join语句优化

Mapjoin

1.场景

Mapjoin是Hive鲜为人知的功能,它允许将表加载到内存中,从而只要在mapper中完全执行(非常快速)的join,而不必使用“map/reduce”步骤。如果您的查询经常依赖于小表联接(例如城市或国家等),则可能会发现使用mapjoins可以大大提高速度。

2.启用

有两种方法可以启用它。

1.是通过使用一个注释,

/ * + MAPJOIN(小表)* /,此C样式注释应放在SELECT之后,它指示Hive将别名(小表)加载到内存中。

SELECT /*+ MAPJOIN(c) */ * FROM orders o JOIN cities c ON (o.city_id = c.id);

2.另一种打开mapjoins的方法是让Hive自动执行。

只需在配置中将hive.auto.convert.join设置为true,Hive就会对小于hive.mapjoin.smalltable.filesize(默认值为25MB)的任何表自动使用mapjoins。

3.缺陷

Mapjoins有一个局限性,即不能在同一表或别名的查询中的不同列上进行联接。

这是有道理的,因为大概Hive在联接中使用的列上使用了一个HashMap键控,而这样的HashMap对于在不同键上的join将毫无用处)。

3.1 绕过缺陷

可以通过限定where条件子查询的子表,进行连接。

SELECT /*+ MAPJOIN(sr) */ COUNT(*)
FROM
(
    select *
    from a
    where source='c'
) g
JOIN
(
    select * from b
    where source='c'
) sr
ON (g.key = sr.key);

参考:https://grisha.org/blog/2013/04/19/mapjoin-a-simple-way-to-speed-up-your-hive-queries/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值