本文主要是介绍Hive全面深入理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文分为几个模块:
- 概述
- 体系架构简介
- 安装步骤
- 开发
1:概述
建立在Hadoop基础之上的数据仓库基础架构,通俗来说,就是数据管理的工具,可以通过编写类似于常用SQL的HQL查询语句,实现大规模数据的查询和处理,而底层则是用MapReduce来完成提交的语句的处理;也就是说,Hive的功能,很多也可以通过自己开发MapReduce程序来处理;数据的存储,则是依据HDFS来完成的。
Hive的核心功能是SQL语句解析引擎,而其中的表,实际上就是HDFS的目录和文件,按照表名来把文件夹分开。
2:体系架构简介
- CLI:命令行方式,
- JDBC/ODBC:通过类似于MySQL接口的方式进行访问
- Web GUI:通过HTTP页面进行访问。
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)
查询语句
- 查询一行:select * from student a where a.id = 10;
- 查询一行中的某一列: select a.first_col from student a where a.id = 10
- 向HDFS中插入数据:insert override directory '/home/tmp' select a.* > 10 from student a.ds= "shanghai";这里是可以指定分区的
从一个表中获取数据插入到另一个表中: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表的修改
- 添加新的一列:ALTER TABLE pokes add columns(address String)
- 添加一列并同时添加注释:alter table pokes add columns(address STRING COMMENT 'address comment')
- 删除表:drop table pokes
- 更改表名: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的不同来进行分区;在查询的过程中,也可以指定分区,这样检索的范围缩小,性能提高。
加载数据到分区表中:
- load data local inpath '/home/files/dealedlog.out' overwrite into table tb_partition partition(month = '201802');这里,通过local inpath指定了加载的是本地文件,overwrite代表数据直接覆盖到tb_partition表中;而month则是指定文件加载到month='201802'的分区中。
- insert select方式:insert into table tb_partition partition(month = '201802') select id ,name from name;该语句就是从name表获取两列数据,插入到tb_partition表中,并指定数据存储的分区为month=‘201802’
- 由于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操作,但是其只支持等值操作。
- Hive只支持等值连接,不支持所有非等值的连接
- Join操作中,每次MapReduce任务的逻辑如下,reducer会缓存除了最后一个表中的所有表的记录,再通过最后一个表将结果存储到文件系统;这就提示我们,最好是把小表放在前面,避免内存溢出,还能提高效率。
- 例句比如:SELECT a.* from visit_config a join visit_config_new b on (a.id = b.id);
从SQL到HQL
大同小异吧,基本的语法很相似,但是hive支持嵌入式的mapreduce程序,而且不支持Insert into,也不支持update,也不支持delete操作;这样就不需要复杂的锁机制,提高效率;而且同时也不支持事务机制,原理同上。
参考资料:
- https://www.cnblogs.com/HondaHsu/p/4346354.html
- https://www.cnblogs.com/one--way/p/7550795.html
这篇关于Hive全面深入理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!