数据仓库VS数据库
数据仓库的定义:
数据仓库是将多个数据源的数据经过ETL(Extract(抽取)、Transform(转换)、Load(加载))理之后,按照一定的主题集成起来提供决策支持和联机分析应用的结构化数据环境
数据仓库VS数据库:
数据库是面向事务的设计,数据仓库是面向主题设计的
数据库一般存储在线交易数据,数据仓库存储的一般是历史数据
数据库设计是避免冗余,采用三范式的规则来设计,数据仓库在设计是有意引入冗余,采用反范式的方式来设计
OLTP VS OLAP:
联机事务处理OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易
联机分析处理OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果
常规的数仓架构:
为什么建设数据仓库:
各个业务数据存在不一致,数据关系混乱
业务系统一般针对于OLTP,而数据仓库可以实现OLAP分析
数据仓库是多源的复杂环境,可以对多个业务的数据进行统一分析
数据仓库建设目标:
集成多源数据,数据来源和去向可追溯,梳理血缘关系
减少重复开发,保存通用型中间数据,避免重复计算
屏蔽底层业务逻辑,对外提供一致的、 结构清晰的数据
如何实现:
实现通用型数据ETL工具
根据业务建立合理的数据分层模型
数据仓库分层建设
数仓建设背景:
数据建设刚起步,大部分数据经过粗暴的数据接入后直接对接业务
数据建设发展到一定阶段,发现数据的使用杂乱无章,各种业务都是从原始数据直接计算而得。
各种重复计算,严重浪费了计算资源,需要优化性能
为什么进行数仓分层:
清晰数据结构:每个数据分层都有对应的作用域
数据血缘追踪:对各层之间的数据表转换进行跟踪,建立血缘关系
减少重复开发:规范数据分层,开发通用的中间层数据
屏蔽原始数据的异常:通过数据分层管控数据质量
屏蔽业务的影响:不必改一次业务就需要重新接入数据
复杂问题简单化:将复杂的数仓架构分解成多个数据层来完成
常见的分层含义:
STG层
原始数据层:存储原始数据,数据结构与采集数据一致
存储周期:保存全部数据
表命名规范:stg_主题_表内容_分表规则
ODS层
数据操作层:对STG层数据进行初步处理,如去除脏数据,去除无用字段.
存储周期:默认保留近30天数据
表命名规范:ods_主题_表内容_分表规则
DWD层
数据明细层:数据处理后的宽表,目标为满足80%的业务需求
存储周期:保留历史至今所有的数据
表命名规范:dwd_业务描述时间粒度
DWS层
数据汇总层:汇总数据,解决数据汇总计算和数据完整度问题
存储周期:保留历史至今所有的数据
表命名规范:dws_业务描述_时间粒度_sum
DIM层
公共维度层:存储公共的信息数据,用于DWD、DWS的数据关联
存储周期:按需存储,一般保留历史至今所有的数据
表命名规范:dim_维度描述
DM层
数据集市层:用于BI、多维分析、标签、数据挖掘等
存储周期:按需存储,--般保留历史至今所有的数据
表命名规范:dm_主题_表内容_分表规则
分层之间的数据流转:
Hive是什么
Hive简介:
Hive是基于Hadoop的数据仓库工具,提供类SQL语法(HiveQL)
默认以MR作为计算引擎(也支持其他计算引擎,例如tez)、HDFS 作为存储系统,提供超大数据集的计算/扩展能力
Hive是将数据映射成数据库和一张张的表,库和表的元数据信息一般存在关系型数据库
Hive的简单架构图:
Hive VS Hadoop:
Hive数据存储:Hive的数据是存储在HDFS.上的,Hive的库和表是对HDFS.上数据的映射
Hive元数据存储:元数据存储一般在外部关系库( Mysql )与Presto Impala等共享
Hive语句的执行过程:将HQL转换为MapReduce任务运行
Hive与关系数据库Mysql的区别
产品定位
Hive是数据仓库,为海量数据的离线分析设计的,不支持OLTP(联机事务处理所需的关键功能ACID,而更接近于OLAP(联机分析技术)),适给离线处理大数据集。而MySQL是关系型数据库,是为实时业务设计的。
可扩展性
Hive中的数据存储在HDFS(Hadoop的分布式文件系统),metastore元数据一 般存储在独立的关系型数据库中,而MySQL则是服务器本地的文件系统。因此Hive具有良好的可扩展性,数据库由于ACID语义的严格限制,扩展性十分有限。
读写模式
Hive为读时模式,数据的验证则是在查询时进行的,这有利于大数据集的导入,读时模式使数据的加载非常迅速,数据的加载仅是文件复制或移动。MySQL为写时模式,数据在写入数据库时对照模式检查。写时模式有利于提升查询性能,因为数据库可以对列进行索引。
数据更新
Hive是针对数据仓库应用设计的,而数仓的内容是读多写少的,Hive中不支持对数据进行改写,所有数据都是在加载的时候确定好的。而数据库中的数据通常是需要经常进行修改的。
索引
Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键。Hive提供了有限的索引功能,可以为-些字段建立索引,一张表的索引数据存储在另外一张表中。由于数据的访问延迟较高,Hive不适合在线数据查询。数据库在少星的特定条件的数据访问中,索引可以提供较低的延迟。
计算模型
Hive默认使用的模型是MapReduce(也可以on spark、on tez),而MySQL使用的是自己设计的Executor计算模型
Hive安装部署
参考:
Hive基本使用(上)Hive数据类型/分区/基础语法
Hive数据类型:
基本数据类型:int、 float、 double、 string、 boolean、 bigint等
复杂类型:array、map、 struct
Hive分区:
Hive将海量数据按某几个字段进行分区,查询时不必加载全部数据
分区对应到HDFS就是HDFS的目录.
分区分为静态分区和动态分区两种
Hive常用基础语法:
USE DATABASE_NAME
CREATE DATABASE IF NOT EXISTS DB NAME
DESC DATABASE DB NAME
CREATE TABLE TABLE_ NAME (..) ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t" STORE AS TEXTFILE
SELECT * FROM TABLE NAME
ALTER TABLE TABLE_NAME RENAME TO NEW_TABLE_NAME
写个Python脚本生成一些测试数据:
import json
import random
import uuid
name = ('Tom', 'Jerry', 'Jim', 'Angela', 'Ann', 'Bella', 'Bonnie', 'Caroline')
hobby = ('reading', 'play', 'dancing', 'sing')
subject = ('math', 'chinese', 'english', 'computer')
data = []
for item in name:
scores = {key: random.randint(60, 100) for key in subject}
data.append("|".join([uuid.uuid4().hex, item, ','.join(
random.sample(set(hobby), 2)), ','.join(["{0}:{1}".format(k, v) for k, v in scores.items()])]))
with open('test.csv', 'w') as f:
f.write('\n'.join(data))
执行该脚本,生成测试数据文件:
[root@hadoop01 ~/py-script]# python3 gen_data.py
[root@hadoop01 ~/py-script]# ll -h
...
-rw-r--r--. 1 root root 745 11月 9 11:09 test.csv
[root@hadoop01 ~/py-script]#
我们可以看一下生成的数据:
[root@hadoop01 ~/py-script]# cat test.csv
f4914b91c5284b01832149776ca53c8d|Tom|reading,dancing|math:91,chinese:86,english:67,computer:77
...
数据以 | 符进行分割,前两个字段都是string类型,第三个字段是array类型,第四个字段是map类型
创建测试用的数据库:
0: jdbc:hive2://localhost:10000> create database hive_test;
No rows affected (0.051 seconds)
0: jdbc:hive2://localhost:10000> use hive_test;
No rows affected (0.06 seconds)
0: jdbc:hive2://localhost:10000>
创建测试表:
CREATE TABLE test(
user_id string,
user_name string,
hobby array,
scores map
)
ROW FORMAT DELIMITED
FIELDS