欢迎关注Hadoop、Spark、Flink、Hive、Hbase、Flume等大数据资料分享微信公共账号:iteblog_hadoop
  1. 文章总数:978
  2. 浏览总数:11,976,096
  3. 评论:3938
  4. 分类目录:106 个
  5. 注册用户数:6129
  6. 最后更新:2018年12月15日
过往记忆博客公众号iteblog_hadoop
欢迎关注微信公众号:
iteblog_hadoop
大数据技术博客公众号bigdata_ai
大数据猿:
bigdata_ai

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的比较:

比较项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内置数据类型》的详细说明进行更多的了解。

本博客文章除特别声明,全部都是原创!
转载本文请加上:转载自过往记忆(https://www.iteblog.com/)
本文链接: 【Hive和传统数据库进行比较】(https://www.iteblog.com/archives/890.html)
喜欢 (6)
分享 (0)
发表我的评论
取消评论

表情
本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!
(2)个小伙伴在吐槽
  1. Hive怎么支持多表插入的呢?一条HQL语句中,能否给个示例呢?谢谢~
    can0072014-03-21 17:30 回复
    • 很简单,看看下面的列子:[code lang="JAVA"]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'; [/code]你只扫描一次表就可以将数据插入到对应的分区中。这个很强大的。
      w3970907702014-03-21 17:40 回复