hive if语句_Hive实践(高阶篇)
1.1、Hive SQL执行原理
简单来说HIVE就是一个查询引擎,通过语法分析、语法解析、语法优化等一系列操作将SQL转化为MapReduce作业,MR作业一般会有以下几个过程:
输入:根据输入数据的大小进行分片
MAP阶段:Map任务的个数由输入的分片个数决定;在Map阶段对分片文件中的每行进行检查过滤,并按指定的列保存到bending文件。
Combine阶段:将Map阶段的输出文件进行一定程度的合并。
Shuffle阶段:Map任务的输出必须经过一个名叫Shuffle的阶段才能交给Reduce任务去处理。Shuffle过程包含了分区、排序、分隔、复制和合并等过程
Reduce阶段:对于group by句,这里需要调用reduce函数逻辑将数据按照group by的字段进行汇总,并保留文件到bending中。
输出文件
1.2、Hive SQL优化总结
常用SQL优化手段,分几个方面:
1.2.1 业务场景优化
好的模型设计事半功倍
了解数据分布,动手通过业务逻辑精确有效解决数据倾斜
1.2.2 语句本身优化
列裁剪和分区裁剪
把握整体减少 job 数,单个作业最优不如整体最优
慎用distinct,尽量用group by替换
利用with as语句减少重复查询
join优化
。优先过滤后再进行Join操作,减少参与join的数据量
。union all代替join并行执行
。多表join时,尽量用相同key
。空值、无意义值过滤或者用随机数打散避免倾斜
1.2.3 参数配置优化
合理 MapReduce 的task数
设置合理文件数,合并小文件
利用 mapjoin特性
map端聚合减少shuffle数据量
group by、join倾斜均衡参数
启用压缩减少中间结果数据和输出数据
合理限制资源使用量避免任务互相影响,尤其tez引擎资源
1.3、Hive SQL优化示例
1.3.1 参数设置优化
---普通join转为mapjoin优化set hive.auto.convert.join=true;set hive.mapjoin.smalltable.filesize=2500000;--group by 优化set hive.map.aggr=true;--map端聚合set hive.groupby.skewindata=true;--小文件合并set hive.merge.mapfiles = true;set hive.merge.mapredfiles= true;set hive.merge.tezfiles=true;set hive.merge.size.per.task = 256000000;set hive.merge.smallfiles.avgsize=256000000;--增加并行度,不相互依赖任务并行执行set hive.exec.parallel=true; set hive.exec.parallel.thread.number=8; --适当设置也不是越多越好。tez有stage并行优化--reduce个数设置,根据任务合理设置set hive.exec.reducers.max = 100; --reduce数set hive.exec.reducers.bytes.per.reducer=500000000; --每个reduce处理的数据量---内存调试, AppMaster的container以及AppMaster向RM申请的container大小set tez.am.resource.memory.mb = 2048;set hive.tez.container.size = 2048;--map数设置,减少提高并发,增大提高吞吐量,一般建议1Gset tez.grouping.min-size = 1024000000;set tez.grouping.max-size = 1024000000;--tez容器资源重用,避免重复申请set tez.am.container.reuse.enabled=true;--大部分是有reduce阶段,建议开启中间过程压缩set hive.exec.compress.intermediate=true;set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
1.3.2 逻辑优化
1) 按需取数据,指定获取的列、指定取数据的分区
--按需取数据,指定获取的列、指定取数据的分区select ptdate, pay_type --获取需要的字段,不需要不from tmp.dualWHERE ptdate = '2020-09-21' --指定查询数据的分区,一般是日期 and type = 'xxx' --过滤需要的数据
2)cube 以及 distinct的优化
--优化前2-3小时--优化后45min左右select id , nvl(type, "合计") type , nvl(plat, "合计")plat , nvl(is_new, "合计")is_new , nvl(flag, "合计") flag , nvl(name, "合计")name , scene , count(user_id) exposure_product_uv , sum(exposure_product_pv) exposure_product_pv , sum(unique_product_exposure_pv) unique_product_exposure_pvfrom(select id , nvl(type, "合计") type , nvl(plat, "合计")plat , nvl(is_new, "合计")is_new , nvl(flag, "合计")flag , nvl(name, "合计")name , scene , user_id , sum(pv) exposure_product_pv , count(1) unique_product_exposure_pvfrom ( select id , nvl(type, "合计") type , nvl(plat, "合计")plat , nvl(is_new, "合计")is_new , nvl(flag, "合计")flag , nvl(name, "合计")name , scene , user_id , request_id , count(1) pv from tmp_exp_log where event = 'exposure_product' group by id , flag , name , is_new , plat , scene , type , user_id , request_id grouping sets( (id, plat, is_new, flag, name, scene, user_id, request_id) , (id, plat, is_new, scene, user_id, request_id) , (id, plat, scene, user_id, request_id) , (id, is_new, scene, user_id, request_id) , (id, name, scene, user_id, request_id) , (id, flag, scene, user_id, request_id) , (id, scene, user_id, request_id) , (id, plat, is_new, flag, name, scene, type, user_id, request_id) , (id, plat, is_new, scene, type, user_id, request_id) , (id, plat, scene, type, user_id, request_id) , (id, is_new, scene, type, user_id, request_id) , (id, name, scene, type, user_id, request_id) , (id, flag, scene, type, user_id, request_id) , (id, scene, type, user_id, request_id) ) )bgroup by id , flag , name , is_new , plat , scene , type , user_id) agroup by id , flag , name , is_new , plat , scene , type;
3)关联字段加随机数,避免特殊值导致的笛卡尔积
--优化前1个多小时跑不完--优化后20min出结果select l.*, ......from tmp.dual1 lleft join tmp.dual2 u on (l.id = u.id and u.date = '2020-11-01')left join tmp.dual3 p on (if(l.pcode='-',rand(10),l.pcode) = p.pcode)left join tmp.dual4 w on (if(l.wcode='-',rand(10),l.wcode) = w.wcode)left tmp.dual5 el on (if(l.eid='-',rand(10),l.eid) = el.eid)where l.date = '2020-11-01'
4)join的子查询维度一致可以改为union all+group by 减少关联,并行执行
select date, sum(amt) as amt, sum(uv) as uv from ( select f.date, sum(f.amt) as amt, 0 as uv from tmp.dual1 f where 1 = 1 and f.date = '2020-10-11' group by f.date union all select f.date, 0 as amt, count(distinct f.user_id) as uv from tmp.dual2 f where 1 = 1 and f.date = '2020-10-11' group by f.date ) unionTable group by date
总结:Hive SQL的优化就是通过各种方式避免数据倾斜、数据冗余、job或IO过多,高效利用集群的并发特性。
hive if语句_Hive实践(高阶篇)相关推荐
- Go 接口实现原理【高阶篇】: type _interface struct
Go 接口实现原理[高阶篇]: type _interface struct The Internal Definition Of Interface Types https://www.tapirg ...
- php redis微信发红包,高阶篇二 使用Redis队列发送微信模版消息
# 高阶篇二 使用Redis队列发送微信模版消息 > 此命令行执行任务的方法类比较复杂 他需要命令行运行才会有效 > 命令行源码以及创建方法 参见上节 https://www.kanclo ...
- 爬虫requests高阶篇详细教程
文章目录 一.前言 二.SSL验证 三.代理设置 四.超时设置 五.身份认证 1)基本身份认证 2)摘要式身份认证 六.总结 一.前言 本篇文高阶篇,上一篇为基础篇,希望你一定要学完基础再来看高阶 ...
- 高阶篇:4.3)FTA故障树分析法-DFMEA的另外一张脸
本章目的:明确什么是FTA,及与DFMEA的关系. 1.FTA定义 故障树分析(FTA) 其一:故障树分析(Fault Tree Analysis,简称FTA)又称事故树分析,是安全系统工程中最重要的 ...
- 高阶篇:4.2.2)DFMEA层级分明的失效模式、失效后果、失效原因
本章目的:明确失效模式.失效后果.失效原因的定义,分清楚层次关系,完成DFMEA这部分的填写. 1.失效模式,失效后果,失效原因的定义 这是FEMEA手册第四册中的定义. 1.1 潜在失效模式 (b) ...
- Prompt工程师指南[高阶篇]:对抗性Prompting、主动prompt、ReAct、GraphPrompts、Multimodal CoT Prompting等
Prompt工程师指南[高阶篇]:对抗性Prompting.主动prompt.ReAct.GraphPrompts.Multimodal CoT Prompting等 1.对抗性 Prompting ...
- Redis7实战加面试题-高阶篇(案例落地实战bitmap/hyperloglog/GEO)
案例落地实战bitmap/hyperloglog/GEO 面试题: 抖音电商直播,主播介绍的商品有评论,1个商品对应了1系列的评论,排序+展现+取前10条记录 用户在手机App上的签到打卡信息:1天对 ...
- 【檀越剑指大厂--mysql】mysql高阶篇
文章目录 一.Mysql 基础 1.数据库与实例? 2.mysql 的配置文件 3.mysql 体系结构 4.innodb 的特点? 5.innodb 和 myisam 的区别 6.其他存储引擎? 7 ...
- ✨三万字制作,关于C语言,你必须知道的这些知识点(高阶篇)✨
目录 一,写在前面 二,数据的存储 1,数据类型介绍 2,类型的基本归类 3,整形在内存中的存储 4,浮点型在内存中的存储 三,指针的进阶 1,字符指针 2,指针数组 3,数组指针的使用 4,函数指针 ...
最新文章
- 设置代码ios中根据文本设置label高度设置代码
- Paxos第三篇 - Paxos成员组变更
- python读取excel,数字都是浮点型,日期格式是数字的解决办法
- 一行代码 实现集合去重
- win7内存占用过高怎么处理
- staf工作笔记-使用stax并行处理获取其他主机操作系统信息
- 案例:按照JSP Model2思想实现用户注册功能
- 和python高级知识_Python中的5个高阶概念属性的知识点!你要了解明白哦!
- (day 17 - 快排)剑指 Offer 40. 最小的k个数
- linux 开源中文字体,有哪些免费的中文字体可以下载?
- 史上最全java自动化测试工具汇总
- 机器人的核心——运动控制器
- Python | OpenCV简单生成调色板
- 【毕设】基于CycleGAN的风格迁移【二】CycleGAN源码解读
- iOS 福利局之开发加速库分享
- C++设计模式23——访问者模式
- firebase在项目中常用的方法
- 办公室日常管理信息系统 数据库课程设计
- word转pdf(第三篇第三种方法)
- 虚幻引擎编辑器开发基础(一)
热门文章
- 软件测试工程师,需要达到什么水平才能顺利拿到 20k+ 无压力?
- getlock mysql_mysql中的get_lock锁机制解析
- dataframe一列按长度补0_Pandas中Series和DataFrame基础功能详解
- Python零基础入门(二)——Python中常见的数据结构[学习笔记]
- M进制转N进制(C++)
- 张凯院 矩阵论学习_有限群表示论(0): 前言
- DID会固定年份吗_倍分法DID详解 (二):多时点 DID (渐进DID)
- php mysql计算距离_php mysql 计算经纬之间距离 范围内筛选
- linux中_Linux基础知识(Linux系统、Linux中的链表)
- loop one image for 10 secs