博主闭关两个多月,查阅了数百万字的大数据资料,结合自身的学习和工作经历,总结了大厂高频面试题,里面涵盖几乎所有我见到的大数据面试题目。
《大厂高频面试题系列》目前已总结4篇文章,且在持续更新中。文中用最直白的语言解释了Hadoop、Hive、Kafka、Flume、Spark等大数据技术和原理,细节也总结的很到位,是不可多得的大数据面试宝典,强烈建议收藏,祝大家都能拿到心仪的大厂offer。下面是相关的系列文章:
- Hadoop:57道hadoop大厂高频面试题
- Kafka:40道Kafka大厂高频面试题
- Flume:15道Flume大厂高频面试题
文章目录
-
- 1. 介绍一下什么是Hive
- 2. Hive的架构原理
- 3. HiveSQL转换为MapReduce的过程
- 4. hive和传统数据库之间的区别
- 5. HiveSQL语句不会转化为MapReduce作业的情况
- 6. 请简单介绍一下Hive的本地模式
- 7. 你使用过哪些 Hive 函数
- 8. 列转行和行转列函数有哪些
- 9. 介绍一下Hive中的窗口函数
- 10. Hive内部表、外部表、分区表、分桶表的区别,以及各自的使用场景
- 11. Order By、Sort By、Distrbute By、Cluster By的区别
- 12. 动态分区和静态分区的区别及使用场景
- 13. Hive SQL语句的执行顺序
- 14. 请说明一下on和where的区别
- 15. 请你说明hql所有的优化方式
- 16. 解决hive小文件过多问题
- 17. Hive数据倾斜问题
- 18. 请介绍一下Hive的严格模式
- 19. Hive索引有了解过吗
- 20. Hive有哪些方式保存元数据,各有哪些特点
- 21. 列式存储和行式存储
- 22. Hive 中的压缩格式TextFile、SequenceFile、RCfile 、ORCfile、Parquet各有什么区别
- 23. Hive的UDF、UDAF、UDTF函数有什么区别
- 24. Hive默认的分隔符是什么
- 25. hive中导入数据的几种方式
- 26. hive导出数据的几种方式
- 27. hive的执行计划有看过吗,你一般会关注哪几个点
- 28. Hive的两张表关联,使用MapReduce怎么实现
- 29. 写出hive中split、coalesce及collect_list函数的用法
- 30. 使用过Hive解析JSON串吗
- 31. 请说出Hive运行的三种引擎
1. 介绍一下什么是Hive
Hive 是基于 Hadoop的一个数据仓库工具,可以将HDFS中的数据文件映射为一张数据库表,并提供类SQL查询功能(HQL),提供快速开发的能力。Hive本质是将SQL转换为 MapReduce的任务进行运算,从而不必开发专门的MapReduce应用,减少开发人员的学习成本,功能扩展很方便。
拓展:
hive存的是和hdfs的映射关系,hive是逻辑上的数据仓库,实际操作的都是hdfs上的文件,HQL就是用sql语法来写的mr程序
2. Hive的架构原理
需要对 Hive 的架构有个大致的印象:
-
用户接口Client:Hive可以通过CLI(Command-line Interface,即命令行),JDBC/ODBC( jdbc 访问 hive)、WEBUI(浏览器访问 hive)。
-
元数据Metastore:Hive的元数据保存在数据库中,如保存在MySQL,SQLServer,PostgreSQL,Oracle及Derby等数据库中(默认是derby)。Hive中的元数据信息包含表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。(其实就是sql表与hdfs文件之间的映射Path)
-
驱动器Driver
- 解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第三方工具库完成,比如 antlr;Antlr定义SQL的语法规则,完成SQL词法、语法解析,将SQL转化为抽象语法树AST Tree
- 编译器(Physical Plan):将 AST 编译生成逻辑执行计划。
- 优化器(Query Optimizer):对逻辑执行计划进行优化。
- 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive 来说,就是 MR/Spark。
Hive 通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的 Driver,结合元数据(MetaStore),将这些指令翻译成 MapReduce,提交到 Hadoop 中执行,最后,将执行返回的结果输出到用户交互接口。
拓展:
这里有有个易混淆点,Hive 元数据默认存储在 derby 数据库,不支持多客户端访问,所以将元数据存储在 MySQL 等数据库,支持多客户端访问。
3. HiveSQL转换为MapReduce的过程
HiveSQL ->AST(抽象语法树) -> QB(查询块) ->OperatorTree(操作树)->优化后的操作树->mapreduce任务树->优化后的mapreduce任务树
过程描述如下:
- SQL Parser(SQL解析器):Antlr定义SQL的语法规则,完成SQL词法、语法解析,将SQL转化为抽象语法树AST Tree;
- Semantic Analyzer(语义分析):遍历AST Tree,抽象出查询的基本组成单元QueryBlock;
- Logical plan(逻辑执行计划):遍历QueryBlock,翻译为执行操作树OperatorTree;
- Logical plan optimizer(逻辑优化器): 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量;
- Physical plan(物理执行计划):遍历OperatorTree,翻译为MapReduce任务;
- Physical plan optimizer(物理优化器):物理层优化器进行MapReduce任务的变换,生成最终的执行计划。
4. hive和传统数据库之间的区别
ANSI SQL指标准化SQL
5. HiveSQL语句不会转化为MapReduce作业的情况
Fetch 抓取是指, Hive 中对某些情况的查询可以不必使用 MapReduce 计算。例如: SELECT * FROM employees;
在这种情况下, Hive 可以简单地读取 employee 对应的存储目录下的文件,然后输出查询结果到控制台。
在 hive-default.xml.template
文件中 hive.fetch.task.conversion
默认是 more,老版本 hive
默认是 minimal,该属性修改为 more 以后,在全局查找、字段查找、limit 查找等都不走mapreduce。
案例
把 hive.fetch.task.conversion 设置成 more, 然后执行查询语句, 如下查询方式都不会执行 mapreduce 程序。
hive (default)> set hive.fetch.task.conversion=more;
hive (default)> select * from emp;
hive (default)> select ename from emp;
hive (default)> select ename from emp limit 3;
把 hive.fetch.task.conversion 设置成 none,然后执行查询语句,都会执行 mapreduce程序。
hive (default)> set hive.fetch.task.conversion=none;
hive (default)> select * from emp;
hive (default)> select ename from emp;
hive (default)> select ename from emp limit 3;
6. 请简单介绍一下Hive的本地模式
大多数的 Hadoop Job 是需要 Hadoop 提供的完整的可扩展性来处理大数据集的。不过,有时 Hive 的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能会比实际 job 的执行时间要多的多。对于大多数这种情况, Hive 可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。
用户可以通过设置 hive.exec.mode.local.auto
的值为 true(该值默认为false),来让 Hive 在适当的时候自动启动这个优化。
set hive.exec.mode.local.auto=true; //开启本地 mr
//设置 local mr 的最大输入数据量,当输入数据量小于这个值时采用 local mr 的方式,默认
为 134217728,即 128M
set hive.exec.mode.local.auto.inputbytes.max=50000000;
//设置 local mr 的最大输入文件个数,当输入文件个数小于这个值时采用 local mr 的方式,默
认为 4
set hive.exec.mode.local.auto.input.files.max=10;
7. 你使用过哪些 Hive 函数
(1)普通函数
(2)行转列函数和列转行函数
见第8题
(3)窗口函数
见第9题
8. 列转行和行转列函数有哪些
(1)行转列:把多行转成一列(多行变一行)
CONCAT(string A/col, string B/col…)
:返回输入字符串连接后的结果,支持任意个输入字符串,如果concat中任意字符串为null,则整个函数的返回结果为null。CONCAT_WS(separator, str1, str2,...)
:一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间。
注意:CONCAT_WS must be "string or array<string>
即concat_ws中的参数一定是字符串或字符串数组COLLECT_SET(col)
:函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生 Array 类型字段。collect_list(col)
将所有将结果放入,不去重,返回Array类型字段
(2)列转行:把一列转成多行
-
EXPLODE(col)
:将 hive 一列中复杂的 Array 或者 Map 结构拆分成多行。 -
LATERAL VIEW
:形成一张侧写表,它可以将原本的字段做一个关联。常和 split、explode 等 UDTF 一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。用法:#注意:as不能省略 LATERAL VIEW udtf(expression) tableAlias AS columnAlias - 这个tableAias是侧写表的别名,里面只有colimnAlias这一个字段,注意:如果炸裂成两个列,则colimnAlias写两个别名
9. 介绍一下Hive中的窗口函数
窗口函数的语法
window_function_name(expression)
OVER (
[partition_defintion]
[order_definition]
[frame_definition]
)
首先需要指定窗口函数的函数名,也就是在上个例子中用的sum(),之后的OVER子句中即使没有内容,括号也需要保留,窗口由partition_defintion,order_definition,frame_definition确定,任何一个都不是必须的。
(1)partition_defintio 窗口分区
PARTITION BY expr [, expr] ...
根据表达式的计算结果来进行分区(列名也是一种表达式)。
(2)order_definition 窗口排序
ORDER BY expr [ASC|DESC] [, expr [ASC|DESC]] ...
为分区内的行的排列顺序。
(3)frame_definition 窗口框架
frame_clause:
frame_units frame_extentframe_units:
{
ROWS | RANGE}frame_extent:
{frame_start | frame_between}frame_between:
BETWEEN frame_start AND frame_endframe_start, frame_end: {
CURRENT ROW
| UNBOUNDED PRECEDING
| UNBOUNDED FOLLOWING
| expr
文章评论