hive相关面试题

1、hive简介:
   基于hadoop的一个数据仓库,可以将结构化数据文件映射为一张数据库表
   基本原理:将HQL语句自动转换成Mapreduce任务
   存储:依赖于hdfs进行数据存储
           查询:依赖于mapreduce完成查询操作
2、hive如何调优?
  hive最终都会转化为mapreduce的job来运行,要想hive调优,实际上就是mapreduce调优,
  可以有下面几个方面的调优:解决数据倾斜问题,减少job数量,设置合理的map和reduce的task数,
  对小文件进行合并,优化时把握整体,单个task最优不如整体最优。按照一定规则分区。
2、Hive sql如何优化?
  1、使用分区裁剪、列裁剪
  2、少用count distinct
  3、合理使用mapjoin
  4、并行执行job
3、hive内部表和外部表的区别?
  Hive 向内部表导入数据时,会将数据移动到数据仓库指向的路径;若是外部表,数据的具体存放目录由用户建表时指定
  在删除表的时候,内部表的元数据和数据会被一起删除,
  而外部表只删除元数据,不删除数据。
  这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
4、hive表关联查询,如何解决数据倾斜问题?
  倾斜原因:map端输出数据按key hash的分配到reduce中,由于key分布不均匀等原因造成reduce上的数据量差异过大。
  key分布不均匀、业务数据本省的特性、建表时考虑不周、某些SQL语句本省就有数据倾斜。
  解决方式:

    1、参数调节,有数据倾斜的时候进行负载均衡
    2、SQL语句调节,选用join key分布最均匀的表作为驱动表;大小表join、大表join大表;count distict大量相同的特殊值
5、hive底层与数据库交互原理
  Hive的查询功能是由hdfs + mapreduce结合起来实现的
  Hive与mysql的关系:只是借用mysql来存储hive中的表的元数据信息,称为metastore
6、hive与hbase的区别?
  共同点:hive和hbase都是架构在hadoop之上的,都是用hadoop作为底层存储
  Hive是数据仓库。通过Hive可以使用HQL语言查询存放在HDFS上的数据。
  HQL是一种类SQL语言,这种语言最终被转化为Map/Reduce. 虽然Hive提供了SQL查询功能,
  但是Hive不能够进行交互查询--因为它是基于MapReduce算法。
  Hbase Key/Value,基础单元是cell,它运行在HDFS之上。和Hive不一样,Hbase的能够在它的数据库上实时运行,而不是运行MapReduce任务,。
  Hive和Hbase是两种基于Hadoop的不同技术--Hive是一种类SQL的引擎,可以直接将文件转成数据库。
  并且运行MapReduce任务,Hbase是一种在Hadoop之上的NoSQL 的Key/vale数据库。Hive可以用来进行统计查询,HBase可以用来进行实时查询。
  数据也可以从Hive写到Hbase,再从Hbase写回Hive。
7、怎么在java中操作hive?
  jdbc的链接方式
  odbc(不稳定,经常会被大数据量冲挂,不建议使用)
  直接利用hive的Driver class来连接
8、hive中索引的优缺点?
  优点:优化查询、检索性能、减少IO
  缺点:在创建索引时会造成资源消耗、索引创建完成保存时会占用空间
9、请说明hive中Sort By,Order By,Cluster By,Distrbute By各代表什么意思?
  Sort By:不是全局排序,其在数据进入reducer前完成排序
  Order By:会对输入做全局排序,只有一个reducer
  Cluster By:除了具有Distrbute By的功能外还兼具Sort By的功能
  Distrbute By:按照指定的字段对数据进行划分输出到不同的reduce中
10、hive的分区分桶
  分区:由于hive查询的时候一般会扫描整个表,会消耗很多时间,有时只需要扫描表中关心的一部分数据,因此引入partition,加快统计的速度
  分桶:就是对每一个表或者分区进一步细分
11、hive解决了什么问题?
  解决了元数据的冲突、hiveserver2代理管理元数据
12、将文件导入到hive表中
  load data local inpath '/a.txt' overwrite into table test partition(xx='xx')
13、hive中的metastore用来做什么的?
  metastore是一套映射工具,将sql语句转换成对应的 job任务去进行执行
14、默认安装hive时是使用derby内存数据库保存hive的元数据,这样是不可以并发调用hive的
15、null在hive底层默认是用'\N'来存储的,可以通过alter table test SET SERDEPROPERTIES('serialization.null.format' = ' ');来修改。
16、请把下一语句用hive方式实现?
  SELECT a.key,a.value
    FROM a
  WHERE a.key not in (SELECT b.key FROM b)
  答案:
    select a.key,a.value from a where a.key not exists (select b.key from b)
17、Hive有哪些方式保存元数据的?

  1)内存数据库derby,较小,不常用
  2) 本地mysql,较常用
  3) 远程mysql,不常用

18、hive数据倾斜原因及解决办法

  1、hive数据倾斜的原因
    a、key分布不均匀
    b、业务数据本身的特性
    c、sql语句造成数据倾斜

  2、解决方法

    1、hive设置hive.map.aggr=true和hivegroupby.skewindata=true

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

猜你喜欢

转载自www.cnblogs.com/yfb918/p/10475710.html