大数据开发面试题之Hive篇

hive的架构

hive外部表和内部表的区别

内部表的数据由hive管理,且存储在hive.metastore.warehouse.dir配置下的路径中;外部表的数据由HDFS存储,路径可以自己指定; 删除表时,内部表会把元数据及真实数据删除;外部表不删除真实数据。

你用过hive哪些窗口函数

可参考:面试官:你用过哪些窗口函数

一般用什么文件格式

可参考:面试官:“你们实际生产中hive用什么文件格式和压缩方式”

Hive中order by,sort by,distribute by和cluster by的区别

1、order by:对数据进行全局排序,只有一个reduce工作 2、sort by:在数据进入reduce前完成排序,一般和distribute by使用,且distribute by写在sort by前面。当mapred.reduce.tasks=1时,效果和order by一样 3、distribute by:类似MR的Partition,对key进行分区,结合sort by实现分区排序 4、cluster by:当distribute by和sort by的字段相同时,可以使用cluster by代替,但cluster by只能是升序,不能指定排序规则。

说下对Hive桶的理解?

桶是对数据某个字段进行哈希取值,然后放到不同文件中存储。 数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。物理上,每个桶就是表(或分区)目录里的一个文件,一个作业产生的桶(输出文件)和reduce任务个数相同。

为什么要使用 Hive? hive 的优缺点?Hive的作用是什么?

这几个问题比较类似,实际上就是要你回答 hive 的特点:

  • 提供类SQL查询,容易上手,开发方便;
  • 封装了很多方法,尽量避免了开发MapReduce程序,减少成本;
  • 适用于处理大规模数据,小数据的处理没有优势;
  • 执行延迟较高,适合用于数据分析,不适合对时效性要求较高的场景。

说下Hive是什么? 跟数据库区别?

hive 是用于大数据分析处理的工具,存储基于 HDFS,计算基于 MapReduce 或 Spark,提供类 SQL 查询。

hive 除了可以通过类 SQL 查询这一点和数据库有点关系外,其它基本没啥关联。

  • 数据库支持事务,可读可写;而hive一般不支持事务(高版本除外),一般用于读多写少的情况,不建议改动数据,因为数据存储在HDFS中,而HDFS的文件不支持修改;
  • hive延迟比较大,因其底层是MapReduce,执行效率较慢。但当数据规模较大的情况下,hive的并行计算优势就体现出来了,数据库的效率就不如hive了;
  • hive不支持索引,查询的时候是全表扫描,这也是其延迟大的原因之一。

Hive内部表和外部表的区别?

  • 外部表在建表的时候需要加关键字 EXTERNAL;
  • 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变;
  • 删除内部表会直接删除元数据【metadata】及存储数据,删除外部表仅仅删除元数据,HDFS上的文件不会被删除;
  • 内部表数据存储在hive.metastore.warehouse.dir【默认:/user/hive/warehouse】,外部表数据存储位置由用户自己决定。

Hive建表语句

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement | like⑩ table_name]

Hive数据倾斜以及解决方案

参考:浅谈数据倾斜的原因及解决办法

Hive的三种自定义函数是什么?它们之间的区别是什么?

  • UDF:用户自定义函数,user defined function。一对一的输入输出。
  • UDTF:用户自定义表生成函数。user defined table-generate function.一对多的输入输出。
  • UDAF:用户自定义聚合函数。user defined aggregate function,多对一的输入输出比如count sum等。

Hive分区和分桶的区别

分区针对的是数据的存储路径;分桶针对的是数据文件。

参考:hive从入门到放弃(四)——分区和分桶

Hive的执行流程

1.(执行查询操作)Execute Query
命令行或Web UI之类的Hive接口将查询发送给Driver(任何数据库驱动程序,如JDBC、ODBC等)以执行。
2.(获取计划任务)Get Plan
Driver借助查询编译器解析查询,检查语法和查询计划或查询需求
3.(获取元数据信息)Get Metadata
编译器将元数据请求发送到Metastore(任何数据库)。
4.(发送元数据)Send Metadata
Metastore将元数据作为对编译器的响应发送出去。
5.(发送计划任务)Send Plan
编译器检查需求并将计划重新发送给Driver。到目前为止,查询的解析和编译已经完成
6.(执行计划任务)Execute Plan
Driver将执行计划发送到执行引擎。
7.(执行Job任务)Execute Job
在内部,执行任务的过程是MapReduce Job。执行引擎将Job发送到ResourceManager,
ResourceManager位于Name节点中,并将job分配给datanode中的NodeManager。在这里,查询执行MapReduce任务.
7.1.(元数据操作)Metadata Ops
在执行的同时,执行引擎可以使用Metastore执行元数据操作。
8.(拉取结果集)Fetch Result
执行引擎将从datanode上获取结果集;
9.(发送结果集至driver)Send Results
执行引擎将这些结果值发送给Driver。
10.(driver将result发送至interface)Send Results
Driver将结果发送到Hive接口

Hive SQL优化处理

  • 优先过滤,过滤后的结果集再进行处理;
  • count(distinct) 改成 sum + group by 的组合;
  • 大小表注意 MapJoin;
  • 使用分区;
  • 注意数据倾斜相关的问题,可参考:

Hive的存储引擎和计算引擎

存储:HDFS; 计算引擎:MR 或 Spark

Hive的文件存储格式都有哪些?

参考:hive从入门到放弃(五)——数据存储格式

介绍下知道的Hive窗口函数,举一些例子

参考:通俗易懂:窗口函数 | 全是案例

