数据库
首页 > 数据库> > 周末小短文:Sql如何处理热点key

周末小短文:Sql如何处理热点key

作者:互联网

周末小短文:Sql如何处理热点key

|0x00 问题概述

在面试的时候,经常会问到一个问题:Hive在Join的时候,经常因为热点key的问题,导致数据倾斜,应该怎么解决?方法很简单,对导致倾斜的key做单独处理即可,最后再做union,那么Sql应该怎么写?

|0x01 常规处理

我们首先建一张临时表:

insert overwrite table tmp_0
select hot_key
from (
    select   hot_key
             ,count(1) as cnt
    from     table_0
    where    dt = '20201206'
    group by hot_key
) a
where    cnt >= 10000
;


然后将热点的key单独组装一段sql:

select *
from  table_1 a
join   tmp_0 b
on    a.key = b.hot_key
;

最后处理非热点key:

select *
from  table_1 a
left join tmp_0 b
on     a.key = b.hot_key
where  b.hot_key is null
;

|0x02 考虑mapjoin

当然,我们还有办法提速吗?有的,是使用mapjoin,参考下面的写法:

select /*+mapjoin(b)*/
       b.*
from   tmp_0 a 
right join table_1 b
on     a.hot_key = b.key
where  a.hot_key is null
;

|0xFF 考虑空值

当然,大多数情况下,key都是有空值情况存在的,我们需要对空值做特殊处理,以上一段sql为例:

select  /*+mapjoin(b1)*/
       b.*
from    tmp_0 a 
right join table_1 b
on     a.hot_key = coalesce(b.key, concat('other', rand()))
where   a.hot_key is null

标签:tmp,短文,bon,hot,key,Sql,table,select
来源: https://blog.51cto.com/u_15291990/2978718