一:Hive定义
1.1出现原因
Hive最早来源于FaceBook ,因为FaceBook⽹站每天产⽣海量的结构化⽇志数据,为
了对这些数据进⾏管理,并且因为机器学习的需求,产⽣了Hive这⻔技术,并继续
发展成为⼀个成功的Apache项⽬。
1.2定义:
Hive是⼀个基于 Hadoop 的数据仓库⼯具,可以将结构化的数据⽂件映射成⼀张数据表,并可以使⽤类似SQL的⽅式来对数据⽂件进⾏读写以及管理。这套Hive SQL 简 称HQL。Hive的执⾏引擎可以是MR、Spark、Tez。
1.3本质:
Hive的本质是将HQL转换成MapReduce任务,完成整个数据的分析查询,减少编
写MapReduce的复杂度 。
二:Hive的优缺点
2.1优点 :
1. 学习成本低:提供了类SQL查询语⾔HQL,使得熟悉SQL语⾔的开发⼈员⽆需关⼼细节,可以快速上⼿.
2. 海量数据分析:底层是基于海量计算到MapReduce实现.
3. 可扩展性:为超⼤数据集设计了计算/扩展能⼒(MR作为计算引擎,HDFS作为存储系统),Hive可以⾃由的扩展集群的规模,⼀般情况下不需要重启服务。
4. 延展性:Hive⽀持⽤户⾃定义函数,⽤户可以根据⾃⼰的需求来实现⾃⼰的函数。
5. 良好的容错性:某个数据节点出现问题HQL仍可完成执⾏。
6. 统计管理:提供了统⼀的元数据管理
2.2缺点 :
1. Hive的HQL表达能⼒有限
2. 迭代式算法⽆法表达.
3. Hive的效率⽐较低.
4. Hive⾃动⽣成的MapReduce作业,通常情况下不够智能化.
5. Hive调优⽐较困难,粒度较粗.
三:Hive的架构:
核心结构如下图:
3.1 ⽤户连接接⼝
CLI:是指Shell命令⾏ JDBC/ODBC:是指Hive的JAVA实现,与传统数据库JDBC类似。 WebUI:是指可通过浏览器访问Hive
3.2 thriftserver
hive的可选组件,此组件是⼀个软件框架服务,允许客户端使⽤包括Java、C++、Ruby和其他很多种语⾔,通过编程的⽅式远程访问Hive。
3.3 元数据
Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括(表名、表所属的数据库名、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在⽬录等)
3.4 驱动(Driver)
解析器(SQLParser):
将HQL字符串转换成抽象语法树AST,这⼀步⼀般都⽤第三⽅⼯具库完成,⽐如
antlr;对AST进⾏语法 分析,⽐如表是否存在、字段是否存在、SQL语义是否有
误。
编译器(Compiler):
对hql语句进⾏词法、语法、语义的编译(需要跟元数据关联),编译完成后会⽣成⼀个执⾏计划。hive上就是编译成mapreduce的job
优化器(Optimizer):
将执⾏计划进⾏优化,减少不必要的列、使⽤分区、使⽤索引等。优化job。
执⾏器(Executer):
将优化后的执⾏计划提交给hadoop的yarn上执⾏。提交job。
四:Hive与关系型数据库的异同
4.1列表比较
4.2 关键⽐较项解释:
1、查询语⾔:由于SQL被⼴泛的应⽤在数据仓库中,因此,专⻔针对Hive的特性设
计了类SQL的查询语⾔HQL。熟悉SQL开发的开发者可以很⽅便的使⽤Hive进⾏开
发。
2、数据存储位置:Hive是建⽴在Hadoop之上的,所有Hive的数据都是存储在
HDFS中的。⽽数据库则可以将数据保存在块设备或者本地⽂件系统中。
3、数据格式:Hive中没有定义专⻔的数据格式,数据格式可以由⽤户指定,⽤户定
义数据格式需要指定三个属性:列分隔符(通常为空格、"\t"、"\x001")、⾏分隔符
("\n")以及读取⽂件数据的⽅法(Hive中默认有三个⽂件格式TextFile、SequenceFile
以及RCFile)。由于在加载数据的过程中,不需要从⽤户数据格式到Hive定义的数据
格式的转换,因此,Hive在加载的过程中不会对数据本身进⾏任何修改,⽽只是将
数据内容复制或者移动到相应的HDFS⽬录中。⽽在数据库中,不同的数据库有不同
的存储引擎,定义了⾃⼰的数据格式。所有数据都会按照⼀定的组织存储,因此,
数据库加载数据的过程会⽐较耗时。
4、数据更新:由于Hive是针对数据仓库应⽤设计的,⽽数据仓库的内容是读多写少
的。因此,Hive中不⽀持对数据的改写和添加,所有的数据都是在加载的时候中确
定好的。⽽数据库中的数据通常是需要经常进⾏修改的,因此可以使⽤INSERT
INTO…VALUES添加数据,使⽤UPDATE…SET修改数据。
5、索引:Hive在加载数据的过程中不会对数据进⾏任何处理,甚⾄不会对数据进⾏
扫描,因此也没有对数据中的某些Key建⽴索引。Hive要访问数据中满⾜条件的特定
值时,需要暴⼒扫描整个数据,因此访问延迟较⾼。由于MapReduce的引⼊,Hive
可以并⾏访问数据,因此即使没有索引,对于⼤数据量的访问,Hive仍然可以体现
出优势。数据库中,通常会针对⼀个或⼏个列建⽴索引,因此对于少量的特定条件
的数据的访问,数据库可以有很⾼的效率,较低的延迟。由于数据的访问延迟较
⾼,决定了Hive不适合在线数据查询。
6、执⾏:Hive中⼤多数查询的执⾏是通过Hadoop提供的MapReduce来实现的(类 似select * from tbl的查询不需要MapReduce)。⽽数据库通常有⾃⼰的执⾏引擎。
7、执⾏延迟:之前提到,Hive在查询数据的时候,由于没有索引,需要扫描整个
表,因此延迟较⾼。另外⼀个导致Hive执⾏延迟⾼的因素是MapReduce框架。由于
MapReduce本身具有较⾼的延迟,因此在利⽤MapReduce执⾏Hive查询时,也会
有较⾼的延迟。相对的,数据库的执⾏延迟较低。当然,这个低是有条件的,即数
据规模较⼩,当数据规模⼤到超过数据库的处理能⼒的时候,Hive的并⾏计算显然
能体现出优势。
8、可扩展性:由于Hive是建⽴在Hadoop之上的,因此Hive的可扩展性是和
Hadoop的可扩展性是⼀致的。⽽数据库由于ACID语义的严格限制,扩展性⾮常有
限。⽬前最先进的并⾏数据库Oracle在理论上的扩展能⼒也只有100台左右。
9、数据规模:由于Hive建⽴在集群上并可以利⽤MapReduce进⾏并⾏计算,因此
可以⽀持很⼤规模的数据;对应的,数据库可以⽀持的数据规模较⼩。
Hive和Hadoop的关系
1. Hive是基于Hadoop的。
2. Hive本身其实没有多少功能,hive就相当于在Hadoop上⾯加了⼀个外壳,就是对hadoop进⾏了⼀次封装。
3. Hive的存储是基于HDFS的,hive的计算是基于MapReduce。
五:数据库的基本操作 库、表
5.1规则语法
注释语法:
-- 单⾏注释
// 单⾏注释
/*
* 多⾏注释
*/
大小写规则:
1 Hive的数据库名、表名都不区分⼤⼩写
2. 建议关键字⼤写
命名规则:
- 名字不能使⽤数字开头
- 不能使⽤关键字
- 尽量不使⽤特殊符号
- 如果表⽐较多,那么表名和字段名可以定义规则加上前缀
快速创建库和表:
-- hive有⼀个默认的数据库default,如果不明确的说明要使⽤哪个库,则使⽤默认数据库。
hive> create database zoo;
hive> create database if not exists zoo;
hive> create database if not exists qfdb comment 'this is a database of qianfeng';
-- 创建库的本质:在hive的warehouse⽬录下创建⼀个⽬录(库名.db命名的⽬录)
-- 切换库:
hive> use zoo;
--创建表
hive> create table t_user(id int,name string);
-- 使⽤库+表的形式创建表:
hive> create table qfdb.t_user(id int,name string);