Hive的union和union all的区别?

  • Union:将多个结果合并为一个,且结果去重且排序
  • Union all:将多个结果合并为一个,且结果不去重不排序

Hive的join操作原理?

在 Map 阶段将 on 的字段设为 key,然后将选择的字段集作为 value; 在 Reduce 阶段将相同 key 值的数据分发到同一个 Reducer。

Hive如何优化join操作

  • 若有大量 null key,则过滤掉或者赋随机值;
  • 若大小表 join,可使用 MapJoin;
  • 若两张大表 join ,可将倾斜的 key 过滤出来单独 join,则会分散到多个 task 进行 join 操作,最后再进行 union

Hive的mapjoin

mapjoin 会将小表数据加载到内存中,在 Map 阶段完成 join 操作。

Hive有哪些保存元数据的方式,都有什么特点?

  • 内嵌模式:将元数据保存在本地内嵌的derby数据库中,内嵌的derby数据库每次只能访问一个数据文件,也就意味着它不支持多会话连接。
  • 本地模式:将元数据保存在本地独立的数据库中(一般是mysql),这可以支持多会话连接。
  • 远程模式:把元数据保存在远程独立的mysql数据库中,避免每个客户端都去安装mysql数据库。

内存数据库derby,占用空间小,但是数据存于内存,不稳定;

mysql数据库,数据存储模式可自己设置,持久化好,查看方便。

Hive SOL实现查询用户连续登陆,讲讲思路

参考:面试官:“如何用 SQL 查询每个用户最大连续登录日期?”

row_number,rank,dense_rank的区别

  • row_number 表示行数,每行都是前面基础加1;
  • rank 是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)
  • dense_rank 是连续排序,有两个第二名时仍接下来即使第三名。

Hive count(distinct)有几个reducer,海量数据会有什么问题

如果没有 group by 就是一个 Reducer,海量数据用一个reducer执行效率过慢,甚至造成内存溢出。

开窗函数中加Order By和不加Order By的区别?

当为排序函数,如row_number(),rank()等时,over中的order by只起到窗口内排序作用。

当为聚合函数,如max,min,count等时,over中的order by不仅起到窗口内排序,还起到窗口内从当前行到之前所有行的聚合,不加则整个分区聚合。

parquet文件优势

可参考:hive从入门到放弃(五)——数据存储格式

Hive里metastore是干嘛的?

客户端连接 metastore,metastore 再去连接 MySQL 存取元数据。

使得多个客户端可以同时连接,且这些客户端无需知道 MySQL 数据库的用户名密码,只需连接 metastore 服务即可。

以上的 hive 篇先总结到这,如果觉得文章对你有帮助,可以点个小赞加收藏。如果有误,欢迎大家指正,谢谢!

#hive##面试题目##数据开发工程师#
全部评论
更多内容可以看这篇:https://www.nowcoder.com/issue/tutorial?zhuanlanId=A065PM&uuid=b489b6de742341a4945c5e13fa5c61f6
2 回复 分享
发布于 2022-12-18 13:01 广东
谢谢大佬总结的优质内容!
点赞 回复 分享
发布于 2022-10-31 22:26 福建

相关推荐

11-19 01:05
已编辑
门头沟学院 Java
暑期实习转正保底 其他都在泡池子跟自己谈了五年的女朋友也分手了 她真的对我很好 秋招的时候帮助了我很多 也忍耐了很多 但是我还是不能完全融入她的生活 以及她要跟我结婚 我觉得我没做好准备 于是就分手了 今天把之前穿的她的衣服还给了她(之前冷了她会把她的衣服给我穿 也把放她那的ipad带走了 也算是交接完了吧回头看来感觉自己读了研什么用都没有 三年的青春去找实习 提技术 到头来秋招大部分是简历挂 感觉其实你已经在一个分明的阶级中 企业的大部分开奖也是看学历 双非本2硕就不配有好的offer 通过技术逆天改命拿到好offer真的是少有的事情 早期的互联网确实可以改变命运 之前发现实习的cto是个双非本 但现在我们时代人的红利又在哪里呢?  转正的部门996 裁应届 而且还是干的一些有的没的的内容 ld不做事 mt不教人 如果给我一个新的offer我是肯定不会来这边的 但造化弄人 现在其他家还没开只能先签着保底了 不知道为什么 我的两次实习经历 对自己来说都没有什么成长 java组的ld不懂java mt也不会说话 所有的基建全靠自己查 业务的内容是各种一知半解 感觉跟自己考上研以后的场景完全不一样呀 以为是能拿到各种offer才做了很多努力 结果到头来还是一场空 冷落了对象 甚至学着学着变成了一个只会代码的机器 今天打开工作软件一看 之前聊天的实习生都没留下来 第一个实习的组ld被干 大头兵和mt也走了 原来很久以前见的那次见面是最后一次见面了呀 互联网变化太快了 快到让我怀疑他是不是真的是我要的东西 当初努力的目标也是希望能把自己喜欢的人靠自己的能力留下 结果一腔努力换来了一无所有 好像走了这么久 还是一场空 本科时候舞团解散的场景又历历在目 上周的笔试发现对象当年考研送我的笔墨用完了 而且是不能换笔芯的 她当初送我的戒指和耳环有一天放到一旁 突然有一天找不到了 她当初开玩笑说如果戒指丢了 我们就分手 所以我格外注意 但现在怎么找也找不到 可能这次真的结束了吧今天到学校后面哭了一场 之前都不知道有这个地方 可能只有有事了才会找到这里吧
辉哥帅的一笔:去把她哄回来
点赞 评论 收藏
分享
评论
7
59
分享
牛客网
牛客企业服务