共计 3372 个字符,预计需要花费 9 分钟才能阅读完成。
这篇文章将为大家详细讲解有关 hive 函数有什么用,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
首先我们要知道 hive 到底是做什么的。下面这几段文字很好的描述了 hive 的特性:
1.hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 sql 查询功能,可以将 sql 语句转换为 MapReduce 任务进行运行。其优点是学习成本低,可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专门的 MapReduce 应用,十分适合数据仓库的统计分析。
2.Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
要理解 hive,必须先理解 hadoop 和 mapreduce,如果有不熟悉的童鞋,可以百度一下。
使用 hive 的命令行接口,感觉很像操作关系数据库,但是 hive 和关系数据库还是有很大的不同,下面我就比较下 hive 与关系数据库的区别,具体如下:
1.hive 和关系数据库存储文件的系统不同,hive 使用的是 hadoop 的 HDFS(hadoop 的分布式文件系统),关系数据库则是服务器本地的文件系统;
2.hive 使用的计算模型是 mapreduce,而关系数据库则是自己设计的计算模型;
3. 关系数据库都是为实时查询的业务进行设计的,而 hive 则是为海量数据做数据挖掘设计的,实时性很差;实时性的区别导致 hive 的应用场景和关系数据库有很大的不同;
4.Hive 很容易扩展自己的存储能力和计算能力,这个是继承 hadoop 的,而关系数据库在这个方面要比数据库差很多。
以上都是从宏观的角度比较 hive 和关系数据库的区别,hive 和关系数据库的异同还有很多,我在文章的后面会一一描述。
下面我来讲讲 hive 的技术架构,大家先看下面的架构图:
由上图可知,hadoop 和 mapreduce 是 hive 架构的根基。Hive 架构包括如下组件:CLI(command line interface)、JDBC/ODBC、Thrift Server、WEB GUI、metastore 和 Driver(Complier、Optimizer 和 Executor),这些组件我可以分为两大类:服务端组件和客户端组件。
首先讲讲服务端组件:
Driver 组件:该组件包括 Complier、Optimizer 和 Executor,它的作用是将我们写的 HiveQL(类 SQL)语句进行解析、编译优化,生成执行计划,然后调用底层的 mapreduce 计算框架。
Metastore 组件:元数据服务组件,这个组件存储 hive 的元数据,hive 的元数据存储在关系数据库里,hive 支持的关系数据库有 derby、mysql。元数据对于 hive 十分重要,因此 hive 支持把 metastore 服务独立出来,安装到远程的服务器集群里,从而解耦 hive 服务和 metastore 服务,保证 hive 运行的健壮性,这个方面的知识,我会在后面的 metastore 小节里做详细的讲解。
Thrift 服务:thrift 是 facebook 开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive 集成了该服务,能让不同的编程语言调用 hive 的接口。
客户端组件:
CLI:command line interface,命令行接口。
Thrift 客户端:上面的架构图里没有写上 Thrift 客户端,但是 hive 架构的许多客户端接口是建立在 thrift 客户端之上,包括 JDBC 和 ODBC 接口。
WEBGUI:hive 客户端提供了一种通过网页的方式访问 hive 所提供的服务。这个接口对应 hive 的 hwi 组件(hive web interface),使用前要启动 hwi 服务。
下面我着重讲讲 metastore 组件, 具体如下:
Hive 的 metastore 组件是 hive 元数据集中存放地。Metastore 组件包括两个部分:metastore 服务和后台数据的存储。后台数据存储的介质就是关系数据库,例如 hive 默认的嵌入式磁盘数据库 derby,还有 mysql 数据库。Metastore 服务是建立在后台数据存储介质之上,并且可以和 hive 服务进行交互的服务组件,默认情况下,metastore 服务和 hive 服务是安装在一起的,运行在同一个进程当中。我也可以把 metastore 服务从 hive 服务里剥离出来,metastore 独立安装在一个集群里,hive 远程调用 metastore 服务,这样我们可以把元数据这一层放到防火墙之后,客户端访问 hive 服务,就可以连接到元数据这一层,从而提供了更好的管理性和安全保障。使用远程的 metastore 服务,可以让 metastore 服务和 hive 服务运行在不同的进程里,这样也保证了 hive 的稳定性,提升了 hive 服务的效率。
Hive 的执行流程如下图所示:
图描述的很清晰了,我这里就不在累述了。
下面我给大家展示一个简单的例子,看看 hive 是怎么操作的。
首先我们创建一个普通的文本文件,里面只有一行数据,该行也只存储一个字符串,命令如下:
echo ‘sharpxiajun /home/hadoop/test.txt
然后我们建一张 hive 的表:
hive –e “create table test (value string);
接下来加载数据:
Load data local inpath ‘home/hadoop/test.txt overwrite into table test
最后我们查询下表:
hive –e ‘select * from test
大家看到了吧,hive 十分简单, 很好入门,操作和 sql 很像,下面我就要深入分析下 hive 与关系数据库的区别,这部分可能有些人看的不是很明白,但是很有必要提前提出,以后我的文章里将进一步讲述 hive,那时不太明白的童鞋在看看这部分,很多问题就会清晰很多,具体如下:
1. 关系数据库里,表的加载模式是在数据加载时候强制确定的(表的加载模式是指数据库存储数据的文件格式),如果加载数据时候发现加载的数据不符合模式,关系数据库则会拒绝加载数据,这个就叫“写时模式”,写时模式会在数据加载时候对数据模式进行检查校验的操作。Hive 在加载数据时候和关系数据库不同,hive 在加载数据时候不会对数据进行检查,也不会更改被加载的数据文件,而检查数据格式的操作是在查询操作时候执行,这种模式叫“读时模式”。在实际应用中,写时模式在加载数据时候会对列进行索引,对数据进行压缩,因此加载数据的速度很慢,但是当数据加载好了,我们去查询数据的时候,速度很快。但是当我们的数据是非结构化,存储模式也是未知时候,关系数据操作这种场景就麻烦多了,这时候 hive 就会发挥它的优势。
2. 关系数据库一个重要的特点是可以对某一行或某些行的数据进行更新、删除操作,hive 不支持对某个具体行的操作,hive 对数据的操作只支持覆盖原数据和追加数据。Hive 也不支持事务和索引。更新、事务和索引都是关系数据库的特征,这些 hive 都不支持,也不打算支持,原因是 hive 的设计是海量数据进行处理,全数据的扫描时常态,针对某些具体数据进行操作的效率是很差的,对于更新操作,hive 是通过查询将原表的数据进行转化最后存储在新表里,这和传统数据库的更新操作有很大不同。
3.Hive 也可以在 hadoop 做实时查询上做一份自己的贡献,那就是和 hbase 集成,hbase 可以进行快速查询,但是 hbase 不支持类 SQL 的语句,那么此时 hive 可以给 hbase 提供 sql 语法解析的外壳,可以用类 sql 语句操作 hbase 数据库
关于“hive 函数有什么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。