hive-sql 性能优化

1、distribute by [sort by] 或cluster by 优化数据倾斜

数据倾斜排查过程:
1、原始sql 如下:

select *
from jour
join spc on spc.id=jour.parent_id 
left join spcadmin on spc.rect_id=spcadmin.rect_id and  to_date(jour.create_time) =to_date(spcadmin.dt_date) 
left join person on person.id = jour.modify_user_id  
where 1 = 1
	and jour.deleted='false'
;

2、map 端出现数据倾斜
在这里插入图片描述
3、大表数据文件分布情况,数据文件分布不均匀,如下图所示
在这里插入图片描述4、spc表是事务表,严重影响关联查询性能,删表重新创建为非事务表

注意:不需要表为事务表才能修改事务表为内部或外部表

5、创建临时表并对数据进行随机分发

set mapred.reduce.tasks=10;   -- 输出10和分布均匀的数据文件
drop table if exists A_tmp;
create table if not exists A_tmp as
select
    id,
    create_user_id ,
    create_time ,
    modify_user_id,
    modify_time,
    tenant_id,
    parent_id,
    bind_id ,
    operation_type,
    `type`,
    object_type
from A
where deleted='false'
distribute by rand(123)
;

数据重新分发后的数据分布,如下图
在这里插入图片描述在这里插入图片描述

优化sql如下:

set mapred.reduce.tasks=10;   -- 输出10和分布均匀的数据文件
drop table if exists A_tmp;
create table if not exists A_tmp as
select
    id,
    create_user_id ,
    create_time ,
    modify_user_id,
    modify_time,
    tenant_id,
    parent_id,
    bind_id ,
    operation_type,
    `type`,
    object_type
from jour 
where deleted='false'
distribute by rand(123)
;

select * 
from spc
join jour on spc.id=jour.parent_id  
left join spcadmin on spc.rect_id=spcadmin.rect_id and  to_date(jour.create_time) =to_date(spcadmin.dt_date) 
left join person on person.id = jour.modify_user_id  
;

或优化sql如下:

set mapred.reduce.tasks=10; 
select * 
from spc
join (
	select *
	from jour 
	where deleted='false'
	distribute by id
)jour on spc.id=jour.parent_id  
left join spcadmin on spc.rect_id=spcadmin.rect_id and  to_date(jour.create_time) =to_date(spcadmin.dt_date) 
left join person on person.id = jour.modify_user_id  
;

DAG执行图
在这里插入图片描述

6、执行性能从11min -> 5min 的变化(最优执行时间3min)
优化前:
在这里插入图片描述优化后:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值