Hive面试题*精选*!附答案!!!

HIVE面试

一、Hive的基本概念

1.什么是hive

Hive是一款开源的基于hadoop的用于统计海量结构化数据的一个数据仓库,它定义了简单的类似SQL的查询语言,称为HQL,允许熟悉SQL的用户查询数据。

从本质上讲:Hive是讲HQL语句转换成MapReduce程序的的一个工具

2.什么是数据仓库

数据仓库是一个面向主题的,集成的,相对稳定的,反映历史变化的数据的集合,用于支持管理角色

3.简单说说MapReduce

MP是一个软件框架,基于该框架能够容易的编写应用程序,这些应用程序能够运行在大规模集群上,并以一种可靠的,具有容错能力的方式并行的处理上TB级别的海量数据集。

MR的思想就是“分而治之”,Mapper负责‘分’,即把复杂的任务分解为若干个‘简单的任务’来处理;Reduce负责对map阶段的结果进行汇总。

4Hive的作用

1.可以将结构化的数据文件映射成一张表,并提供类SQL查询功能,方便非java开发人员对hdfs上的数据做MapRedece操作;

2.可以对数据提取转化加载(ETL)

3.构建数据仓库

5.Hive的使用场景

1.即使查询:利用CLI或者类似HUE之类的工具,可以对Hive中的数据做即时查询,如果底层的引擎使用的MR耗时会很久,可以替换成Tez或者Spark;

2.离线的数据分析:通过执行定时调度或者脚本去执行HQL语句,并将结果保存

3.构建数仓时用于组织管理数据和表

6. Hive的特点

优点:

​ 1.可扩展性,横向扩展,Hive可以自由的扩展集群的规模,一般情况下不需要重启服务,横向扩展:通过分担压力的方式扩展集群的规模;纵向扩展:升级一台服务器的硬件

​ 2.延展性,Hive支持自定义函数,用户可以根据自己的需求来实现自己的函数

​ 3.良好的容错性,可以保障即使有节点出现问题,SQL语句仍可完成执行

缺点:

​ 1.Hive不支持记录级别的增删改操作,但是用户可以通过查询生成新表或者将查询结果导入到文件中

​ 2.Hive的查询延时很严重,因为MRJ的启动过程消耗很长时间,所以不能用在交互查询系统中

​ 3.Hive不支持事务,因为没有增删改,所以主要用来做OLAP(联机分析处理),而不是OLTP(联机事务处理),这就是出局处理的两大级别。

7.Hive和传统数据库比较

1.数据存储位置

​ hive存储在HDFS。数据库将数据保存在块设备或者本地文件系统中。

2.数据更新

​ hive中不建议对数据的改写,而数据库中的数据通常是需要经常进行修改的

3.执行延迟

​ hive执行延迟较高,数据的执行延迟较低。当然,这个是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。

4.数据规模

​ Hive支持很大规模的数据计算;数据库可以支持的数据规模较小。

5.索引

​ hive较弱,不适合实时查询,数据库有索引

6.可扩展性

​ hive的扩展性较高,数据库的低

7.写时模式和读时模式

​ 传统数据库时写时模式,在load过程中,提升了查询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费更多的加载时间

​ hive是读时模式,load data非常迅速,因为它不需要读取数据进行解析,仅进行文件的复制和移动。

二、Hive架构

img

hive的内部架构由四部分组成:

用户接口:CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)

元数据:元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。

Hadoop:使用 HDFS 进行存储,使用 MapReduce 进行计算

驱动器:主要包含以下几类:
        a.解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
        b.编译器(Physical Plan):将AST编译生成逻辑执行计划。
        c.优化器(Query Optimizer):对逻辑执行计划进行优化。
        d.执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

**执行流程:**HQL通过命令行或者客户端提交,经过Compiler编译器,运用MetaStore中的元数据进行类型检测和语法分析,生成一个逻辑方案,然后通过的优化处理生成一个MapReduce任务。

HQL(Hive QL)语句是怎么执行的

1.解释器完成词法,语法和语义的分析以及中间代码的生成,最终转换成抽象语法树;

2.编译器将语法树编译为逻辑执行计划

3.逻辑层优化器对逻辑执行进行优化,由于Hive最终生成的MR任务中,Map阶段和Reduce阶段由OperatorTree组成,所以大部分逻辑层优化器通过变换OperatorTree,合并操作符,达到减少MR job和减少shuffler数据量的目的。

