Hive是构建在Hadoop上的数据仓库框架。Hive设计的目的是让精通SQL技能(但Java编程技能相对较弱)的分析师能够对Facebook存放在HDFS中的大规模数据集执行查询,是一个通用的、可伸缩的数据处理平台。 Hive一般在工作站上运行,它把SQL查询转换为一系列在Hadoop集群上运行的MapReduce作业。Hive把数据组织为表,元数据(如表模式)存储在metastore数据库中。 HiveQL是Hive的查询语言,基于SQL语言,是SQL的一种“方言”,命令必须一分号结束。和SQL一样,HiveQL对大小写不敏感。 如: 第一行和SQL一样,声明一张表,包含三列,必须指明每一列的数据类型。ROW FORMAT子句是HiveQL所特有的。这个子句声明数据文件的每一行是由制表符分割文本。
配置Hive: 和Hadoop类似,Hive使用XML配置文件进行设置。
Hive服务: 常用的Hive服务:cli、hiveserver、hwi、jar、metastore。
Hive的体系结构如下图所示。 metastore是Hive元数据的集中存放地。metastore包括两个部分:服务和后台数据的存储。 SQL和HiveQL概要比较:
表: Hive在逻辑上由存储的数据和描述表中数据形式的相关元数据组成。数据一般存放在HDFS中,但也可以存放在其他任何Hadoop文件系统中,包括本地文件系统或S3。Hive把元数据存放在关系数据库中,而不是放在HDFS中。 分区和桶: Hive把表组织成“分区”。这是一种根据“分区列”的值对表进行粗略划分的机制,使用分区可以加快数据分配的查询速度。表或分区可以进一步分为“桶”。 一个表可以以多个维度来进行分区。 把表(或分区)组织成桶的两个理由:一是获得更高的查询处理效率。桶为表加上了额外的结构,Hive在处理有些查询时能够利用这个结构,具体而言,连接两个在相同列上划分了桶的表,可以使map端连接高效地实现。二是使“取样”更为高效。在处理大规模数据集时,在开发和修改查询阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。 存储格式: Hive从两个维度对表的存储进行管理:“行格式”和“文件格式”。行格式指行和一行中的字段如何存储。文件格式指一行中字段容器的格式,最简单的格式是纯文本文件,也可使用面向行和面向列的二进制格式。
查询数据: 排序和聚集: Hive可以使用标准的ORDER BY子句对数据进行排序,但有一个潜在的不利因素。ORDER BY能够预期产生完全排序的结果,但它是通过只用一个reducer来做到这一点的。所以对于大规模的数据集,它的效率非常低。很多情况下并不需要结果是全局排序的,此时可以换用Hive的非标准扩展SORT BY,SORT BY为每个reducer产生一个排序文件。 连接: (内连接)和直接使用MapReduce相比,使用Hive的一个好处在于Hive简化了常用操作。对比在MapReduce中实现“连接”要做的事情,在Hive中进行连接操作能充分体现这个好处。Hive只支持等值连接,只允许在FROM子句中出现一个表。 (外连接)LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN (半连接)LEFT SEMI JOIN 子查询: Hive对子查询的支持很有限,它只允许子查询出现在SELECT语句的FROM子句中。 视图: 视图是一种用SELECT语句定义的“虚表”。视图以一种不同于磁盘实际存储的形式把数据呈现给用户。Hive中,创建视图时并不把视图“物化”存储到磁盘上。相反,视图的SELECT语句只是在执行引用视图的语句时才执行。创建视图时并不执行查询,查询只是存储在metastore中。Hive中的视图时只读的,无法通过视图为基表加载或插入数据。
用户定义函数: 有时所要查询无法使用Hive提供的内置函数来表示,通过写“用户定义函数”(user-defined function,UDF)Hive可以方便地插入用户写的处理代码并在查询中调用它们。UDF必须用Java语言编写。Hive本身也是用Java写的。 Hive中有三种UDF:普通UDF、用户定义聚集函数(UDAF)、用户定义表生成函数(UDTF)。它们所接受的输入和产生的输出的数据行的数量是不同的。 ->:普通UDF操作作用于单个数据行,且产生一个数据行作为输出。 ->:UDAF接受多个输入数据行,并产生一个输出数据行。如COUNT和MAX这样的函数都是聚集函数。 ->:UDTF操作作用于单个数据行,且产生多个数据行——一个表作为输出。 编写UDF: 一个UDF必须满足以下两个条件: ->:一个UDF必须是org.apache.hadoop.hive.ql.exec.UDF的子类 ->:一个UDF必须至少实现了evaluate()方法 为了在Hive中使用UDF,需要把编译后的Java类打包(package)成一个JAR文件,并在Hive中注册这个文件。 编写UDAF: 聚集函数比普通UDF难写。因为值是在块内进行聚集的(这些块可能分布在很多map或reduce任务中),从而实现时要能够把部分的聚集值组合成最终结果。 UDFA必须是org.apache.hadoop.hive.ql.exec.UDAF的子类,且包含一个或多个嵌套的、实现了org.apache.hadoop.hive.ql.exec.UDAFEvaluator
|