欢迎关注大数据技术架构与案例微信公众号:过往记忆大数据
过往记忆博客公众号iteblog_hadoop
欢迎关注微信公众号:
过往记忆大数据

Hive和传统数据库进行比较

写在前面的话,学Hive这么久了,发现目前国内还没有一本完整的介绍Hive的书籍,而且互联网上面的资料很乱,于是我决定写一些关于《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的比较:

比较项 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的其他的一些对比,如下图所示:


如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

  上图中是使用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)
喜欢 (8)
分享 (0)
发表我的评论
取消评论

表情
本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!
(2)个小伙伴在吐槽
  1. Hive怎么支持多表插入的呢?一条HQL语句中,能否给个示例呢?谢谢~

    can0072014-03-21 17:30 回复
    • 很简单,看看下面的列子:

      ROM staged_employees se  
      INSERT INTO TABLE employess   
        PARTTITION (country = 'US',state = 'OR')  
        SELECT * WHERE se.cnty = 'US' AND se.st = 'OR';  
      INSERT INTO TABLE employess   
        PARTTITION (country = 'US',state = 'CA')  
        SELECT * WHERE se.cnty = 'US' AND se.st = 'CA';  
      INSERT INTO TABLE employess   
        PARTTITION (country = 'US',state = 'IL')  
        SELECT * WHERE se.cnty = 'US' AND se.st = 'IL'; 
      


      你只扫描一次表就可以将数据插入到对应的分区中。这个很强大的。

      w3970907702014-03-21 17:40 回复