1、数据仓库基本概念
(1)数据仓库的英文名称为Data Warehouse,可简写为DW或DWH。
(2)数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。它出于分析性报告和决策支持的目的而创建。
(3)数据仓库本身并不“生产”数据,同时自身也不需要“消费”数据;
(4)数据来源于外部,并且开放给外部应用;
2、数据仓库的主要特征
(1)面向主题的(Subject-Oriented):有特定目的而建立数据仓库;
(2)集成的(Integrated):将所有要用到的数据集合在一起;
(3)非易失的(Non-Volatile):历史数据一般不会改变(数仓用于记录已经发生的数据);
(4)时变的(Time-Variant ):分析工具可能会发生改变。
3、 数据仓库与数据库区别
数据库 | 数据仓库 |
有事务保证 | 用于数据分析 |
主要用于OLTP 联机事务处理; | 主要是用于OLAP联机分析处理 |
面向事务 | 面向主题 |
存储业务数据 | 存储历史数据 |
尽量避免冗余 | 有意引入冗余,依照分析需求,分析维度、分析指标进行设计。 |
为捕获数据而设计 | 为分析数据而设计 |
| 不是“大型数据库”。 |
OLTP (On-Line Transaction Processing) 联机事务处理;
OLAP(On-Line Analytical Processing ) 联机分析处理;
4、数据仓库分层架构
数据仓库架构可分为三层——源数据层、数据仓库层、数据应用层。
源数据层(ODS): 贴源层,保存着原始的数据,为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备
数据仓库层(DW) :数据仓库层,也称为细节层 ,做数据的分析处理,写hql,即对源系统数据进行了清洗(去除了杂质)后的数据。
数据应用层(DA或APP): 数据的展示层,做报表的可视化展现,前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。
数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra, 转化Transfer, 装载Load)的过程,ETL是数据仓库的流水线,
为什么要对数据仓库分层?
(1)用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。
(2)通过数据分层管理可以简化数据清洗的过程。
5、Hive基本概念
(1)Hive是基于Hadoop的一个数据仓库工具 ;
(2)可以将结构化的数据文件映射为一张数据库表 ,并提供类SQL查询功能。
(3)本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据的存储支持;
6、Hive与数据库的区别
Hive 具有 SQL 数据库的外表,但应用场景完全不同;Hive 只适合用来做海量离线数据统计分析,也就是数据仓库 ;下表是Hive与关系型数据的区别:
7、Hive的优缺点
优点:
(1)操作接口采用类SQL语法,提供快速开发的能力;
(2)避免了去写MapReduce,减少开发人员的学习成本;
(3)Hive支持用户自定义函数,可以根据自己的需求来实现自己的函;
缺点:
(1)Hive 的查询延迟很严;
(2)Hive 不支持事务 。
8、Hive架构原理
(1)用户接口:Client,分为一下三部分:
- CLI(hive shell)
- JDBC/ODBC(java访问hive)
- WEBUI(浏览器访问hive)
(2)元数据:Metastore
- 元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
- 默认存储在自带的derby数据库中 ;
(3)Driver:驱动器,包括四部分:
解析器(SQL Parser):(即hql -> 解析hql语句的)
- 将SQL字符串转换成抽象语法树AST
- 对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误
编译器(Physical Plan):将AST编译生成逻辑执行计划
优化器(Query Optimizer):对逻辑执行计划进行优化
执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说默认就是mapreduce任务。
(4)Hadoop集群:使用HDFS进行存储,使用MapReduce进行计算。
9、Hive的交互方式
使用Hive之前:
- 先启动hadoop集群:因为hql语句会被编译成MR任务提交到集群运行;hive表数据一般存储在HDFS上;
- mysql服务:因为对hive操作过程中,需要访问mysql中存储元数据的库及表。
Hive的交互方式主要有三种:
(1)Hive交互shell
在任意路径运行hive,如[hadoop@node03 ~]$ hive
(2)Hive JDBC服务(开发中使用)
启动hiveserver2服务,包括前台启动与后台启动两种方式:
- 前台启动 :在任意路径输入命令hive --service hiveserver2
- 后台启动 :在任意路径输入命令nohup hive --service hiveserver2 &
beeline连接hiveserver2服务 :在任意目录输入beeline回车,再输入 !connect jdbc:hive2://node03:10000,用户名为hadoop,密码为空即可,如图:
退出:输入!quit回车即可(0: jdbc:hive2://node03:10000> !quit)
(3)Hive的命令
- 使用 –e 参数来直接执行hql语句,如:[hadoop@node03 ~]$ hive -e "show databases";
- 使用 –f参数执行包含hql语句的文件 ,如[hadoop@node03 install]$ hive -f /kkb/install/hive.sql 。
10、Hive的数据类型
(1)基本数据类型
类型名称 | 描述 | 举例 |
---|---|---|
boolean | true/false | true |
tinyint | 1字节的有符号整数 | 1 |
smallint | 2字节的有符号整数 | 1 |
int | 4字节的有符号整数 | 1 |
bigint | 8字节的有符号整数 | 1 |
float | 4字节单精度浮点数 | 1.0 |
double | 8字节单精度浮点数 | 1.0 |
string | 字符串(不设长度) | “abc” |
varchar | 字符串(1-65355长度,超长截断) | “abc” |
timestamp | 时间戳 | 1563157873 |
date | 日期 | 20190715 |
(2)复合数据类型
类型名称 | 描述 | 举例 |
---|---|---|
array | 一组有序的字段,字段类型必须相同 array(元素1,元素2) | Array(1,2,3) |
map | 一组无序的键值对 map(k1,v1,k2,v2) | Map(‘a’,1,'b',2) |
struct | 一组命名的字段,字段类型可以不同 struct(元素1,元素2) | Struct('a',1,2,0) |
array类型的字段的元素访问方式:
- 通过下标获取元素,下标从0开始;
- 如获取第一个元素array[0]
map类型字段的元素访问方式:
- 通过键获取值,如获取a这个key对应的value:map['a']
struct类型字段的元素获取方式:
- 定义一个字段c的类型为struct{a int, b string}
- 获取a和b的值使用c.a 和c.b 获取其中的元素值
- 这里可以把这种类型看成是一个对象
如:创建一张表,包含了array、map、struct类型的字段:
create table complex(
col1 array<int>,
col2 map<string,int>,
col3 struct<a:string,b:int,c:double>
);
(11)复合类型使用说明和实例
1、参数说明
创建表的时候可以指定每行数据的格式,如果使用的是复合数据类型,还需要指定复合数据类型中的元素分割符;
ROW FORMAT DELIMITED
[FIELDS TERMINATED BY char [ESCAPED BY char]]
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
[LINES TERMINATED BY char]
其中这里
FIELDS TERMINATED BY char 指定每一行记录中字段的分割符
COLLECTION ITEMS TERMINATED BY char 指定复合类型中多元素的分割符
MAP KEYS TERMINATED BY char 指定map集合类型中每一个key/value之间的分隔符
LINES TERMINATED BY char 指定每行记录的换行符,一般有默认 就是\n
2、Array类型
array中的数据为相同类型,例如,假如array A中元素['a','b','c'],则A[1]的值为'b' ;
建表语法:
create table t_array(
id string,
name string,
locations array<string>
) row format delimited fields terminated by ' ' collection items terminated by ',';
加载数据 :
load data local inpath '/home/hadoop/t_array.txt' into table t_array;
查询数据:
select id,name,locations[0],locations[1] from t_array;
3、Map类型
map类型中存储key/value类型的数据,后期可以通过["指定key名称"]访问;
建表语法:
create table t_map(
id string,
info map<string,string>
) row format delimited fields terminated by ' ' collection items terminated by '#' map keys terminated by ':';
加载数据:
load data local inpath '/home/hadoop/t_map.txt' into table t_map;
查询数据:
select id, info['name'], info['age'] from t_map;
4、Struct类型
可以存储不同类型的数据:例如c的类型为struct{a INT; b INT},我们可以通过c.a来访问域a;
建表语法:
create table t_struct(
id string,
info struct<name:string, age:int,address:String>
) row format delimited fields terminated by ' ' collection items terminated by ':' ;
加载数据:
load data local inpath '/home/hadoop/t_struct.txt' into table t_struct;
查询数据:
select id,info.name,info.age,info.address from t_struct;