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架构

Hive面试题*精选*!附答案!!!_第1张图片

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支持关系型数据中大多数基本数据类型

类型 描述
boolean true/false
tinyint 1字节的有符号整数
smalint 2个字节的有符号整数
int 4个字节的带符号整数
bigint 8字节带符号整数
float 4字节单精度浮点数
double 8字节双精度浮点数
deicimal 任意精度的带符号小数
String 字符串,变长
varchar 边长字符串
char 固定长度字符串
binary 字节数据
timestamp 时间戳
date 日期

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

2.复杂类型

类型 描述 示例
array 有序的的同类型的集合 array(1,2)
map key-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 File ORC、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]

建表语法介绍:

你可能感兴趣的:(hive,学习,大数据)