• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Hive精选高频面试题

武飞扬头像
数据行
帮助1

Hive高频面试题

1.Hive的架构及HQL转换为MR流程

  • Hive元数据默认存储在derby数据库,不支持多客户端访问,所以将元数据存储在MySQl,支持多客户端访问。
  • Hive架构
    学新通
  • HQL编译为MR任务流程介绍
    学新通
  • HQL转换为MR核心流程
    学新通

2.Hive和数据库比较

  • 1)数据存储位置

    • Hive 存储在 HDFS 。数据库将数据保存在块设备或者本地文件系统中
  • 2)数据更新

    • Hive中不建议对数据的改写。而数据库中的数据通常是需要经常进行修改的
  • 3)执行延迟

    • Hive 执行延迟较高。数据库的执行延迟较低。当然,这个是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。
  • 4)数据规模

    • Hive支持很大规模的数据计算;数据库可以支持的数据规模较小。
  • 5)索引

    • Hive比较弱,不适合实时查询。数据库有。
  • 7)可扩展性

    • Hive高,数据库低
  • 8)写时模式和读时模式

    • 传统数据库是写时模式,在load过程中,提升了査询性能,因为预先解析之后可以对列建立索引,并压缩,但 这样也会花费更多的加载时间。
    • Hive是读时模式,1oad data非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。

3.内部表和外部表

  • 内部表:加载数据到hive所在的hdfs目录,删除时,元数据和数据文件都删除
  • 外部表:不加载数据到hive所在的hdfs目录,删除时,只删除表结构。
  • 这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

4.4个By区别

  • 1)Order By:全局排序,只有一个Reducer;
  • 2)Sort By:分区内有序;
  • 3)Distrbute By:类似MR中Partition,进行分区,结合sort by使用。
  • 4) Cluster By:当Distribute by和Sorts by字段相同时,可以使用Cluster by方式。Cluster by除了具有Distribute by的功能外还兼具Sort by的功能。但是排序只能是升序排序.
  • 在生产环境中Order By用的比较少,容易导致OOM。
    在生产环境中Sort By Distrbute By用的多。

5.1系统函数

  • 1)date_add、date_sub函数(加减日期)
  • 2)next_day函数(周指标相关)
  • 3)date_format函数(根据格式整理日期)
  • 4)last_day函数(求当月最后一天日期)
  • 5)CONCAT、CONCAT_WS
  • 6)LATERAL VIEW EXPLODE
  • 7)collect_set函数
  • 8)get_json_object解析json函数
  • 9)NVL(表达式1,表达式2)
    如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值。
  • 10)unix_timestamp:返回当前或指定时间的时间戳
    from_unixtime:将时间戳转为日期格式
  • cast(expr as )
  • size(Map<K.V>)
    map_keys(Map<K.V>)
    map_values(Map<K.V>)
    array_contains(Array, value)
    sort_array(Array)

6.自定义UDF、UDTF函数

  • 1)在项目中是否自定义过UDF、UDTF函数,以及用他们处理了什么问题,及自定义步骤?

    • (1)用UDF函数解析公共字段;用UDTF函数解析事件字段。
    • (2)自定义UDF:继承UDF,重写evaluate方法
    • (3)自定义UDTF:继承自GenericUDTF,重写3个方法:initialize(自定义输出的列名和类型),process(将结果返回forward(result)),close
  • 2)为什么要自定义UDF/UDTF?

    • 因为自定义函数,可以自己埋点Log打印日志,出错或者数据异常,方便调试。
    • 引入第三方jar包时,也需要。

7.窗口函数

  • 1)Rank

    • (1)RANK() 排序相同时会重复,总数不会变
    • (2)DENSE_RANK() 排序相同时会重复,总数会减少
    • (3)ROW_NUMBER() 会根据顺序计算
  • 2) OVER():
    指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化

    • (1)CURRENT ROW:当前行
    • (2)n PRECEDING:往前n行数据
    • (3) n FOLLOWING:往后n行数据
    • (4)UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING表示到后面的终点
    • (5) LAG(col,n):往前第n行数据
    • (6)LEAD(col,n):往后第n行数据
    • (7) NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。
  • 3)手写:分组TopN、行转列、列转行

8.数据倾斜(重点)

