数据仓库(Data Warehouse )
1.1 基本概念
数据仓库的目的是构建面向分析的集成化的数据环境, 为企业提供决策支持 (Decision Support ).
数据仓库是存储数据的,企业的各种数据往里面存储,主要目的是为了分析有效数据,后续会基于它产出供分析挖掘的数据,或者数据应用需要的数据,如企业的分析性报告和各类报表等。
可以理解为: 面向分析的存储系统。
1.2 主要特征
数据仓库是面向主题的 (Subject-Oriented ) , 集成的( Integrated) ,非易失的(Non-Volatile) , 时变的(Time-Variant) 数据集合,用以支持管理决策。
1.2.1 面向主题
数据仓库是面向主题的,数据仓库通过一个个主题域将多个业务系统的数据加载到一起,为了各个主题 ( 如:用户,订单,商品等)进行分析而建,操作型数据库是为了支撑各种业务而建立。
1.2.2 集成性
数据仓库会将不同来源数据库中的数据汇总到一起,数据仓库中的综合数据不能从原有的数据库系统直接得到。因此在数据进入数据仓库之前,必然要经过统一与整和,这一步是数据仓库建设中最关键的,最复杂的一步(ETL),要统一源数据中的所有矛盾之处,如字段的同名异义,异名同义,单位不统一,字长不一致,等等。
1.2.3 非易失性
操作型数据库主要服务于日常的业务操作,使得数据库需要不断地对数据实时更新,以便迅速获得当前最新数据,不至于影响正常的业务运作。
在数据仓库中,不需要每一笔业务都实时更新到数据仓库,只要保存过去的业务数据,根据商业需要每隔一段时间把一批较新的数据导入数据仓库.数据仓库的数据反映的是一段相当长的时间内历史数据的内容,是不同时点的数据库的集合,以及基于这些快照进行统计,综合,重组的导出数据.
数据仓库中的数据一般仅仅执行查询操作,很少会有删除更新.但是会定期加载更新较新的数据.
1.2.4 时变性
数据仓库包含各种粒度的历史数据,数据仓库中的数据可能与某个特定日期,星期,月份,季度或者年份有关.数据仓库的目的是通过分析企业过去一段时间业务的经营状况,挖掘其中隐藏的模式.虽然数据仓库的用户不能修改数据,但数据从仓库的数据并不是永久不变的,需要定期的更新数据.
数据仓库的分析结果只能反映过去的情况,当业务变化之后,挖掘出的隐藏模式会失去时效性,因此数据仓库的数据需要定期更新,以适应决策的需要.
1.3 数据库和数据仓库的区别
数据库与数据仓库的区别实际上讲的是 OLTP 与 OLAP 的区别.
OLTP(On-line Transaction Processing) 操作型数据库,也叫联机事务处理,也可以称面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询,修改.用户较为关系操作的响应时间,数据的安全性,完整性和并发支持的用户数等问题.传统的数据库系统作为数据管理的主要手段,主要用于操作型数据处理.
OLAP(On-Line Analytical Processing) 分析型处理,也叫联机分析处理,一般针对某些主题的历史数据进行分析,支持管理决策.
首先要明白,数据仓库的出现,并不是要取代数据库.
*数据库是面向事务的设计,数据仓库是面向主题设计的
*数据库一般存储业务数据,数据仓库存储的一般是历史数据.
*数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的User 表,记录用户名,密码等简单数据即可,符合业务应用,但是不符合分析.数据仓库在设计是有意引入冗余,依照分析需求,分析维度,分析指标进行设计.
*数据库是为了捕获数据而设计,数据仓库是为分析数据而设计.
数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源,为了决策需要而产生的,它绝不是所谓的"大型数据库".
1.4 数据仓库的分层架构
按照数据流入流出的过程,数据仓库架构可分为三层--源数据,数据仓库,数据应用.
数据仓库的数据来源不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台.
*源数据层(ODS) : 此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备.
*数据仓库层(DW): 也称细节层, DW层的数据应该是一致的,准确的,干净的数据,即对源系统数据进行清洗 (去除杂质) 后的数据.
*数据应用层( DA 或 APP) : 前端应用直接读取的数据源;根据报表,专题分析需求而计算生成的数据.
数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是 ETL (抽取 Extra, 转化 Transfer ,装载 Load ) 的过程, ETL 是数据仓库的流水线,也可以认为是数据仓库的血液,它维系着数据仓库中数据的新陈代谢,而数据仓库的日常的管理和维护工作的大部分精力就是保持 ETL 的正常和稳定.
为什么要对数据仓库分层?
用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大.
通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆开成多个简单的工作,这样每一层的处理逻辑都相对简单和容易理解,这样我们也更容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部简单的调整某个步骤即可.
数据仓库的元数据管理
元数据(Meta Date) ,主要记录数据仓库中模型的定义,各层级间的映射关系,监控数据仓库的数据状态及 ETL 的任务运行状态.一般会通过元数据资料库( Metadata Repository) 来统一地存储和管理元数据,其只要目的是使数据仓库的设计,部署,操作和管理能达成协同和一致.
元数据是数据仓库管理系统的重要组成部分,元数据管理是企业级数据仓库中的关键组件,贯穿数据仓库构建的整个过程,直接影响着数据仓库的构建,使用和维护.
-
构建数据仓库的主要步骤之一是 ETL. 这时元数据将发挥重要的作用,它定义了源数据系统到数据仓库的映射,数据转换的规则,数据仓库的逻辑结构,数据更新的规则,数据导入历史记录以及装载周期等相关内容,数据抽取和转换的专家以及数据仓库管理员正是通过元数据高效地构建数据仓库.
*用户在使用数据仓库的时候,通过元数据访问数据,明确数据项的含义以及定制报表.
*数据仓库的规模及其复杂性离不开正确的元数据管理,包括增加或移除外部数据源,改变数据清洗方法,控制出错的查询以及安排备份等.
- 元数据可以分为技术元数据和业务元数据. 技术元数据为开发和管理数据仓库的 IT 人员使用,它描述了与数据仓库开发,管理和维护相关的数据,包括数据源信息,数据转换描述,数据仓库模型,数据清洗与更新规则,数据映射和访问权限等.而业务元数据为管理层和业务分析人员服务,从业务角度描述数据,包括商务术语,数据仓库中有哪些数据,数据的位置和数据的可用性等.帮助业务任务更好地理解数据仓库中哪些数据是可用的以及如何使用.
由上可见,元数据不仅定义了数据仓库中数据的模式,来源,抽取和转换规则等,而且是整个数据仓库系统运行的基础,元数据吧数据仓库系统中各个松散的组件联系起来,组成了一个个有机的整体.
2.Hive 的基本概念
2.1.Hive 简介
什么是 Hive
Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类 SQL 查询功能.
其本质是将 SQL 转换为 MapReduce 的任务进行运算,底层是由 HDFS来提供数据的存储,说白了 hive 可以理解为一个将 SQL 转换为 MapReduce 的任务的工具,甚至更进一步可以说 hive 就是一个 MapReduce 的客户端.
为什么使用 Hive
- 采用类 SQL 语法去操作数据,提供快速开发的能力.
- 避免了去写 MapReduce ,减少开发人员的学习成本.
- 功能扩展很方便.
2.2. Hive 架构
*用户接口: 包括CLI, JDBC/ODBC, WebGUI.其中, CLI(command line interface)为shell 命令行,JDBC/ODBC 是 Hive 的JAVA 实现, 与传统数据库 JDBC 类似; WebGUI 是通过浏览器访问 Hive.
*元数据存储: 通常是存储在关系数据库如 mysql/derby 中. Hive 将元数据存储在数据库中.Hive 中的元数据包括表名,表的列和分区及其属性,表的属性(是否为外部表等等),表的数据所在目录等.
*解释器,编译器,优化器,执行器: 完成 HQL 查询语句从语法分析,编译,优化,以及查询计划生成.生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用并执行.
2.3 Hive 与 Hadoop 的关系
Hive 利用 HDFS 存储数据,利用 MapReduce 查询分析数据
2.4 Hive与传统数据库对比
hive 用于海量数据的离线数据分析
总结: Hive 具有 Sql 数据库的外表,但应用场景完全不同
2.6. Hive 的交互方式
第一种进入Hive 目录的交互方式 bin/hive
cd /export/servers/apache-hive-2.1.1-bin/
bin/hive
创建一个数据库
create database if not exists mytest;
第二种交互方式: 使用 Sql 语句或者 Sql 脚本进行交互
不进入Hive的客户端直接执行 hive 的 hql 语句
cd /export/servers/apache-hive-2.1.1-bin
bin/hive -e "create database if not exists mytest;"
或者我们可以将我们的hql 语句写成一个 sql 脚本然后执行
cd/ export /servers
vim hive.sql
sql 脚本
create database if not exists mytest;
use mytest;
create table stu(id int ,name string);
通过hive -f 来执行我们的 Sql 脚本
bin/hive -f /export/servers/hive.sql
3.Hive 的基本操作
3.1 数据库操作
3.1.1 创建数据库
create database if not exists myhive;
use myhive;
说明:hive的表存放仓库(warehouse)位置模式是由hive-site.xml当中的一个属性指定的
hive.metastore.warehouse.dir
/user/hive/warehouse
3.1.3 创建数据库并指定位置
create database myhive2 location '/myhive2';
3.1.3 设置数据库键值对信息
数据库可以有一些描述性的键值对信息,在创建的时候进行添加:
create database foocoyi with dbproperties ('owner' = 'coyi','data'='2019');
查看数据库的键值对信息:
describe database extened foocoyi;
- 修改数据库的键值对信息
alter database foocoyi set dbproperties ('owner' = 'coyilove');
3.1.4 查看数据库更多详细的信息
desc database extended foocoyi;
3.1.5 删除数据库
删除一个空数据库,如果数据库下面有数据表,那么就会报错
drop database foocoyi;
强制删除数据库,包含数据库下面的表一起删除
drop database foocoyi cascade;
3.2 数据库表操作
3.2.1 创建表的语法:
1 create [ external ] table [ if not exists ] 表名table_name (
2 列名col_name 数据类型data_type [ comment '字段描述信息' ]
3 列名col_name 数据类型data_type [ comment '字段描述信息’ ] )
4 [ comment '表的描述信息' ]
5 [ partitioned by ( 列名col_name 数据类型data_type , ... ) ]
6 [ clustered by ( 列明col_name , 列名col_name , ... ) ]
7 [ sorted by ( 列名col_name [ asc | desc ] , ... ) into 分桶数num_buckets buckets ]
8 [ row format row_format ]
9 [ storted as .... ]
10 [ location '指定表的路径 ' ]
说明
1. create table
创建一个指定名字的表,如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
2. external
可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径( LOCATION ) , Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何修改。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
3. comment
表示注释,默认不能使用中文
4. partitioned by
表示使用表分区,一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。
5. clustered by
对于每一个表分区文件, Hive 可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive 也是针对某一列进行桶的组织。
6. sorted by
指定排序字段和排序规则
7. row format
指定表文件字段分隔符
8. stored as
指定表文件的存储格式,常用格式:
SEQUENCEFILE
TEXTFILE
RCFILE
如果文件数据是纯文本,可以使用 Stored as TEXTFILE 。
如果数据需要压缩,使用 Stored as SEQUENCEFILE 。
9. location
指定表文件的存储路径
Hive 建表字段类型
3.2.2 内部表的操作
创建表时,如果没有使用 external 关键字,则该表是内部表 (managed table )
3.2.2.1建表入门:
1 use myhive;
2 create table stu ( id int , name string );
3 insert into stu values ( 1 , "zhangsan" ); #插入数据
4 select * from stu ;
3.2.2.2 创建表并指定字段之间的分隔符
create table if not exists stu2(id int, name string ) row format delimited fields terminated by '\t';
创建表并指定表文件的存放路径
create table if not exists stu2 ( id int , name string ) row format delimited fields terminated by '\t ' location '/user/stu2';
根据查询结果创建表
create table stu3 as select * from stu2;
根据已经存在的表的结构创建表
create table stu4 like stu;
查询表的详细信息
desc formatted stu2;
删除表
drop table stu4;
3.2.4 外部表的操作
外部表说明
外部表因为是指定其他的hdfs 路径的数据加载到表当中来,所以hive 表会认为自己不完全独占这份数据,所以删除hive 表的时候,数据仍然放在 hdfs 当中,不会删除.
内部表和外部表的使用场景
每天将收集到的网站日志定期流入 HDFS 文本文件中,在外部表(原始日志表) 的基础上做大量的统计分析,用到的中间表,结果表使用内部表存储,数据通过 Select + Insert 进入内部表.
操作案列
分别常见老师与学生外部表,并向表中加载数据
创建老师表
create exterbnal table teacher (t_id string , t_name string ) row format delimited fields terminated by '\t';
Hive,结构化数据,数据仓库,还在HDFS上,类SQL方式处理,MR很难写,Hadoop上查询。
2.不能用于:
不是关系型数据库,不适合在线处理OLTP,是延迟性很高的操作,不适用于实时查询和行级行级更新。
3.Hive的特点
Hive存储数据结构(sechema)在数据库中,处理的数据,进入HDFS
OLAP分析处理
Hsql / Hql / HiveQL
可伸缩,可扩展,快
3.Hive架构
处理数据:HDFS/HBASE
meta strore 元数据,放在MySQL,
查询引擎:使用类SQL命令
执行引擎/MapReduce
最上层:用户接口,Hive命令行,web ui
4.流程:
先去查询元数据,编译,然后MapReduce,最后返回
5.Hive中查看表的数据是不是一定会转换成 MAPReduce?
答: "不一定,比如查询所有的操作,根本不会转成MAPReduce,因为我们在插入的时候已经转换了。你查询所有的数据,根本就不需要聚合的过程,直接通过HDFS 文件访问就可以了,所以不需要转换成mapreduce 座作业。
6.怎么把数据导入到HIVE 中呢,?
load data inpath '/home/centos/a.txt' into table t2;
上面这种方法是移动,相当于剪切的方式
7。辅复制表
like 不带数据
as 带数据,
create table t1 as select * from aa;
8。 分区表就是一个文件夹,这是hive 的一个常见的优化方式之一。
典型: 日志一天一个T 的日志,以分区表的方式进行存储,最近一个周的销量,通过分区查询最近一周的一个子目录,假如不建立分区,那么就需要进行搜索所有的文件.可能会把前年的文件也给搜索了 。创建分区的目的只是在更高的目录层面上面,来缩小目录的层面范围,
在我们常规的mysql 中,year , month , day 等等都是属于字段,但是在 hive 中,这些并不是字段 了,而是一种目录结构,但是我们在查询的时候完全可以以字段的形式进行查询。