Hive:表1inner join表2结果group by优化
问题背景
最近遇到一个比较棘手的事情:hive sql优化:
lib表(id,h,soj,noj,sp,np) --一个字典表
mitem表(md,mt,soj,noj,sp,np)--一天的数据,包含小时分区的表。
业务:
1)需要先把lib表与mitem表进行关联(关联条件是lib.soj=mitem.soj and lib.noj=mitem.noj),关联后的结果按照soj,md,mt,id,h进行分组;
2)对1)中的结果在分组的时候需要统计差值的平均值记为svalue;
3)对关联后的分区的统计后的数据,进行一次分组排序:按照soj,md,mt分组,按照svalue排序,只保留同一个分组内排序第一的记录。
其中表lib有3亿条记录,mitem表包含记录数50~150亿左右,lib与mitem关联后的记录数在6000亿条记录,之后对这个关联后的结果进行进行分组却执行了6小时后抛出异常问题。
尝试解决方案
瓶颈主要体现在在对第一次关联后的记录包含了6000亿条记录进行分组时,耗费资源,资源不足导致的问题。
尝试过的解决方案:
1)创建索引:《hive:创建索引》
针对该6000亿条记录进行创建索引,耗费了20小时后依然是在stage2失败了,此方案推翻。
2)对mitem数据按照小时粒度进行数据拆分,之后每一个小时的mitem与lib进行关联,结果耗费时间为20多个小时,依然是抛出异常。
3)对mitem数据按照小时粒度进行分区,同时对lib表按照字段soj进行分页(分10页,一页中包含的lib记录数约3000w条)《hive:某张表进行分页》
create table lib_soj as select soj from lib group by soj;--记录数约为8000条记录
create table lib_soj_page as select row_number()over(order by soj)rnum,soj from lib_soj;
create table lib_1_1000 as select t10.* from lib t10 inner join lib_soj_page t11 on t10.soj=t11.soj where t11.rnum between 1 and 1000;--记录数约为3000w条记录。
此时,拿一个小时的select * from mitem where hour='2017102412' 与一个分页中的soj进行关联,数据终于出来了,可是耗费的时间为1小时20分,那么该总体时间为1.33*24*10小时。时间实际上太长了。
4)针对2)、3)的方案我们得知,如果把mitem查分带来的效果实际上是不大,而查分lib的效果特别明显,于是想到如果把lib查分的粒度更细与一天的mitem进行关联是否可行(这里是查分为20份,一份数据约为1500w)。
测试结果,耗时3小时20分,那么总体的时间约为3.33*20小时。如果并行执行多个分页的数据相信时间上会缩短。
但是目前这个方案应该是shuffle时出现了数据偏移问题:
调优:
https://tech.meituan.com/spark-tuning-pro.html
提高shuffle并行度:
http://blog.csdn.net/u013939918/article/details/60956620
。
Hive:表1inner join表2结果group by优化相关推荐
- Hive基本操作,DDL操作(创建表,修改表,显示命令),DML操作(Load Insert Select),Hive Join,Hive Shell参数(内置运算符、内置函数)等
1. Hive基本操作 1.1DDL操作 1.1.1 创建表 建表语法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_nam ...
- 关于hive中Map join 时大表left join小表的问题
在hive中,(启用Map join时) 大表left join小表,加载从右向左,所以小表会加载进内存,存储成map键值对,通过大表驱动小表,来进行join,即大表中的join字段作为key 来获取 ...
- hive分桶表join_Hive:JOIN及JOIN优化 2015.10.25
1. Join的基本原理 大家都知道,Hive会将所有的SQL查询转化为Map/Reduce作业运行于Hadoop集群之上.在这里简要介绍Hive将Join转化为Map/Reduce的基本原理(其它查 ...
- Hive中小表与大表关联(join)的性能分析
经常看到一些Hive优化的建议中说当小表与大表做关联时,把小表写在前面,这样可以使Hive的关联速度更快,提到的原因都是说因为小表可以先放到内存中,然后大表的每条记录再去内存中检测,最终完成关联查询. ...
- Hive SQL 小表与大表Join 原理与实操
一.案例演示 1)没有使用map join -- a 表是大表,数据量是百万级别 -- b 表是小表,数据量在百级别 select a.field1 as field1,b.field2 as fie ...
- hive中多表full join主键重复问题
目录 0. 其他 1. 问题描述 2. 问题复现 2.1. 建表语句 2.2. 插入数据 2.3. 查询SQL以及问题 3. 问题原因 4. 问题解决 0. 相关文章链接 开发随笔文章汇总 1. 问题 ...
- Hadoop Hive创建外部表及多表join操作
hive在drop内部表时会将数据一并删除,但在drop外部表时不会
- 大表与大表join数据倾斜_技术分享|大数据技术初探之Spark数据倾斜调优
侯亚南 数据技术处 支宸啸 数据技术处 在大数据计算中,我们可能会遇到一个很棘手的问题--数据倾斜,此时spark任务的性能会比预期要差很多:绝大多数task都很快执行完成,但个别task执行极慢或者 ...
- hive 两个没有null指定的表左关联的结果有null_Hive的优化原则
原文链接:https://zhuanlan.zhihu.com/p/174469951 本篇将 Hive 的优化分成三个部分: 第一部分是 SQL 通用语法优化, 第二部分是针对 Hive 所具有的数 ...
最新文章
- 公开课报名 | 基于自定义模板的OCR结果的结构化处理技术
- linux安装软件不同用户名密码,Linux的安装和基本命令
- c语言 内存搜索,怎么在一段内存中搜索一个十六进制串
- 160个Crackme032用ProcessMonitor拆解KeyFile保护
- 软考-信息系统项目管理师-信息系统综合测试与管理
- [HDU]2089不要62
- 《MATLAB R2012a超级学习手册》一2.5 本章小结
- ctype.h,ctype.c 结构分析 \linux-1.0\linux\include\linux\ctype
- js 刷新div_vue.js备忘记录(五) vue-router
- java 线程状态_【19期】为什么Java线程没有Running状态?
- RT-Thread 简介 https://www.rt-thread.org/
- 【QCustomPlot】1.0 - QCustomPlot库添加到自己的工程、创建工程
- markDown用这一招实现图片并排显示
- openindiana软件包维护
- python_mysql
- 啡鸟集:什么样的咖啡豆,才是好的咖啡豆?
- Oracle 存储过程详解(上)
- 一次性读懂云计算中的6大热门词汇
- MFC-SaoChat(模仿QQ)聊天软件
- MPC、LMPC、LEMPC、NMPC、 NEMPC
热门文章
- 解决Please choose a writable location using the '-configuration' command line option
- windows下安装配置mongodb
- elasticsearch不能使用root启动问题解决
- WebJars——web端静态资源的jar包
- 操作系统的实现(0)
- Installshield x:实现序列号检验,获取用户信息并写入指定_ini文件1 - 子夜 MySpace聚友博客...
- 《DSP using MATLAB》Problem 7.2
- python框架Flask学习笔记之get和post请求
- 密码学笔记——zip明文攻击
- 搜狗浏览器也可以直接安装Chrome插件,太棒了