4.物理层优化器进行MR任务的变换,生成最终的物理执行计划

5.执行器调用底层的运行框架执行最终的物理执行计划

三、Hive的数据组织

1.Hive的存储结构包括数据库、表、视图、分区和表数据等,数据库、表、分区等等都对应HDFS上的一个目录,表数据对应HDFS对应目录下的文件。

2.Hive中所有的数据都存储在HDFS中,没有专门的数据存储格式,因为Hive是读模式,可以支持TextFile、SequenceFile、RCFile或者自定义格式等。

3.只需要在创建表的时候告诉Hive数据中的行列分隔符,Hive就可以解析数据

4.Hive包含一下数据模型:

database:在 HDFS 中表现为${hive.metastore.warehouse.dir}目录下一个文件夹

table:在 HDFS 中表现所属 database 目录下一个文件夹

external table:与 table 类似,不过其数据存放位置可以指定任意 HDFS 目录路径

partition:在 HDFS 中表现为 table 目录下的子目录

bucket:在 HDFS 中表现为同一个表目录或者分区目录下根据某个字段的值进行 hash 散 列之后的多个文件

view:与传统数据库类似,只读,基于基本表创建

5.Hive的元数据存储在RDBMS中,除元数据外的其他所有数据都基于HDFS存储。默认情况下,Hive元数据保存在内嵌的Derby数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不适用,为了支持多用户会话,则需要一个独立的元数据库,使用MySQL作为元数据库,Hive内部对MySQL提供了很好的支持。

6.Hive中的表分为内部表、外部表、分区表和Bucket表

内部表和外部表的区别:

​ 删除内部表,删除表元数据和数据

​ 删除外部表,删除元数据,不删除数据

内部表和外部表的使用选择:

  • ​ 如果数据的所有处理都在Hive中进行,那么倾向于选择内部表,但是如果Hive和其他工具要针对相同的数据集进行处理,外部表更合适。
  • ​ 使用外部表访问存储在 HDFS 上的初始数据,然后通过 Hive 转换数据并存到内部表中
  • ​ 外部表的使用场景是针对一个数据集有多个不同的Schema。
  • ​ 通过外部表和内部表的区别和使用选择的对比可以看出来,hive 其实仅仅只是对存储在 HDFS 上的数据提供了一种新的抽象。而不是管理存储在 HDFS 上的数据。所以不管创建内部 表还是外部表,都可以对 hive 表的数据存储目录中的数据进行增删操作。

分区表和分桶表的区别:

​ Hive数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。同时表和分区也可以进一步被划分为Buckets,分桶表的原理和MapReduce编程中的HashPartitioner的原理类似

​ 分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于Hive是读模式,所以对添加进分区的数据不做模式校验,分桶表中的数据是按照某些分桶字段进行Hash散列形成的多个文件,所以数据的准确性也高很多。

四、Hive的数据类型

1.基本数据类型

hive支持关系型数据中大多数基本数据类型

类型描述
booleantrue/false
tinyint1字节的有符号整数
smalint2个字节的有符号整数
int4个字节的带符号整数
bigint8字节带符号整数
float4字节单精度浮点数
double8字节双精度浮点数
deicimal任意精度的带符号小数
String字符串,变长
varchar边长字符串
char固定长度字符串
binary字节数据
timestamp时间戳
date日期

这些数据类型都是对java中接口的实现,因此这些类型的具体行为细节和java中对应的类型是完全一直的

2.复杂类型

类型描述示例
array有序的的同类型的集合array(1,2)
mapkey-value,key必须为原始类型,value可以任意类型map(‘a’,1,’b’,2)
struct字段集合,类型可以不同struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0)

3.存储格式

Hive会为每个创建的数据库再HDFS上创建一个目录,该数据库的表会以子目录形式存储,表中的数据会以表目录下的文件形式存储。对于default数据库,默认的缺省数据库没有自己的目录,default数据库下的表默认存放再/user//hive/worehouse目录下。

1)textfile

​ textfile为默认存储格式,存储方式为行存储,数据不做压缩,磁盘开销打,数据解析开销大

2)SequenceFile

​ 其是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。

​ SequenceFile支持的三种压缩格式:NONE,RECORD,BLOCK。Record压缩率低,一般建议Block

