数据仓库 -Hive

19

description

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

Transcript of 数据仓库 -Hive

Page 1: 数据仓库 -Hive
Page 2: 数据仓库 -Hive
Page 3: 数据仓库 -Hive

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

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

Page 4: 数据仓库 -Hive

◦ Hive 的体系结构

Hadoop

H

JobTracker

NameNode

Hive

Driver(Compiler,Optimizer,Executor)

ThriftServer

CLIJDBC/ODBC

WebGUI

Metastore

Page 5: 数据仓库 -Hive

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

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

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

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

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

Page 6: 数据仓库 -Hive

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

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

Page 7: 数据仓库 -Hive

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

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

Page 8: 数据仓库 -Hive

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

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

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

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

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

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

Page 9: 数据仓库 -Hive

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

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

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

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

Page 10: 数据仓库 -Hive

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

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

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

Page 11: 数据仓库 -Hive

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

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

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

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

Page 12: 数据仓库 -Hive

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

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

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

Page 13: 数据仓库 -Hive

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

Page 14: 数据仓库 -Hive

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’;

Page 15: 数据仓库 -Hive

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);

Page 16: 数据仓库 -Hive

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;

Page 17: 数据仓库 -Hive

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

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

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

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

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

Page 18: 数据仓库 -Hive

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){…….}

}

Page 19: 数据仓库 -Hive

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返回最终结果。