Hive的设计目的是为了那些精通SQL技能的分析师能够对存放在HDFS上的大规模数据集上进行查询。既然是为了那些精通SQL技能的分析师设计,那么Hive应该和传统的数据库有很多相同的地方,那么它们是不是完全一样?Hive是否也遵循SQL92标准?答案是不完全是。那么它们的区别与联系到底体现在什么地方?这就是今天本文本需要讨论的话题。
Hive在很多方面和RMDB类似,比如说它支持SQL接口;但是由于其它底层设计的原因,对HDFS和Mapreduce有很强的依赖,这也就意味这Hive的体系结构和RMDB有很大的区别。这些区别又间接的影响到Hive所支持的一些特性。
在传统的RMDB中,表的模式是在数据加载的时候强行确定好的。如果在加载时发现数据不符合模式,则拒绝加载这些数据。而Hive在加载的过程中不对数据进行任何的验证操作,其只是简单的将数据复制或者移动到表对应的目录下面。从这方面来说,传统数据库在数据加载的过程中比Hive要慢。但是因为传统数据库在数据加载过程中可以进行一些处理,比如对某一列建立索引等,这样可以提升数据的查询性能。而在这方面Hive不行。
我们都知道,数据库的事务、索引以及更新都是传统数据库的重要特性。但是Hive到目前也不支持更新(这里说的是对行级别的数据进行更新),不支持事务;虽然Hive支持建立索引(可以参见本博客《Hive创建索引》),但是它还不能提升数据的查询速度。下表列出了RMDB和Hive的比较:
比较项 | SQL | HiveQL |
ANSI SQL | 支持 | 不完全支持 |
更新 | UPDATE\INSERT\DELETE | insert OVERWRITE\INTO TABLE |
事务 | 支持 | 不支持 |
模式 | 写模式 | 读模式 |
数据保存 | 块设备、本地文件系统 | HDFS |
延时 | 低 | 高 |
多表插入 | 不支持 | 支持 |
子查询 | 完全支持 | 只能用在From子句中 |
视图 | Updatable | Read-only |
可扩展性 | 低 | 高 |
数据规模 | 小 | 大 |
.... | ...... | ...... |
从上表可以看出,Hive和传统的数据库还是有很多的区别。
Hive的SQL方言一般被称为HiveQL,在下文我们简称HQL。在上面我们提到,HQL并不完全支持SQL92标准。这个也是有原因的。遵循SQL92从Hive的设计开始就不是它的目标。在本博客的《Hive内置数据类型》中,我们提到了Hive支持或者将来支持的内置数据类型,这里我们列出HQL和SQL92的其他的一些对比,如下图所示:
上图中是使用Hive 0.11.0版本进行说明的,Hive 0.11.0版本不支持的数据类型很多都在Hive 0.12.0,Hive 0.13.0版本中开始支持。这个可以参见本博客的《Hive内置数据类型》的详细说明进行更多的了解。
本博客文章除特别声明,全部都是原创!原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
本文链接: 【Hive和传统数据库进行比较】(https://www.iteblog.com/archives/890.html)
Hive怎么支持多表插入的呢?一条HQL语句中,能否给个示例呢?谢谢~
很简单,看看下面的列子:
你只扫描一次表就可以将数据插入到对应的分区中。这个很强大的。