hive理论
join操作:

这个
group by count()操作:

数据倾斜:
操作
• Join on a.id=b.id
• Group by
• Count Distinct count(groupby)
• 原因
• key分布不均导致的
• 人为的建表疏忽
• 业务数据特点
• 症状
• 任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。
• 查看未完成的子任务,可以看到本地读写数据量积累非常大,通常超过10GB可以认定为发生数据倾斜。
• 倾斜度
• 平均记录数超过50w且最大记录数是超过平均记录数的4倍。Null 50w 10w
• 最长时长比平均时长超过4分钟,且最大时长超过平均时长的2倍。
• 万能方法
• hive.groupby.skewindata=true
原因
• Hive在进行join时,按照join的key进行分发,而在join左边的表的数据会首先读入内存,如果左边表的key相对分
散,读入内存的数据会比较小,join任务执行会比较快;而如果左边的表key比较集中,而这张表的数据量很大,
那么数据倾斜就会比较严重,而如果这张表是小表,则还是应该把这张表放在join左边。
• 思路
• 将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率
• 使用map join让小的维度表先进内存。
• 方法
• Small_table join big_table
原因
• 日志中有一部分的userid是空或者是0的情况,导致在用user_id进行hash分桶的时候,会将日志中userid为0或者
空的数据分到一起,导致了过大的斜率。
• 思路
• 把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不
影响最终结果。
•
• 方法 -0 2 -1 2 -2 3 -0 -1 -2 -
• on case when (x.uid = '-' or x.uid = '0‘ or x.uid is null) then concat(‘-',rand()) else x.uid end =f.user_id;
案例
• Select * from dw_log t join dw_user t1 on t.user_id=t1.user_id
• 现象:两个表都上千万,跑起来很悬 1,2,3,4,5,2,3,4 2,3,4
• 思路
• 当天登陆的用户其实很少
• 方法
• Select/*+MAPJOIN(t12)*/ *
• from dw_log t11
• join (
• select/*+MAPJOIN(t)*/ t1.*
• from (
• select distinct user_id from dw_log --group by user_id
• ) t
• join dw_user t1
• on t.user_id=t1.user_id
• ) t12
• on t11.user_id=t12.user_id
原因
• 做count distinct时,该字段存在大量值为NULL或空的记录。
• 思路
• count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结
果中加1。
• 如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union
• 方法
• select cast(count(distinct user_id)+1 as bigint) as user_cnt
• from tab_a
• where user_id is not null and user_id <> ''
案例
• Select day,count(distinct session_id),count(distinct user_id) from log a group by day
• 问题
• 同一个reduce上进行distinct操作时压力很大
• 方法
select day,
count(case when type='session' then 1 else null end) as session_cnt,
count(case when type='user' then 1 else null end) as user_cnt
from (
select day,session_id,type
from (
select day,session_id,'session' as type
from log
union all
elect day user_id,'user' as type
from log
) group by day,session_id,type
) t1 group by day;
hive理论的更多相关文章
- 【Hive三】Hive理论
1. Hive基础 1. Hive基础 Hive基本概念 引入原因: Hive是什么 Hive数据管理 四种数据模型 Hive内部表和外部表 Hive数据类型 Hive的优化 Map的优化: Redu ...
- about云资源汇总V1,3
mongodb文档与视频资料分享 1.mongodb1-72.mongodb8-17集含代码3.MongoDB_and_Python学习笔记4.深入学习MongoDb5.PHP&MongoDB ...
- Apache Hive 基本理论与安装指南
一.Hive的基本理论 Hive是在HDFS之上的架构,Hive中含有其自身的组件,解释器.编译器.执行器.优化器.解释器用于对脚本进行解释,编译器是对高级语言代码进行编译,执行器是对java代码的执 ...
- Hive的学习之路(理论篇)
一.Hive介绍 Apache官网给出的logo,一半是Hadoop大象的头,一半是蜜蜂的身体,也是寓意着它是基于Hadoop,哈哈,纯属个人理解,进入正题. Hive是基于Hadoop的一个数据仓库 ...
- Hive不支持非相等的join
由于 hive 与传统关系型数据库面对的业务场景及底层技术架构都有着很大差异,因此,传统数据库领域的一些技能放到 Hive 中可能已不再适用.关于 hive 的优化与原理.应用的文章,前面也陆陆续续的 ...
- Hive技术文档
Hive是什么? Hive是蜂房的意思,为什么hadoop上的这层数据仓库叫Hive? 因为生物学上蜂房是一个结构相当精良的建筑,取名Hive足见则个数据仓库在数据存储上也是堪称精良的.Hive是Fa ...
- Hbase总结(一)-hbase命令,hbase安装,与Hive的区别,与传统数据库的区别,Hbase数据模型
Hbase总结(一)-hbase命令 下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令表达式 创建表 create '表名称', ...
- HIVE中内连接和左半连接不一致问题
一.理论 HIVE中都是按等值连接来统计的,理论上两种写法统计结果应该是一致的: 二.实际情况 但实际使用中发现两种写法会返回的结果,总会有一些差距虽然差别不大,但让人很是困惑. 三.原因 当使用jo ...
- Hive 编程之DDL、DML、UDF、Select总结
Hive的基本理论与安装可参看作者上一篇博文<Apache Hive 基本理论与安装指南>. 一.Hive命令行 所有的hive命令都可以通过hive命令行去执行,hive命令行中仍有许多 ...
随机推荐
- Dubbo(6)Dubbo服务集群实现负载均衡
什么时候用到集群?比如说某个服务,并发量特别大的时候就会用到集群: 具体的话比如说,某些特殊的项目一天的注册量10万,国家的一些考试系统,集中在几天,注册量一天10万,如果只弄一个服务,根本服务不过来 ...
- 无法将当前工程转化成model 2.5/3.1:Cannot change version of project facet Dynamic Web Module to 2.5.
Description Resource Path Location TypeCannot change version of project facet Dynamic We ...
- 运行java飞行记录器JFR(java flight recorder)
JFR 上面讲到的工具都是作为快速的查看诊断工具的.如果要深入分析问题,可以选择使用内置的Java飞行记录器:Java Mission Control. 转储JFR需要三步: 1. 创建一个包含了你自 ...
- Sequentially-consistent ordering
先引入cppreference中的描述: Atomic operations tagged memory_order_seq_cst not only order memory the same wa ...
- int, bool, string的操作
基本数据类型 1.int型 可以求整数的二进制长度.输入一个数字a,"a.bit_length()"语法求a的二进制长度. a = 3 #二进制为11 print(a.bit_le ...
- [UE4]位与字节
位 1.bit,比特 2.一个位可以表示两个值,0或者1(一个位只能表示0或者1,并不是能同时表示0和1). 3.一个位为什么只能是2个值,而不能是3个值呢?这是由于技术因素造成的,在硬件中,如果用一 ...
- [UE4]移除UI(User Widget)并销毁
1.移除UI,使用“Remove from Parent”方法 2.最后一步给UI变量赋值的时候,如果保持默认选择“Select Assets”,则会把UI变量销毁(赋值为null).
- sqlserver数据库设计完整性与约束
use StudentManageDB go --创建主键约束 if exists(select * from sysobjects where name='pk_StudentId') alter ...
- 梳理源码:spring ioc容器加载的流程图
- c#类 对象 构造函数 析构函数——面向对象
类: 也是复杂数据类型 也是需要我们先定义出类型,才能使用它的数据 对象: 是通过模板类实例化出来的个体,具有具体的属性和行为(方法),对象是不能索引到静态方法. 对象的生命周期 构造—— 使用—— ...