hive面试题

一. Hive的架构介绍

sql 复制代码
用户接口:CLI(Shell命令行)、JDBC等
元数据存储:Hive的元数据(如表名、列名、分区信息等)存储在数据库中,例如放在MySQL中。
核心组件:解析器->编译器->优化器->执行器
默认计算引擎:MapReduce

二、hive是什么?

sql 复制代码
hive是数据仓库的建模工具之一,可以传入一条交互式的sql,在海量数据中进行查询分析的平台。

三、Hive与传统数据库之间有哪些区别?

sql 复制代码
1、hive中的表数据存储在hdfs中,数据库表存储在数据库文件系统中(DBMS)。
2、数据库表支持索引,而Hive表默认不支持索引
3、Hive使用类SQL语言,而数据库表使用SQL(结构化查询语言)

四、解释一下Hive的优点和缺点(应用场景)

sql 复制代码
优点:适合对大规模数据进行处理分析
缺点:hive的默认引擎是MapReduce,导致hive执行速度慢,延迟较高,适合批处理,不适合实时处理。

五、如何在Hive里删除一条记录?

sql 复制代码
在Hive中,不支持直接删除单条记录.
可以通过以下方法间接地删除一条或多条记录:
1、创建一个与原表结构相同的临时表。
2、将不想删除的记录插入到这个临时表。
3、使用INSERT OVERWRITE语句将临时表的数据覆盖回原表。

六、hive中你了解那些的开窗函数?

sql 复制代码
hive中的开窗函数分为聚合开窗和排序开窗
--聚合开窗:
sum()、age()、count()、max()、min()

--排序开窗:
1、row_number():当排序数据相同时,排名序号唯一(1,2,3,4)
2、rank():排序数据相同时,序号会重复,总数不会变(1,2,2,4)
3、dense_rank():与rank类似,排序数据相同时,序号会重复,但总数会减少(1,2,2,3)

4、NTILE(n)
功能:将分区中的行划分为大小尽可能相等的n个组,并返回给定行所在的组的排名。
示例:NTILE(4) OVER (ORDER BY salary DESC)

5、PERCENT_RANK()
功能:计算给定行的百分比排名。
示例:PERCENT_RANK() OVER (PARTITION BY department ORDER BY salary DESC)

6、CUME_DIST()
功能:计算某个窗口或分区中某个值的累积分布。
示例:CUME_DIST() OVER (PARTITION BY department ORDER BY salary)

7、FIRST_VALUE()
功能:返回窗口中的第一个值。
示例:FIRST_VALUE(salary) OVER (PARTITION BY department ORDER BY hire_date)

8、LAST_VALUE()
功能:返回窗口中的最后一个值。
示例:LAST_VALUE(salary) OVER (PARTITION BY department ORDER BY hire_date DESC)

9、LAG(col,n,default)
功能:返回窗口中当前行之前的第n行的值,如果不存在则返回default。
示例:LAG(salary, 1, 0) OVER (PARTITION BY department ORDER BY hire_date)

10、LEAD(col,n,default)
功能:返回窗口中当前行之后的第n行的值,如果不存在则返回default。
示例:LEAD(salary, 1, 0) OVER (PARTITION BY department ORDER BY hire_date)

七、Hive内部表和外部表区别?

sql 复制代码
1、外部表被删除时元数据被删除,但是存储在hdfs中的表数据不会被删除
2、内部表被删除时元数据和hdfs上的表数据都会被删除
3、造成上述现象的原因:内部表的数据由Hive管理,外部表的数据hdfs管理
4、在实际开发中通常建的都是外部表

八、Hive的三种自定义函数是什么?

sql 复制代码
1、UDF:进一出一,用于单个值的处理并返回单个值
   实现:可继承GenericUDF类,重写evaluate()方法实现
 
2、UDAF:进一出多,由一行输入数据产生多行输出数据
    实现:可继承GenericUDTF类,重写initialize()、process()、close()方法实现
   
3、UDAF:进多出一,用于对多行数据执行聚合操作,并返回单个值
   实现:可继承UDAFEvaluator类,重写init(), iterate(), terminate(), merge(), terminatePartial()等方法实现

九、Hive分区和分桶的区别?

sql 复制代码
1、Hive分区是按照某个列的值进行划分,目的是减少查询时需要扫描的数据量。
2、Hive分桶是通过哈希函数进行数据的随机分配,目的是将数据均匀地分散在多个桶中,可以防止数据倾斜。
分区之后会产生分区文件夹,数据会存储在文件夹下的文件中,分桶不会产生文件夹,数据直接存储在分桶之后的文件中。

十、Hive中关键字的执行顺序

sql 复制代码
优先级从高到低:
from > join > where > group by > having > select > order by > limit

十一、Hive SQL转化为MR的过程

sql 复制代码
1、解析:当用户提交一个HiveQL查询时,Hive首先会解析这个查询,检查其语法和语义的正确性,之后解析器会将HiveQL查询转化为一个抽象语         法树(AST)
2、编译:编译器会将抽象语法树转化为一个逻辑执行计划,接着,这个逻辑执行计划会被优化并转为一个MapReduce作业的物理执行计划
3、MapReduce作业生成:Hive会根据物理执行计划生成MapReduce作业
4、作业提交与执行:生成的MapReduce作业会被提交到Hadoop集群上执行
5、输出:当MapReduce作业完成后,Hive会收集并整理作业的输出结果返回给用户。

十二、执行计划的生成

sql 复制代码
在Hive中,执行计划可以通过在查询前加上EXPLAIN关键字来生成,以树状结构呈现,每个节点代表一个操作步骤

十三、Hive的文件存储格式都有哪些?

