31道Hive大厂高频面试题,学会了进大厂不是梦,建议收藏! 您所在的位置:网站首页 大厂是哪几个 31道Hive大厂高频面试题,学会了进大厂不是梦,建议收藏!

31道Hive大厂高频面试题,学会了进大厂不是梦,建议收藏!

2023-08-10 23:36| 来源: 网络整理| 查看: 265

博主闭关两个多月,查阅了数百万字的大数据资料,结合自身的学习和工作经历,总结了大厂高频面试题,里面涵盖几乎所有我见到的大数据面试题目。

《大厂高频面试题系列》目前已总结4篇文章,且在持续更新中✍。文中用最直白的语言解释了Hadoop、Hive、Kafka、Flume、Spark等大数据技术和原理,细节也总结的很到位,是不可多得的大数据面试宝典,强烈建议收藏,祝大家都能拿到心仪的大厂offer🏆。下面是相关的系列文章:

Hadoop:57道hadoop大厂高频面试题Kafka:40道Kafka大厂高频面试题Flume:15道Flume大厂高频面试题

文章目录 1. 介绍一下什么是Hive2. 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 的架构有个大致的印象:

image-20210704173203053

用户接口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任务树

img

过程描述如下:

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和传统数据库之间的区别

img

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即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 PRECEDING | expr FOLLOWING}

解释:

PRECEDING:往前FOLLOWING:往后CURRENT ROW:当前行UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点UNBOUNDED FOLLOWING:表示到后面的终点

窗口框架的作用对分区进一步细分,frame_unit有两种,分别是ROWS和RANGE,ROWS通过指定当前行之前或之后的固定数目的行来限制分区中的行,RANGE按照排序列的当前值,根据相同值来确定分区中的行。

10. Hive内部表、外部表、分区表、分桶表的区别,以及各自的使用场景 内部表

如果Hive中没有特别指定,则默认创建的表都是管理表,也称内部表。由Hive负责管理表中的数据,管理表不共享数据。删除管理表时,会删除管理表中的数据和元数据信息。

绝大多数表都是外部表; 只有自己使用的临时表,才是内部表。

外部表

当一份数据需要被共享时,可以创建一个外部表指向这份数据。外部表数据由HDFS管理。删除该表并不会删除掉原始数据,删除的是表的元数据。当表结构或者分区数发生变化时,需要进行一步修复的操作。

场景:

每天将收集到的网站日志定期流入 HDFS 文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过 SELECT+INSERT 进入内部表。

分区表

分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。 Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。

分区表使用的是表外字段,需要指定字段类型,并通过关键字partitioned by(partition_name string)声名。

分桶表

分桶使用的是表内字段,已经知道字段类型,不需要再指定。通过关键字 clustered by(column_name) into n buckets声明。分桶是更细粒度的划分、管理数据,可以对表进行先分区再分桶的划分策略

分桶最大的优势就是:用于数据取样,可以起到优化加速的作用。

# 抽样查询 select * from stu_buck tablesample(bucket 1 out of 4 on id);

分桶规则: Hive 的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

经测试,如果设置reduce数量n>分桶表的通数m,测mapreduce会分出分m 和 (n-m)两部分 reduce task执行,其中(n-m)个reduce task应该执行的是空任务,m个reduce task执行分桶任务。如果n select o.id from bigtable b join bigtable o on o.id = b.id where o.id



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有