暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Hive SQL 企业级优化技巧

孙若堃 2021-05-05
301


Hive SQL 企业级优化技巧


本文是笔者在日常满足 Hive SQL 业务需求中,总结出一些 HQL 优化技巧,希望能给各位提供一些帮助与启发,文章如有运用不妥之处,敬请谅解。


关于数据倾斜的优化技巧,因为篇幅有限,只会先简要提供解决思路,后边也会更新辅以实际案例的关于数据倾斜原因与具体解决方案。


技巧1:活用 group by


结合实际的代码块,各位先看以下两段代码

第一段:

第二段:

上边代码中,session_id 是作为用户访问一次的会话字段,对比第一段 SQL 代码,明显第二段的计算方式更为简洁,访问次数不用考虑 session_id直接对每个用户 group by 后 count(*) 得出每个用户的访问次数,最后在最外层 sum(pv) 得到总的访问次数即可。 


同时在进行简单的查询操作时 group by 也能替代 distinct 进行去重,碰到数据量级较大时,可以用这个技巧减少代码运行的时间。


技巧2:巧用 cube 函数


cube:根据group by 维度的所有组合进行聚合。

具体应用见以下代码

假如想要统计全部类目的商家数量,可以使用 cube 函数得出。


技巧3:利用 lateral view 对字段采用行转列处理


在电商业务中,有时候会碰到一个商家经营商品的类目属性是涵盖了多个类目的,但你需要统计出不同类目的商家数多少?这时候就可以运用对类目字段行转列,再聚合统计。

代码如下:


技巧4:表连接优化与中间表应用


1、join 的时候,小表在前,大表在后

Hive 查询的时候,无论是否使用 mapjoin ,小表都需要放入前面,原因是reduce阶段会将第一个表的 key 全部放入内存,当第二个表到来的时候再开始输出。假设最后的一个表是大表,即它会把其他的表缓存起来,缩短计算时长。


2、在对多个表进行 join 连接的时候,on 的部分优先使用相同的连接条件。如果不是同一个连接条件,可能会导致出现多个 MapReduce job,不利于减少计算量。


3、在使用数据表的时候,要养成提前筛选过滤掉不必要的数据,即能减少计算量,又能避免不必要的失误,当然这是建立在充分理解业务逻辑的情况。


4、在梳理业务逻辑,逻辑过于复杂的时候,应适当引入中间表。比如做月表可以先做一张日表,先统计出每日的指标数据,再由拉取一个月的数据作为月表数据。累计指标可以先建立累计表。


技巧5:如何解决数据倾斜


什么是数据倾斜?

答:一个进行中的任务进度一直维持在99%(或100%),查看日志发现有一个 reduce 运行时长非常久,其他的 reduce 都能够在1min之内完成,由此可推断出必然发生了数据倾斜。数据倾斜基本都发生在group by、join等需要数据shuffle的操作中。


解决思路:

1、连接条件没有过滤空值

如果查看数据发现两个表的连接条件存在大量空值,应先在连接前筛掉空值。

2、连接的 key 大量重复切非必要,则过滤掉这部分 连接key。

3、大小表连接的话,直接用 /*+mapjoin*/,将小表放内存里,在 map 端做 join

4、两个表连接条件的字段数据类型不一致,把连接 key 转换下数据类型






文章转载自孙若堃,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论