Hive的基本概念

一.基本概念

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程序
image.png
  • 注意项

    • 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”中导入以下测试数据:

image.png

若需要查询年龄大于20的所有数据,查询语句如下:


SELECT * FROM STUDENT WHERE info.age>20;

查询输出结果为:

image.png

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)

然后向表中导入以下测试数据(冒号前面为数组的第一个值,后面为第二个值):

image.png

查询表中年龄大于20的所有数据,查询语句如下:


SELECT * FROM student WHERE info[1]>20

查询结果

image.png

此外,一张表中也可以存在多个复杂数据类型。例如,创建表“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架构体系

image.png

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.运行机制

image.png

  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 进行并行计算,因此可以支持很大规模 的数据;

    • 对应的,数据库可以支持的数据规模较小。

你可能感兴趣的:(Hive的基本概念)