3)RCFile

​ 一种行列存储相结合的存储方式

4)ORCFile

​ 数据按照行分块,每个块按照列分块,其中每个块都存储有一个索引。hive给出的新格式。属于RCFile的升级,性能有很大的提升,而且数据可以压缩存储,压缩快,快速列存取。

5)Parquet

​ Parquet也是一种行式存储,同时具有很好的压缩性能;同时可以减少大量的表扫描的反序列化的时间。

行列存储对比:

对比行存储列存储
写性能写入时一次性完成,性能高把一行数据拆分成成列保存,写入次数比行存储多。
读性能读取整行数据时,性能高。 读取少数列时,IO开销大取数列时性能高,读取行时性能低
数据压缩压缩低列为单位存储数据,使得同类型的相同数据存放在一起,压缩比较高
典型代表Text File、Squence FileORC、Parquet、Carbon Data

五、Hive的DDL操作

与库有关的操作

建库
	create database t1;
看库
	show database;
建库时查看吃否存在
	create database if not exists t1;
建库时带注释
	create database if not exists t2 comment `desc xxx`;
建库带属性
	create database if noe exists t3 with 
	dbproperties('creator'='hadoop','date'='2018-04-05');
实现库详细信息
	desc database [extended] t1;
查看正在使用的库
	select current_database();
删除库
	drop database t1;
	drop database if exists t2;
	默认情况下,hive不允许删除包含表的数据库,有两种解决方法:
		1.手动删除库下所有表,然后删除表
		2.使用 cascade 关键字
切换库
	use t3;

与表有关的操作

建表语法:
	create [external] table [if not exists] table_name
	[( col_name  data_type [comment col_comment ], ...... )]
	[comment table_comment]
	[Partitioned by (col_name data_type[comment col_comment], ... )]
	[Clustered by (col_name,col_name,...)
		[sored by (col_name[ASC|DEDC],...)] into num_buckets BUCKETS ]
	[Row Format row_format]
	[Stored as file_fomat]
	[location hdfs_path]

建表语法介绍:

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Hive是一个基于Hadoop的数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。以下是关于Hive高级面试题的回答: 1. Hive的架构及HQL转换为MR流程 Hive的架构包括Hive客户端、Hive服务端、元数据存储和Hadoop集群。Hive客户端通过HQL语句与Hive服务端交互,Hive服务端将HQL语句转换为MapReduce任务并提交到Hadoop集群上执行。Hive元数据默认存储在derby数据库,但不支持多客户端访问,因此可以将元数据存储在MySQL中,支持多客户端访问。 2. HQL转换为MR核心流程 HQL转换为MR核心流程包括解析、语法树生成、语义分析、逻辑优化、物理优化和MR任务生成。其中,解析将HQL语句解析为抽象语法树,语法树生成将抽象语法树转换为逻辑执行计划,语义分析将逻辑执行计划转换为物理执行计划,逻辑优化和物理优化分别对逻辑执行计划和物理执行计划进行优化,MR任务生成将物理执行计划转换为MapReduce任务。 3. Hive和数据库比较 Hive和数据库的比较主要有以下几点: - 数据存储方式:Hive将数据存储在Hadoop分布式文件系统中,而数据库将数据存储在磁盘上。 - 数据查询方式:Hive使用类SQL语言进行查询,而数据库使用SQL语言进行查询。 - 数据处理方式:Hive使用MapReduce进行数据处理,而数据库使用索引等技术进行数据处理。 - 数据规模:Hive适合处理大规模数据,而数据库适合处理小规模数据。 - 数据类型:Hive支持复杂数据类型,如数组和结构体,而数据库不支持复杂数据类型。 4. SET hive.merge.size.per.task = 268435456; -- 默认256M 这是Hive中的一个参数设置,用于控制MapReduce任务中的文件合并大小。默认值为256M,可以根据实际情况进行调整。 5. 处理数据倾斜问题 当任务中存在GroupBy操作同时聚合函数为count或者sum时,可能会出现数据倾斜问题。可以通过以下方式来处理数据倾斜问题: - 使用Distribute By进行数据分布 - 使用Map端的Combiner进行局部聚合 - 使用Reduce端的Combiner进行全局聚合 - 使用Bucketing进行数据分桶 - 使用Sampling进行数据采样

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值