Hive sql写法问题导致运行慢问题合集(二)
7.join on中加判断
现象:
mr任务慢
原因:
on条件中存在if或case when判断,在mapjoin时,会拿大表数据一条一条与小表比对同时一条一条做判断导致慢
例如:
Select *
From tba t1
Join tbb t2
On t1.id=
Case where t1.type=’qwr’ THEN t2.type ELSE null END;
解决方法:
将sql拆分
8.join on中带不等于的条件
现象:
查出来都是Null,mr任务慢
原因:
Hive2.2版本后支持join的on条件中存在不等于条件,但要在cbo为true时,cbo为false时会出现结果所有字段为Null
同时不等于条件会产生笛卡尔积
Sql例如
select t1.id from student_p t1 join student_p t2 on t1.id>=t2.id ;
查看执行计划如下无keys,产生笛卡尔积
解决方法:
修改cbo为true,或整改sql
9.特殊写法导致大数据量只有一个reduce
现象:
只有一个reduce,但是数据量较大,导致查询慢
原因:
有三种情况只有一个reduce
- 聚合函数未加groupby
- Order by
- 笛卡尔积
解决方法:
改sql
10.两表关联,关联字段类型不一致
现象:
查询慢
原因:
关联字段类型不一致,关联前会做一个类型转换,导致时间变长
解决方法:
修改两表关联字段类型保持统一
11.Left join 右表分区条件写在where后
现象:
查询慢,右表会进行全表扫描
原因:
例如如下例子
select t1.id
from student_p t1
left join test0617 t2
on t1.id=t2.id
where t1.pt_dt<'2022-02-25' and t2.pt_dt<'20220616';
副表(上边t2)表,where 条件写在join后面,会导致先全表关联再过滤分区
虽然主表(上边t1)表分区条件也写在join后面,但是主表会谓词下推,先执行分区过滤再进行join
打执行计划可以看到sql扫描了副表的不在条件内的分区
解决方法
将副表的分区过滤条件写在join中 上述例子改为:
select t1.id
from student_p t1
left join test0617 t2
on t1.id=t2.id and t2.pt_dt<'20220616'
where t1.pt_dt<'2022-02-25';
打印执行计划可以看到,20220617分区不在扫描,只扫描指定的分区
- 点赞
- 收藏
- 关注作者
评论(0)