1、 大数据导论第七章CONTENTS目录PART 01 数据仓库概述PART 02 数据仓库Hive概述PART 03 Hive和数据库的比较PART 04 Hive的体系架构PART 05 Hive的工作流程PART 06 Hive数据类型PART 07 HiveQL:数据定义与操作PART 08 HiveQL:查询PART 09 Hive模式设计PART 10 作业PART 01 数据仓库概述数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。数据仓库的定义数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。根据数据仓库
2、概念的含义,数据仓库拥有以下四个特点:1.面向主题2.集成的3.相对稳定的4.反映历史变化数据仓库的定义n 面向主题 数据仓库中的数据是按照一定的主题域进行组织。主题是一个抽象的概念,是指用户使用数据仓库进行决策时所关心的重点方面,一个主题通常与多个操作型信息系统相关。n 集成的 在数据仓库系统中,无论何种数据源,无论是Access、SQL Server、MySQL还是Oracle,甚至是系统访问日志中的数据,都会被统一装入到同一个数据仓库系统。数据仓库的定义n 相对稳定的 数据仓库中的数据,一旦从数据源中存入,便不会再进行任何修改,只会在此基础上进行进一步的分析处理。n 反映历史变化 数据仓
3、库中的数据通常包含历史信息,系统记录了企业从过去某一时点,如开始应用数据仓库的时点,到目前的各个阶段的信息。通过这些信息,可以对企业的发展历程和未来趋势做出定量分析和预测。数据仓库与操作数据库操作数据库称作联机事务处理(OLTP)系统,主要任务执行联机事务处理和查询处理。数据仓库系统即联机分析处理(OLAP),在数据分析和决策支持方面为用户或者机器学习提供服务。二者的主要区别在于五个大的方面:1.用户系统的面向性2.数据内容3.数据库设计4.视图5.访问模式数据仓库与操作数据库p 用户系统的面向性:OLTP是面向客户的,而OLAP是面向市场的;p 数据内容:OLTP主要是面向当前的业务,而OL
4、AP是需要使用历史数据的;p 数据库设计:OLTP是根据实体关系进行设计,而OLAP是面向主题进行设计的;p 视图:OLTP是面向个别具体问题的,而OLAP是要面向整个企业全景的;p 访问模式:OLTP是原子事务操作,而OLAP是只读操作。数据仓库的架构数据仓库的架构主要由四层组成。数据源 数据仓库服务器 OLAP服务器 前端工具数据仓库的架构p 数据源 是数据仓库系统的基础,是整个系统的数据源泉。通常包括企业内部信息和外部信息。p 数据仓库服务器 是整个数据仓库系统的核心。数据仓库的真正关键是数据的存储和管理。p OLAP服务器 对分析需要的数据进行有效集成,按多维模型予以组织,以便进行多角
5、度、多层次的分析,并发现趋势。p 前端工具 主要包括各种报表工具、查询工具、数据分析工具、数据挖掘工具,以及各种基于数据仓库或数据集市的应用开发工具。传统数据仓库的问题进入大数据时代,传统架构的数据仓库遇到了非常多的挑战。传统数据仓库有如下几个问题:1.无法满足快速增长的海量数据存储需求2.无法处理不同类型的数据3.传统数据仓库建立在关系型数据仓库之上,计算和处理能力不足4.过去的数据库没有提供搜索和数据挖掘的能力,而这些需求已经是企业的刚需。PART 02 数据仓库Hive概述Hive是基于Hadoop的数据仓库,可对存储在HDFS上的文件中的数据集进行数据整理、特殊查询和分析处理,提供了类
6、似于SQL语言的查询语言HiveQL。数据仓库Hive概述Hive是基于Hadoop的数据仓库,可对存储在HDFS上的文件中的数据集进行数据整理、特殊查询和分析处理,提供了类似于SQL语言的查询语言HiveQL。Hive把HQL语句转换成MapReduce任务后,采用批处理的方式对海量数据进行处理。但Hive不是一个数据库。Hive不支持OLTP(联机事务处理)所需的关键功能,而更接近成为一个OLAP(联机分析)工具。PART 03 Hive和数据库的比较Hive是基于Hadoop平台的数据仓库,与传统的数据库有着根本的差别。Hive与数据库的比较查询语言HQLSQL数据存储位置HDFSRaw
7、 Device 或者 Local FS数据格式用户定义系统决定数据更新不支持支持索引无有执行MapReduceExecutor执行延迟高低可扩展性高低数据规模大小Hive建立在Hadoop的分布式文件系统(HDFS)和MapReduce系统之上。PART 04 Hive的体系架构Hive的体系架构Hive的体系架构Hive体系架构的组件可以分为两大类:p 服务端组件 Driver组件 Metastore组件 Thrift服务p 客户端组件 CLI Thrift客户端 WEB GUIHive的体系架构各组件作用如下:p Driver组件 将用户的HiveQL语句进行解析、编译优化,生成执行计划,
8、然后调用底层的MapReduce计算框架。Hive驱动程序把元数据存储在数据库中。p Metastore组件 存储Hive的元数据。Hive支持把Metastore服务独立出来,安装到远程的服务器集群里,从而解耦Hive 服务和Metastore服务,保证Hive运行的可靠性。Hive的体系架构各组件作用如下:p Thrift服务 用来进行可扩展且跨语言的服务的开发,Hive集成了该服务,能让不同的编程语言调用Hive的接口。p CLI Command Line Interface,命令行接口。架构图的最上面包括一个命令行接口(CLI),可以在Linux终端窗口向Hive驱动程序直接发出查询或
9、管理命令。Hive的体系架构各组件作用如下:p Thrift客户端 Hive架构的许多客户端接口是建立在Thrift客户端之上,包括JDBC和ODBC接口。p WEB GUI客户端提供了通过网页的方式访问Hive所提供的服务。这个接口对应Hive的HWI组件(Hive Web Interface)。Hive的主要工作就是把用户提交的HQL查询转换成MapReduce程序,并提交给Hadoop的MapReduce计算框架执行,最后再把执行结果返回给用户。PART 05 Hive的工作流程Hive的工作流程Hive的工作流程Hive的具体工作流程如下:1.Execute Query:Hive界面如
10、命令行或Web UI将查询发送到Driver(任何数据库驱动程序如JDBC、ODBC等)来执行;2.Get Plan:Driver根据查询编译器解析查询语句(Query),验证查询语句的语法,查询计划或者查询条件;3.Get Metadata:编译器将元数据请求发送给Metastore;4.Send Metadata:Metastore将元数据作为响应发送给编译器;5.Send Plan:编译器检查要求和重新发送Driver的计划。查询的解析和编译完成;Hive的工作流程Hive的具体工作流程如下:6.Execute Plan:Driver将执行计划发送到执行引擎;6.1 Execute Jo
11、b:Hadoop内部执行的是MapReduce工作过程,任务执行引擎发送一个任务到资源管理节点(Job Tracker),资源管理器分配该任务到任务节点(Task Trackers),由任务节点上开始执行MapReduce任务;6.1 Metadata Ops:在执行引擎发送任务的同时,对Hive的元数据进行相应操作;6.2 Job Done:MapReduce任务执行完毕以后,通知执行引擎;Hive的工作流程Hive的具体工作流程如下:7.Fetch Results:执行引擎接收数据节点(Data Node)的结果;8.Send Results:执行引擎发送这些合成值到Driver;9.fe
12、tch Results:Driver将结果发送到Hive接口。Hive支持基本数据类型和复杂类型,基本类型包括数值型,Boolean,字符串,时间戳。复杂类型包括数组,Map、和Struct。PART 06 Hive数据类型基本数据类型Hive的基本数据类型包括:1.整数类型2.小数类型3.文本类型4.Boolean5.二进制6.时间类型基本数据类型n 1.整数类型 Hive有4种带符号的整数类型:TINYINT、SMALLINT、INT、BIGINT,分别对应Java中的byte、short、int、long,字节长度分别为1、2、4、8字节。在使用整数字面量时,默认情况下为INT,如果要声
13、明为其他类型,通过后缀来标识。类型描述后缀示例TINYINT1字节的有符号整数,-128127Y10YSMALLINT 2个字节的有符号整数,-3276832767S10SINT4个字节的带符号整数-10BIGINT8字节带符号整数L10L基本数据类型n 2.小数类型 浮点类型包括FLOAT和DOUBLE两种,分别为32位和64位浮点数。DECIMAL用于表示任意精度的小数,通常在货币当中使用。类型描述示例FLOAT4字节单精度浮点数1.01500.00DOUBLE8字节双精度浮点数750000.00DECIMAL17字节任意精度的带符号小数 DECIMAL(5,2)基本数据类型n 3.文本类
14、型 Hive有3种类型用于存储字文本。STRING存储变长的文本,对长度没有限制。VARCHAR与STRING类似,但是长度上只允许在1-65355之间。CHAR则用固定长度来存储数据。类型描述示例STRING字符串,变长。使用单引号或双引号来指定Welcome to use Hive.VARCHAR变长字符串,最长65355字节 Welcome to use Hive.CHAR固定长度字符串Welcome!基本数据类型n 4.Boolean Boolean表示二元的true或false。n 5.二进制 BINARY用于存储变长的二进制数据。n 6.二进制 TIMESTAMP类型支持传统的UN
15、IX时间戳可选纳秒的精度,支持的java.sql.Timestamp格式“YYYY-MM-DD HH:MM:SS.fffffffff”和格式“YYYY-MM-DD HH:MM:ss.ffffffffff”。DATE类型则表示日期,对应年月日三个部分,格式形式描述为 YYYY-MM-DD。复杂数据类型Hive的基本数据类型包括:1.ARRAY2.MAP3.STRUCT4.UNION复杂数据类型n 1.2.ARRAY和MAP ARRAY和MAP类型对应于Java中的数组和映射表。数组是有序的同类型的集,声明格式为ARRAY,元素访问通过0开始的下标,例如arrays1访问第二个元素。MAP是键值对
16、集合,key必须为基本类型,value可以是任何类型。MAP通过MAP来声明。Map的元素访问则使用,例如mapkey1。复杂数据类型n 3.STRUCT STRUCT则封装一组有名字的字段,其类型可以是任意的基本类型,元素的访问使用点号。例如,如果列Name的类型是STRUCTfirst STRING,last STRING,那么第一个元素可以通过Name.first来访问。n 4.UNION UNION是异类的数据类型的集合。在给定的任何一个时间点,UNION类型可以保存指定数据类型中的任意一种。UNION类型声明语法为UNIONTYPE。HQL的数据定义,用于创建、修改和删除数据库和创建
17、、修改和删除表;HQL的数据操作,用于将数据加载到Hive表中,以及将数据抽取到文件系统中。PART 07 HiveQL:数据定义与操作Hive创建数据库Hive中的数据库本质上就是一个表目录,通过使用数据库来组织表可以避免表名冲突。如果用户在创建表的时候没有显式地指定数据库,那么将会使用默认的数据库default。1.命令格式CREATE DATABASE|SCHEMA IF NOT EXISTS 创建一个名为userdb的数据库:hive CREATE DATABASE IF NOT EXISTS userdb;随时可以通过SHOW命令来查看Hive中所包含的数据库:hive SHOW D
18、ATABASES;default userdbHive创建数据库2.JDBC程序 可以在Java程序里使用JDBC操作Hive,和使用普通JDBC数据库一样。创建数据库的JDBC程序如下:import java.sql.SQLException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import java.sql.DriverManager;public class HiveCreateDb private static String driverName=org.apach
19、e.hadoop.hive.jdbc.HiveDriver;public static void main(String args)throws SQLException /Register driver and create driver instance Class.forName(driverName);/get connection Connection con=DriverManager.getConnection(jdbc:hive:/localhost:10000/default,);Statement stmt=con.createStatement();stmt.execut
20、eQuery(CREATE DATABASE userdb);System.out.println(Database userdb created successfully.);con.close();Hive删除数据库当不需要的时候,用户可以删除数据库。如果某个数据库被删除了,那么其对应的目录也同时会被删除。1.命令格式DROP DATABASE StatementDROP DATABASE IF EXISTS database_name RESTRICT|CASCADE;删除名为userdb的数据库:hive DROP DATABASE IF EXISTS userdb;Hive删除数据库
21、2.JDBC程序 删除数据库的JDBC程序如下:import java.sql.SQLException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import java.sql.DriverManager;public class HiveDropDb private static String driverName=org.apache.hadoop.hive.jdbc.HiveDriver;public static void main(String args)throws
22、 SQLException /Register driver and create driver instance Class.forName(driverName);/get connection Connection con=DriverManager.getConnection(jdbc:hive:/localhost:10000/default,);Statement stmt=con.createStatement();stmt.executeQuery(DROP DATABASE userdb);System.out.println(“Drop userdb database su
23、ccessful.”);con.close();Hive创建表Hive的表有内部表和外部表两大类。内部表也称为管理表。Hive会控制内部表数据的生命周期,当删除一个内部表的时候,Hive也会删除这个表中的数据。但是,内部表不方便与其他数据处理系统共享数据。外部表是外部的,所以Hive并不拥有外部表的数据,只是有权使用这些数据。因此,删除外部表的时候,并不会删除这份数据,只是把描述表的元数据删除。Hive创建表1.命令格式CREATE TABLE IF NOT EXISTS db_name.table_name(col_name data_type COMMENT col_comment,.)C
24、OMMENT table_commentROW FORMAT row_formatSTORED AS file_format创建一个名为employee表,表中字段和数据类型如下:Sr.No字段名称数据类型1Eidint2NameString3SalaryString4DesignationstringHive创建表hive CREATE TABLE IF NOT EXISTS employee(eid int,name String,salary String,designation String)COMMENT Employee details ROW FORMAT DELIMITED F
25、IELDS TERMINATED BY t LINES TERMINATED BY n STORED AS TEXTFILE;Hive创建表2.JDBC程序 创建表的JDBC程序如下:import java.sql.SQLException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import java.sql.DriverManager;public class HiveCreateTable private static String driverName=org.apac
26、he.hadoop.hive.jdbc.HiveDriver;public static void main(String args)throws SQLException /Register driver and create driver instance Class.forName(driverName);/get connection Connection con=DriverManager.getConnection(jdbc:hive:/localhost:10000/userdb,);/create statement Statement stmt=con.createState
27、ment();/execute statement stmt.executeQuery(CREATE TABLE IF NOT EXISTS +employee(eid int,name String,+salary String,designation String)+COMMENT Employee details +ROW FORMAT DELIMITED +FIELDS TERMINATED BY t +LINES TERMINATED BY n +STORED AS TEXTFILE;);System.out.println(“Table employee created.”);co
28、n.close();Hive加载数据Hive没有行级别的数据插入、数据更新和删除操作,那么往表中添加数据的唯一途径就是使用一种“大量”的数据加载操作。有两种方法可以用来加载数据:l 从本地文件系统l 从Hadoop文件系统1.命令格式LOAD DATA LOCAL INPATH filepath OVERWRITE INTO TABLE tablename PARTITION(partcol1=val1,partcol2=val2.)Hive加载数据1201 Gopal 45000 Technical manager1202 Manisha 45000 Proof reader1203 Mas
29、thanvali 40000 Technical writer1204 Kiran 40000 Hr Admin1205 Kranthi 30000 Op Admin要将下面的数据加载到表中,这些数据存储在/home/user目录中名为sample.txt的文件中。加载文本数据到表中hive LOAD DATA LOCAL INPATH/home/user/sample.txt OVERWRITE INTO TABLE employee;Hive加载数据2.JDBC程序 将给定的数据加载到表中的JDBC程序如下:import java.sql.SQLException;import java.
30、sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import java.sql.DriverManager;public class HiveLoadData private static String driverName=org.apache.hadoop.hive.jdbc.HiveDriver;public static void main(String args)throws SQLException /Register driver and create driver instance Class
31、.forName(driverName);/get connection Connection con=DriverManager.getConnection(jdbc:hive:/localhost:10000/userdb,);/create statement Statement stmt=con.createStatement();/execute statement stmt.executeQuery(LOAD DATA LOCAL INPATH/home/user/sample.txt+OVERWRITE INTO TABLE employee;);System.out.print
32、ln(Load Data into employee successful);con.close();Hive修改表大多数Hive表的属性可以通过ALTER TABLE语句来进行修改。这种操作会修改元数据,但不会修改数据本身。这些语句主要用来修改表模式中出现的错误、改变分区路径,以及其他一些操作。一Rename To 语句ALTER TABLE name RENAME TO new_nameALTER TABLE name ADD COLUMNS(col_spec,col_spec.)ALTER TABLE name DROP COLUMN column_nameALTER TABLE nam
33、e CHANGE column_name new_name new_typeALTER TABLE name REPLACE COLUMNS(col_spec,col_spec.)1.命令格式 修改表名、添加列、删除列、修改列名、替换列Hive修改表把表名从employee修改为emp:hive ALTER TABLE employee RENAME TO emp;2.JDBC程序 对表进行重命名的JDBC程序如下:import java.sql.SQLException;import java.sql.Connection;import java.sql.ResultSet;import j
34、ava.sql.Statement;import java.sql.DriverManager;public class HiveAlterRenameTo private static String driverName=org.apache.hadoop.hive.jdbc.HiveDriver;public static void main(String args)throws SQLException /Register driver and create driver instance Class.forName(driverName);/get connection Connect
35、ion con=DriverManager.getConnection(jdbc:hive:/localhost:10000/userdb,);/create statement Statement stmt=con.createStatement();/execute statement stmt.executeQuery(ALTER TABLE employee RENAME TO emp;);System.out.println(Table Renamed Successfully);con.close();Hive修改表二Change 语句hive ALTER TABLE employ
36、ee CHANGE name ename String;hive ALTER TABLE employee CHANGE salary salary Double;1.命令格式 修改列名和列数据类型2.JDBC程序import java.sql.SQLException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import java.sql.DriverManager;public class HiveAlterChangeColumn private static Strin
37、g driverName=org.apache.hadoop.hive.jdbc.HiveDriver;public static void main(String args)throws SQLException /Register driver and create driver instance Class.forName(driverName);/get connection Connection con=DriverManager.getConnection(jdbc:hive:/localhost:10000/userdb,);/create statement Statement
38、 stmt=con.createStatement();/execute statement stmt.executeQuery(ALTER TABLE employee CHANGE name ename String;);stmt.executeQuery(ALTER TABLE employee CHANGE salary salary Double;);System.out.println(Change column successful.);con.close();Hive修改表三添加列语句hive ALTER TABLE employee ADD COLUMNS(dept STRI
39、NG COMMENT Department name);1.命令格式 增加一个列名dept在employee表。2.JDBC程序import java.sql.SQLException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import java.sql.DriverManager;public class HiveAlterAddColumn private static String driverName=org.apache.hadoop.hive.jdbc.HiveD
40、river;public static void main(String args)throws SQLException /Register driver and create driver instance Class.forName(driverName);/get connection Connection con=DriverManager.getConnection(jdbc:hive:/localhost:10000/userdb,);/create statement Statement stmt=con.createStatement();/execute statement
41、 stmt.executeQuery(ALTER TABLE employee ADD COLUMNS +(dept STRING COMMENT Department name););System.out.prinln(Add column successful.);con.close();Hive修改表四REPLACE 语句hive ALTER TABLE employee REPLACE COLUMNS(eid INT empid Int,ename STRING name String);1.命令格式 empid代替eid列,name代替ename列2.JDBC程序import jav
42、a.sql.SQLException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import java.sql.DriverManager;public class HiveAlterReplaceColumn private static String driverName=org.apache.hadoop.hive.jdbc.HiveDriver;public static void main(String args)throws SQLException /Registe
43、r driver and create driver instance Class.forName(driverName);/get connection Connection con=DriverManager.getConnection(jdbc:hive:/localhost:10000/userdb,);/create statement Statement stmt=con.createStatement();/execute statement stmt.executeQuery(ALTER TABLE employee REPLACE COLUMNS +(eid INT empi
44、d Int,+ename STRING name String););System.out.println(Replace column successful);con.close();Hive删除表当从Hive Metastore删除表,它删除了表/列的数据及其元数据。1.命令格式DROP TABLE IF EXISTS table_name;删除名为employee的表:DROP TABLE IF EXISTS employee;2.JDBC程序import java.sql.SQLException;import java.sql.Connection;import java.sql.R
45、esultSet;import java.sql.Statement;import java.sql.DriverManager;public class HiveDropTable private static String driverName=org.apache.hadoop.hive.jdbc.HiveDriver;public static void main(String args)throws SQLException /Register driver and create driver instance Class.forName(driverName);/get conne
46、ction Connection con=DriverManager.getConnection(jdbc:hive:/localhost:10000/userdb,);/create statement Statement stmt=con.createStatement();/execute statement stmt.executeQuery(DROP TABLE IF EXISTS employee;);System.out.println(Drop table successful.);con.close();Hive分区Hive分区是指按照数据表的某列或某些列分为多个区,区从形式
47、上可以理解为文件夹。1.给表添加分区 命令格式ALTER TABLE table_name ADD IF NOT EXISTS PARTITION(p_column=p_col_value,p_column=p_col_value,.)LOCATION location1(p_column=p_col_value,p_column=p_col_value,.)LOCATION location2.;Hive分区hive ALTER TABLE employee ADD PARTITION(year=2012)location/2012/part2012(year=2013)location/2
48、013/part2013;有一个表叫employee,拥有如Id、Name、Salary、Designation、Dept、和yoj等字段。以下命令用于将添加两个分区到employee表。2.重命名分区 命令格式ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;Hive分区hive ALTER TABLE employee PARTITION(year=2013)RENAME TO PARTITION(Yoj=2013);重新命名一个分区:3.删除分区 命令格式ALTER TAB
49、LE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;hive ALTER TABLE employee DROP IF EXISTS PARTITION(year=1203);删除一个分区:Hive导出数据将Hive表中的数据导出,可以根据导出的地方不同,将这些方式分为三种:导出到本地文件系统;导出到HDFS中;导出到Hive的另一个表中。1.导出到本地文件系统hive INSERT OVERWRITE LOCAL DIRECTORY/home/wzx/sample SELECT*FROM user
50、_table;2.导出到HDFShive INSERT OVERWRITE DIRECTORY/home/wzx/hdfs SELECT*FROM user_table;Hive导出数据3.导出到另一张Hive表中hive insert into table test partition(age=25)select id,name,tel from user_table;Hive外部表外部表是外部的,所以Hive并不拥有外部表的数据,只是有权使用这些数据。因此,删除外部表的时候,并不会删除这份数据,只是把描述表的元数据删除。1.创建外部表hive CREATE EXTERNAL TABLE u