sql 复制代码
1、TextFile(文本文件格式):以文本形式存储数据,每一行都是一个记录,字段之间使用分隔符进行分割,是Hive的默认文件格式。
2、SequenceFile(二进制文件格式):数据以键值对的形式存储,适用于大数据量的存储和读取。
3、CSV格式:以逗号分割的文本文件格式,适用于简单的表格数据存储。
4、orcFile:这个格式可以提高hive读、写、处理数据的效率。

十四、Hive中union和unionall的区别?

sql 复制代码
使用UNION ALL合并会保留所有行,包括重复的行
使用UNION合并会删除重复的行

十五、Hive实现行转列、列转行的方式

sql 复制代码
--列转行:
1、explode():用于将数组或map类型的一列拆分成多行。
2、LATERAL VIEW explode():与explode()一起使用,允许在FROM子句中应用UDTF(用户定义的表生成函数),如explode(),并将结果作为虚拟表使用。

--行转列:
方式1:case when 
方式2:collect_list

十六、hive中四个排序分别是什么,有什么区别?

sql 复制代码
--1. order by(全局排序)
在严格模式(hive.mapred.mode=strict)下,必须指定limit来限制输出条数,否则会报错。
排序方式可以是升序(ASC,默认)或降序(DESC)。

--2. sort by(分区内排序)
sort by在每个reducer内部进行排序,但不保证全局排序。
如果设置多个reducer,则sort by只保证每个reducer的输出有序,不保证全局有序

--3.distribute by(分区)
distribute by会将数据分发到不同的reducer

--4. cluster by(分区排序)
cluster by等同于distribute by+sort by
排序只能是升序,不能指定排序规则为ASC或DESC

注意:
ORDER BY因为只有一个reducer,性能较差,适用于小数据集;SORT BY可以在多个reducer上并行排序,性能较好,适用于大数据集。

十七、hive出现数据倾斜的原因及其解决办法?

sql 复制代码
--数据倾斜的原因:
hive中产生数据倾斜的原因主要有两个方面,第一种是Key分布不均匀,当某个key的数据量远大于其他key时,会导致数据倾斜。
第二种可能是没有正确的分区导致的数据倾斜。


解决办法:
1、第一种基本是在表关联操作时发生,如果是大表join小表,这种情况可以使用map join将小表加载到内存中,与大表进行join操作,可以避免数据倾斜。如果是大表join大表,可以将空值的key转变为随机字符串,这样可以将倾斜的数据分散到多个reduce task上进行处理。
也可以使用where语句过滤掉不需要的数据,减少数据处理量,从根源上解决数据倾斜的问题。

2、第二种情况可以使用重分区或者分桶来解决数据倾斜的问题。

其他情况产生的数据倾斜:
调整参数配置:
设置hive.map.aggr=true:在map端进行部分聚合操作,减少shuffle的数据量。
设置hive.groupby.skewindata=true:在数据倾斜时进行负载均衡,生成两个MR Job来处理数据倾斜问题。
调整hive.mapjoin.smalltable.filesize:设置小表的阈值,当小表的大小小于此值时,自动开启map join。

十八、hive优化

sql 复制代码
--存储方面优化
1、选择合适的存储格式,可以使用ORC格式存储,它具有更高的存储效率和更优的查询性能
2、采用合适的数据分区或者数据分桶策略

--执行过程优化
1、设置Fetch抓取的模式为more(set hive.fetch.task.conversion)
这种模式下一些简单的查询不会走MapReduce,直接产生结果
2、开启本地模式(hive.exec.mode.local.auto)
对于小规模数据,Hive可以通过本地模式在单台机器上处理所有的任务,缩短执行时间。
3、开启严格模式
在严格模式下,禁止分区表全表扫描,禁止排序不加limit,禁止产生笛卡尔集的join操作
4、调整参数控制map和reduce的数量
5、合并小文件
6、Map Join
用Map join将小表加载到内存中,与大表进行join操作,可以避免数据倾斜

十九、你使用过hive的哪些内置系统函数?

sql 复制代码
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的值。
8、round(四舍五入取整)、floor(向下取整)、ceil或ceiling(向上取整)、rand(生成随机数)等。

二十、Hive中字段的默认分隔符用的是什么?有遇到过字段里边有\t的情况吗,怎么处理的?

sql 复制代码
字段的默认分隔符是制表符(\t)

--字段内容包含 \t 的情况及处理方法
如果字段内容中包含制表符,会导致解析数据时字段分隔出错。以下是几种处理这种情况的方法:
1、转义制表符
2、使用其他分隔符
相关推荐
tsyjjOvO1 天前
SpringMVC 从入门到精通
数据仓库·hive·hadoop
Francek Chen2 天前
【大数据存储与管理】分布式数据库HBase:05 HBase运行机制
大数据·数据库·hadoop·分布式·hdfs·hbase
zzzzzwbetter2 天前
Hadoop完全分布式部署-Master的NameNode以及Slaver2的DataNode未启动
大数据·hadoop·分布式
weixin_449310842 天前
ETL转换和数据写入小满OKKICRM的技术细节
数据仓库·php·etl
IvanCodes2 天前
Hive IDE连接及UDF实战
ide·hive·hadoop
yumgpkpm2 天前
华为昇腾910B 开源软件GPUStack的介绍(Cloudera CDH、CDP)
人工智能·hadoop·elasticsearch·flink·kafka·企业微信·big data
lifewange2 天前
Hive数据库
数据库·hive·hadoop
五月天的尾巴4 天前
hive数据库模糊查询表名
hive·查询表名
蓝魔Y4 天前
hive—1.1、执行优化
hive
快乐非自愿4 天前
OpenClaw 生态适配:Hadoop/Hive 技能现状与企业级集成方案
大数据·hive·hadoop·分布式·openclaw