处理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数据倾斜内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GBase与梧桐数据库窗口函数使用的方法比较

    GBase与梧桐数据库窗口函数使用的方法比较

    这篇文章主要给大家介绍了关于GBase与梧桐数据库窗口函数使用的比较,文中包括排序类和统计类窗口函数的定义、语法和示例,窗口函数可以进行复杂的数据分析,提高查询性能,并适应不同的数据分析需求,需要的朋友可以参考下
    2024-11-11
  • 一次因表变量导致SQL执行效率变慢的实战记录

    一次因表变量导致SQL执行效率变慢的实战记录

    这篇文章主要给大家介绍了一次因表变量导致SQL执行效率变慢的实战记录,本文通过图文以及示例代码介绍的非常详细,对大家学习或者了解sql具有一定的参考学习价值,需要的朋友可以参考下
    2021-11-11
  • 数据库安装包和升级包脚本工具RedGate使用介绍

    数据库安装包和升级包脚本工具RedGate使用介绍

    这篇文章主要介绍了数据库安装包和升级包脚本工具RedGate使用介绍,RedGate是一个SQL脚本生成工具,需要的朋友可以参考下
    2014-07-07
  • 使用DataGrip连接Hive的详细步骤

    使用DataGrip连接Hive的详细步骤

    这篇文章主要介绍了DataGrip连接Hive的详细图文教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • SQL之Join的使用详解

    SQL之Join的使用详解

    关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面就为大家介绍一下相关资料,需要的朋友可以参考下
    2020-09-09
  • 达梦数据库文件故障的恢复方法

    达梦数据库文件故障的恢复方法

    本文介绍了达梦数据库文件损坏或误删除后的恢复方法,这里的数据库文件包括,表空间数据文件、重做日志文件、UNDO文件、TEMP文件、控制文件等,介绍了两种恢复场景,感兴趣的小伙伴跟着小编一起来看看吧
    2024-12-12
  • 数据库分页查询语句数据库查询

    数据库分页查询语句数据库查询

    关于分页 SQL 的资料许多,有的使用存储过程,有的使用游标。本人不喜欢使用游标,我觉得它耗资、效率低;使用存储过程是个不错的选择,因为存储过程是颠末预编译的,执行效率高,也更灵活
    2014-08-08
  • Access和SQL Server里面的SQL语句的不同之处

    Access和SQL Server里面的SQL语句的不同之处

    做了一个Winform的营养测量软件,来回的捣腾着Access数据库,还是那几句增删改查,不过用多了,发现Access数据库下的SQL语句和SQL Server下正宗的SQL还有有很大的不同。
    2009-12-12
  • 浅析sql server 公共表达式的简单应用

    浅析sql server 公共表达式的简单应用

    本文主要对sql server 公共表达式的简单应用进行介绍,具有一定的参考价值,有需要的可以看下
    2016-12-12
  • k8s rbac权限最小化实现方式

    k8s rbac权限最小化实现方式

    Kubernetes的RBAC权限最小化策略,通过Role和ClusterRole定义权限,RoleBinding和ClusterRoleBinding进行关联,实现最小权限原则,角色设计精细化,命名空间隔离,服务账户管控,权限审核与监控,权限提升控制,自动化权限管理策略,安全加固措施,典型角色示例
    2025-10-10

最新评论