写在前面的话,学《Hive的那些事》序列文章,分享给大家。我会在接下来的时间整理有关Hive的资料,如果对Hive的东西感兴趣,请关注本博客。https://www.iteblog.com/archives/tag/hive-technology/
Hive的设计目的是为了那些精通SQL技能的分析师能够对存放在HDFS上的大规模数据集上进行查询。既然是为了那些精通SQL技能的分析师设计,那么Hive应该和传统的数据库有很多相同的地方,那么它们是不是完全一样?Hive是否也遵循SQL92标准?答案是不完全是。那么它们的区别与联系到底体现在什么地方?这就是今天本文本需要讨论的话题。
Hive在很多方面和RMDB类似,比如说它支持SQL接口;但是由于其它底层设计的原因,对HDFS和Mapreduce有很强的依赖,这也就意味这Hive的体系结构和RMDB有很大的区别。这些区别又间接的影响到Hive所支持的一些特性。
在传统的RMDB中,表的模式是在数据加载的时候强行确定好的。如果在加载时发现数据不符合模式,则拒绝加载这些数据。而Hive在加载的过程中不对数据进行任何的验证操作,其只是简单的将数据复制或者移动到表对应的目录下面。从这方面来说,传统数据库在数据加载的过程中比Hive要慢。但是因为传统数据库在数据加载过程中可以进行一些处理,比如对某一列建立索引等,这样可以提升数据的查询性能。而在这方面Hive不行。
我们都知道,数据库的事务、索引以及更新都是传统数据库的重要特性。但是Hive到目前也不支持更新(这里说的是对行级别的数据进行更新),不支持事务;虽然Hive支持建立索引(可以参见本博客《Hive创建索引》),但是它还不能提升数据的查询速度。下表列出了RMDB和Hive的比较:比较项SQLHiveQL
ANSI SQL支持不完全支持
更新UPDATE\INSERT\DELETEinsert OVERWRITE\INTO TABLE
事务支持不支持
模式写模式读模式
数据保存块设备、本地文件系统HDFS
延时低高
多表插入不支持支持
子查询完全支持只能用在From子句中
视图UpdatableRead-only
可扩展性低高
数据规模小大
................
从上表可以看出,Hive和传统的数据库还是有很多的区别。
Hive的SQL方言一般被称为HiveQL,在下文我们简称HQL。在上面我们提到,HQL并不完全支持SQL92标准。这个也是有原因的。遵循SQL92从Hive的设计开始就不是它的目标。在本博客的《Hive内置数据类型》中,我们提到了Hive支持或者将来支持的内置数据类型,这里我们列出HQL和SQL92的其他的一些对比,如下图所示:
如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop
上图中是使用Hive 0.11.0版本进行说明的,Hive 0.11.0版本不支持的数据类型很多都在Hive 0.12.0,Hive 0.13.0版本中开始支持。这个可以参见本博客的《Hive内置数据类型》的详细说明进行更多的了解。