本文将深入探讨 Hive,这是大数据处理中的关键利器,特别是在构建数据仓库方面。透过高频面试题解析,我们将深入研究 Hive 在数据存储与查询中的作用。无论你是初学者还是渴望加深对数据仓库技术的了解,本文都将为你提供实用的面试准备。让我们一同揭示 Hive 的内部机制,为你的面试之旅增添实质价值!
一、hive转换成MR流程
1、解析器:将sql字符串转换成抽象语法树
2、语法分析器:将抽象语法树进一步抽象为queryblock
3、逻辑计划计划生成器:由queryblock生成逻辑计划
4、逻辑优化器:对逻辑计划进行优化
5、物理计划生成器:根据优化后的逻辑计划生成物理计划
6、物理优化器:对物理计划进行优化
7、执行器:执行该计划,得到查询结果并返回给客户端
二、hive和数据库比较
1、数据存储位置
hive存储在hdfs。数据库将数据保存在块设备或本地文件系统中
2、数据更新
hive中不建议对数据进行改写。而数据库中的数据是经常需要修改的
3、执行延迟
hive执行延迟高。数据库的执行延迟较低
4、数据规模
hive支持很大规模的数据计算,数据库可以支持的数据规模较小
三、内部表和外部表
删除数据时,外部表只会删除原始数据,不会删除元数据,而内部表既会删除元数据,也会删除原始数据
四、4个by的区别
order by:全局排序,只有一个reducer,通常会联合limit使用
sort by:局部排序,保证每个reducer的数据是有序的
distribute by:进行分区,结合sort by使用
cluster by:当sort by和partition by的字段相同时可使用cluster by,但排序只能升序,不能指定
五、hive优化
1、分组聚合
一个分组聚合的查询语句,默认是通过一个mapreduce完成的,map端负责读取数据,并根据分组字段分区,再经过shuffle,将数据发往reduce端,各组数据在reduce端完成最终的分组聚合。
分组聚合的优化主要围绕减少shuffle数据进行,具体做法是map side:在map端维护一个hash table,利用其完成部分的聚合,然后将部分聚合的结果按照分组字段分区,再通过shuffle,发往reduce端,完成最终的聚合
2、map join
hive中默认的join算法是common join,其通过一个mapreduce job完成一个join操作。map端负责读取数据,并按照关联字段进行分区,再通过shuffle,将数据发往reduce端,相同key的数据再reduce端完成最终的join操作。
优化join的常用手段是map join:其可通过只有两个map阶段的job来完成一个join操作。第一个job负责读取小表数据,将其制作为hash table,并上传至hadoop分布式缓存。第二个job会先从分布式缓存读取小表数据,并缓存在maptask的内存中,再去扫描大表数据,这样在map端就可以完成关联操作。由于map join需要缓存整个小表,故只应用于大表join小表的场景
3、sort merge bucket map join—可应用于大表join大表的场景
(1)参与join的表都为分桶表
(2)两表分桶呈倍数关系
(3)数据在分桶内是按关联字段有序的
4、redduce join:通常用于执行关联操作,特别是在处理大型数据集时,目标是通过减少数据移动和传输来提高关联查询的性能
(1)maptask:对数据进行打标签区分数据不同源,连接on字段为key,剩余部分+标签字段为value
(2)reducetask:相同连接字段的数据进入同一个reduce方法,然后将来源不同的数据源汇总
缺点:join的操作都是在reduce端进行的,reduce压力比较大,很容易造成数据倾斜,所以引出map join‘
reduce join即为common join,又叫做shuffle join
5、reduce并行度:可由用户自己指定,也可由hive自行根据该mr job输入得文件大小进行估算
6、小文件合并
7、谓词下推:尽量将过滤操作提前,以减少后续计算步骤得数据量
8、并行执行
hive会将一个sql语句转化成一个或者多个stage,每个stage对应一个mr job。默认情况下hive只会执行一个stage。但是某些sql语句可能会包含多个stage,但这些stage可能并非完全相互依赖,也就是说有些stage是可以并行执行的,此处提到的并行执行就是指这些stage的并行执行
9、压缩以减少磁盘io
10、文件格式:采用orc列式存储加快查询速度
11、分区和分桶
(1)创建分区表,防止后续全表扫描
(2)创建分桶表,对复杂的数进行提前采样
12、更换引擎
六、hive解决数据倾斜方法
数据倾斜:参与计算的数据分布不均,即某些或某个key的数据量远远超过其他key,导致在shuffle阶段,大量相同ley的数据被发往同一个reduce,进而导致该reduce所需的时间远超其他reduce
1、分组聚合导致的数据倾斜
(1)判断倾斜的指是否为null,若为null,可以考虑最终结果是否需要这些数据,若不需要,只要提前将null值过滤掉,就能解决问题
(2)map side聚合
(3)skew group by优化
skew group by是hive提供的一个专门用来解决数据倾斜问题的方法。其原理是:启动两个mr任务,第一个mr按照随机数分区,将数据分散发送到各个reduce,并完成部分聚合,第二个mr按照分组字段分区,完整最终聚合
2、join导致的数据倾斜
(1)map join
(2)skew join:参与join的两张表均为大表,为倾斜大的key专门启动一个map join任务进行计算,其余key进行正常的common join
3、调整sql语句
七、union和union all的区别
(1)union会将联合的结果集去重,同时进行排序,效率较union all差
(2)union all不会对结果集进行去重,也不会对结果进行排序,所以效率高
八、hive新功能-多维分析函数
1、cube
cube简称数据魔方,可以实现hive多个任意维度的查询,cube(a,b,c)首先会对(a,b,c)进行group by,然后依次是(a,b),(a,c),(a),(b,c),(b),最后再对全表进行group by,他会统计所选列中值的所有组合的聚合
select
device_id,
od_id,
app_id,
client_version,
from_id,
count(user_id)
from test_xinyan_reg
group by device_id,
od_id,
app_id,
client_version,
from_id
with cube
上面的sql语句相当于group by后所有字段的排列组合,然后将结果union all起来
2、rollup
rollup可以实现从右到左递减多级的统计,显示统计某一层次结构的聚合
select
device_id,
os_id,
app_id,
client_version,
from_id,
count(user_id)
from test_xinyan_reg
group by device_id,os_id,app_id,client_version,from_id with rollup;
--和下面的sql等价
select
device_id,
os_id,
app_id,
client_version,
from_id,
count(user_id)
from test_xinyan_reg
group by device_id,os_id,app_id,client_version,from_id
grouping sets ((device_id,os_id,app_id,client_version,from_id),(device_id,os_id,app_id,client_version),(device_id,os_id,app_id),(device_id,os_id),(device_id),());
Grouping Sets 可以看做是将 group by 的内容进行 union 整合
若有收获,就点个赞吧