hive基础介绍

  • 一、Hive介绍
  • 二、Hive架构与运行机制
  • 2.1 Hive架构
  • 2.2 Hive的运行机制
  • 三、Hive的数据类型和数据存储类型
  • 3.1、数据类型
  • 3.2、数据存储类型
  • 四、Hive的操作、查询与函数
  • 4.1、数据操作
  • 4.2、数据查询
  • 4.3、连接查询
  • 4.4、内置函数


一、Hive介绍

Hive是基于Hadoop的数据仓库工具,是建立在Hadoop上的数据仓库基础架构,用于存储和处理海量的结构化数据,属于Hadoop生态系统的一个重要部分,如图1.1所示。Hive数据仓库底层的数据存储,依赖的是Hadoop平台的分布式文件系统(HDFS),而不是传统的关系型数据库,Hive数据仓库的底层计算处理数据依赖的是Hadoop平台的分布式计算框架MapReduce。Hive数据仓库拥有一套完整的类数据库的数据定义语言、数据操作语言和结构化查询语言。

HIVE数据挖掘 hive 数据库_大数据


图1.1 Hadoop生态系统

Hive采用HQL查询语言对海量数据进行自动化的管理和计算,使得操作Hive就像操作关系型数据库一样,Hive与传统关系型数据库的对比如表1.1所示。Hive可以将结构化的数据文件映射为一张表,但这些表实际是以分布式的形式存储在Hadoop平台的HDFS分布式文件系统中,Hive通过提供类SQL的查询功能,对HQL语句进行解析和转换,生成基于Hadoop平台的map/reduce任务,并交由Yarn运行。

Hive的优势在于处理大数据,对于处理小数据没有优势,因为Hive没有像数据库一样的索引功能,总是扫描全表数据,因此Hive的执行延迟比较高,也因此在实时性要求较高的场合不适用,更宜用于离线的数据分析;Hive采用类SQL的语法,不必编写MapReduce,减少学习成本;支持用户自定义函数。但Hive也拥有其自身的不足,首先Hive的HQL语言表达能力有限,无法实现迭代式算法,对于数据挖掘方面的工作不擅长; Hive自动生成的MapReduce作业,通常情况下不够智能化,效率比较低;调优比较困难,粒度较粗。

表1.1 Hive与传统关系型数据库的对比

Hive

关系型数据库(MySQL)

数据规模

大,PB级以上

小,GB以内

查询语言

HQL

SQL

使用场景

为数据仓库而设计,读多写少

用于在线的应用,实时操作

数据存储

建立在Hadoop之上,存储在HDFS中

块设备或本地系统均可

数据改写

当前已支持,不建议使用

支持

执行时延

全表扫描和MapReduce框架有较高延迟,在大规模数据访问时,其并行访问更具优势

有索引,延迟低

语句执行

由Hadoop提供的MapReduce实现

Executor物理线程

可扩展性

高可扩展性,和Hadoop的可扩展性一致

扩展性有限,由于数据库的ACID语义严格限制

二、Hive架构与运行机制

2.1 Hive架构

HIVE数据挖掘 hive 数据库_大数据_02

图2.1 Hive架构图

如图2.1所示为Hive的架构图,其中包括了Hive的底层存储、执行引擎、解释器、编译器、优化器、用户开发界面等。

MetaStore:元数据,描述数据的信息数据,比如某个表的元数据,包括表名、表所属的数据库、表的类型、表的数据目录等;

用户开发界面:包括CLI(命令行接口)、JDBC,作为用户接口,用以访问hive,通过建立连接,可以进行查看、创建、插入、查询、删除等操作;

Sql Parser解析器:将SQL转换成抽象语法树,一般用第三方工具库完成;对抽象语法树进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误;

Physical Plan编译器:将抽象语法树编译生成逻辑执行计划;

Query Optimizer优化器:对逻辑执行计划进行优化;

Execution执行器:把逻辑执行计划转换成可以运行的物理计划。对Hive而言,就是 MR/Spark;

HDFS:Hadoop分布式文件存储系统,hive数据文件存放的地方。

2.2 Hive的运行机制

当创建表的时候,需要指定HDFS文件路径,表和其文件路径会保存到MetaStore,从而建立表和数据的映射关系。当数据加载该表时,根据MetaStore中的映射获取到对应的HDFS路径,将数据导入。
用户输入HQL语句后,Hive会将其翻译成MapReduce或者Spark任务,提交到Yarn上面执行,执行成功将返回结果。

Hive默认将元数据存储在Derby数据库中,但Derby是基于内存的,其仅支持单线程操作,若有一个用户在操作,其他用户则无法使用,造成效率不高;而且在切换目录后,重新进入Hive会找不到原来已经创建的数据库和表,因此一般用MySQL存储元数据。

三、Hive的数据类型和数据存储类型

3.1、数据类型

Hive所拥有的基本数据类型:TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、STRING、DOUBLE、BINARY。各数据类型之间的转换关系如下所示:

(1)TINYINT,SMALINT→INT→BIGINT→FLOAT→DOUBLE;
(2)STRING→DOUBLE;
(3)BOOLEAN不参与转换,可以使用CAST操作进行数据类型转换。

集合数据类型:STRUCT、MAP、ARRAY。通过使用非标准格式的数据类型,以数据冗余、牺牲存储空间的方式来换取数据计算处理速度,实现对数据更高的吞吐量。

