大数据面试题(五)----HIVE面试题

“无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。”。

大数据面试宝典目录,请点击

HIVE面试题目录

1. Hive 表关联查询,如何解决数据倾斜的问题?
2. 请谈一下Hive 的特点,Hive 和RDBMS 有什么异同?
3. 请说明hive 中Sort By , Order By , Cluster By ,Distrbute By 各代表什么意思?
4. 简要描述数据库中的null,说出null 在hive 底层如何存储,并解释select a.* from t1 a left outer join t2 b on a.id=b.idwhere b.id is null; 语句的含义?
5. 写出hive 中split、coalesce 及collect_list 函数的用法(可举例)?
6. Hive 有哪些方式保存元数据,各有哪些特点?
7. Hive 内部表和外部表的区别?
8. Hive 的HSQL 转换为MapReduce 的过程?(☆☆☆☆☆)
9. Hive 底层与数据库交互原理?(☆☆☆☆☆)
10. Hive join 过程中大表小表的放置顺序?
11. Hive 的两张表关联,使用MapReduce 怎么实现?(☆☆☆☆☆)
12. Hive 中使用什么代替in 查询?
13. 所有的Hive 任务都会有MapReduce 的执行吗?
14. Hive 的函数:UDF、UDAF、UDTF 的区别?
15. 说说对Hive 桶表的理解?
16. Hive 自定义UDF 函数的流程?


1. Hive 表关联查询,如何解决数据倾斜的问题?(☆☆☆☆☆)

1) 倾斜原因:
       map 输出数据按key Hash 的分配到reduce 中,由于key 分布不均匀、业务数据本身的特、建表时考虑不周、等原因造成的reduce 上的数据量差异过大。
(1) key 分布不均匀;
(2) 业务数据本身的特性;
(3) 建表时考虑不周;
(4) 某些SQL 语句本身就有数据倾斜;
       如何避免:对于key 为空产生的数据倾斜,可以对其赋予一个随机值。
2) 解决方案
(1) 参数调节:
       hive.map.aggr = true
       hive.groupby.skewindata=true
       有数据倾斜的时候进行负载均衡,当选项设定位true,生成的查询计划会有两个MR Job。第一个MR Job 中,Map 的输出结果集合会随机分布到Reduce 中,每个Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key 有可能被分发到不同的Reduce 中,从而达到负载均衡的目的;第二个MR Job 再根据预处理的数据结果按照Group By Key 分布到Reduce 中(这个过程可以保证相同的Group By Key 被分布到同一个Reduce 中), 最后完成最终的聚合操作。
(2) SQL 语句调节:
       ① 选用join key 分布最均匀的表作为驱动表。做好列裁剪和filter 操作,以达到两表做join 的时候,数据量相对变小的效果。
       ② 大小表Join:使用map join 让小的维度表(1000 条以下的记录条数)先进内存。在map 端完成reduce.
       ③ 大表Join 大表:把空值的key 变成一个字符串加上随机数,把倾斜的数据分到不同的reduce 上,由于null 值关联不上,处理后并不影响最终结果。
       ④ count distinct 大量相同特殊值:count distinct 时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理, 直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。

2. 请谈一下Hive 的特点,Hive 和RDBMS 有什么异同?

       hive 是基于Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql 查询功能,可以将sql 语句转换为MapReduce 任务进行运行。其优点是学习成本低,可以通过类SQL 语句快速实现简单的MapReduce 统计,不必开发专门的MapReduce 应用,十分适合数据仓库的统计分析,但是Hive 不支持实时查询。
       Hive 与关系型数据库的区别:
在这里插入图片描述

3. 请说明hive 中Sort By , Order By , Cluster By ,Distrbute By 各代表什么意思?

        order by: 会对输入做全局排序,因此只有一个reducer(多个reducer 无法保证全局有序)。只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
        sort by: 不是全局排序,其在数据进入reducer 前完成排序。
        distribute by:按照指定的字段对数据进行划分输出到不同的reduce 中。
        cluster by:除了具有distribute by 的功能外还兼具sort by 的功能。

4. 简要描述数据库中的null,说出null 在hive 底层如何存储,并解释select a.* from t1 a left outer join t2 b on a.id=b.idwhere b.id is null; 语句的含义?

       null 与任何值运算的结果都是null, 可以使用is null、is not null 函数指定在其值为null 情况下的取值。
       null 在hive 底层默认是用’\N’ 来存储的, 可以通过alter table test SETSERDEPROPERTIES(‘serialization.null.format’ = ‘a’);来修改。查询出t1 表中与t2 表中id 相等的所有信息。

5. 写出hive 中split、coalesce 及collect_list 函数的用法(可举例)?

       split 将字符串转化为数组,即:split(‘a,b,c,d’ , ‘,’) ==> [“a”,“b”,“c”,“d”]。
       coalesce(T v1, T v2, …) 返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULL。
       collect_list 列出该字段所有的值,不去重select collect_list(id) from table。

