数据仓库 -Hive

Preview:

DESCRIPTION

Cloud Computing. 数据仓库 -Hive. 主要内容. 简介. Hive 是一个构建在 Hadoop 上的数据仓库平台,其设计目标是使 Hadoop 上的数据操作与传统 SQL 结合,让熟悉 SQL 编程的开发人员能够向 Hadoop 平台迁移。 Hive 可以在 HDFS 上构建数据仓库来存储结构化的数据,这些数据来源于 HDFS 上的原始数据, Hive 提供了类似 SQL 的查询语言 HiveQL ,可以执行查询,变换数据等操作。通过解析, HiveQL 语言在底层被转化为相应的 MapReduce 操作。. Hive 的组成. - PowerPoint PPT Presentation

Citation preview

Hive 是一个构建在 Hadoop 上的数据仓库平台,其设计目标是使Hadoop 上的数据操作与传统 SQL 结合,让熟悉 SQL 编程的开发人员能够向 Hadoop 平台迁移。

Hive 可以在 HDFS 上构建数据仓库来存储结构化的数据,这些数据来源于 HDFS 上的原始数据, Hive 提供了类似 SQL 的查询语言HiveQL ,可以执行查询,变换数据等操作。通过解析, HiveQL 语言在底层被转化为相应的 MapReduce 操作。

◦ Hive 的体系结构

Hadoop

H

JobTracker

NameNode

Hive

Driver(Compiler,Optimizer,Executor)

ThriftServer

CLIJDBC/ODBC

WebGUI

Metastore

Hive 相关组件:◦ 外部接口: Hive 提供了例如命令行 (CLI) 、 Web 界面等用户接口,

还提供了应用程序接口 (API) 例如 JDBC , ODBC 等。

◦ Thrift 服务器: Hive Thrift 服务器是一种跨语言服务的可伸缩软件框架。它结合律功能强大的软件堆栈的代码生成引擎,可以无缝的与 C++ 、 C# 、 Java 、 Python 、 PHP 和 Ruby 结合。 Thrift 允许用户简单地定义文件中的数据类型和服务接口,编译器生成代码来实现 RPC 客户端和服务器之间的通信。

Hive 内部集成了 Thrift 服务,支持在多种语言中运行 Hive 命令,使

客户端可以跨平台连接 Hive 。

Hive 相关组件:◦ 解析器 (Driver) :包括解释器,编译器,优化器,执行器,通过这一系列对 HiveQL 查询语句的处理,最后生成查询计划。解析器管理着 HiveQL 语句在编译,优化和执行时的生命周期。当接收到一个 HiveQL 查询语句时,解析器会创建一个相对的句柄,这个句柄被用来追踪执行时间,输出行数等数据。

◦ Hadoop :数据仓库和查询计划存储在 HDFS 上,计算过程由MapReduce 执行。

Hive 相关组件:◦ 元数据库 (Metastore) :管理系统目录,通常存储在关系数据库

如 MySQL , Derby 中。 Hive 所有其他的组件都会与它进行交互。Hive 的元数据中保存了表的属性和服务信息,为查询操作提供依据,默认的元数据库是内部的 Derby ,这种情况下 metastore 和其他 Hive 服务运行在同一个 Java 虚拟机里,只能允许建立单个会话,要实现多用户多会话支持,需要配置一个独立的元数据库。

数据在 Hive 里组织成表,分区和桶的形式◦ 表: Hive 里的表类似于关系数据库中的表。每个表都有一个对应的

HDFS 目录。表中的数据被序列化后存储在该目录的文件中。

Hive 提供了内置的序列化格式。用户还可以通过自定义序列化

和反序列化的方法去支持新的数据格式。每张表的序列化格式

存储在原数据库中,并在查询编译和执行时被自动调用。Hive

同时还支持数据存储在 NFS ,本地目录的外部表。

数据在 Hive 里组织成表,分区和桶的形式◦ 分区:分区是表的部分列的集合。一个表可以有一个或者多个分区, 这些分区确定了数据在表目录下的分布情况。假设

表 T 的数 据是在 /wh/T 目录下。如果 T 在列 ds 和 ctry 上被分区,那么

ds 值为 20090101 和 ctry 值为 US 的数据将会被存储到 /wh/T/ds=20090101/ctry=US 的目录下。

◦ 桶:在每个分区中的数据可以根据列的哈希值进一步划分成桶,每 个桶在分区目录下都存在一个文件中。

Hive 支持的数据类型 ( 基本类型 ) 基本类型 大小 描述

