一. 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、使用其他分隔符