HIVE SQL 代码优化总结(容易踩坑的地方)

一、Hadoop简介

Hadoop有两大核心:HDFS和MapReduce。
hdfs即为 Hadoop distributed file system,负责分布式数据存储;
mr即为MapReduce,负责分布式数据运算。

hive提供基于sql的查询语言用以查询数据的方式,运行hive时,脚本被编译为MapReduce进行执行。

Hive的优化主要分为:配置优化、SQL语句优化、任务优化等方案。
其中在开发过程中主要涉及到的可能是SQL优化这块。
优化的核心思想是以下四个:
减少数据量(分区裁剪、列剪裁)
避免数据倾斜(例如加参数、Key打散)
避免全表扫描(例如on添加加上分区等)
减少job数(例如相同的on条件的join放在一起作为一个任务)

二、HIVE SQL执行顺序

第一步:确定数据源,进行表的查询和加载
from
(left/right/inner/outner) join
on
第二步:过滤数据,进行条件筛选
where
group by
having
第三步:查询数据
select
第四步:显示数据
distinct
order by
limit
union/union all

二、优化技巧和代码编写注意事项

1. 列裁剪和分区裁剪

a. 列裁剪(说人话就是选自己要的字段)
这里就是尽量不使用select * from table;
而要使用 select 字段A,字段B,… from table;

b. 分区裁剪(说人话就是对于分区表要进行分区字段进行过滤)
如果不做分区操作,hive每次都会进行全表扫描,在查询的时候通过where选择指定的分区,查询效率高很多。
尽量不要直接对超大的分区表进行select 操作。如 某张表存量数据量超千亿条,TB级别。
对于分区表要进行分区字段进行过滤,然后同时注意在where后面把分区字段的筛选放到具体id的查询前面;
如何区分哪个是分区表,可以在hive使用的使用时候,在元数据搜索出来以后,可以对表查看数据字典,一般分区字段会显示PartitionField
举例:

select 字段A,字段B from table where 分区字段 = 20220101 and id = ’aaa‘;
2. 表连接(left/right/inner/outter)join优化

a. 注意使用相同的连接键
观察好要连接的两张表的主键,不要使用错误的字段进行连接。

b. 小表在前,大表在后
将条数少的表、或者子查询后的表放在Join操作符的左边。但新版的hive已经对小表JOIN大表和大表JOIN小表进行了优化。小表放在左边和右边已经没有明显区别。不过在做join的过程中通过小表在前可以适当地减少数据量,提高效率。

c. 太多个join操作,连接过于复杂时候,可以建立中间表

d. 尽早过滤数据,在子查询或者中间表中过滤数据, 同时 join后面不要跟where条件
因为这样会导致匹配的时候全表join,如果提前过滤数据,会提高效率。

举例:

select ... from table1 A
inner join table2 B
on A.key = B.key
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值