Sql、Hive和Hbase的联系和区别


Hive是作为一个中间人,与sql和Hbase有着联系,而sql和Hbase没有直接的联系。所以我分两部分来谈清楚三者的联系和区别。

一、 首先来谈谈Hive和SQl的关系

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能。

下图是hive的一个入口。先连接hadoop再连接hive,提供Hql(类sql)代码运行MapReduce任务,所以相对花费的时间会长一些,当然Hive也可以将底层计算引擎更换为Spark/Tez等。

sql hadoop nosql 性能 hadoop和sql的联系_hive


跟sql的主要区别是在大数据计算框架下运行,适用于大数据量,并且可扩展性比较强,所以在今天到处是大数据的情况下,Hive非常受欢迎。其次Hive sql跟SQL大致是相同的,简单罗列几个不一样的地方:

1、Hive不支持等值连接

即不支持where a.id = b.id的连接方式,hive使用join连接。

•SQL中对两表内联可以写成:
 select * from dual a,dual b where a.key = b.key;
 •Hive中应为
 select * from dual a join dual b on a.key = b.key;

2、分号字符
•分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:

select concat(key,concat(’;’,key)) from dual;


•但HiveQL在解析语句时提示:

FAILED: Parse Error: line 0:-1 mismatched input ‘’ expecting ) in function specification


•解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:

select concat(key,concat(’\073’,key)) from dual;

3、hive支持按行分割,按字段分割,如按‘,’分割:   

lateral view explode(split( , ‘,’))

4、IS [NOT] NULL
•SQL中null代表空值, 值得警惕的是, 在HiveQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对它进行IS NULL的判断结果是False.
hive中没有not null,当字段为null时,使用\n代替。

二、再来谈谈Hive和Hbase的关系
Hbase和Hive在大数据架构中处在不同位置,Hbase主要解决实时数据查询问题,Hive主要解决数据处理和计算问题,一般是配合使用。
在大数据架构中,Hive和HBase是协作关系,数据流一般如下图:
1、通过ETL工具将数据源抽取到HDFS存储;
2、通过Hive清洗、处理和计算原始数据;
3、HIve清洗处理后的结果,如果是面向海量数据随机查询场景的可存入Hbase
4、数据应用从HBase查询数据;
Hive和Hbase的区别如下所示:
1、hbase是物理表,不是逻辑表,本质是数据存储,是个NoSql数据库,提供一个超大的内存hash表,搜索引擎通过它来存储索引,方便查询操作;Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce,Hive中的表纯逻辑。
2、hive是sql语言,通过数据库的方式来操作hdfs文件系统,为了简化编程,底层计算方式为mapreduce;HBase为查询而生的,它通过组织起节点內所有机器的內存,提供一個超大的內存Hash表。
3、hive是面向行存储的数据库;hbase是列存储。
4、hive是高延迟、结构化和面向分析的,hbase是低延迟、非结构化和面向编程的。Hive数据仓库在hadoop上是高延迟的。