绝大部分任务都很快完成,只有一个或者少数几个任务执行的很慢甚至最终执行失败,这样的现象为数据倾斜现象。
一定要和数据过量导致的现象区分开,数据过量的表现为所有任务都执行的很慢,这个时候只有提高执行资源才可以优化HQL的执行效率。
综合来看,导致数据倾斜的原因在于按照Key分组以后,少量的任务负责绝大部分数据的计算,也就是说产生数据倾斜的HQL中一定存在分组操作,那么从HQL的角度,我们可以将数据倾斜分为单表携带了GroupBy字段的查询和两表(或者多表)Join的查询。

  • 1 单表数据倾斜优化

    • 1 当任务中存在GroupBy操作同时聚合函数为count或者sum可以设置参数来处理数据倾斜问题。

      是否在Map端进行聚合,默认为True
      set hive.map.aggr = true;
      在Map端进行聚合操作的条目数目
      set hive.groupby.mapaggr.checkinterval = 100000;

      有数据倾斜的时候进行负载均衡(默认是false)
      set hive.groupby.skewindata = true;
      当选项设定为 true,生成的查询计划会有两个MR Job。

    • 2 增加Reduce数量(多个Key同时导致数据倾斜)

      1)调整reduce个数方法一
      (1)每个Reduce处理的数据量默认是256MB
      set hive.exec.reducers.bytes.per.reducer = 256000000
      (2)每个任务最大的reduce数,默认为1009
      set hive.exec.reducers.max = 1009
      (3)计算reducer数的公式
      N=min(参数2,总输入数据量/参数1)(参数2 指的是上面的1009,参数1值得是256M)
      2)调整reduce个数方法二
      在hadoop的mapred-default.xml文件中修改
      设置每个job的Reduce个数
      set mapreduce.job.reduces = 15;

    • 3 count(distinct) 情形:某特殊值过多

  • 2 Join数据倾斜优化

    • 1 在编写 Join 查询语句时,

如果确定是由于 join 出现的数据倾斜join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置

  set hive.skewjoin.key=100000;
  # 如果是join过程出现倾斜应该设置为true
  set hive.optimize.skewjoin=false;
  如果开启了,在Join过程中Hive会将计数超过阈值hive.skewjoin.key(默认100000)的倾斜key对应的行临时写进文件中,然后再启动另一个job做map join生成结果。通过 hive.skewjoin.mapjoin.map.tasks参数还可以控制第二个job的mapper数量,默认10000。
  set hive.skewjoin.mapjoin.map.tasks=10000;

- 2 MapJoin

  MapJoin 是将 Join 双方比较小的表直接分发到各个 Map 进程的内存中,在 Map 进程中进行 Join 操 作,这样就不用进行 Reduce 步骤,从而提高了速度。如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成Join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在Map端进行Join,避免Reducer处理。
  1)开启MapJoin参数设置
  (1)设置自动选择MapJoin
  set hive.auto.convert.join=true; #默认为true
  (2)大表小表的阈值设置(默认25M以下认为是小表):
  set hive.mapjoin.smalltable.filesize=25000000;
  2)MapJoin工作机制
  MapJoin 是将 Join 双方比较小的表直接分发到各个 Map 进程的内存中,在 Map 进程中进行 Join 操作,这样就不用进行 Reduce 步骤,从而提高了速度。

- 3 不同数据类型关联产生数据倾斜
学新通
  • 控制空值分布

9.Hive Map优化

  • 1 复杂文件增加Map数

    当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。
    增加map的方法为:根据
    computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M公式,调整maxSize最大值。让maxSize最大值低于blocksize就可以增加map的个数。

  • 2 小文件进行合并

    1)在map执行前合并小文件,减少map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。
    set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
    2)在Map-Reduce的任务结束时合并小文件的设置:
    在map-only任务结束时合并小文件,默认true
    set hive.merge.mapfiles = true;
    在map-reduce任务结束时合并小文件,默认false
    set hive.merge.mapredfiles = true;
    合并文件的大小,默认256M
    set hive.merge.size.per.task = 268435456;
    当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
    set hive.merge.smallfiles.avgsize = 16777216;

  • 3 Map端聚合

    set hive.map.aggr=true;相当于map端执行combiner

10.Hive Reduce优化

  • 1 合理设置Reduce数

    1)调整reduce个数方法一
    (1)每个Reduce处理的数据量默认是256MB
    set hive.exec.reducers.bytes.per.reducer = 256000000
    (2)每个任务最大的reduce数,默认为1009
    set hive.exec.reducers.max = 1009
    (3)计算reducer数的公式
    N=min(参数2,总输入数据量/参数1)(参数2 指的是上面的1009,参数1值得是256M)
    2)调整reduce个数方法二
    在hadoop的mapred-default.xml文件中修改
    设置每个job的Reduce个数
    set mapreduce.job.reduces = 15;
    3)reduce个数并不是越多越好
    (1)过多的启动和初始化reduce也会消耗时间和资源;
    (2)另外,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;
    在设置reduce个数的时候也需要考虑这两个原则:处理大数据量利用合适的reduce数;使单个reduce任务处理数据量大小要合适;

11.Hive里边字段的分隔符用的什么?为什么用\t?有遇到过字段里边有\t的情况吗,怎么处理的?

  • hive 默认的字段分隔符为ascii码的控制符\001(^A),建表的时候用fields terminated by ‘\001’。注意:如果采用\t或者\001等为分隔符,需要要求前端埋点和javaEE后台传递过来的数据必须不能出现该分隔符,通过代码规范约束。一旦传输过来的数据含有分隔符,需要在前一级数据中转义或者替换(ETL)。
  • 可以设置参数(导入HDFS同样有效):
    –hive-drop-import-delims 导入到hive时删除 \n, \r, \001
    –hive-delims-replacement 导入到hive时用自定义的字符替换掉 \n, \r, \001

