【最全的⼤数据⾯试系列】Hive⾯试题⼤全
作者 :“⼤数据⼩禅”
专栏简介 :本专栏主要分享收集的⼤数据相关的⾯试题,涉及到
Hadoop,Spark,Flink,Zookeeper,Flume,Kafka,Hive,Hbase等⼤数据相关技术。。
个⼈主页 :
粉丝福利 :
欢迎⼩伙伴们 点赞 、收藏 、留⾔
⾯试题⽬录
1.Hive 表关联查询,如何解决数据倾斜的问题?
1.倾斜原因:map 输出数据按 key Hash 的分配到 reduce 中,由于 key 分布不均匀、业务数据本⾝的特、建表时考虑不周、等原因造成的 reduce 上的数据量差异过⼤。
1)key 分布不均匀;
2)业务数据本⾝的特性;
3)建表时考虑不周;sqlyog打开是灰的
4)某些 SQL 语句本⾝就有数据倾斜;
如何避免:对于 key 为空产⽣的数据倾斜,可以对其赋予⼀个随机值。
2.解决⽅案
1)参数调节:
hive.map.aggr = 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 的 HSQL 转换为 MapReduce 的过程?
HiveSQL ->AST(抽象语法树) -> QB(查询块) ->OperatorTree(操作树)->优化后的操作树->mapreduce 任务树->优化后的 mapreduce 任务树
过程描述如下:
ctrl的ascii码
SQL Parser:Antlr 定义 SQL 的语法规则,完成 SQL 词法,语法解析,将SQL 转化为抽象语法树 AST Tree;
putty输入密码显示access
Semantic Analyzer:遍历 AST Tree,抽象出查询的基本组成单元QueryBlock;
Logical plan:遍历 QueryBlock,翻译为执⾏操作树 OperatorTree;
Logical plan optimizer: 逻辑层优化器进⾏ OperatorTree 变换,合并不必要的 ReduceSinkOperator,减少 shuffle数据量;
Physical plan:遍历 OperatorTree,翻译为 MapReduce 任务;
Logical plan optimizer:物理层优化器进⾏ MapReduce 任务的变换,⽣成最终的执⾏计划。
3.Hive 底层与数据库交互原理?
由于 Hive 的元数据可能要⾯临不断地更新、修改和读取操作,所以它显然不适合使⽤ Hadoop ⽂件系统进⾏存储。⽬前 Hive 将元数据存储在 RDBMS 中,⽐如存储在 MySQL、Derby 中。元数据信息包括:存在的表、表的列、权限和更多的其他信息。
4.Hive 的两张表关联,使⽤ MapReduce怎么实现?
如果其中有⼀张表为⼩表,直接使⽤ map 端 join 的⽅式(map 端加载⼩表)进⾏聚合。如果两张都是⼤表,那么采⽤联合 key,联合key 的第⼀个组成部分是 join on 中的公共字段,第⼆部分是⼀个 flag,0 代表表 A,1 代表表 B,由此让Reduce 区分客户信息和订单信息;在 Mapper 中同时处理两张表的信息,将join on 公共字段相同的数据划分到同⼀个分区中,进⽽传递到⼀个 Reduce中,然后在Reduce 中实现聚合。
5.请谈⼀下 Hive 的特点?
hive 是基于 Hadoop 的⼀个数据仓库⼯具,可以将结构化的数据⽂件映射为⼀张数据库表,并提供完整的 sql 查询功能,可以将 sql语句转换为MapReduce 任务进⾏运⾏。其优点是学习成本低,可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专门的MapReduce 应⽤,⼗分适合数据仓库的统计分析,但是 Hive 不⽀持实时查询。
6.请说明 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 的功能。python快速排序算法代码
7. 写出 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) fromtable。
8. Hive 有哪些⽅式保存元数据,各有哪些特点?
Hive ⽀持三种不同的元存储服务器,分别为:内嵌式元存储服务器、本地元存储服务器、远程元存储服务器,每种存储⽅式使⽤不同的配置参数。内嵌式元存储主要⽤于单元测试,在该模式下每次只有⼀个进程可以连接到元存储,Derby 是内嵌式元存储的默认数据库。在本地模式下,每个 Hive 客户端都会打开到数据存储的连接并在该连接上请求 SQL 查询。在远程模式下,所有的 Hive 客户端都将打
开⼀个到元数据服务器的连接,该服务器依次查询元数据,元数据服务器和客户端之间使⽤ Thrift 协议通信。
9.Hive 内部表和外部表的区别?
创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。删除表时:在删除表的时候,内部表的元数据和数据会被⼀起删除, ⽽外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,⽅便共享源数据。
10.Hive 中的压缩格式 TextFile、SequenceFile、RCfile
ORCfile各有什么区别?
1、TextFile
默认格式,存储⽅式为⾏存储,数据不做压缩,磁盘开销⼤,数据解析开销****⼤。可结合 Gzip、Bzip2 使⽤(系统⾃动检查,执⾏查询时⾃动解压),但使⽤这种⽅式,压缩后的⽂件不⽀持 split,Hive 不会对数据进⾏切分,从⽽⽆法对数据进⾏并⾏操作。并且在反序列化过程中,必须逐个字符判断是不是分隔符和⾏结束符,因此反序列化开销会⽐ SequenceFile ⾼⼏⼗倍。
2、SequenceFile
SequenceFile 是 Hadoop API 提供的⼀种⼆进制⽂件⽀持,存储⽅式为⾏存储,其具有使⽤⽅便、可分割、可压缩的特点。
SequenceFile ⽀持三种压缩选择:NONE,RECORD,BLOCK。Record 压缩率低,⼀般建议使⽤ BLOCK 压缩。优势是⽂件和hadoop api 中的 MapFile 是相互兼容的
3、RCFile
mysql面试题大全
存储⽅式:数据按⾏分块,每块按列存储。结合了⾏存储和列存储的优点:⾸先,RCFile 保证同⼀⾏的数据位于同⼀节点,因此元组重构的开销很低;其次,像列存储⼀样,RCFile 能够利⽤列维度的数据压缩,并且能跳过不必要的列读取;
4、ORCFile
存储⽅式:数据按⾏分块 每块按照列存储。
压缩快、快速列存取。
效率⽐ rcfile ⾼,是 rcfile 的改良版本。
11.所有的 Hive 任务都会有 MapReduce 的执⾏吗?
不是,从 Hive0.10.0 版本开始,对于简单的不需要聚合的类似 SELECT from LIMIT n 语句,不需要起 MapReduce job,直接通过Fetch task获取数据。
12.Hive 的函数:UDF、UDAF、UDTF 的区别?
UDF:单⾏进⼊,单⾏输出UDAF:多⾏进⼊,单⾏输出
UDTF:单⾏输⼊,多⾏输出
13.说说对 Hive 桶表的理解?
桶表是对数据进⾏哈希取值,然后放到不同⽂件中存储。数据加载到桶表时,会对字段取 hash 值,然后与桶的数量取模。把数据放到对应的⽂件中。物理上,每个桶就是表(或分区)⽬录⾥的⼀个⽂件,⼀个作业产⽣的桶(输出⽂件)和 reduce 任务个数相同。桶表专门⽤于抽样查询,是很专业性的,不是⽇常⽤来存储数据的表,需要抽样查询时,才创建和使⽤桶表。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。