6. Hive 有哪些方式保存元数据,各有哪些特点?

       Hive 支持三种不同的元存储服务器,分别为:内嵌式元存储服务器、本地元存储服务器、远程元存储服务器,每种存储方式使用不同的配置参数。
       内嵌式元存储主要用于单元测试,在该模式下每次只有一个进程可以连接到元存储,Derby 是内嵌式元存储的默认数据库。
       在本地模式下,每个Hive 客户端都会打开到数据存储的连接并在该连接上请求SQL 查询。
       在远程模式下,所有的Hive 客户端都将打开一个到元数据服务器的连接,该服务器依次查询元数据,元数据服务器和客户端之间使用Thrift 协议通信。

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

       创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
       删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

8. Hive 的HSQL 转换为MapReduce 的过程?(☆☆☆☆☆)

       HiveSQL ->AST( 抽象语法树) -> QB( 查询块) ->OperatorTree ( 操作树) -> 优化后的操作树->mapreduce 任务树->优化后的mapreduce 任务树
在这里插入图片描述

过程描述如下:
        SQL Parser: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 任务;
        Logical plan optimizer:物理层优化器进行MapReduce 任务的变换,生成最终的执行计划;

9. Hive 底层与数据库交互原理?(☆☆☆☆☆)

        由于Hive 的元数据可能要面临不断地更新、修改和读取操作,所以它显然不适合使用Hadoop 文件系统进行存储。目前Hive 将元数据存储在RDBMS 中,比如存储在MySQL、Derby 中。元数据信息包括:存在的表、表的列、权限和更多的其他信息。

在这里插入图片描述在这里插入图片描述

10. Hive join 过程中大表小表的放置顺序?

       将最大的表放置在JOIN 语句的最右边,或者直接使用/*+ streamtable(table_name) */指出。
       在编写带有join 操作的代码语句时,应该将条目少的表/子查询放在Join 操作符的左边。因为在Reduce 阶段,位于Join 操作符左边的表的内容会被加载进内存,载入条目较少的表可以有效减少OOM(out of memory)即内存溢出。所以对于同一个key 来说,对应的value 值小的放前,大的放后,这便是“小表放前”原则。若一条语句中有多个Join, 依据Join 的条件相同与否,有不同的处理方法。

11. Hive 的两张表关联,使用MapReduce 怎么实现?(☆☆☆☆☆)

       如果其中有一张表为小表,直接使用map 端join 的方式(map 端加载小表)进行聚合。
       如果两张都是大表,那么采用联合key,联合key 的第一个组成部分是join on 中的公共字段,第二部分是一个flag,0 代表表A,1 代表表B,由此让Reduce 区分客户信息和订单信息;在Mapper 中同时处理两张表的信息,将join on 公共字段相同的数据划分到同一个分区中,进而传递到一个Reduce 中,然后在Reduce 中实现聚合。

12. Hive 中使用什么代替in 查询?

       在Hive 0.13 版本之前,通过left outer join 实现SQL 中的in 查询,0.13 版本之后,Hive 已经支持in 查询。

13. 所有的Hive 任务都会有MapReduce 的执行吗?

       不是,从Hive0.10.0 版本开始,对于简单的不需要聚合的类似SELECT from

LIMIT n 语句,不需要起MapReduce job,直接通过Fetch task 获取数据。

14. Hive 的函数:UDF、UDAF、UDTF 的区别?

       UDF: 单行进入,单行输出
       UDAF: 多行进入,单行输出
       UDTF: 单行输入,多行输出

15. 说说对Hive 桶表的理解?

       桶表是对数据进行哈希取值,然后放到不同文件中存储。
       数据加载到桶表时,会对字段取hash 值,然后与桶的数量取模。把数据放到对应的文件中。物理上,每个桶就是表(或分区)目录里的一个文件,一个作业产生的桶(输出文件)和reduce 任务个数相同。
       桶表专门用于抽样查询,是很专业性的,不是日常用来存储数据的表,需要抽样查询时, 才创建和使用桶表。

16. Hive 自定义UDF 函数的流程?

1) 写一个类继承(org.apache.hadoop.hive.ql.)UDF 类;
2) 覆盖方法evaluate();
3) 打JAR 包;
4) 通过hive 命令将JAR 添加到Hive 的类路径:
       hive> addjar /home/ubuntu/ToDate.jar;
5) 注册函数:
       hive> create temporary function xxx as ‘XXX’;
6) 使用函数;
7)[可选] drop 临时函数;

发布了422 篇原创文章 · 获赞 357 · 访问量 124万+

猜你喜欢

转载自blog.csdn.net/silentwolfyh/article/details/103864595