精华内容
下载资源
问答
  • HIVE面试题集锦201901

    2019-01-25 17:06:04
    HIVE面试题集锦
  • Hive面试

    2021-01-08 10:05:59
    Hive面试题Hive高频面试题1.简述Hive的主要架构2.Hive和传统数据库有和区别?2.1.数据存储位置2.2.数据更新2.3.执行延迟2.4.数据规模3.Hive的内部表和外部表分别是什么?有什么区别?3.1.删除数据时:3.2.在公司生产...

    Hive高频面试题

    Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。它架构在Hadoop之上,总归为大数据,并使得查询和分析方便。并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。

    1.简述Hive的主要架构

    Hive元数据默认存储在derby数据库,不支持多客户端访问,所以需要将元数据存储在MySQl,以支持多客户端访问。主要架构如下:
    在这里插入图片描述

    2.Hive和传统数据库有和区别?

    Hive和数据库除了拥有类似的查询语言,再无类似之处。主要区别在以下几个方面

    2.1.数据存储位置

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

    2.2.数据更新

    Hive中不建议对数据的改写。而数据库中的数据通常是需要经常进行修改的,

    2.3.执行延迟

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

    2.4.数据规模

    Hive支持很大规模的数据计算;数据库可以支持的数据规模较小。

    3.Hive的内部表和外部表分别是什么?有什么区别?

    主要区别在两方面:元数据和原始数据。

    3.1.删除数据时:

    内部表:元数据、原始数据,全删除;
    外部表:只删除元数据;

    3.2.在公司生产环境下,什么时候创建内部表,什么时候创建外部表?

    在公司中绝大多数场景都是外部表;
    自己使用的临时表,才会创建内部表。

    4.Hive中order by、sort by、distribute by、cluster 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的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。
    在生产环境中Order By用的比较少,容易导致OOM。
    在生产环境中Sort By + Distrbute By用的多。

    5.Hive中常用的系统函数都有哪些?

    (1)date_add、date_sub函数(加减日期)
    (2)next_day函数(周指标相关)
    (3)date_format函数(根据格式整理日期)
    (4)last_day函数(求当月最后一天日期)
    (5)collect_set函数
    (6)get_json_object解析json函数
    (7)NVL(表达式1,表达式2)
    如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值。

    6.如何在Hive中自定义UDF、UDTF函数?

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

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

    6.2.为什么要自定义UDF/UDTF?

    因为自定义函数,可以自己埋点Log打印日志,出错或者数据异常,方便调试。

    7.Hive中的窗口函数都有哪些?如何使用?

    7.1.Rank

    (1)RANK() 排序相同时会重复,总数不会变
    (2)DENSE_RANK() 排序相同时会重复,总数会减少
    (3)ROW_NUMBER() 会根据顺序计算

    7.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类型。

    8.Hive都要哪些优化手段?

    8.1.MapJoin

    如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。

    8.2.行列过滤

    列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。
    行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。

    8.3.列式存储

    8.4.采用分区技术

    8.5.合理设置Map数

    mapred.min.split.size: 指的是数据的最小分割单元大小;min的默认值是1B
    mapred.max.split.size: 指的是数据的最大分割单元大小;max的默认值是256MB
    通过调整max可以起到调整map数的作用,减小max可以增加map数,增大max可以减少map数。
    需要提醒的是,直接调整mapred.map.tasks这个参数是没有效果的。
    https://www.cnblogs.com/swordfall/p/11037539.html

    8.6.合理设置Reduce数

    Reduce个数并不是越多越好
    (1)过多的启动和初始化Reduce也会消耗时间和资源;
    (2)另外,有多少个Reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;
    在设置Reduce个数的时候也需要考虑这两个原则:处理大数据量利用合适的Reduce数;使单个Reduce任务处理数据量大小要合适;

    8.7.小文件如何产生的?

    (1)动态分区插入数据,产生大量的小文件,从而导致map数量剧增;
    (2)reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的);
    (3)数据源本身就包含大量的小文件。

    8.8.小文件解决方案

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

    (3)开启JVM重用
    set mapreduce.job.jvm.numtasks=10

    8.9.开启map端combiner(不影响最终业务逻辑)

    set hive.map.aggr=true;

    8.10.压缩(选择快的)

    设置map端输出、中间结果压缩。(不完全是解决数据倾斜的问题,但是减少了IO读写和网络传输,能提高很多效率)
    set hive.exec.compress.intermediate=true --启用中间数据压缩set mapreduce.map.output.compress=true --启用最终数据压缩setmapreduce.map.outout.compress.codec=…; --设置压缩方式

    8.11.采用tez引擎或者spark引擎

    9.Hive中如何解决数据倾斜的?

    9.1.数据倾斜长啥样?

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

    9.2.怎么产生的数据倾斜?

    (1)不同数据类型关联产生数据倾斜
    情形:比如用户表中user_id字段为int,log表中user_id字段string类型。当按照user_id进行两个表的Join操作时。
    解决方式:把数字类型转换成字符串类型
    select * from users a
    left outer join logs b
    on a.usr_id = cast(b.user_id asstring)
    bug记录:https://www.jianshu.com/p/2181e00d74dc
    (2)控制空值分布
    在生产环境经常会用大量空值数据进入到一个reduce中去,导致数据倾斜。
    解决办法:
    自定义分区,将为空的key转变为字符串加随机数或纯随机数,将因空值而造成倾斜的数据分不到多个Reducer。
    注意:对于异常值如果不需要的话,最好是提前在where条件里过滤掉,这样可以使计算量大大减少。

    9.3.解决数据倾斜的方法?

    (1)group by
    注:group by 优于distinct group
    解决方式:采用sum() group by的方式来替换count(distinct)完成计算。
    (2)mapjoin
    (3)开启数据倾斜时负载均衡
    sethive.groupby.skewindata=true;
    思想:就是先随机分发并处理,再按照key group by来分发处理。
    操作:当选项设定为true,生成的查询计划会有两个MRJob。
    第一个MRJob中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的GroupBy Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;
    第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到Reduce中(这个过程可以保证相同的原始GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作。
    点评:它使计算变成了两个mapreduce,先在第一个中在shuffle过程partition时随机给 key打标记,使每个key随机均匀分布到各个reduce上计算,但是这样只能完成部分计算,因为相同key没有分配到相同reduce上。
    所以需要第二次的mapreduce,这次就回归正常shuffle,但是数据分布不均匀的问题在第一次mapreduce已经有了很大的改善,因此基本解决数据倾斜。因为大量计算已经在第一次mr中随机分布到各个节点完成。
    (4)设置多个reduce个数。

    10.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

    字段包含分隔符存在的问题:
    在这里插入图片描述

    添加参数的效果:
    在这里插入图片描述

    在Hive表里的体现:
    在这里插入图片描述

    11.TEZ引擎都有哪些优点?

    Tez可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升作业的计算性能。
    Mr/tez/spark区别:
    Mr引擎:多job串联,基于磁盘,落盘的地方比较多。虽然慢,但一定能跑出结果。一般处理,周、月、年指标。
    Spark引擎:虽然在Shuffle过程中也落盘,但是并不是所有算子都需要Shuffle,尤其是多算子过程,中间过程不落盘 DAG有向无环图。兼顾了可靠性和效率。一般处理天指标。
    Tez引擎:完全基于内存。 注意:如果数据量特别大,慎重使用。容易OOM。一般用于快速出结果,数据量比较小的场景。

    12.如何对MySQL的元数据进行备份?

    (1)MySQL之元数据备份(项目中遇到的问题)
    元数据备份(重点,如数据损坏,可能整个集群无法运行,至少要保证每日零点之后备份到其它服务器两个复本)。
    搭建MySQL元数据服务的高可用集群。
    (2)MySQL utf8 超过字节数问题
    MySQL的utf8编码最多存储3个字节,当数据中存在表情号、特色符号时会占用超过3个字节数的字节,那么会出现错误 Incorrect string value: ‘\xF0\x9F\x91\x91\xE5\xB0…’
    解决办法:将utf8修改为utf8mb4。
    首先修改库的基字符集和数据库排序规则:
    在这里插入图片描述

    再使用 SHOW VARIABLES LIKE ‘%char%’; 命令查看参数:
    在这里插入图片描述
    确保这几个参数的value值为utf8mb4 如果不是,则使用set命令修改。
    如:set character_set_server = utf8mb4;

    13.union和union all有什么区别?

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

    参考:https://mp.weixin.qq.com/s/l0n1VA0ZCfzyhpikdPN2mg

    展开全文
  • hive面试

    2019-08-19 21:08:43
    hive面试题 多选题:关于 Hive 内部表和外部表的说法,正确的是() hive介绍 hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 sql 查询功能,可以将 sql ...

    hive面试题

    1. 多选题:关于 Hive 内部表和外部表的说法,正确的是()
      在这里插入图片描述

    2. hive介绍

      hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 sql 查询功能,可以将 sql 语句转换为 MapReduce 任务进行运行。
      其优点是学习成本低,可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专 门的 MapReduce 程序,只要会sql就行。

    3. 简述 HIve, sparkSQL 的用途和区别

      (1)Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为 一 张数据库表,并提供 SQL语句查询功能。本质是将 SQL 转换为 MapReduce 程序
      (2)Sparksql 是 spark 生态中的一员 不但兼容 hive,还可以从 RDD、parquet 文件、JSON 文件中获取数据 , 底层转为spark程序

    4. hive内部表和外部表的区别

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

    5. hive 跟 hbase 的区别是?

      hive和Hbase是两种基于Hadoop的不同技术–Hive是一种类SQL的引擎,并且运行MapReduce任务,Hbase是一种在Hadoop之上的NoSQL 的列存储数据库数据库。当然,这两种工具是可以同时使用的。数据也可以从Hive写到Hbase,设置再从Hbase写回Hive

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

      (1)默认 : 存储于 derby 数据库,此方法只能开启一个 hive 客户端,不推荐使用
      (2)存储于 mySQL 数据库中,可以多客户端连接,推荐使用。

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

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

    8. Hive中追加导入数据的4种方式是什么?请写出简要语法

      从本地导入: load data local inpath ‘/home/1.txt’ (overwrite)into table student;
      从Hdfs导入: load data inpath ‘/user/hive/warehouse/1.txt’ (overwrite)into table student;
      查询导入: create table student1 as select * from student;(也可以具体查询某项数据)

    9. 分区和分桶的区别

      分区
      从形式上可以理解为文件夹 , 将一个表数据划分为多个文件夹 , 可以避免数据表的内容过大,在查询时进行全表扫描耗费的资源非常多。我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,查询时指定分区字段的值即可。
      分桶 --使用场景 , 抽样
      分桶是相对分区进行更细粒度的划分。从形式上可以理解为文件。
      分桶将整个数据内容按照某列属性值得hash值进行区分,如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。
      如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件
      语法 : select * from bucket_table tablesample(bucket 1 out of 4 on columns);

    10. 动态分区和静态分区

      静态分区
      hive 是如何实现分区的?
      建表语句:
      create table tablename (id) partitioned by (dt string)
      增加分区:
      alter table tablenname add partition (dt = ‘2016-03-06’)
      删除分区:
      alter table tablename drop partition (dt = ‘2016-03-06’)
      动态分区
      from psn21
      insert overwrite table psn22 partition(age, sex)
      select id, name, age, sex, likes, address distribute by age, sex;
      hive.exec.dynamic.partition=true :是否允许动态分区
      hive.exec.dynamic.partition.mode=strict :分区模式设置
      strict:最少需要有一个是静态分区
      nostrict:可以全部是动态分区
      hive.exec.max.dynamic.partitions=1000 :允许动态分区的最大数量
      hive.exec.max.dynamic.partitions.pernode =100 :单个节点上的 mapper/reducer 允许创建的最大分区
      设置非严格模式动态分区
      set hive.exec.dynamic.partition.mode=nostrict;

    11. hive 操作中动态分区与静态分区的区别

      静态分区与动态分区的主要区别在于静态分区是手动指定,分区的值是确定的。
      而动态分区是通过数据来进行判断,分区的值是非确定的,由输入数据来确定。

    12. UDF UDAF UDTF

      UDF 一进一出 —继承UDF , 实现eveluete方法
      UDAF 多进一出 —sum avg ,继承UDAF , 实现很多歌方法
      UDTF 一进多出

    13. 数据倾斜问题

      group by 和 join 容易数据倾斜,数据倾斜的原因: shuffle 阶段 造成reduce 分配不均,数据倾斜直接结果:效率低,闲置资源多,任务错误指数上升
      (1)开启Map端聚合功能 , 能够使map传送给reduce的数据量大大减少 ,减少网路io
      (2)通过开启group by数据倾斜优化开关skewindata=true。注:开启优化开关后group by会启动两个MR , 第一个MR Job中的Map的输出结果集合会随机分布到第一个MR Job的Reduce中,每个Reduce做局部聚合操作作为输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而实现负载均衡的目的; 第二个MR Job再根据预处理的数据结果按照Group By Key分布到相应的Reduce中,最后完成最终的聚合操作。

    14. Hive的索引

      创建格式:
      create index zxz_5_index
      on table zxz_5 (nid)
      as ‘bitmap’
      with deferred rebuild
      建立索引之后快的原因 : 建立索引会生成一张索引表 , 里面字段包括 : 索引列的值、该值对应的HDFS文件路径、该值在文件中的偏移量。在查询涉及到索引字段时,首先到索引表查找索引列值对应的HDFS文件路径及偏移量,这样就避免了全表扫描
      缺点 : 无法自动的rebuid , 有数据新增或者删除要手动rebuid
      Hive 3.0支持的物化视图可以达到类似的效果 , 而且ORCFile RCFile parquet 这些按列存储的格式能进过滤列 , 所以在hive 3.0时候 , hive会去掉索引
      注意: as 后面跟的是索引处理器,bitmap处理器普遍应用于排重后值较小的列;
      with deferred rebuild 他是必须要填加的
      分区表建立的索引是分区索引
      重建索引
      普通重建索引: alter index zxz_5_index on zxz_5 rebuild
      分区重建索引:alter index zxz_5_index on zxz_5 partition (year=“2018”) rebuild
      删除索引
      drop index zxz_5_index on table zxz_5; 注意:如果我们把原表删除索引表会自动删除

    15. 视图 (简化操作)

      创建视图: create view v_psn as select * from psn;
      修改视图: ALTER view v_psn as select * from psn;
      删除视图:drop view v_psn;
      查看视图:show tables;
      普通视图 , 只是建立一份元数据, 一张逻辑表。查询视图时转为SQL子查询执行。这样并不能提高查询效率 , 普通视图只能查询
      物化视图 , 是一张物理表 , 会实际占用磁盘空间 , 实际存储着数据
      Hive在3.0开始支持物化视图 ! 自动重写的物化视图 !

    16. insert into 和 insert overwrite 区别 ?

      都是向hive表中插入数据,但是insert into直接追加到表中数据的尾部,而insert overwrite会重写数据,既先进行删除,再写入。如果存在分区的情况,insert overwrite会只重写当前分区数据。

    17. hive调优

      hive最终都会转化为mapreduce来运行,要想hive调优,实际上就是mapreduce调优,可以有一下几方面。
      模式方面
      本地模式 : 数据量少的时候 , 可以开启本地模式运行
      并行模式 : hive默认是一个job执行完之后再执行下个job ,开启并行模式可以job可以并行
      严格模式 : 避免一些人为的误操作 , 导致运行效率慢 限制查询 : 分区表必须要加分区条件查询, order by 要加limit条件,限制笛卡尔积查询
      查询方面优化
      (1)join 优化,尽量将小表放在 join 的左边,左边的表会加载到内存中 , 避免内存溢出 , 还可以开启MapJoin , 自动将小表加载到内存
      (2)分区优化 ,对数据进行分区, 查询时对于表进行分区字段的条件过滤 , 避免全表扫描,减少查询的数据量
      (3)查询数据只查需要用到的列 , 不用的列不查询, 不要用*查询所有列
      (4)避免使用order by全局排序 , order by只用一个Reducer产生结果,对于大数据集,这种做法效率很低。如果不需要全局有序,则可以使用sort by 为每个reducer生成一个排好序的文件。如果需要控制一个特定数据行流向哪个reducer,可以使用distribute by子句
      (5)将重复的子查询结果保存到中间表
      运行计算方面优化
      避免数据倾斜 :
      (3)开启Map端聚合功能 , 能够使map传送给reduce的数据量大大减少 ,减少网路io
      (4)通过开启group by数据倾斜优化skewindata=true。注:开启优化开关后group by会启动两个MR , 第一个MR Job中的Map的输出结果集合会随机分布到第一个MR Job的Reduce中,每个Reduce做局部聚合操作作为输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而实现负载均衡的目的; 第二个MR Job再根据预处理的数据结果按照Group By Key分布到相应的Reduce中,最后完成最终的聚合操作。
      (5)开启合并小文件,启动较多的map或reduce能够提高并发度,加快任务运行速度;但同时生成的文件数目也会越来越多,给HDFS的NameNode造成内存上压力,进而影响HDFS读写效率。NameNode管理用户的读写请求 .
      (6)索引列的值、该值对应的HDFS文件路径、该值在文件中的偏移量。在查询涉及到索引字段时,首先到索引表查找索引列值对应的HDFS文件路径及偏移量,这样就避免了全表扫描
      (7)对数据进行压缩,减少io数据量 gzip
      (8)文件格式的优化 , hive主要有3种格式
      Textfile 默认格式
      sequence[西捆死]file , 使用方便 , 可压缩 [BLOCK]
      Rcfile 行列存储相结合的存储方式
      ORCFile
      Parquet
      (9)设置合适的map数量和reduce数量
      当输入文件很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。
      当输入文件很小,任务逻辑简单,map任务启动和初始化的时间远远大于逻辑处理的时间 , 这时可以考虑减少map
      对应调整切片大小即可! 参数 :minsize maxsize blocksize 默认切片=block大小

    未完…待续!!! 各位同仁如有补充可在下方留言

    展开全文
  • 文章Hive面试题SQL测试题目所需数据,包含建表语句 测试数据等等...................
  • 文章Hive面试题SQL测试题目所需数据,包含建表语句 测试数据等等...................
  • 【大数据Hive系列】Hive面试题整理(一)

    Hive面试题整理(一)

    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的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任务的变换,生成最终的执行计划。

    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和RDBMS有什么异同?

      hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析,但是Hive不支持实时查询。
      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 的功能。

    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) from table。

    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
      存储方式:数据按行分块,每块按列存储。结合了行存储和列存储的优点:
        首先,RCFile 保证同一行的数据位于同一节点,因此元组重构的开销很低;
        其次,像列存储一样,RCFile 能够利用列维度的数据压缩,并且能跳过不必要的列读取;
    4、ORCFile
      存储方式:数据按行分块 每块按照列存储。
      压缩快、快速列存取。
      效率比rcfile高,是rcfile的改良版本。
      总结:相比TEXTFILE和SEQUENCEFILE,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任务个数相同。
      桶表专门用于抽样查询,是很专业性的,不是日常用来存储数据的表,需要抽样查询时,才创建和使用桶表。

    展开全文
  • hive面试题总结

    2019-07-19 08:01:28
    Hive面试题 一、什么是hive hive是基于hadoop的一个数据仓库管理工具。它将结构化的数据映射为一张数据库表。并提供简单的sql查询功能。 因为hive的查询计划是被编译成mapreduce执行,所以它的学习成本底。适合...

    Hive面试题
    一、什么是hive
          hive是基于hadoop的一个数据仓库管理工具。它将结构化的数据映射为一张数据库表。并提供简单的sql查询功能。
          因为hive的查询计划是被编译成mapreduce执行,所以它的学习成本底。适合开发数据仓库的统计分析。因此也可以
          理解为hive是mapreduce的客户端。
    二、内外部表的区别
          内部表:是将数据存储在hive的指定hdfs目录下,删除表时,数据和表结构一块被删除。
          外部表:是不将数据存储在hive的指定hdfs目录下,删除表时,只删除表结构。
    三、分区的作用
          分区的作用:防止数据倾斜
    四、sort by和order by之间的区别?
          order by会引发全局排序;
          sort by使用是局部排序;
                 distribute by + sort by就是该替代方案,被distribute by设定的字段为KEY,
                 数据会被HASH分发到不同的reducer机器上,
                 然后sort by会对同一个reducer机器上的每组数据进行局部排序。
    五、Hive 优化:看做 mapreduce 处理
          1. 排序优化: sort by 效率高于 order by。分区:
          2. 使用静态分区 (statu_date="20160516",location="beijin") ,
          3. 每个分区对应 hdfs 上的一个目录,减少 job 和 task 数量:
          4. 使用表链接操作,解决 groupby 数据倾斜问题:
          5. 设置hive.groupby.skewindata=true ,那么 hive 会自动负载均衡,小文件合并成大文件:
          6. 表连接操作,使用 UDF 或 UDAF 函数:
    六、Hive表关联查询,如何解决数据倾斜的问题?
          数据倾斜的原因:
              map端输出的数据按key hash分配到reduce中:
                    1. 由于key分布不均匀,
                    2. 业务数据本身的特性,
                    3. 建表时考率不足,
                    4. 某些SQL语句本身就有数据倾斜;
          如何避免:对于key为空产生的数据倾斜,可以对其赋予一个随机值。
          
          解决方案:
              1. 参数调节
                     hive.map.aggr = true
                     hive.groupby.skewindata=true
                   目的: 有数据倾斜的时候进行负载均衡.
              2. sql调节
                    *. 选用key分布最均匀的表作为驱动表。
                    *. 大小表join: 使用map join让小表加载到内存中。在map端完成reduce。
                    *. 大表关联:把空值的key变成一个字符串加上随机数。把倾斜的数据分配到reduce上,
                         由于null值关联不上,处理后并不影响最终结果。
    七、请说明hive中 Sort By,Order By,Cluster By,Distrbute By各代表什么意思?
          sort by: 会进行局部排序。通常和distrbute by合起来用。
          distrbute by: 会指定排序字段(key)然后根据key hash 将数据划分到不同的reduce中。
          cluster by:除了具有 distribute by 的功能外还兼具 sort by 的功能。
          Order By:会进行全局排序。
    八、写出将 text.txt 文件放入 hive 中 test 表‘2016-10-10’ 分区的语句,test 的分区字段是 l_date。
           load data local inpath '/root/text.txt' overwrite into table test partition(l_date = '2016-10-10');
    九、Hive的优化
          sql优化:
             1. join连接时的优化:当三个或多个以上的表进行join操作时,如果每个on使用相同的字段连接时只会产生一个mapreduce。
             2. join连接时的优化:当多个表进行查询时,从左到右表的大小顺序应该是从小到大。
                            原因:hive在对每行记录操作时会把其他表先缓存起来,直到扫描最后的表进行计算
             3. 在where字句中增加分区过滤器。
             4. 当可以使用left semi join 语法时不要使用inner join,前者效率更高。
                            原因:对于左表中指定的一条记录,一旦在右表中找到立即停止扫描。
             5. 如果所有表中有一张表足够小,则可置于内存中,这样在和其他表进行连接的时候就能完成匹配,省略掉reduce过程。
             6. hive提供的严格模式,禁止3种情况下的查询模式。
                    a:当表为分区表时,where字句后没有分区字段和限制时,不允许执行。
                                    b:当使用order by语句时,必须使用limit字段,因为order by 只会产生一个reduce任务。
                                    c:限制笛卡尔积的查询。
          参数优化:
             1. limit调优:limit语句通常是执行整个语句后返回部分结果。set hive.limit.optimize.enable=true;
             2. 合理的设置map和reduce数量。
             3. jvm重用。可在hadoop的mapred-site.xml中设置jvm被重用的次数。    
             4. 开启并发执行。某个job任务中可能包含众多的阶段,其中某些阶段没有依赖关系可以并发执行,
                 开启并发执行后job任务可以更快的完成。设置属性:set hive.exec.parallel=true;
      

    使用kettle从mysql抽取到hive数据错误总结:
    1. kettle连接mysql找不到驱动包的问题;
         将mysql-connector.jar拷贝到data_intergration/lib下
         
    2. mysql中存储的''和null导入数据插入乱行。
         修改.kettle/kettle.properties文件添加参数:
                    KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL=Y

    3. mysql中date, datetime, timestamp数据类型插入到hive报错。
         在kettle转换任务中添加转换组件,将date, datetime, timestamp数据类型转换成string类型, 或者使用cast命令转换。
     
    4. 在kettle中连接impala时,使用dense_rank函数,生成的rank的数据类型在kettle中识别为bignumber
         使用cast命令转换成Int类型。

    5. java.lang.OutOfMemoryError: Java heap space kettle
         修改spoon.bat
         在KETTLE安装目录中找到spoon.bat程序,用记事本等程序打开,找到
                    if "%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS="-Xmx512m" "-XX:MaxPermSize=256m"
                    部分,将其调整(一般调整为256的倍数)为:
                    if "%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS="-Xmx1024m" "-XX:MaxPermSize=2048m"
                    然后保存。

    6. 第一次面试总结
              sql语句left join后加条件和where之后有什么不同
                    答:on只是对局部条件做限制,而where是对全局做限制。

               
           

     

     

     

       

     

     

     

     

     

    展开全文
  • Hive面试题(一)

    2019-11-29 08:22:32
    大数据面试题之Hive面试
  • Hive面试篇之Hive与Hbase的区别 使用方面区别 Hive是一个构建在Hadoop平台上的数据仓库,可以将结构化的数据文件映射为一张数据库表。通过Hive可以使用HQL语言查询存放在HDFS上的数据。HQL是一种类SQL语言,这种语言...
  • 文章目录Hive面试题整理(二)1、Fetch抓取2、本地模式**表的优化**3、小表、大表Join4、大表Join大表5、Group By6、Count(Distinct) 去重统计7、笛卡尔积8、行列过滤**数据倾斜**9、 Map数10、小文件进行合并11、...
  • Hive面试题汇总(2021)

    千次阅读 多人点赞 2021-01-25 16:40:57
    Hive面试汇总 1. 简述Hive主要架构 Hive元数据默认存储在derby数据库,不支持多客户端访问,所以需要将元数据存储在MySQL中,才支持多客户端访问。主要架构如下: Hive解析成MR的过程: Hive通过给用户提供一...
  • Hive面试题考点-整理

    万次阅读 多人点赞 2017-01-02 15:13:01
    Hive面试题考点整理
  • Hive面试题:hive有哪些udf函数,作用 UDF(user-defined function)作用于单个数据行,产生一个数据行作为输出。(数学函数,字符串函数) UDAF(用户定义聚集函数 User- Defined Aggregation Funcation):接收多...
  • Hive 面试题 最全
  • hdfs面试题 MapReduce面试题 hive面试题 kafka面试题 hbase面试题 spark面试题 flume面试题
  • Hive面试题—理清hive应用思路

    千次阅读 2015-07-06 14:29:50
    Hive面试题—理清hive应用思路 问题:有一张很大的表:TRLOG该表大概有2T左右。 [sql] view plaincopy TRLOG:  CREATE TABLE TRLOG  (PLATFORM string,  USER_ID int,  ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,155
精华内容 862
关键字:

hive面试