Hadoop学习系列笔记(六):关于Hive

Hive是构建在Hadoop上的数据仓库框架。Hive设计的目的是让精通SQL技能(但Java编程技能相对较弱)的分析师能够对Facebook存放在HDFS中的大规模数据集执行查询,是一个通用的、可伸缩的数据处理平台。

Hive一般在工作站上运行,它把SQL查询转换为一系列在Hadoop集群上运行的MapReduce作业Hive把数据组织为,元数据(如表模式)存储在metastore数据库中。

HiveQLHive查询语言,基于SQL语言,是SQL的一种“方言”,命令必须一分号结束。和SQL一样,HiveQL对大小写不敏感。

如:

 Hadoop学习系列笔记(六):关于Hive

第一行和SQL一样,声明一张表,包含三列,必须指明每一列的数据类型。ROW FORMAT子句是HiveQL所特有的。这个子句声明数据文件的每一行是由制表符分割文本。

 

配置Hive

Hadoop类似,Hive使用XML配置文件进行设置。

 

Hive服务:

常用的Hive服务:clihiveserverhwijarmetastore

 

Hive的体系结构如下图所示。

 Hadoop学习系列笔记(六):关于Hive

metastoreHive元数据的集中存放地。metastore包括两个部分:服务后台数据的存

SQLHiveQL概要比较:

 Hadoop学习系列笔记(六):关于Hive

Hadoop学习系列笔记(六):关于Hive

 

表:

Hive在逻辑上由存储的数据描述表中数据形式的相关元数据组成。数据一般存放在HDFS中,但也可以存放在其他任何Hadoop文件系统中,包括本地文件系统或S3Hive元数据存放在关系数据库中,而不是放在HDFS中。

分区和桶:

Hive把表组织成分区”。这是一种根据“分区列的值对表进行粗略划分的机制,使用分区可以加快数据分配的查询速度。表或分区可以进一步分为“桶”。

一个表可以以多个维度来进行分区。

把表(或分区)组织的两个理由:一是获得更高的查询处理效率。桶为表加上了额外的结构Hive在处理有些查询时能够利用这个结构,具体而言,连接两个在相同列上划分了桶的表,可以使map端连接高效地实现。二是使“取样”更为高效。在处理大规模数据集时,在开发和修改查询阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

存储格式:

Hive从两个维度对表的存储进行管理:“行格式”和“文件格式”。行格式指一行中的字段如何存储。文件格式指一行中字段容器的格式,最简单的格式是纯文本文件,也可使用面向行和面向列的二进制格式。

 

查询数据:

排序和聚集:

Hive可以使用标准ORDER BY子句对数据进行排序,但有一个潜在的不利因素。ORDER BY能够预期产生完全排序的结果,但它是通过只用一个reducer来做到这一点的。所以对于大规模的数据集,它的效率非常低。很多情况下并不需要结果是全局排序的,此时可以换用Hive非标准扩展SORT BYSORT BY每个reducer产生一个排序文件

连接:

(内连接)和直接使用MapReduce相比,使用Hive的一个好处在于Hive简化了常用操作。对比在MapReduce中实现“连接”要做的事情,Hive中进行连接操作能充分体现这个好处。Hive只支持等值连接,只允许在FROM子句中出现一个表。

(外连接)LEFT OUTER JOINRIGHT OUTER JOINFULL OUTER JOIN

(半连接)LEFT SEMI JOIN

子查询:

Hive对子查询的支持很有限,它只允许子查询出现在SELECT语句的FROM子句中。

视图:

视图是一种用SELECT语句定义的“虚表”。视图以一种不同于磁盘实际存储的形式把数据呈现给用户。Hive中,创建视图时并不把视图“物化存储到磁盘上。相反,视图的SELECT语句只是在执行引用视图的语句时才执行。创建视图时并不执行查询,查询只是存储在metastore中。Hive中的视图时只读的,无法通过视图为基表加载或插入数据。

 

用户定义函数:

有时所要查询无法使用Hive提供的内置函数来表示,通过写“用户定义函数”(user-defined functionUDFHive可以方便地插入用户写的处理代码并在查询中调用它们。UDF必须用Java语言编写Hive本身也是用Java写的。

Hive中有三种UDF普通UDF、用户定义聚集函数UDAF)、用户定义表生成函数UDTF)。它们所接受的输入产生的输出数据行数量是不同的。

->普通UDF操作作用于单个数据行,且产生一个数据行作为输出。

->UDAF接受多个输入数据行,并产生一个输出数据行。如COUNTMAX这样的函数都是聚集函数。

->UDTF操作作用于单个数据行,且产生多个数据行——一个表作为输出。

编写UDF

一个UDF必须满足以下两个条件

->:一个UDF必须是org.apache.hadoop.hive.ql.exec.UDF的子类

->:一个UDF必须至少实现了evaluate()方法

为了在Hive中使用UDF,需要把编译后Java打包(package)成一个JAR文件,并Hive中注册这个文件。

编写UDAF

聚集函数比普通UDF难写。因为值是在块内进行聚集的(这些块可能分布在很多mapreduce任务中),从而实现时要能够把部分的聚集值组合成最终结果。

UDFA必须是org.apache.hadoop.hive.ql.exec.UDAF的子类,且包含一个或多个嵌套的、实现了org.apache.hadoop.hive.ql.exec.UDAFEvaluator