12.Tez引擎优点?

  • Tez可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升作业的计算性能。

  • Mr/tez/spark区别:

    • Mr引擎:多job串联,基于磁盘,落盘的地方比较多。虽然慢,但一定能跑出结果。一般处理,周、月、年指标。
    • Spark引擎:虽然在Shuffle过程中也落盘,但是并不是所有算子都需要Shuffle,尤其是多算子过程,中间过程不落盘 DAG有向无环图。 兼顾了可靠性和效率。一般处理天指标。
    • Tez引擎:完全基于内存。 注意:如果数据量特别大,慎重使用。容易OOM。一般用于快速出结果,数据量比较小的场景。

13.MySQL元数据备份

  • 1)MySQL之元数据备份(项目中遇到的问题)

    • 元数据备份(重点,如数据损坏,可能整个集群无法运行,至少要保证每日零点之后备份到其它服务器两个复本)
      Keepalived或者用mycat
  • 2)MySQL utf8超过字节数问题

    • MySQL的utf8编码最多存储3个字节,当数据中存在表情号、特色符号时会占用超过3个字节数的字节,那么会出现错误 Incorrect string value: ‘\xF0\x9F\x91\x91\xE5\xB0…’
    • 解决办法:将utf8修改为utf8mb4

14.Union与Union all区别

  • 1)union会将联合的结果集去重,效率较union all差
  • 2)union all不会对结果集去重,所以效率高

15.简单描述一下HIVE的功能?用hive创建表有几种方式?

  • hive主要是做离线分析的
  • hive建表有三种方式
  • 直接建表法
  • 查询建表法
  • like建表法

16.若在hive中建立分区仍不能优化查询效率,建表时如何优化

  • 可以重新建表为分区分桶表

17.简述delete,drop,truncate的区别

  • delet 删除数据
    drop 删除表
    truncate 摧毁表结构并重建

18.分区表和分桶表的区别

  • 1.两者的区别

    • (1)分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于hive是读模式,所以对添加进分区的数据不做模式校验。分桶表的数据时按住某些分桶字段进行hash散列 相乘的多个文件,所以数据的准确性高很多
    • (2)分区表是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹
    • (3)分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值的hash值进行区分,如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件
  • 2.归纳总结两者的区别:

    • (1)从表现形式上:
      分区表是一个目录,分桶表是文件
    • (2)从创建语句上:
      分区表使用partitioned by 子句指定,以指定字段为伪列,需要指定字段类型
      分桶表由clustered by 子句指定,指定字段为真实字段,需要指定桶的个数
    • (3)从数量上:
      分区表的分区个数可以增长,分桶表一旦指定,不能再增长
    • (4)从作用上:
      分区避免全表扫描,根据分区列查询指定目录提高查询速度
      分桶保存分桶查询结果的分桶结构(数据已经按照分桶字段进行了hash散列)。
      分桶表数据进行抽样和JOIN时可以提高MR程序效率

19.hive中导入数据的4种方式

  • 从本地导入: load data local inpath /home/nx into table nx.test
  • 从hdfs导入:load data inpath /user/hive/warehouse/a.txt into nx.test
  • 查询导入:create table tmp_test as select * from nx.test
  • 查询结果导入:insert into table tmp.test select * from nx.test

20.Hive的执行流程?

    1. 用户提交查询等任务给Driver。
    1. 编译器获得该用户的任务Plan。
    1. 编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。
    1. 编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树 转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划 (MapReduce), 最后选择最佳的策略。
    1. 将最终的计划提交给Driver。
    1. Driver将计划Plan转交给ExecutionEngine去执行,获取元数据信息,提交给JobTracker或者 SourceManager执行该任务,任务会直接读取HDFS中文件进行相应的操作。
    1. 获取执行的结果。
    1. 取得并返回执行结果。

21.on和where的区别

  • 不考虑where条件下,left join 会把左表所有数据查询出来,on及其后面的条件仅仅会影响右表的数据(符 合就显示,不符合全部为null)
  • 在匹配阶段,where子句的条件都不会被使用,仅在匹配阶段完成以后,where子句条件才会被使用,它将从 匹配阶段产生的数据中检索过滤
  • 所以左连接关注的是左边的主表数据,不应该把on后面的从表中的条件加到where后,这样会影响原有主表中 的数据
  • where后面:是先连接然生成临时查询结果,然后再筛选
  • on后面:先根据条件过滤筛选,再连接生成临时查询结果

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfkacfi
系列文章
更多 icon
同类精品
更多 icon
继续加载