Hive的工作原理和相关操作

Hive是一个基于Hadoop的数据仓库,提供比较完整的SQL功能(本质还是将SQL转换为MapReduce),可供数据分析师利用Hadoop对海量数据进行分析。但是,Hive也有自身的缺点,比如比较慢等。

 

一. Hive的架构

Hive的工作原理和相关操作_第1张图片

Hive架构包括四个部分,如下所示:

1. 用户接口

解析:

主要包括CLI,HiveServer和HWI,CLI是命令行工具,HiveServer通过Thrift对外提供服务,HWI是Web接口,它们相应的启动方式为hive --service XXX。我们最经常使用的hive属于CLI命令行工具,它为默认服务。如果做过Java EE的开发,那么可能会有更加深刻的认识。

2. 元数据存储

解析:

我们使用MySQL存储Hive的元数据,包括表的名字、表的列和分区及其属性、表的属性(是否为外部表等)、表的数据所在目录等。详细情况,可以查看MySQL中hive数据库(自行设定)中的内容。

3. 解释器、编译器、优化器

解析:

完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后由MapReduce调用执行。

4. 数据存储

Hive中的所有数据(Table,External Table,Partition,Bucket等)都存储在HDFS中,大部分的HQL都被解释成MapReduce来执行,只有少部分HQL直接读取文件,比如select * from tableName等。

说明:

Hive支持4种文件格式,分别为TextFile、SequenceFile、RCFile和自定义文件格式。

 

二. Hive的基本操作

HQL与SQL的操作类似,如果熟悉MySQL等RDBMS的SQL操作,那么对HQL会有更加深刻的认识。我们主要介绍不太常见的一些操作。其它具体的操作,还要参考官方文档[1]。

1. 表操作

(1)创建表 

创建与已知表相同结构的表,如下所示:

create table copy_table like table;

说明:

数据表在删除的时候,内部表会连数据一起删除,而外部表只删除表结构,数据还是保留的。

(2)表的查询

表的查询是重点,也是最有技巧性的一部分。查询的优化程度最能考验一个DBA对数据库原理的认识程度。

由于这一部分的内容太多了,首先给出框架,后面慢慢补充。如下所示:

1)where查询

2)all和distinct选项

3)基于partition的查询

4)having子句转换

5)limit限制查询

6)正则表达式查询

7)group by分组查询

8)order by排序查询

9)sort by查询

10)distribute by查询

11)cluster by查询

(3)数据加载

1)加载本地数据

load data local inpath '/.../path.txt' into table tableName

 2)加载HDFS数据

load data inpath '/.../path.txt' into table tableName

(4)表插入

1)单表插入

2)多表插入

2. 视图操作

需要说明的是Hive 0.6及以上版本才支持视图操作。

3. 索引操作

需要说明的是Hive 0.7版本之后才支持索引。hive.optimize.index.filter和hive.optimize.index.groupby参数默认是false,使用索引的时候必须把这两个参数开启,才能起到作用(hive-site.xml)。

(1)创建索引

(2)删除索引

4. 分区操作

5. 桶操作

说明:分区操作和桶操作这两部分还不熟悉,需要进一步的学习。

6. Hive的权限控制

(1)角色的创建和删除

(2)角色的授权和撤销

(3)超级管理员权限

说明:除了上面介绍的外,还有Hive的基本数据类型和复合类型(Struct,Array和Map);Hive的内置操作符和函数;Hive的优化策略等。

 

三. 使用JDBC开发Hive程序

Hive的JDBC接口给开发人员提供了远程操作Hive的接口,我们可以通过Hive的JDBC操作实现表的数据加载、表结构信息和数据查询等。由于代码较长,所以放在了GitHub上面,链接地址:https://github.com/1000sprites/Hive_Program

输入文件userinfo.txt的内容,如下所示:

1    hadoop    
2    hive
3    Hbase

程序的运行结果,如下所示:

Running: show tables 'test'
after show tables: 
test
Runing: describe test
after describe tables: 
key    int
value    string
Running:load data local inpath '/root/userinfo.txt' into table test
Running: select * from test
after select * query:
1    hadoop
2    hive
3    Hbase
Running: select count(1) from test
after regular hive query: 
3

说明:

程序运行之前首先要开启Hive的远程服务接口,执行命令:hive --service hiveserver2 &。需要说明的是hiveserver1和hiveserver2的driverName和url是不同的,我们采用的hiveserver2编程。另外,还要熟练使用maven这个软件项目管理工具。

 

参考文献:

[1] Hive Getting Started:https://cwiki.apache.org/confluence/display/Hive/GettingStarted

[2] 《Hive编程指南》

你可能感兴趣的:(Hive的工作原理和相关操作)