hive面试题

ops/2024/9/23 3:18:06/

一. Hive的架构介绍

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

二、hive是什么?

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

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

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

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

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

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

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

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

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内部表和外部表区别?

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

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

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

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

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

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

优先级从高到低:
from > join > where > group by > having > select > order by > limit

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

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

十二、执行计划的生成

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

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

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

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

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

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

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

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

--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出现数据倾斜的原因及其解决办法?

--数据倾斜的原因:
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优化

--存储方面优化
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操作,可以避免数据倾斜

http://www.ppmy.cn/ops/53174.html

相关文章

Lua 绕过元表

Lua 绕过元表,直接访问 table 的字段。 绕过元表 rawset(table, index, value),在不触发元方法的情况下,设置 table[index] 的值为 value。 rawget(table, index),在不触发元方法的情况下,获取 table[index] 的值。…

理解和实现 LFU 缓存置换算法

引言 在计算机科学中,缓存是一种重要的技术,用于提高数据访问速度和系统性能。然而,由于缓存空间有限,当缓存满了之后,就需要一种智能的策略来决定哪些数据应该保留,哪些应该被淘汰。LFU(Least…

如何给小语种视频生成字幕

目前我们常看的有视频有中、英、日、韩这四种语言,如果我们想给其他的不常用的语言生成字幕怎么办?今天教大家如何给其他语言生成视频字幕文件 打开智游剪辑(zyjj.cc)搜索字幕生成,选择多语种那个就可以了 然后上传我们…

matlab用spdiags 函数构造大型稀疏对角矩阵

在Matlab中,spdiags函数主要用于创建稀疏对角矩阵或修改现有的稀疏矩阵的对角线。它的语法如下: B spdiags(B, d, m, n)其中各个参数的含义如下: B:可以是一个向量或者一个矩阵,用来表示对角线的值。如果B是向量&…

neo4j端口号不能访问的问题

安装可能出现的问题 访问Neo4j验证失败(The client is unauthorized due to authentication failure.)大概意思就是说服务器验证失败。 如果你有在浏览器上登录不同的neo4j数据库,很可能是由于缓存没有清理掉导致的。 可以试试无痕浏览来访问…

Linux——数据流和重定向,制作镜像

1. 数据流 标准输入( standard input ,简称 stdin ):默认情况下,标准输入指从键盘获取的输入 标准输出( standard output ,简称 stdout ):默认情况下,命令…

python循环结构

1.while 循环 语句&#xff1a; while 循环条件表达式&#xff1a; 代码块 else&#xff1a; 代码块 小练&#xff1a; 设计一百以内的偶数相加 n 0 while n < 100:n 1if n % 2 0 :print(n) 判断是不是闰年&#xff08;四年一润和百年不润&#xff0c;或者四百年一润&am…

C++观察者模式

一、定义 观察者&#xff08;Observer&#xff09;模式 定义如下&#xff1a;是一种对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 二、观察者模式组成&#xff1a; 抽象目标角色&#xff08…