54、说下为什么要使用Hive?Hive的优缺点?Hive的作用是什么?
hive是hadoop生态系统中不可或缺的工具,提供一种类SQL语言,可以查询存储在hadoop分布式文件系统中的数据或者其他hadoop集成的文件系统
hive降低了将这些应用程序转移到hadoop系统上的难度
优点:类sql开发,快速开发;避免了去写MR程序的难度;执行延迟较高,常用作数据分析;处理大型数据集;自定义用户函数
缺点:HQL表达能力有限;hive的效率较低;
hive的本质是将HQL转换为MR程序
55、数仓和Hive的关系?
数据仓库更加注重数据的存储、查询和管理;而hive主要用于分析查询
56、hive架构
1、用户接口 client
2、元数据:metastore:元数据包括数据库、表名、表的拥有者、列/分区字段、表的类型、表的数据所在目录
3、驱动器(driver):
1.解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第 三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、SQL 语义是否有误。
2.编译器(Physical Plan):将 AST 编译生成逻辑执行计划。
3.优化器(Query Optimizer):对逻辑执行计划进行优化。
4.执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive 来 说,就是 MR/Spark。
4、hadoop:使用hdfs进行存储
[图片]
57、hive内部表和外部表的区别
内部表:是hive默认创建的表,它的数据存储在hive的数据仓库中默认路径下,hive负责管理内部表的元数据和数据,当删除内部表时候,hive会删除该表的元数据和数据
外部表:外部表是指hive中定义的表,但数据存储在hive之外的位置上,外部表的元数据由hive进行统一管理,但是数据本身由外部存储系统管理,当删除外部表时候,hive只删除元数据,而不删除数据本身
58、Hive数据倾斜以及解决方案
hive中的数据倾斜是指某些分区或者数据块的数据量过大,导致查询性能下降
解决方案:
1、数据倾斜通常是由于某些键的数据量过大,可以通过将数据进行重分区或者使用更细粒度的分区来解决
2、可以使用随机数和哈希函数等技术来解决数据倾斜,使得数据分区更加均匀
3、可以使用倾斜表连接技术来解决数据倾斜
4、使用布隆过滤器来减少数据倾斜的影响
5、使用动态分区或者分桶来解决数据倾斜
6、使用压缩算法来解决数据倾斜的影响
59、Hive如果不用参数调优,在map和reduce端应该做什么?
map端:
增加map任务的数量,提高整并行度和整体处理速度
压缩中间数据,减少磁盘IO开销
reduce端:
增加reduce任务的数量,提高并行度…
合理设置shuffle阶段的内存大小,避免内存溢出或者过多的磁盘IO操作
使用combiner函数,如果reduce端的数据量比较大,可以使用combiner函数来进行部分聚合操作,减少传输给reducer的数据量
60、自定义函数
UDF、UDAF(用户自定义聚合函数)、UDTF(用户自定义表生成函数)
UDF对单个输入值进行处理,返回一个输出值;UDAF对多个输入值进行聚合计算,返回一个聚合结果;UDTF生成一个或多个输出表。
步骤:
继承GenericUDF类
重写类中的方法
打包上传jar包到/opt/module/hive/datas/myudf.jar中
创建临时函数并且命名
61、Hive中Sort By,Order By,Cluster By,Distribute By分别是什么意思?
- Sort by:是进行分区内排序,如果指定reduce个数唯一,那么排序的结果就是全局排序,如果有多个
- reduce,就是分区内有序,全局无序
- Order by:全局排序,也就是会在最后一个reduce中进行统一排序
- Cluster by:相当于distribute by和sort by结合使用,不过使用cluster by不能指定排序规则(asc,desc),只能是升序排序,cluster by用于将表的数据按照指定列进行分区存储,使用时候,hive会根据指定的列值进行数据分区,并将相同的值的行存储在同一个分区中()
- Distribute By:控制map中的数据是如何分发的,用于控制数据在不同的reduce任务中的分布情况(分区规则是根据分区字段的hash值于reduce的个数进行相除后,余数相同的分到同一个区),相同的key可以被分到哟一个reduce中
62、Hive分区和分桶的区别
- 分区是根据某一个列进行的逻辑划分,可以将数据按照指定的列值划分成多个目录文件,使得查询时候只需要扫描特定分区的数据,提高查询性能,一般设置动态分区;
- 分桶是将数据分散存储到多个文件中,分桶是对某些列的哈希函数计算得到的
- 分区是按照某个列的值进行划分,减少查询时候需要扫描的数据量
- 分桶是根据哈希函数进行数据的随机分配,将数据均匀地分散在多个桶中
- 分区针对的是数据的存储路径,分桶针对的是数据文件
- 先按照分区的进行分区,再在每个分区里面进行分桶,进一步保证数据读取时候的高效性
63、Hive的执行流程
1、解析器:通过解析器将用户输入的HQL转换成抽象语法树
2、语义分析器:对抽象语法树进行语义分析,包括验证表和列的存在性、检查数据类型、解析表达式等
3、查询优化器:在语义分析完以后,hive会对查村进行优化,重写查询计划、选择合适的连接方式等
4、查询计划生成器:优化后的查询计划将被传递给查询计划生成器,生成逻辑查询计划
5、物理计划生成器:逻辑查询计划将被传递给物理计划生成器,生成物理查询计划(将逻辑操作符映射到对应的MR任务,生成一系列的MR任务,生成的MR任务将被提交给hadoop集群进行执行)
6、执行器:生成的物理查询计划将被执行器执行
7、结果存储:查询结果将被存储在指定的位置
64、Hive的存储引擎和计算引擎
存储引擎是基于hadoop的HDFS
计算引擎有三个:MR、Tez、Spark
65、Hive的文件存储格式都有哪些
文本文件格式:textfile
序列文件格式:SequenceFile,二进制文件格式,键值对存储
列示存储格式:parquet和orc,以列为单位存储数据
Avro格式:
RCFile:列示存储格式,每个列的数据存储在单独的文件中
json:以json格式存储数据
csv格式:以逗号分割文本
66、介绍下知道的Hive窗口函数,举一些例子
row_number函数:它为每一行分配一个唯一的整数值,这个值根据窗口排序规则进行排序。即使两个行值相同,它们的row_number值也会不同。例如,如果有5行数据,排序后的结果分别为1、2、3、4、5。返回结果集中每一行的唯一编号。
rank函数:它为每一行分配一个排名值,根据窗口排序规则进行排序。如果两个行的值相同,它们的rank值也会相同,而下一个行将跳过对应数量的排名。例如,如果有5行数据,排序后的结果分别为1、2、2、4、5。
dense_rank函数:它为每一行分配一个紧凑的排名值,根据窗口排序规则进行排序。即使两个行的值相同,它们的dense rank值也会不同,而下一个行将始终增加1。例如,如果有5行数据,排序后的结果分别为1、2、2、3、4。后面名次不跳跃
row_number:依次排序
rank:遇到重复,排名相同,后续排名跳过
dense_rank:遇到重复,排名相同,后续排名依次
Rank:对每一行进行排序,可重复,
dense_rank():稠密排名
补充:开窗函数
count、sum、min、max、first_value、last_value、lag、lead、
- cume_dist(如果按升序排列,则统计小于等于当前值的函数/总行数<如果是降序排列,则统计大于等于当前值的行数/总行数)
- rank(排名可能不是连续的。例如,如果两个行的排名为 1,则下一个排名为 3。)
- dense_rank(当排名一样的时候,接下来的行是连续的,两个行排名为1,则下一个排名为2)
- row_number(排名连续不间断不重复)
- ntile(将分区中已排序的行划分为大小尽可能相等的指定数量的排名相同的组,并返回给行所在的组的排名)
- percent_rank(计算给定行的百分比排名,可以用来计算超过了百分之多少的人,(当前行的rank值-1)/(分组内的总行数-1))
67、hive中count用法
count(*) 计算指定列或者整个表中的行数
count(column_name):计算指定列的非空值的个数
68、Hive的union和unionall的区别?
前提是需要查询结果的字段类型和字段名一致
union会删除重复行,union all会保留所有行
union会对结果进行排序,消除重复行,unionall不会排序;
69、Hive的join操作原理,left join、right join、inner join、outer join的异同?
leftjoin:保留左边的表的数据
Right join:保留右边的数据
Inner join:保留公共部分的数据
全外连接:保存所有的数据
70、Hive如何优化join操作
72、hive的mapjoin
- mapjoin是一种优化技术,加快hive查询的速度,通过将小表加载到内存中,然后再map阶段将大表的数据与小标的数据进行连接,从而减少磁盘读写操作和网络传输开销
- bukcetmap端的mapjoin:当两个表都被分桶shihive可以使用bucketmap端的mapjoin,它将两个表按照相同的桶号分发到同一个map任务中,然后再map任务中进行连接操作,减少shuffle和磁盘IO(前提是mapjoin的小表可以完全加载到内存中,否则可能会导致内存不足的问题)
73、Hive使用的时候会将数据同步到HDFS,小文件问题怎么解决的?
对于底层HDFS来说,小文件过多会导致namenode元数据特别大,占用大量的内存,严重影响hdfs性能
解决:
1、使用hive自带的concatenate命令,自动合并小文件
使用hive中insert into,就会再hadoop中生成一个小文件夹
2、调整参数减少map数量
3、减少reduce的数量
reduce的个数决定了输出文件的个数,可以调整reduce个数控制hive表的文件数量
74、hive的shuffle过程
就是mr的具体过程
75、Hive有哪些保存元数据的方式,都有什么特点?
内嵌模式:将元数据保存在本地内嵌的derby数据库中
本地模式:将元数据保存在本地独立的数据库中
远程模式:把元数据保存在远程独立的mysql数据库中
76、Metadata和Metastore、HiveServer2
metadata:元数据包含了额hive创建的database和table等信息
metastore:客户端连接metastore服务,再去连接mysql数据库用来存取元数据,有了meatastore服务,就可以有多个客户端同时连接,
HiveServer2:是一种能够使客户端执行hive查询的服务
77、hive中的行转列、列转行
TRANSPOSE、COLLECT_SET
EXPLODE、STACK
78、parquet文件优势
补充:hive和hadoop的关系
hive默认使用的引擎是MR,hive执行的sql都会转化成MR的作业的形式
hive表默认的存储系统是hdfs文件系统,数据全部存储在hdfs中
hive是一种读时模式,只有真正从hdfs读取数据的时候才会进行类型转换,mysql是一种写时模式。当数据写入文件时候已经严格检验数据
补充:Hive的隐式转换
任何整数类型的都可以隐式转换成一个范围更大的类型,TINYINT,SMALLINT,INT,BIGINT,FLOAT和STRING都可以隐式地转换成DOUBLE;
或者使用显示转换:cast
版权归原作者 748521 所有, 如有侵权,请联系我们删除。