处理Hive中的数据倾斜的方法

 更新时间:2024年10月29日 10:19:25   作者:莫叫石榴姐  
数据倾斜是大数据处理不可避免会遇到的问题,那么在Hive中数据倾斜又是如何导致的?通过本片本章,你可以清楚的认识为什么Hive中会发生数据倾斜;发生数据倾斜时我们又该用怎么的方案去解决不同的数据倾斜问题,需要的朋友可以参考下

1 groupby(大表分组-局部聚合+全局聚合)

示例1:

select label,sum(cnt) as all from 
(
    select rd,label,sum(1) as cnt from 
    (
        select id,label,round(rand(),2) as rd,value from tmp1
    ) as tmp
    group by rd,label
) as tmp
group by label;

示例2:

select 
	split(new_source,'\\_')[0] as source 
	,sum(cnt) as cnt 
from  
(select  
	concat(source,'_', rand()*100) as  new_source
	,count(1) as cnt 
from  test_table 
where day ='2022-01-01'
group by 
	concat(source,'_', rand()*100)
)tt 
group by 
	split(new_source,'\\_')[0]

2 join(大中表Join - 加salt + 小表膨胀)

示例1:

select label,sum(value) as all from 
(
    select rd,label,sum(value) as cnt from
    (
        select tmp1.rd as rd,tmp1.label as label,tmp1.value*tmp2.value as value 
        from 
        (
            select id,round(rand(),1) as rd,label,value from tmp1
        ) as tmp1
        join
        (
            select id,rd,label,value from tmp2
            lateral view explode(split('0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9',',')) mytable as rd
        ) as tmp2
        on tmp1.rd = tmp2.rd and tmp1.label = tmp2.label
    ) as tmp1
    group by rd,label
) as tmp1
group by label;

示例2:

select 
	source
	,source_name
	,sum(cnt) as cnt 
from  
(select 
	t1.source 
	,new_source
	,nvl(source_name,'未知') as source_name 
	,count(imei) as cnt 
from  
(select  
	imei
	,source 
	,concat(cast(rand()*10 as int ),'_',source ) as new_source
from  test_table_1
where day ='2022-01-01'
) t1 
inner join 
(
select 
	source_name 
	,concat(preflix,'_',source) as new_source
from  test_table_1
where day ='2022-01-01'
lateral view explode(split('0,1,2,3,4,5,6,7,8,9,10',','))b as preflix 
) t2 
on t1.new_source =t2.new_source
group by 
t1.source 
,new_source
,nvl(source_name,'未知')
) tta  
group by 
	source
	,source_name

3 双大表Join - 抽样取倾斜key+BroadJoin

##优化前:
create table test.tmp_table_test_all as 
select  
imei 
,lable_id 
,nvl(label_name,'未知')
from tmp_table_1  t1  
left join 
(select  
lable_id
,label_name
from  tmp_table_2 
where day ='2024-01-01') t2 
on t1.lable_id =t2.lable_id
where t1.day ='2024-01-01'
;
 
## 优化后 :
create table test.tmp_table_test_all_new  as 
 
 
with tmp_table_test_1 as 
(select  
lable_id 
,count(1) as cnt 
from tmp_table_1  t1 
tablesample(5 percent) --抽样取5%的数据,减少table scan的量
group by lable_id
order by cnt desc 
limit 100
) 
 
 
select  
	imei 
	,lable_id 
	,nvl(label_name,'未知') as  label_name
from tmp_table_1  t1 
left join  tmp_table_test_1  t2
on t1.lable_id =t2.lable_id
left join 
(select  
	lable_id
	,label_name
from  tmp_table_2 
where day ='2024-01-01') t3
on t1.lable_id =t3.lable_id
where t1.day ='2024-01-01' and  t2.lable_id is null 
 
union all  
 
select  
	imei 
	,lable_id 
	,nvl(label_name,'未知') as  label_name 
from tmp_table_1  t1 
inner  join 
(select  
	lable_id
from  tmp_table_test_1  t1 
left   join   tmp_table_2  t2 
on t1.lable_id =t2.lable_id
where t2.day ='2024-01-01') t3
on t1.lable_id =t3.lable_id
where t1.day ='2024-01-01' 
;

4 小结

到此这篇关于处理Hive中的数据倾斜的方法的文章就介绍到这了,更多相关处理Hive数据倾斜内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mycat在windows环境下的安装和启动

    mycat在windows环境下的安装和启动

    这篇文章主要介绍了mycat在windows环境下的安装和启动过程,需要的朋友参考下吧
    2018-03-03
  • SQL Update多表联合更新的方法

    SQL Update多表联合更新的方法

    这篇文章主要介绍了SQL Update多表联合更新的方法,需要的朋友可以参考下
    2014-08-08
  • idea中连接数据库时出现SSL错误的问题

    idea中连接数据库时出现SSL错误的问题

    这篇文章主要介绍了idea中连接数据库是出现SSL错误的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 单机离线部署OceanBase3.1.5详解

    单机离线部署OceanBase3.1.5详解

    文章详细介绍了如何下载、安装和配置OceanBase数据库,包括配置OBD、修改配置文件、指定版本启动、修改limits.conf、部署安装、启动OceanBase、安装obclient、创建用户租户等步骤
    2024-11-11
  • 数据库触发器(Trigger)的一点使用心得

    数据库触发器(Trigger)的一点使用心得

    最近了解了一下数据库触发器,并做一点实际的应用,在翻看其概念的时候,还是本着从理解的角度来学习的,但是,到了实际的应用场景中,还是有一些特别注意的地方的,下面是自己在应用中的几点体会
    2009-07-07
  • Linux下开启和配置OpenGauss数据库远程连接的教程详解

    Linux下开启和配置OpenGauss数据库远程连接的教程详解

    openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行,本文主要为大家介绍了Linux系统中如何开启和配置OpenGauss数据库的远程连接,需要的小伙伴可以参考下
    2023-12-12
  • IntellJ Idea 2020版添加sqlite数据库的方法

    IntellJ Idea 2020版添加sqlite数据库的方法

    这篇文章主要介绍了IntellJ Idea 2020版添加sqlite数据库的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 一文弄懂数据库设计的三范式

    一文弄懂数据库设计的三范式

    面试中经常会问到的数据库三范式指的是什么,本文主要介绍了数据库设计的三范式,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 详解SQL中Group By的使用教程

    详解SQL中Group By的使用教程

    这篇文章主要介绍了SQL中Group By的使用,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • sql连接查询语句中on、where筛选的区别总结

    sql连接查询语句中on、where筛选的区别总结

    接触Sql语句时间挺长时间了,听他人说过sql语句的连接查询,但一直没有认真研究和使用过!下面这篇文章主要给大家介绍了关于sql连接查询语句中on、where筛选两者之间区别的相关资料,文中通过图文介绍的非常详细,需要的朋友们下面来一起看看吧。
    2017-07-07

最新评论