美文网首页
Hive的基本概念

Hive的基本概念

作者: 乙腾 | 来源:发表于2021-12-03 10:09 被阅读0次

    一.基本概念

    1.基本介绍

    什么是Hive

    • 由 Facebook 开源用于解决海量结构化日志的数据统计工具。

    • Hive 是基于 Hadoop 的一个数据仓库工具,可以将<font color=green>结构化的数据文件</font><font color=red>映射</font>为一张<font color=red>表</font>,并 提供<font color=apple green>类 SQL 查询功能</font>。

    简单理解

    • 我们可以将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<name:STRING, age: INT>)
    
    

    向表“student”中导入以下测试数据:

    image.png

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

    
    SELECT * FROM STUDENT WHERE info.age>20;
    
    

    查询输出结果为:

    image.png

    3.2.2 键值对(MAP)

      类似于Java中的Map,使用键值对存储数据,根据键可以访问值。

    • 例如,表中的c列用于存储学生的姓名和年龄,数据类型为MAP<STRING,INT>(姓名为键,年龄为值),访问c列中的键zhangsan对应的年龄,可以写为c['zhangsan']。

    例子

      在上方的学生表例子中,若将列info的类型改为MAP<STRING,INT>,则创建表的语句如下:

    
    CREATE TABLE student (id INT,info MAP<STRING,INT>)
    
    

    然后向表中导入以下测试数据:

    [图片上传失败...(image-d1f0de-1638497175786)]

    查询姓名为zhangsan,年龄为20的所有数据,查询语句如下:

    
    SELECT * FROM student WHERE info[zhangsan]=20
    
    

    输出结果

    
    1 zhangsan:20,english:98
    
    

    3.2.3 数组(ARRAY)

      类似于Java中的数组,数组中所有元素的类型相同。

    • 例如,表中c列的数据类型为ARRAY<INT>,访问该列的第一个元素可以写为c[0]。

    例子

      仍然以上方的学生表为例,若将列info的类型改为ARRAY <STRING>,则创建表的语句如下:

    
    CREATE TABLE student(id INT,info ARRAY<STRING>)
    
    

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

    image.png

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

    
    SELECT * FROM student WHERE info[1]>20
    
    

    查询结果

    image.png

    此外,一张表中也可以存在多个复杂数据类型。例如,创建表“student”,其中有三列col1、col2和col3,每一列都使用复杂数据类型,创建语句如下:

    
    CREATE TABLE student(
    
        col1 STUDENT<a:STRING,b:INT,c:DOUBLE>),
    
        col2 MAP<STRING,INT>,
    
        col3 ARRAY<INT>
    
        )
    
    

    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的基本概念

          本文链接:https://www.haomeiwen.com/subject/kpypxrtx.html