一、数据接入
1. 结构化数据
结构化的数据一般是指可以使用关系型数据库表示和存储,可以用二维表来逻辑表达实现的数据。
一般特点是:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的,存储在数据库中;能够用数据或统一的结构加以表示,如数字、符号;能够用二维表结构来逻辑表达实现,包含属性和元组,如:成绩单就是属性,90分就是其对应的元组。
传统的关系数据模型、行数据,存储于数据库,可用二维表结构表示。而结构化的数据的存储和排列是很有规律的,这对查询和修改等操作很有帮助。
对于结构化数据来讲通常是先有结构再有数据,而对于半结构化数据来说则是先有数据再有结构。
2. 半结构化数据
半结构化数据是结构化数据的一种形式,它并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔语义元素以及对记录和字段进行分层,数据的结构和内容混在一起,没有明显的区分,因此,它也被称为自描述的结构,简单的说半结构化数据就是介于完全结构化数据和完全无结构的数据之间的数据。例如:HTML文档,JSON,XML和一些NoSQL数据库等就属于半结构化数据。
3. 非结构化数据
非结构化数据顾名思义,就是没有固定结构的数据。包括所有格式的办公文档、文本、图片、XML、HTML、各类报表、图像和音频/视频信息等等都属于非结构化数据。对于这类数据,我们一般直接整体进行存储,而且一般存储为二进制的数据格式。
典型的人为生成的非结构化数据包括:
文本文件:文字处理、电子表格、演示文稿、电子邮件、日志。
社交媒体:来自新浪微博、微信、QQ、Facebook,Twitter,LinkedIn等平台的数据。
网站: YouTube,Instagram,照片共享网站。
移动数据:短信、位置等。
通讯:聊天、即时消息、电话录音、协作软件等。
媒体:MP3、数码照片、音频文件、视频文件。
业务应用程序:MS Office文档、生产力应用程序。
典型的机器生成的非结构化数据包括:
卫星图像:天气数据、地形、军事活动。
科学数据:石油和天然气勘探、空间勘探、地震图像、大气数据。
数字监控:监控照片和视频。
传感器数据:交通、天气、海洋传感器。
二、数仓分层
数据贴源层ODS
ODS层简介
- 数据准备层,贴源层
- 直接接入源数据:业务库、埋点数据、消息队列
- ods是数仓层的准备区
ODS层详情
数据运营层:Operation Data Store 数据准备区,也称为贴源层。数据源中的数据,经过抽取、转换、加载,也就是ETL过程之后进入本层。该层的主要功能:
- ODS是后面数据仓库层的准备区
- 为DWD层提供原始数据
- 减少对业务系统的影响
后续可能需要追溯数据问题,因此对于这一层就不做过多的数据清洗工作,原封不动地接入原始数据即可
这层的数据是后续数据仓库加工数据的来源。数据来源的方式:
数据仓库层
2.1 数据细节层(清洗层)DWD
DWD层简介
- 数据清洗层,业务层和数据仓库层的隔离层,保持和ods相同的颗粒度
- 进行数据清洗和规范化操作:去空值/脏数据
DWD层详情
数据细节层:data warehouse details,DWD
该层是业务层和数据仓库的隔离层,保持和ODS层一样的数据颗粒度;主要是对ODS数据层做一些数据的清洗和规范化的操作,比如去除空数据、脏数据、离群值等。
为了提高数据明细层的易用性,该层通常会才采用一些维度退化方法,将维度退化至事实表中,减少事实表和维表的关联。
2.2 数据中间层DWM
DWM层简介
- 在dwd的基础上做轻微聚合操作,算出相应的统计指标
- 聚合之后会形成中间表
DWM层详情
数据中间层:Data Warehouse Middle,DWM;
该层是在DWD层的数据基础上,对数据做一些轻微的聚合操作,生成一些列的中间结果表,提升公共指标的复用性,减少重复加工的工作。
简答来说,对通用的核心维度进行聚合操作,算出相应的统计指标
2.3 数据服务层DWS
DWS层简介
- 在dwm的基础上整合汇总成一个主题的数据服务层
- 汇总结果通常为宽表,用于olap、数据分发等
DWS层详情
数据服务层:Data Warehouse Service,DWS;
该层是基于DWM上的基础数据,整合汇总成分析某一个主题域的数据服务层,一般是宽表,用于提供后续的业务查询,OLAP分析,数据分发等。
一般来说,该层的数据表会相对较少;一张表会涵盖比较多的业务内容,由于其字段较多,因此一般也会称该层的表为宽表。
数据应用层ADS
ADS层简介
- 存放在postgreSQL、redis、ES等数据库中,供数据分析和挖掘使用
- 数据报表存放在该层
ADS层详情
数据应用层:Application Data Service,ADS;
该层主要是提供给数据产品和数据分析使用的数据,一般会存放在ES、Redis、PostgreSql等系统中供线上系统使用,数据报表层。
事实表 Fact Table
事实表是指存储有事实记录的表,比如系统日志、销售记录等。事实表的记录在不断地增长,比如电商的商品订单表,就是类似的情况,所以事实表的体积通常是远大于其他表。
维表层Dimension
- 维度表(Dimension Table)或维表,有时也称查找表(Lookup Table),是与事实表相对应的一种表;它保存了维度的属性值,可以跟事实表做关联,相当于将事实表上经常重复出现的属性抽取、规范出来用一张表进行管理。维度表主要是包含两个部分:
高基数维度数据:一般是用户资料表、商品资料表类似的资料表,数据量可能是千万级或者上亿级别
低基数维度数据:一般是配置表,比如枚举字段对应的中文含义,或者日期维表等;数据量可能就是个位数或者几千几万。
- 常见的维度表有:日期表(存储与日期对应的周、月、季度等的属性)、地点表(包含国家、省/州、城市等属性)
数仓表命名规范
ODS层命名为ods_xxx
DWD层命名为dwd_xxx
DWM层命名为dwm_xxx
DWS层命名为dws_xxx
ADS层命名为ads_xxx
临时表数据库命名为xxx_tmp
备份数据数据库命名为xxx_bak
拉链表
7.1 什么是拉链表
7.2 为什么要做拉链表
7.3 拉链表形成过程
7.4 拉链表制作过程图
7.5 拉链表制作过程
7.5.1 步骤0:初始化拉链表(首次独立执行)
1)生成10条原始订单数据
CALL init_data('2019-02-13',10,5,10,TRUE);
[bw@hadoop102 bin]$ sqoop_import.sh all 2019-02-13
[bw@hadoop102 bin]$ ods_db.sh 2019-02-13
[bw@hadoop102 bin]$ dwd_db.sh 2019-02-13
2)建立拉链表
hive (gmall)>
drop table if exists dwd_order_info_his;
create external table dwd_order_info_his(
`id` string COMMENT '订单编号',
`total_amount` decimal(10,2) COMMENT '订单金额',
`order_status` string COMMENT '订单状态',
`user_id` string COMMENT '用户id' ,
`payment_way` string COMMENT '支付方式',
`out_trade_no` string COMMENT '支付流水号',
`create_time` string COMMENT '创建时间',
`operate_time` string COMMENT '操作时间',
`start_date` string COMMENT '有效开始日期',
`end_date` string COMMENT '有效结束日期'
) COMMENT '订单拉链表'
stored as parquet
location '/warehouse/gmall/dwd/dwd_order_info_his/'
tblproperties ("parquet.compression"="snappy");
3)初始化拉链表
hive (gmall)>
insert overwrite table dwd_order_info_his
select
id,
total_amount,
order_status,
user_id,
payment_way,
out_trade_no,
create_time,
operate_time,
'2019-02-13',
'9999-99-99'
from ods_order_info oi
where oi.dt='2019-02-13';
4)查询拉链表中数据
hive (gmall)> select * from dwd_order_info_his limit 2;
7.5.2 步骤1:制作当日变动数据(包括新增,修改)每日执行
1)如何获得每日变动表
(1)最好表内有创建时间和变动时间(Lucky!)
(2)如果没有,可以利用第三方工具监控比如canal,监控MySQL的实时变化进行记录(麻烦)。
(3)逐行对比前后两天的数据, 检查md5(concat(全部有可能变化的字段))是否相同(low)
(4)要求业务数据库提供变动流水(人品,颜值)
2)因为dwd_order_info本身导入过来就是新增变动明细的表,所以不用处理
(1)2019-02-14日新增2条订单数据
CALL init_data('2019-02-14',2,5,10,TRUE);
(2)通过Sqoop把2019-02-14日所有数据导入
sqoop_import.sh all 2019-02-14
(3)ODS层数据导入
ods_db.sh 2019-02-14
(4)DWD层数据导入
dwd_db.sh 2019-02-14
7.5.3 步骤2:先合并变动信息,再追加新增信息,插入到临时表中
1)建立临时表
hive (gmall)>
drop table if exists dwd_order_info_his_tmp;
create table dwd_order_info_his_tmp(
`id` string COMMENT '订单编号',
`total_amount` decimal(10,2) COMMENT '订单金额',
`order_status` string COMMENT '订单状态',
`user_id` string COMMENT '用户id' ,
`payment_way` string COMMENT '支付方式',
`out_trade_no` string COMMENT '支付流水号',
`create_time` string COMMENT '创建时间',
`operate_time` string COMMENT '操作时间',
`start_date` string COMMENT '有效开始日期',
`end_date` string COMMENT '有效结束日期'
) COMMENT '订单拉链临时表'
stored as parquet
location '/warehouse/gmall/dwd/dwd_order_info_his_tmp/'
tblproperties ("parquet.compression"="snappy");
2)导入脚本
hive (gmall)>
insert overwrite table dwd_order_info_his_tmp
select * from
(
select
id,
total_amount,
order_status,
user_id,
payment_way,
out_trade_no,
create_time,
operate_time,
'2020-09-21' start_date,
'9999-99-99' end_date
from dwd_order_info where dt='2020-09-21'
union all
select oh.id,
oh.total_amount,
oh.order_status,
oh.user_id,
oh.payment_way,
oh.out_trade_no,
oh.create_time,
oh.operate_time,
oh.start_date,
if(oi.id is null, oh.end_date, date_add(oi.dt,-1)) end_date
from dwd_order_info_his oh left join
(
select
*
from dwd_order_info
where dt='2020-09-21'
) oi
on oh.id=oi.id and oh.end_date='9999-99-99'
)his
order by his.id, start_date;
7.5.4 步骤3:把临时表覆盖给拉链表
1)导入数据
hive (gmall)>
insert overwrite table dwd_order_info_his
select * from dwd_order_info_his_tmp;
2)查询导入数据
hive (gmall)> select * from dwd_order_info_his;