Hive精选面试题(一)

2021年11月22日 阅读数:3
这篇文章主要向大家介绍Hive精选面试题(一),主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

关注公众号:大数据技术派,回复“资料”,领取资料,学习大数据技术。
本文首发于个人我的博客:Hive精选面试题(一)面试

一、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。 sql

二、Hive的HSQL转换为MapReduce的过程?(☆☆☆☆☆)

  HiveSQL ->AST(抽象语法树) -> QB(查询块) ->OperatorTree(操做树)->优化后的操做树->mapreduce任务树->优化后的mapreduce任务树 数据库

Hive精选面试题(一)

HSQL转MR(2)

  过程描述以下:
    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任务的变换,生成最终的执行计划。 api

三、Hive底层与数据库交互原理?(☆☆☆☆☆)

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

Hive精选面试题(一)

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

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

五、请谈一下Hive的特色,Hive和RDBMS有什么异同?

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

Hive和RDBMS异同

六、请说明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 的功能。 markdown

七、写出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。 app

八、Hive有哪些方式保存元数据,各有哪些特色?

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

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

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

十、Hive 中的压缩格式TextFile、SequenceFile、RCfile 、ORCfile各有什么区别?

一、TextFile
  默认格式,存储方式为行存储,数据不作压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,压缩后的文件不支持split,Hive不会对数据进行切分,从而没法对数据进行并行操做。而且在反序列化过程当中,必须逐个字符判断是否是分隔符和行结束符,所以反序列化开销会比SequenceFile高几十倍。
二、SequenceFile
  SequenceFile是Hadoop API提供的一种二进制文件支持,存储方式为行存储,其具备使用方便、可分割、可压缩的特色
  SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,通常建议使用BLOCK压缩
  优点是文件和hadoop api中的MapFile是相互兼容的
三、RCFile
  存储方式:数据按行分块,每块按列存储。结合了行存储和列存储的优势:
    首先,RCFile 保证同一行的数据位于同一节点,所以元组重构的开销很低;
    其次,像列存储同样,RCFile 可以利用列维度的数据压缩,而且能跳过没必要要的列读取;
四、ORCFile
  存储方式:数据按行分块 每块按照列存储。
  压缩快、快速列存取。
  效率比rcfile高,是rcfile的改良版本。
  总结:相比TEXTFILE和SEQUENCEFILE,RCFILE因为列式存储方式,数据加载时性能消耗较大,可是具备较好的压缩比和查询响应
数据仓库的特色是一次写入、屡次读取,所以,总体来看,RCFILE相比其他两种格式具备较明显的优点

十一、全部的Hive任务都会有MapReduce的执行吗?

  不是,从Hive0.10.0版本开始,对于简单的不须要聚合的相似SELECT <col> from <table> LIMIT n语句,不须要起MapReduce job,直接经过Fetch task获取数据。

十二、Hive的函数:UDF、UDAF、UDTF的区别?

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

1三、说说对Hive桶表的理解?

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