目录
1. 数据仓库
1.1 数据仓库的基本概念
1.2 数据仓库的主要特征
1.3 数据仓库与数据库区别
1.4 数据仓库分层架构
2. Hive
2.1 Hive的概念
2.2 Hive与数据库的区别
2.3 Hive的优缺点
2.4 Hive架构原理
3. Hive的交互方式
3.1 Hive交互shell
3.2 Hive JDBC服务
3.3 Hive的命令
4. Hive的数据类型
4.1 基本数据类型
4.2 复合数据类型
数据仓库的英文名称为Data Warehouse,可简写为DW或DWH。
数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。它出于分析性报告和决策支持的目的而创建。
数据仓库本身并不“生产”任何数据,同时自身也不需要“消费”任何的数据,数据来源于外部,并且开放给外部应用,这也是为什么叫“仓库”,而不叫“工厂”的原因。
数据仓库是面向主题的(Subject-Oriented)、集成的(Integrated)、非易失的(Non-Volatile)和时变的(Time-Variant )数据集合,用以支持管理决策。
数据库与数据仓库的区别实际讲的是OLTP 与 OLAP 的区别。
操作型处理,叫联机事务处理 OLTP(On-Line Transaction Processing),也可以称面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理OLTP。
分析型处理,叫联机分析处理 OLAP(On-Line Analytical Processing),一般针对某些主题的历史数据进行分析,支持管理决策。
首先要明白,数据仓库的出现,并不是要取代数据库。
数据库是面向事务的设计,数据仓库是面向主题设计的。
数据库一般存储业务数据,数据仓库存储的一般是历史数据。
数据库设计是尽量避免冗余,一般针对某一业务应用进行设计;比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析;数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
以银行业务为例。数据库是事务系统的数据平台,客户在银行做的每笔交易都会写入数据库,被记录下来,这里,可以简单地理解为用数据库记账。数据仓库是分析系统的数据平台,它从事务系统获取数据,并做汇总、加工,为决策者提供决策的依据。比如,某银行某分行一个月发生多少交易,该分行当前存款余额是多少。如果存款又多,消费交易又多,那么该地区就有必要设立ATM了。
显然,银行的交易量是巨大的,通常以百万甚至千万次来计算。事务系统是实时的,这就要求时效性,客户存一笔钱需要几十秒是无法忍受的,这就要求数据库只能存储很短一段时间的数据。而分析系统是事后的,它要提供关注时间段内所有的有效数据。这些数据是海量的,汇总计算起来也要慢一些,但是,只要能够提供有效的分析数据就达到目的了。
数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,它决不是所谓的“大型数据库”。
按照数据流入流出的过程,数据仓库架构可分为三层——源数据层、数据仓库层、数据应用层。
数据仓库的数据来源于不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。
源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。
数据仓库层(DW):也称为细节层,DW层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。
数据应用层(DA或APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。
数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra, 转化Transfer, 装载Load)的过程,ETL是数据仓库的流水线,也可以认为是数据仓库的血液,它维系着数据仓库中数据的新陈代谢,而数据仓库日常的管理和维护工作的大部分精力就是保持ETL的正常和稳定。
为什么要对数据仓库分层?
用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;
不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。
通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。
Hive是基于Hadoop的一个数据仓库工具
可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
其本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据的存储支持,说白了hive可以理解为一个将SQL转换为MapReduce任务的工具,甚至更进一步可以说hive就是一个MapReduce的客户端
Hive 具有 SQL 数据库的外表,但应用场景完全不同。
Hive 只适合用来做海量离线数据统计分析,也就是数据仓库。
优点:
缺点:
1)Hive的HQL表达能力有限
2)Hive的效率比较低
1)用户接口:Client
CLI(hive shell)
JDBC/ODBC(java访问hive)
WEBUI(浏览器访问hive)
2)元数据:Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore
3)Hadoop集群
使用HDFS进行存储,使用MapReduce进行计算。
4)Driver:驱动器
解析器(SQL Parser)
将SQL字符串转换成抽象语法树AST
对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误
编译器(Physical Plan):将AST编译生成逻辑执行计划
优化器(Query Optimizer):对逻辑执行计划进行优化
执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说默认就是mapreduce任务
Hive的交互方式主要有三种
使用Hive之前:
先启动hadoop集群:因为hql语句会被编译成MR任务提交到集群运行;hive表数据一般存储在HDFS上
mysql服务:因为对hive操作过程中,需要访问mysql中存储元数据的库及表
在任意路径运行hive
[hadoop@node03 ~]$ hive
启动hiveserver2服务,前台启动与后台启动方式二选一
前台启动
[hadoop@node03 ~]$ hive --service hiveserver2
后台启动
beeline连接hiveserver2服务
若是前台启动hiveserver2,请再开启一个新会话窗口,然后使用beeline连接hive
[hadoop@node03 ~]$ beeline --color=true
beeline> !connect jdbc:hive2://node03:10000
用户名hadoop,密码为空即可
帮助信息
0: jdbc:hive2://node03:10000> help
退出
0: jdbc:hive2://node03:10000> !quit
hive -e hql语句
使用 –e 参数来直接执行hql语句
[hadoop@node03 ~]$ hive -e "show databases"
使用 –f 参数执行包含hql语句的文件
node03执行以下命令准备hive执行脚本
[hadoop@node03 ~]$ cd /xsluo/install/
[hadoop@node03 install]$ vim hive.sql
文件内容如下
create database if not exists myhive;
通过以下命令来执行我们的hive脚本
[hadoop@node03 install]$ hive -f /xsluo/install/hive.sql
查看效果,成功执行hql语句,创建myhive数据库
类型名称 | 描述 | 举例 |
---|---|---|
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 |
类型名称 | 描述 | 举例 |
---|---|---|
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,
col2 map,
col3 struct
)