Hive全面深入理解

本文分为几个模块:

  1. 概述
  2. 体系架构简介
  3. 安装步骤
  4. 开发

1:概述

建立在Hadoop基础之上的数据仓库基础架构,通俗来说,就是数据管理的工具,可以通过编写类似于常用SQL的HQL查询语句,实现大规模数据的查询和处理,而底层则是用MapReduce来完成提交的语句的处理;也就是说,Hive的功能,很多也可以通过自己开发MapReduce程序来处理;数据的存储,则是依据HDFS来完成的。

Hive的核心功能是SQL语句解析引擎,而其中的表,实际上就是HDFS的目录和文件,按照表名来把文件夹分开。

2:体系架构简介

Hive全面深入理解
对于本图来说,实际上Hive就相当于一个SQL语言引擎,将用户提交出的SQL语句,解析成MapReduce程序,由底层的Hadoop来执行。
对于用户来说,有三种接口方式:
  1. CLI:命令行方式,
  2. JDBC/ODBC:通过类似于MySQL接口的方式进行访问
  3. Web GUI:通过HTTP页面进行访问。
2:Hive支持的数据类型

INT

TINYINT/SMALLINT/BIGINT

BOOLEAN

FLOAT

DOUBLE

STRING 

BINARY

TIMESTAMP

ARRAY, MAP, STRUCT, UNION

DECIMAL

3:常见的一些HQL语

通过加载本地文件创建表:load data local inpath './home/test.txt' override into table pokes

通过加载HDFS文件,并且分区建表:load data inpath '/wordcount/output.txt' override into table pokes partition(times = 5)

查询语句

  1. 查询一行:select * from student a where a.id = 10;
  2. 查询一行中的某一列: select a.first_col from student a where a.id = 10
  3. 向HDFS中插入数据:insert override directory '/home/tmp' select a.* > 10 from student a.ds= "shanghai";这里是可以指定分区的
  4. 从一个表中获取数据插入到另一个表中:FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(*) WHERE a.foo > 0 GROUP BY a.bar;

Join操作:FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;这种操作就比较厉害了,而且使用也比较灵活

创建新表1:create table student (name STRING,age INT ,sex INT) row format delimited fields by ',' stored as testfile.

创建新表2:create table student (name STRING , age INT , sex INT) row format delimited fields by ';' lines terminated by '\n';默认情况下,数据是按照行来分的,所以如无特别要求,无需指定;而每一行的字段划分,则是必须要指定的。

创建附加注释的表:create external table student(name String comment 'the name of student', age Int 'the age of student', sex Int) comment 'this is a student basic information table' row format delimited fields by ',' STORED AS TEXTFILE LOCATION 'hdfs://localhost:9000'

Hive表的修改

  1. 添加新的一列:ALTER TABLE pokes add columns(address String)
  2. 添加一列并同时添加注释:alter table pokes add columns(address STRING COMMENT 'address comment')
  3. 删除表:drop table pokes
  4. 更改表名:alter table pokes rename to another

Hive的分区和分桶

创建分区表:create table tb_partition(id String, name String) PARTITIONED BY(month String) row format delimited fields terminated by ';'这就创建了一张分区表,按照month的不同来进行分区;在查询的过程中,也可以指定分区,这样检索的范围缩小,性能提高。

加载数据到分区表中:

  1. load data local inpath '/home/files/dealedlog.out' overwrite into table tb_partition partition(month = '201802');这里,通过local inpath指定了加载的是本地文件,overwrite代表数据直接覆盖到tb_partition表中;而month则是指定文件加载到month='201802'的分区中。
  2. insert select方式:insert into table tb_partition partition(month = '201802') select id ,name from name;该语句就是从name表获取两列数据,插入到tb_partition表中,并指定数据存储的分区为month=‘201802’
  3. 由于Hive实际上加载的就是HDFS文件,所以,可以通过手动把文件传输到HDFS上,然后进行加载;比如:hdfs dfs -mkdir /user/hive/warehouse/tb_partition/month=201802;创建目录后,把文件传输到目录下:hdfs dfs -put nameinfo.txt /usr/hive/warehousr/tb_partition/month=201802;毫无疑问,这里需要重新加载元数据,才能加载到传上去的文件。

创建多级分区:create table tb_mul_partition (id Int , name String) PARTITIONED BY(month String ,code String) row format delimited fields terminated by ';';这里,就创建了一张表,存在两个分区,按照month和code进行多级别的分区,而在读取数据的时候,也需要指明分区:load data local inpath '/home/files/nameinfo.txt' into table tb_mul_partition partition(month = '201802',code = '1000');这里,必须强调一下,如果指定了多个分区,在加载数据的时候,必须指定多个分区,否则会报错。

注:分区所使用的列,并不是正式数据中的一列,更像是伪列,所以需要指定分列的字段类型,在HDFS底层,就相当于按照分区创建了一个文件夹,将文件存在该目录下;这样,在我们指定查询数据的时候,可以从某一个文件夹内查询,大大提高了速度。

而分桶,则是依靠数据中真实存在的列,按照哈希取模的方式,将数据分成不同的文件进行存储,与分区相比,其粒度更细;假如说分为三个桶,那就是一份数据,会按照三份来进行存储。

JOIN操作

在传统数据库中,JOIN操作就是非常常见的一种操作,同样,Hive作为数据仓库,也支持JOIN操作,但是其只支持等值操作。

  1. Hive只支持等值连接,不支持所有非等值的连接
  2. Join操作中,每次MapReduce任务的逻辑如下,reducer会缓存除了最后一个表中的所有表的记录,再通过最后一个表将结果存储到文件系统;这就提示我们,最好是把小表放在前面,避免内存溢出,还能提高效率。
  3. 例句比如:SELECT a.* from visit_config a join visit_config_new b on (a.id = b.id);

从SQL到HQL

大同小异吧,基本的语法很相似,但是hive支持嵌入式的mapreduce程序,而且不支持Insert into,也不支持update,也不支持delete操作;这样就不需要复杂的锁机制,提高效率;而且同时也不支持事务机制,原理同上。

参考资料:

  1. https://www.cnblogs.com/HondaHsu/p/4346354.html
  2. https://www.cnblogs.com/one--way/p/7550795.html