3.2、数据存储类型

database:数据库,在HDFS中表现为hive/metastore/warehouse/dir目录下的一个文件夹。可以进行创建、查看和删除操作;

internal table:内部表,也就是管理表,是Hive中默认的表类型,在HDFS中表现为所属database目录下的一个文件夹,Hive控制着管理表的整个生命周期,当删除表时,表对应的数据文件也会被删除。可以进行创建、查询、修改、注释、删除、分区、指定行列分隔符等操作。

external table:外部表,与table类似,在创建表时需要加关键字external,并指定表的存储位置,外部表的数据存放的位置可以在任意指定路径,其数据的生命周期不受Hive控制,可以和其他外部表进行数据的共享,是实际开发中主要使用的一种表。在实际工作中,我们先通过flume采集数据,把数据上传到HDFS中,然后在Hive中创建外部表和HDFS上的数据绑定关系,就可以使用SQL查询数据了,所以连load数据那一步都可以省略了,因为是先有数据,才创建的表。可以进行创建、查询、修改、注释、删除、分区、指定行列分隔符等操作。

partition table:分区表,创建表时使用partitioned by关键字定义,是一种粗粒度的划分。分区表的意义在于优化查询,查询时尽量利用分区字段,如果不使用分区字段,就会全表扫描,最典型的一个场景就是把天作为分区字段,查询的时候指定天。分区表是为了解决在数据量激增的情况下,解决数据库存储和计算性能问题,提高I/O吞吐量。分为静态分区和动态分区,由于Hive的数据实际存储在HDFS,因此Hive的分区表是在HDFS中表现为table目录下的子目录,而不是一个实际字段。

bucket table:分桶表,创建表时使用clustered by (字段名) into (桶数量) buckets关键字定义,相对于分区表是一种更细粒度的划分,防止出现数据倾斜的问题。最典型的场景就是按省份人口划分的问题。分桶表可以实现对数据的抽样,并在一定条件下提高查询效率。其划分规则为对分桶的字段值取哈希值,用该哈希值除以桶的个数取模,余数相同的记录会被分在一个桶内,一个桶对应一个文件。在HDFS中表现为同一个目录下根据哈希值散列之后的多个文件。

view:视图,实际上是一张虚拟的表,是对数据的逻辑表示,它的主要作用是为了降低查询的复杂度。可以进行创建、查看、删除,但在warehouse中是不存在的。

四、Hive的操作、查询与函数

4.1、数据操作

(1)create table:创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 if not exists 选项来忽略这个异常。
(2)external:关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实际数据的路径(location),在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
(3)comment:为表和列添加注释。
(4)partitioned by:创建分区表。
(5)clustered by:创建分桶表。
(6)row format delimited [fields terminated by char][collection items terminated by char][map keys terminated by char][lines terminated by char]:指定分隔符。
(7)stored as:指定存储文件类型,常用的存储文件类型:sequencefile(二进制序列文件)、textfile(文本)、rcfile(列式存储格式文件)。
(8)location:指定表在hdfs上的存储位置。
(9)as:后跟查询语句,根据查询结果创建表。

4.2、数据查询

(1)From:从某个表中查询。
(2)Where:过滤。
(3)Group by:以某个字段分组进行聚合操作。
(4)聚合函数:统计运算。
(5)Having:分组后过滤。
(6)Select:挑选选择。
(7)Distinct:去重。
(8)Order by:排序。
(9)Limit:翻页。
查询语句的执行顺序:from→where→group by→聚合函数→having→select→ distinct→order by →limit。

4.3、连接查询

(1)内连接
使用join关键字,只有进行连接的两个表中都存在相匹配的数据才会被保留下来,分为等值连接和不等值连接。

(2)自然连接
使用natural join关键字,是在两张表中寻找那些数据类型和列名都相同的字段,然后将他们连接起来,并返回所有符合条件的结果,他是通过对参与表关系中所有同名的属性对进行相等比较来完成的,无需自己添加连接条件。与外连接的区别,对于无法匹配的记录,外连接会虚拟一条与之匹配的记录来保持全连接表中的所有记录,而自然连接不会。

(3)外连接:
左外连接:使用left outer join关键字,以连接中的左表为主,返回左表的所有信息和右表中符合连接条件的信息,对于右表中不符合连接条件的补空值。
右外连接:使用right outer join关键字,以连接中的右表为准,返回右表的所有信息和左表中符合连接条件的信息,对于左表中不符合连接条件的补空值。

(4)全外连接:使用full outer join关键字,查询结果等于左外连接和右外连接的和。

(5)自连接:将自身表的一个镜像当成另一个表来对待,适用于表自己和自己的连接查询。

4.4、内置函数

(1)数学函数:+、-、×、/、round(四舍五入)、ceil(向上取整)、floor(向下取整)、pow(乘方)、pmod(取模)。
(2)字符函数:lower(转小写)、upper(转大写)、length(字符串长度)、concat(拼接)、substr(取子串)、instr(是否包含)、trim(去前后空格)、get_json_object(处理json对象)。
(3)转换函数:cast。
(4)日期函数:year(取年)、month(取月)、day(取日)、to_date(返回日期部分)。
(5)条件函数:case A when B then C else D end、if(A,B,C)。
(6)聚合函数:count(返回行数)、sum(某列求和)、min(某列最小值)、max(某列最大值)、avg(某列平均值)。