Hive sql写法问题导致运行慢问题合集(二)

举报
yd_225577686 发表于 2022/12/27 10:05:47 2022/12/27
【摘要】 7.join on中加判断现象:mr任务慢原因:on条件中存在if或case when判断,在mapjoin时,会拿大表数据一条一条与小表比对同时一条一条做判断导致慢例如:Select * From tba t1Join tbb t2On t1.id=Case where t1.type=’qwr’ THEN t2.type ELSE null END;解决方法:将sql拆分8.join o...

7.join on中加判断

现象:

mr任务慢

原因:

on条件中存在ifcase 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中带不等于的条件

现象:

查出来都是Nullmr任务慢

原因:

Hive2.2版本后支持joinon条件中存在不等于条件,但要在cbotrue时,cbofalse时会出现结果所有字段为Null

同时不等于条件会产生笛卡尔积

Sql例如

select t1.id from student_p t1 join student_p t2 on t1.id>=t2.id ;

查看执行计划如下无keys,产生笛卡尔积


解决方法:

修改cbotrue,或整改sql

9.特殊写法导致大数据量只有一个reduce

现象:

只有一个reduce,但是数据量较大,导致查询慢

原因:

有三种情况只有一个reduce

  1. 聚合函数未加groupby
  2. Order by
  3. 笛卡尔积

解决方法:

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分区不在扫描,只扫描指定的分区

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。