大数据面试题V3.0 -- Hive面试题(约3.3w字)
Hive面试题(约3.3w字)
-
说下为什么要使用Hive?Hive的优缺点?Hive的作用是什么?
Hive是Hadoop生态系统中比不可少的一个工具,它提供了一种SQL(结构化查询语言)方言,可以查询存储在Hadoop分布式文件系统(HDFS)中的数据或其他和Hadoop集成的文件系统,
如MapR-FS、Amazon的S3和像HBase(Hadoop数据仓库)和Cassandra这样的数据库中的数据。 大多数数据仓库应用程序都是使用关系数据库进行实现的,并使用SQL作为查询语言。Hive降低了将这些应用程序转移到Hadoop系统上的难度。凡是会使用SQL语言的开发人员都可以很轻松的学习并使用Hive。
如果没有Hive,那么这些用户就必须学习新的语言和工具,然后才能应用到生产环境中。另外,相比其他工具,Hive更便于开发人员将基于SQL的应用程序转移到Hadoop中。
如果没有Hive,那么开发者将面临一个艰巨的挑战,如何将他们的SQL应用程序移植到Hadoop上。 优点 1)操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。 2)避免了去写MapReduce,减少开发人员的学习成本。 3)Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。 4)Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。 5)Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。 缺点 1)Hive的HQL表达能力有限 迭代式算法无法表达 数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法却无法实现。 2)Hive的效率比较低 Hive自动生成的MapReduce作业,通常情况下不够智能化 Hive调优比较困难,粒度较粗 Hive不是一个完整的数据库。Hadoop以及HDFS的设计本身约束和局限性地限制了Hive所能胜任的工作。其中最大的限制就是Hive不支持记录级别的更新、插入或者删除操作。
但是用户可以通过查询生成新表或者将查询结果导入到文件中。同时,因为Hadoop是面向批处理的系统,而MapReduce任务(job)的启动过程需要消耗较长的时间,所以Hive查询延时比较严重。
传统数据库中在秒级别可以完成的查询,在Hive中,即使数据集相对较小,往往也需要执行更长的时间。 - 说下Hive是什么?跟数据仓库区别?
Hive是由Facebook开源用于解决海量结构化日志的数据统计工具。 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。 Hive的本质是将HQL转化成MapReduce程序 Hive处理的数据存储在HDFS Hive分析数据底层的实现是MapReduce 执行程序运行在Yarn上
Hive是Hadoop生态圈中不可缺少的一部分。Hive的元数据存储在自带的derby数据库中,可它实际的数据存储在HDFS上。
可数据库的数据存储在块设备上或者本地文件系统中。1、什么是数据库?
数据库(Database)是按照一定格式和数据结构在计算机保存数据的软件,属于物理层。
最早期是广义上的数据库,这个阶段的数据库结构主要以层次或网状的为主,这是数据库的数据和程序间具备非常强的依赖性,应用有一定局限性。
我们现在所说的数据库一般指的是关系型数据库。关系数据库是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,具有结构化程度高,独立性强,冗余度低等优点。
关系型数据库主要用于联机事务处理OLTP(On-Line Transaction Processing),主要用于进行基本的、日常的事务处理,例如银行交易等场景。
2、什么是数据集市?
数据集市是一种微型的数据仓库,它通常是有更少的数据,更少的主题区域,以及更少的历史数据,如果数据仓库是企业级的,那数据集市就是部门级的,一般数据集市只能为某个局部范围内的管理人员服务。
3、什么是数据仓库?
数据仓库(Data Warehouse),可简写为DW或DWH。它是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。
数据仓库之父比尔·恩门于1990年提出数据仓库(Data Warehouse),数仓主要是为解决企业的数据集成与分析问题。数据仓库主要功能是将OLTP经年累月所累积的大量数据,通过数据仓库特有的数据储存架构进行OLAP,最终帮助决策者能快速有效地从大量数据中,分析出有价值的信息,提供决策支持。自从数据仓库出现之后,信息产业就开始从以关系型数据库为基础的运营式系统慢慢向决策支持系统发展。
一句话总结:数据仓库存在的意义在于对企业的所有数据进行汇总,为企业各个部门提供统一的, 规范的数据出口。
-
Hive架构------
-
Hive内部表和外部表的区别?
删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
-
为什么内部表的删除,就会将数据全部删除,而外部表只删除表结构?为什么用外部表更好?
内部表数据由Hive自身管理,外部表数据由HDFS管理;
-
Hive建表语句?创建表时使用什么分隔符?
hive 默认的字段分隔符为ascii码的控制符\001, CREATE TABLE test(id int, name string ,tel string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n'STORED AS TEXTFILE;
-
Hive删除语句外部表删除的是什么?
-
Hive数据倾斜以及解决方案
1. 优化数据源,从源头避免 如果导致数据倾斜的表时Hive表,而Hive表中数据的分布很不均匀,而业务需要频繁的对Hive表执行某个分析操作,那么我们可以尝试使用Hive ETL预处理数据(按key进行聚合,或预先和其他表join)。 之后所有操作针对的数据源就不是原来的Hive表了,而是预处理之后的Hive表。 不过需要注意的是,因为数据本身存在分布不均匀的问题,所以在Hive ETL过程中还是会存在数据倾斜,导致Hive ETL速度很慢。我们只是把数据倾斜的发生提前到了Hive ETL中。 方案优点:执行起来简单便捷,效果还很好。 方案缺点:Hive ETL过程中还是会发生数据倾斜。 2. 增加并行度 手动的对shuffle算子传入一个参数,该参数设定了shuffle算子执行时shuffle read task的数量,通过增大这个数量,将原本需要分配到1个task上的key,被分配给了多个task,那么每个task的执行时间自然就短了。 方案优点:实现起来比较简单,可以有效缓解数据倾斜的影响。 方案缺点:只是缓解了数据倾斜而已,并没有在根本上解决数据倾斜的问题。 3. Mapjoin(BroadcastJoin) 替代 Shuffle based Join 适合于在进行join类操作时,其中一个表或RDD的数据量比较小。 普通的join是会走shuffle过程的,而一旦shuffle,就相当于会将相同key的数据拉取到同一个task中进行join。 但是如果其中一个表或RDD比较小,可以采用广播小RDD全量数据+map算子来实现与join同样的效果,此时不会发生shuffle操作,自然也不会发生数据倾斜。 方案优点:因为不会发生shuffle,也就根本不会发生数据倾斜。 方案缺点:仅适用于一个大表和一个小表的情况,且会消耗一定内存资源。 4.局部聚合 + 全局聚合 适合于group by语句或reduceByKey等聚合类shuffle算子进行分组聚合时使用。 其核心思路就是进行两阶段聚合。 首先,将原本相同的key通过附加随机前缀的方式,变成多个不同的key,就可以使原本被一个task处理的数据分散到多个task上去做局部聚合,从而解决单个task处理数据量过多的问题。 接着去掉随机前缀,再进行一次全局聚合,就可以得到最终的结果。 方案优点:对于聚合类的shuffle操作导致的数据倾斜效果很好。 方案缺点:适用范围较窄,仅仅适用于聚合类的shuffle操作。 5.基表增加随机前缀 小表膨胀 如果在进行join操作时,RDD有大量的key导致数据倾斜,便可以考虑使用以下的方法。 将大表的key通过附加n以内的随机前缀,变成"不一样"的key,将其分散到多个task中进行处理,而不是让一个task处理大量的相同的key。 同时对小表进行扩容,每条数据都扩容成n条数据,扩容出来的每条数据都依次打上0~n的前缀。 然后将两个处理后的结果进行join。 方案优点:对join类型的数据倾斜都可以处理,效果比较明显。 方案缺点:需要对小表进行扩容,对内存资源要求很高。 6. 自定义 hash 算法 对key做一层hash,先将数据打散让它的并行度变大,再汇集,使其尽量均匀分布。 7. 过滤掉null部分 若key值存在大量空字段,会hash到同一reduce,造成reduce长尾,此时需要将null值过滤掉。 举例: select user_id from logs where statdate = '20170815' where user_id is not null; 8. 通过设置skew join参数解决hive join倾斜 可以手动传入一个参数,设置join的键对应的记录的最大值,如果超过这个值,新的值会被发送给那些还没有达到的reduce。 set hive.optimize.skewjoin=true;--如果是join 过程出现倾斜 应该设置为true set hive.skewjoin.key=100000; --这个是join的键对应的记录条数超过100000则会进行分拆,值可以根据具体数据量设置 9. 通过设置skew参数解决hive groupby distinct 倾斜 设置为true之后,会有2轮MR过程,第一轮在做reduce操作时,拿到的key并不是所有相同值给同一个reduce,而是随机分发,然后在reduce阶段做聚合。 在聚合之后,再进行一轮MR任务,拿前面聚合过的数据再算记过,虽然多了一轮MR任务,但是可以有效地减少数据倾斜带来的危险。 set hive.groupby.skewindata=true; - -如果是group by过程出现倾斜 应该设置为true set hive.groupby.mapaggr.checkinterval=100000 ; --group的键对应的记录条数超过这个值则会进行优化。 需要注意的是,当启用set hive.groupby.skewindata=ture时,能够解决数据倾斜问题,但如果在查询语句中对多个字段进行去重统计时会报错。 https://blog.csdn.net/qq_37472274/article/details/126227575
-
Hive如果不用参数调优,在map和reduce端应该做什么
-
Hive的用户自定义函数实现步骤与流程
-
Hive的三种自定义函数是什么?实现步骤与流程?它们之间的区别?作用是什么?
-
Hive的cluster by、sort bydistribute by、orderby区别?
order by 会最终在一个reducer上面做排序,全局统一 sort by 一般会和distribute by配合使用,distribute by会把按照后面跟的字段把数据打到同一个 reducer 上面,然后根据sort by在相应的reducer上面做局部聚合 cluster by 是distribute by和sort by的结合,不过只能按照某一个字段来排序
-
Hive分区和分桶的区别
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程序效率 ———————————————— https://blog.csdn.net/Li_Jian_Hui_/article/details/112280985
-
Hive的执行流程
-
Hive SQL转化为MR的过程?
-
Hive SQL优化处理
hive sql优化:中间表 join优化:先where后join 数据倾斜的优化:不需要空值或者无意义值的数据就过滤掉,如果需要保留则将key用随机的方式打散。 mapreduce的优化:合理空值map数和reduce数 map数 map数过大:map阶段输出文件太小,产生大量小文件。初始化和创建map的开销大。 map数过小:文件处理或查询并发度小,job执行空间过长。大作业时,容易堵塞集群。通常情况下,作业会用过input文件产生一个或者多个map数。主要的决定因素有:input文件数,input文件大小。 reduce数 ruduce数过大:生成了很多个小文件(最终输出文件有reduce是决定,一个reduce一个文件),那么如果这些小文件作为下一个job输入,则也会出现小文件过多需要进行合并(消耗资源)的问题。
启动和初始化reduce也会消耗大量的时间和资源,有多少个reduce就会有多少个输出文件。 reduce数过小:每个文件很大,执行耗时。可能出现数据倾斜 -
Hive的存储和计算引擎
存储方式:textfile、orcfile、rcfile、parquet、sequencefile 执行引擎:mr、tez、spark
-
Hive的文件存储格式都有哪些
textfile、sequencefile、orc、parquet
-
Hive中如何调整Mapper和Reducer的数目
hive时按照 输入的数据量大小 来确定reducer个数的。 reduce个数需适量:1)当reducer过多,就会生成多个小文件,那么如果这些小文件作为下一个任务的输入,则会出现小文件过多的问题;2)当reducer过少,则会影响执行效率。
-
介绍下知道的Hive窗口函数,举一些例子
1. 窗口排序函数:ROW_NUMBER()、RANK()、DENSE_RANK(); ROW_NUMBER()函数,生成的排序序号从1开始,不存在相同序号。 RANK()函数,生成的排序序号从1开始,序号相同有空位。 DENSE_RANK()函数,生成的排序序号从1开始,序号相同不会留下空位。 2. 窗口聚合函数:SUM()、MIN()、MAX()、AVG(); 搭配窗口子句使用, 如: select 字段1,字段2, ..., sum(字段3) over( partition by 字段1 order by 字段2 rows between unbounded preceding and current row) as 新字段1 // 新字段1含义为计算当前分组中,从第一行到当前行字段3的和。 其中ROWS BETWEEN叫窗口子句, 其中CURRENT ROW表示当前行,UNBOUNDED PRECEDING表示前面的起点,UNBOUNDED FOLLOWING表示后面的终点,当没有写窗口子句时,语义为从第一行到当前行。 3. LAG() LAG(col,n,DEFAULT) 用于取窗口内列col往前第N行的值,列名,往前取n行(可选,默认为1),第三个参数为默认值NULL 4. LEAD() LEAD(col, n, DEFAULT) 用于去窗口内列col往后第n行的值,列名,往后取n行(可选,默认为1),第三个参数当列col往后取n行为NULL时,取该默认值,若不指定,则为NULL。
-
Hive的count的用法
-
Hive的union和unionall的区别
-
Hive的join操作原理,leftjoin、right join、inner join、outer join的异同?
-
Hive如何优化join操作
-
Hive的mapjoin
-
Hive语句的运行机制,例如包含where、having、group by、orderby,整个的执行过程?
-
Hive使用的时候会将数据同步到HDFS,小文件问题怎么解决的?
-
Hive Shuffle的具体过程
-
Hive有哪些保存元数据的方式,都有什么特点?
-
Hive SOL实现查询用户连续登陆,讲讲思路
-
Hive的开窗函数有哪些
-
Hive存储数据吗
-
Hive的SOL转换为MapReduce的过程?
-
Hive的函数:UDF、UDAF、UDTF的区别?
-
UDF是怎么在Hive里执行的
-
Hive优化
-
row_number,rank,dense_rank的区别
-
Hive count(distinct)有几个reduce,海量数据会有什么问题
-
HQL:行转列、列转行
-
一条HQL从代码到执行的过程
-
了解Hive SQL吗?讲讲分析函数?
-
分析函数中加Order By和不加Order By的区别?
-
Hive优化方法
-
Hive里metastore是干嘛的
-
HiveServer2是什么?
-
Hive表字段换类型怎么办
-
parquet文件优势