一.基本概念
1.基本介绍
什么是Hive
由 Facebook 开源用于解决海量结构化日志的数据统计工具。
Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并 提供类 SQL 查询功能。
简单理解
我们可以将Hive理解为一个客户端工具,其提供了一种类SQL查询语言,称为 HiveQL。
这使得Hive十分适合数据仓库的统计分析,能够轻松使用HiveQL开启数据仓库任务,如提取/转换/加载(ETL)、分析报告和数据分析。
Hive不仅可以分析HDFS文件系统中的数据也可以分析其他存储系统,例如HBase。
特点
- Hive可以将SQL语句转化为MapReduce(或Apache Spark和Apache Tez)任务执行,大大降低了Hadoop的使用门槛,减少了开发MapReduce程序的时间成本。
Hive本质
- 将HQL转化成MapReduce程序
-
注意项
Hive 处理的数据存储在 HDFS ;
Hive 分析数据底层的实现是 MapReduce;
执行程序运行在 Yarn 上;
知识补充: 数据库和数据仓库的区别
数据库:传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。
数据仓库:数据仓库系统的主要应用主要是OLAP(On-Line Analytical Processing),支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
2.数据单元
Hive中核心的几个数据单元解析如下:
-
元数据、
- 元数据(Metadata)是指数据的各项属性信息,例如数据的类型、结构,数据库、表、视图的信息等。
-
数据库
- Hive中的数据库相当于一个命名空间,用于避免表、分区、列之间出现命名冲突,以确保用户和用户组的安全。
-
表
数据库中的表由若干行组成,每行数据都有相同的模式和相同属性的列。
-
Hive中的表可以分为内部表和外部表。
-
内部表
通常所说的表就是指内部表,也叫管理表。
内部表数据被存储在数据仓库的目录中。
当删除内部表时,表数据及其元数据将一同被删除。
-
外部表
外部表在创建时,数据可以存储于指定的HDFS目录中,也可以存储于数据仓库中,还可以与指定的HDFS目录中的数据相关联。
外部表被删除时,只有元数据被删除,实际数据不会被删除。
-
-
分区
Hive在查询数据的时候会扫描整个表的数据,如果表非常大,则会耗费大量时间和资源。
因此,Hive引入了表分区的功能,每个表可以有一个或多个分区。
这些分区决定了数据的存储方式,使查询操作只扫描相关性高的那部分数据,从而大大提高了Hive的工作效率。
-
桶
每个分区会根据表的某列数据的哈希值被划分为若干个桶,每个桶对应分区下的一个数据文件。
对表进行分区和分桶不是必须的,但这样可以减少对不必要数据的访问,从而提高查询速度。
3. 数据类型
Hive的数据类型分为基本数据类型和复杂数据类型。
3.1 基本类型
基本数据类型与常用的大部分数据库类似,包括以下几种:
整型:TINYINT、SMALLINT、INT、BIGINT。
布尔型:TRUE/FALSE。
浮点型:FLOAT(单精度)、DOUBLE(双精度)。
定点型:DECIMAL。
字符型:STRING、VARCHAR、CHAR。
日期和时间型:TIMESTAMP、DATE。
二进制型:BINARY,用于存储变长的二进制数据。
3.2 复杂数据类型
3.2.1 STRUCT
STRUCT是一个记录类型,封装了一个命名字段集合。
一个STRUCT类型的元素可以包含不同类型的其他元素,并且可以使用点符号“.”访问类型中的元素。
- 例如,表中的c列的数据类型为STRUCT<\a STRING,b INT>,则可以通过c.a访问c列中的元素a。
例子
假如现在需要创建一张学生表“student”,其中有两列,一列是主键id,另一列是学生信息info,其中学生信息包括姓名和年龄,则该表的创建语句如下:
CREATE TABLE student(id INT,info STRUCT)
向表“student”中导入以下测试数据:
若需要查询年龄大于20的所有数据,查询语句如下:
SELECT * FROM STUDENT WHERE info.age>20;
查询输出结果为:
3.2.2 键值对(MAP)
类似于Java中的Map,使用键值对存储数据,根据键可以访问值。
- 例如,表中的c列用于存储学生的姓名和年龄,数据类型为MAP
(姓名为键,年龄为值),访问c列中的键zhangsan对应的年龄,可以写为c['zhangsan']。
例子
在上方的学生表例子中,若将列info的类型改为MAP
CREATE TABLE student (id INT,info MAP)
然后向表中导入以下测试数据:
[图片上传失败...(image-d1f0de-1638497175786)]
查询姓名为zhangsan,年龄为20的所有数据,查询语句如下:
SELECT * FROM student WHERE info[zhangsan]=20
输出结果
1 zhangsan:20,english:98
3.2.3 数组(ARRAY)
类似于Java中的数组,数组中所有元素的类型相同。
- 例如,表中c列的数据类型为ARRAY
,访问该列的第一个元素可以写为c[0]。
例子
仍然以上方的学生表为例,若将列info的类型改为ARRAY
CREATE TABLE student(id INT,info ARRAY)
然后向表中导入以下测试数据(冒号前面为数组的第一个值,后面为第二个值):
查询表中年龄大于20的所有数据,查询语句如下:
SELECT * FROM student WHERE info[1]>20
查询结果
此外,一张表中也可以存在多个复杂数据类型。例如,创建表“student”,其中有三列col1、col2和col3,每一列都使用复杂数据类型,创建语句如下:
CREATE TABLE student(
col1 STUDENT),
col2 MAP,
col3 ARRAY
)
4.Hive优缺点
-
优点
(1)操作接口采用类 SQL 语法,提供快速开发的能力(简单、容易上手)。
(2)避免了去写 MapReduce,减少开发人员的学习成本。
(3)Hive 的执行延迟比较高,因此 Hive 常用于数据分析,对实时性要求不高的场合。
(4)Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较 高。
(5)Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
-
缺点
-
1)Hive 的 HQL 表达能力有限
(1)迭代式算法无法表达 ;
(2)数据挖掘方面不擅长,受MapReduce 数据处理流程的限制,效率更高的算法无法实现;
2)Hive 的效率比较低
(1)Hive 自动生成的 MapReduce 作业,通常情况下不够智能化 ;
(2)Hive 调优比较困难,粒度较粗;
-
5.Hive架构体系
1)用户接口:Client
CLI是Hive的命令行界面(模式),是Hive最常用的一种方式。CLI本质上是Hive的一个客户端服务,启动客户端后进入交互式命令行,即可通过HiveQL访问Hive中的数据
2)元数据:Metastore
元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、 表的类型(是否是外部表)、表的数据所在目录等;
默认存储在自带的 derby 数据库中,推荐使用 MySQL 存储 Metastore
3)Hadoop
使用 HDFS 进行存储,使用 MapReduce 进行计算。
4)驱动器:Driver
-
解析器(SQL Parser):
-
将 SQL 字符串转换成抽象语法树 AST
这一步一般都用第 三方工具库完成比如 antlr;
对 AST 进行语法分析,比如表是否存在、字段是否存在、SQL 语义是否有误。
-
-
编译器(Physical Plan):
- 将 AST 编译生成逻辑执行计划。
-
优化器(Query Optimizer):
- 对逻辑执行计划进行优化。
-
执行器(Execution):
把逻辑执行计划转换成可以运行的物理计划。
对于 Hive 来 说,就是 MR/Spark。
6.运行机制
Hive 通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的 Driver, 结合元数据(MetaStore),将这些指令翻译成 MapReduce,提交到 Hadoop 中执行,最后,将 执行返回的结果输出到用户交互接口。
7.Hive和数据库的比较
Hive 采用了类似 SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。 本文将从多个方面来阐述 Hive 和数据库的差异。数据库可以用在 Online 的应用中,但是 Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特性。
-
查询语言
由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查 询语言 HQL。
熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发。
数据更新
由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。
因此,Hive 中 不建议对数据的改写,所有的数据都是在加载的时候确定好的。
而数据库中的数据通常是需 要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATE … SET 修 改数据。
-
执行延迟
Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。
-
另外一个导 致 Hive 执行延迟高的因素是 MapReduce 框架。
由于 MapReduce 本身具有较高的延迟,因此 在利用 MapReduce 执行 Hive 查询时,也会有较高的延迟。
-
相对的,数据库的执行延迟较低。
- 当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候, Hive 的并行计算显然能体现出优势。
-
数据规模
由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模 的数据;
对应的,数据库可以支持的数据规模较小。