当前位置: 首页 > news >正文

hive优化(4)之mapjoin和union all避免数据倾斜

生数据,通常的象是:

  • 务进长时间维持在99%(或100%),看任务监面,发现只有少量(1个或几个)reduce子任未完成。
  • 看未完成的子任,可以看到本地写数据量累非常大,通常超10GB可以为发生数据斜。

数据斜一般是由于代中的joingroup bydistinctkey分布不均致的,大量经验表明数据斜的原因是人的建表疏忽或业务可以避的。如果确认业务需要这样倾斜的逻辑.

 

  • join,使用map join,即在查询头添加map join hint,例如

select /*+MAPJOIN(b)*/ * from a join b on a.id =b.id

将会把join转换为mapjoin,且将b表作小表理。

  • group bydistinct,使用两次MR化,即定参数: hive.groupby.skewindata=true
  • 随机数解决数据倾斜


二、MAPJOIN 结合 UNIONALL

 

原始sql:

select a.*,coalesce(c.categoryid,’NA’) as app_category

from (select * from t_aa_pvid_ctr_hour_js_mes1

) a

left outer join

(select * fromt_qd_cmfu_book_info_mes

) c

on a.app_id=c.book_id;

 

速度很慢,老办法,先查下数据分布。

select *

from

(selectapp_id,count(1) cnt

fromt_aa_pvid_ctr_hour_js_mes1

group by app_id) t

order by cnt DESC

limit 50;

 

数据分布如下:

NA      617370129

2       118293314

1       40673814

d       20151236

b       1846306

s       1124246

5       675240

8       642231

6       611104

t       596973

4       579473

3       489516

7       475999

9       373395

107580  10508

 

我们可以看到除了NA是有问题的异常值,还有appid=1~9的数据也很多,而这些数据是可以关联到的,所以这里不能简单的随机函数了。而t_qd_cmfu_book_info_mes这张app库表,又有几百万数据,太大以致不能放入内存使用mapjoin。

 

解决方案:

select a.*,coalesce(c.categoryid,’NA’) as app_category

from –if app_id isnot number value or <=9,then not join

(select * fromt_aa_pvid_ctr_hour_js_mes1

where cast(app_id asint)>9

) a

left outer join

(select * fromt_qd_cmfu_book_info_mes

where cast(book_id asint)>9) c

on a.app_id=c.book_id

union all

select /*+ MAPJOIN(c)*/

a.*,coalesce(c.categoryid,’NA’) as app_category

from –if app_id<=9,use map join

(select * fromt_aa_pvid_ctr_hour_js_mes1

wherecoalesce(cast(app_id as int),-999)<=9) a

left outer join

(select * fromt_qd_cmfu_book_info_mes

where cast(book_id asint)<=9) c

–if app_id is notnumber value,then not join

on a.app_id=c.book_id

 

首先将appid=NA和1~9的数据存入一组,并使用mapjoin与维表(维表也限定appid=1~9,这样内存就放得下了)关联,而除此之外的数据存入另一组,使用普通的join,最后使用union

all 放到一起。


相关文章:

  • hive cli
  • Hive优化(5)之选择合适的map数
  • C++ 文件操作(CFile类)
  • Hadoop MapReduce:详解Shuffle过程
  • 编译树莓派2代B型OpenWrt固件实现无线路由器及nodogsplash认证功能
  • 为什么一些公司把dwg文件转化为pdf
  • hadoop生态系统
  • influxDB 变换类函数
  • C# Android 开发中使用 Sqlite.NET ORM
  • 大数据到底怎么学:数据科学概论与大数据学习误区
  • 选项卡TAB
  • 你想快速成为大数据工程师?
  • 【USACO4.2】草地排水Drainage Ditches(最大流)
  • 如何快速学习大数据挖掘分析(个人观点)
  • 人工智能与大数据开发的12个注意事项
  • 【Leetcode】101. 对称二叉树
  • ES6指北【2】—— 箭头函数
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • CSS相对定位
  • IDEA 插件开发入门教程
  • Java 网络编程(2):UDP 的使用
  • java8 Stream Pipelines 浅析
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Phpstorm怎样批量删除空行?
  • SpiderData 2019年2月25日 DApp数据排行榜
  • spring security oauth2 password授权模式
  • ViewService——一种保证客户端与服务端同步的方法
  • Vue.js 移动端适配之 vw 解决方案
  • 简单基于spring的redis配置(单机和集群模式)
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端存储 - localStorage
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何优雅地使用 Sublime Text
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 用mpvue开发微信小程序
  • 由插件封装引出的一丢丢思考
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #1014 : Trie树
  • $.ajax()方法详解
  • (11)MATLAB PCA+SVM 人脸识别
  • (5)STL算法之复制
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (Forward) Music Player: From UI Proposal to Code
  • (HAL库版)freeRTOS移植STMF103
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (pojstep1.1.2)2654(直叙式模拟)
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (九)One-Wire总线-DS18B20
  • (力扣)循环队列的实现与详解(C语言)
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?