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

Hive优化(3)之随机数避免数据倾斜

生数据,通常的象是:

  • 务进长时间维持在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
  • 随机数解决数据倾斜

 

一、随机函数解决倾斜

 

原始sql:

insertoverwrite table t_aa_click_log partition (pt=’${yyyymmddhh}’)

selecta.*

from(select * from t_aa_click_log1

wherept=’${yyyymmddhh}’

)a

leftouter join

(select* from t_aa_pv_info_log

wherept=’${yyyymmddhh}’) b

ona.pvid=b.pvid;

 

发现大量时间花费在reduce99%~100%这最后一步上,约占总时长20分钟的一半,

用以下sql检查下数据分布:

select*

from(

selectpvid,count(1) cnt

fromt_aa_click_log1

wherept=’${yyyymmddhh}’

groupby pvid) t

orderby cnt desc

limit50;

 

发现pvid=’NA’的占比最高,有100多万,而其他最多的也只有几十条,证实数据倾斜。

 

利用随机函数,将pvid=’NA’的数据随机分布到不同的reduce中:

insertoverwrite table t_aa_click_log partition (pt=’${yyyymmddhh}’)

selecta.*

from(select * from t_aa_click_log1

wherept=’${yyyymmddhh}’

)a

leftouter join

(select* from t_aa_pv_info_log

wherept=’${yyyymmddhh}’) b

–如果pvid长度<=2,包含pvid=NA或-1 等多种异常值,即用随机函数叠加处理,因为异常值本来就关联不到,所以加上随机函数对结果没有影响

oncase when length(a.pvid)<=2 then concat(a.pvid,rand()) else a.pvid end =b.pvid;

 

问题解决。

 


相关文章:

  • Angular2学习(一)
  • hive优化(4)之mapjoin和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(最大流)
  • @jsonView过滤属性
  • 【RocksDB】TransactionDB源码分析
  • bearychat的java client
  • Django 博客开发教程 16 - 统计文章阅读量
  • Java比较器对数组,集合排序
  • jquery cookie
  • Spring Cloud Feign的两种使用姿势
  • win10下安装mysql5.7
  • 浮现式设计
  • 聊聊flink的TableFactory
  • 前端
  • 入门到放弃node系列之Hello Word篇
  • 删除表内多余的重复数据
  • 使用 Docker 部署 Spring Boot项目
  • 小程序 setData 学问多
  • gunicorn工作原理
  • 湖北分布式智能数据采集方法有哪些?
  • ​业务双活的数据切换思路设计(下)
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #14vue3生成表单并跳转到外部地址的方式
  • #includecmath
  • #include到底该写在哪
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (12)目标检测_SSD基于pytorch搭建代码
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (python)数据结构---字典
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)shell调试方法
  • ***利用Ms05002溢出找“肉鸡
  • . ./ bash dash source 这五种执行shell脚本方式 区别