hive基础介绍

一、Hive介绍

Hive是基于Hadoop的数据仓库工具,是建立在Hadoop上的数据仓库基础架构,用于存储和处理海量的结构化数据,属于Hadoop生态系统的一个重要部分,如图1.1所示。Hive数据仓库底层的数据存储,依赖的是Hadoop平台的分布式文件系统(HDFS),而不是传统的关系型数据库,Hive数据仓库的底层计算处理数据依赖的是Hadoop平台的分布式计算框架MapReduce。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以内
查询语言HQLSQL
使用场景为数据仓库而设计,读多写少用于在线的应用,实时操作
数据存储建立在Hadoop之上,存储在HDFS中块设备或本地系统均可
数据改写当前已支持,不建议使用支持
执行时延全表扫描和MapReduce框架有较高延迟,在大规模数据访问时,其并行访问更具优势有索引,延迟低
语句执行由Hadoop提供的MapReduce实现Executor物理线程
可扩展性高可扩展性,和Hadoop的可扩展性一致扩展性有限,由于数据库的ACID语义严格限制

二、Hive架构与运行机制

2.1 Hive架构

在这里插入图片描述

图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(某列平均值)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值