大数据面试高频题目 - 深度解析 Hive:揭秘数据仓库的关键利器

       本文将深入探讨 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 整合

若有收获,就点个赞吧

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值