TINYINT 1 字节 有符号整数SMALLINT 2 字节 有符号整数INT 4 字节 有符号整数BIGINT 8 字节 有符号整数FLOAT 4 字节 单精度浮点数DOUBLE 8 字节 双精度浮点数BOOLEAN ~ 取 true/false

STRING 最大 2GB 字符串,类似于 sql 的varchar

Hive 支持的数据类型 (复杂类型 )

复杂类型 大小 描述ARRAY 不限 一组有序字段,字段类型必须相

同MAP 不限 无序键值对,键值内部字段类型

必须相同STRUCT 不限 一组字段,字段类型可以不同

Hive 提供了类似于 SQL 的查询语言 HiveQL 。◦ HiveQL 支持选择,投影,连接,聚合,合并以及 From中嵌套的子查询语句。

◦ HiveQL 允许在创建表的时候申明表的序列化格式,分区等 HiveQL 目前不支持行的删除和更新。

◦ HiveQL 支持多表的插入操作。

HiveQL 的常用操作◦ 创建表:创建一张名为 userinfo 的表,表中有两列 id 和 name ,

Hive Shell 中的创建命令为: create table userinfo (id int, name string) row format delimited fields terminated by ‘\t’; row format delimited fields terminated by ‘\t 是 HiveQL特有的,用来指定

数据的分隔方式

◦ 导入数据:建表后可以从本地文件系统或 HDFS 中导入数据文件,导入命令如下:

load data local inpath ‘/home/hadoop/1’ overwrite into table userinfo

HiveQL 的常用操作◦ 创建分区:创建一张名为 userinfo 的表,表中有两列 id 和 name ,并且对 name 进行分区,创建命令为:

create table userinfo (id int) partitioned by (name string) row format delimited fields terminated by ‘\t’;

◦ 创建桶:可以把表或者是分区组织成桶,桶是按行分开组织特定字段,每个桶对应一个 reduce 操作。在建立桶之前要设置hive.enforce.bucketing 属性,命令为:

set hive.enforce.bucketing; hive.enforce.bucketing=true create table userinfo (id int,name string) clusteredby (id) into 3 buckets row format delimited fields terminated by ‘\t’;

HiveQL 的常用操作◦ 多表插入:在同一条语句中,把读取的同一份元数据插入到不同表中。

from userinfo insert overwrite table t1 select id,name insert overwrite table t2 select count(distinct id),name group by name

◦ 修改表:重命名表,增加数据列 alter table userinfo rename to userinfo1 alter talbe userinfo1 add colums (grade string);

HiveQL 的常用操作◦ 连接, HiveQL 的连接分为内连接,左向外连接,右向外连接,全外连接和半连接。例如内链节:

select userinfo.*, choice.* from userinfo join choice on (userinf.id = choice.id);

◦ 子查询: HiveQL 只能在 from 引导的字句中出现子查询。 select teacher, MAX(class_num) from (select teacher, count(classname)

as class_num from classinfo group by teacher)subq group by teacher;

HiveQL 的扩展性◦ HiveQL 只有几十个内嵌的函数,但是可以通过编写

UDF(User-Defined Function) 来扩展功能。 Hive 的 UDF 包括三种。

◦ UDF(User-Defined Function) 支持一个输入产生一个输出。

◦ UDAF(User-Defined Aggregate Function) 支持多个输入一个输出。

◦ UDTF(Uers-Defined Table-Generating Function) 支持一个输入多个输出。

UDF 编程示例◦ UDF 类必须继承自 org.apache.hadoop.hive.ql.exec.UDF 类,并且实现 evaluate 方法。下面为对一个查询结果进行大小转化的 UDF 。

package com.cstoreImport org.apache.hadoop.hive.ql.UDF;….Public class lowerORupper extends UDF{

public Text evalute(Text t, String up_or_lower){…….}

}

UDAF 编程示例◦ UDAF 类必须继承自 org.apache.hadoop.hive.ql.exec.UDAF 类,并且在内部类中实现 org.apache.hadoop.hive.ql.exec.UDAFEvaluator 接口 , UDAFEvaluator 接口有五个方法:

◦ 1. init 方法负责对中间结果实现初始化;◦ 2. iterate 接收传入的参数,并进行内部的转化,其返回值类型为

boolean;◦ 3. terminatePartial 没有参数,负责返回 iterate函数轮转后的数据;◦ 4. merge 接收 terminatePartial 的返回结果,合并接收的中间值,返回

类型为 boolean;◦ 5. terminate返回最终结果。

Recommended