【离线数仓】Day03-系统业务数据仓库:数仓表概念、搭建、数据导入、数据可视化、Azkaban全调度、拉链表的使用
一、电商业务与数据结构简介
1、业务流程
2、常识:SKU/SPU
SKU=Stock Keeping Unit(库存量基本单位)。现在已经被引申为产品统一编号的简称,每种产品均对应有唯一的SKU号。
SPU(Standard Product Unit):是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息集合。
3、电商表结构
二、数仓理论
1、表的分类
实体表
维度表:对应一些业务状态,编号的解释表。也可以称之为码表,比如地区表,订单状态,支付方式,审批状态,商品分类等等
事务型事实表:一旦发生不会再变化,如,交易流水,操作日志,出库入库记录等等
周期型事实表,一般指随着业务发生不断产生变化(更新, 新增)的数据。比如订单,其中订单状态会周期性变化。再比如,请假、贷款申请,随着批复状态在周期性变化。
2、同步策略
全量表:存储完整的数据。
增量表:存储新增加的数据。
新增及变化表:存储新增加的数据和变化的数据。
拉链表:对新增及变化表做定期合并。
---------------------
实体表:每日全量
维度表:每日全量
事务型事实表:增量表
周期型事实表:拉链表
name姓名 |
start新名字创建时间 |
end名字更改时间 |
张三 |
1990/1/1 |
2018/12/31 |
张小三 |
2019/1/1 |
2019/4/30 |
张大三 |
2019/5/1 |
9999-99-99 |
。。。 |
。。。 |
。。。 |
select * from user where start =<’2019-1-2’ and end>=’2019-1-2’
3、范式
4、关系建模与维度建模
关系模型:OLTP,多表关联降低执行效率
维度模型:OLAP,所有维度表围绕着事实表进行解释
5、雪花模型、星型模型和星座模型
三、数仓搭建
1、配置Hadoop支持Snappy压缩
解压缩上传至/opt/module/hadoop-2.7.2/lib/native
检查压缩方式:hadoop checknative
2、业务数据生成
MySQL建库gmall,建表
执行生成业务数据函数:init_data ( do_date_string VARCHAR(20) , order_incr_num INT, user_incr_num INT , sku_num INT , if_truncate BOOLEAN ):
需求:生成日期2019年2月10日数据、订单1000个、用户200个、商品sku300个、删除原始数据。
CALL init_data('2019-02-10',1000,200,300,TRUE);
2、数据导入数仓
sqoop导入命令
/opt/module/sqoop/bin/sqoop import \
--connect \
--username \
--password \
--target-dir \
--delete-target-dir \
--num-mappers \
--fields-terminated-by \
--query "$2" ' and $CONDITIONS;'
各表的同步策略
Sqoop定时导入脚本:vim sqoop_import.sh【MySQL-hdfs】
生成某日数据:CALL init_data('2019-02-11',1000,200,300,TRUE);
3、ODS层
仿照业务数据库中的表字段,创建ODS层的表
数据导入脚本编写【hdfs-MySQL】
sql=" load data inpath '/origin_data/$APP/db/order_info/$do_date' OVERWRITE into table "$APP".ods_order_info partition(dt='$do_date');
4、DWD层
对ODS层数据进行判空过滤。对商品分类表进行维度退化(降维)
insert overwrite table "$APP".dwd_order_info partition(dt)
select * from "$APP".ods_order_info
where dt='$do_date' and id is not null;
insert overwrite table "$APP".dwd_sku_info partition(dt)
select
sku.id,
sku.spu_id,
sku.price,
sku.sku_name,
sku.sku_desc,
sku.weight,
sku.tm_id,
sku.category3_id,
c2.id category2_id,
c1.id category1_id,
c3.name category3_name,
c2.name category2_name,
c1.name category1_name,
sku.create_time,
sku.dt
from
"$APP".ods_sku_info sku
join "$APP".ods_base_category3 c3 on sku.category3_id=c3.id
join "$APP".ods_base_category2 c2 on c3.category2_id=c2.id
join "$APP".ods_base_category1 c1 on c2.category1_id=c1.id
where sku.dt='$do_date' and c2.dt='$do_date'
and c3.dt='$do_date' and c1.dt='$do_date'
and sku.id is not null;
" $hive -e "$sql"
5、用户行为宽表
用户单日的行为聚合起来组成一张多列宽表,以便之后关联用户维度信息后进行
create external table dws_user_action
(
user_id string comment '用户 id',
order_count bigint comment '下单次数 ',
order_amount decimal(16,2) comment '下单金额 ',
payment_count bigint comment '支付次数',
payment_amount decimal(16,2) comment '支付金额 ',
comment_count bigint comment '评论次数'
) COMMENT '每日用户行为宽表'
PARTITIONED BY (`dt` string)
stored as parquet
location '/warehouse/gmall/dws/dws_user_action/';
导入数据
insert overwrite table dws_user_action partition(dt='2019-02-10')
select
user_actions.user_id,
sum(user_actions.order_count),
sum(user_actions.order_amount),
sum(user_actions.payment_count),
sum(user_actions.payment_amount),
sum(user_actions.comment_count)
from
(
select
四、GMV成交总额
1、ADS层
五、转化率之用户新鲜度及漏斗分析
1、转化率
2、ADS层之新增用户占日活跃用户比率(用户新鲜度)
十三、数据可视化
1、MySQL建表并插入数据
2、web查看
运行spring-boot-echarts-master程序
在web页面上查看显示结果
3、sqoop导出脚本
export_data() {
/opt/module/sqoop/bin/sqoop export \
--connect "jdbc:mysql://hadoop102:3306/${db_name}?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 000000 \
--table $1 \
--num-mappers 1 \
--export-dir /warehouse/$db_name/ads/$1 \
--input-fields-terminated-by "\t" \
--update-mode allowinsert \
--update-key $2 \
--input-null-string '\\N' \
--input-null-non-string '\\N'
} case $1 in
"ads_uv_count")
export_data "ads_uv_count" "dt"
;;
"ads_user_action_convert_day")
export_data "ads_user_action_convert_day" "dt"
;;
"ads_gmv_sum_day")
export_data "ads_gmv_sum_day" "dt"
;;
"all")
export_data "ads_uv_count" "dt"
export_data "ads_user_action_convert_day" "dt"
export_data "ads_gmv_sum_day" "dt"
;;
esac
十四、Azkaban调度器
1、GMV指标获取的全调度流程
编写Azkaban程序运行job
(1)import.job文件
type=command
do_date=${dt}
command=/home/atguigu/bin/sqoop_import.sh all ${do_date}
(2)ods.job文件
type=command
do_date=${dt}
dependencies=import
command=/home/atguigu/bin/ods_db.sh ${do_date}
(3)dwd.job文件
type=command
do_date=${dt}
dependencies=ods
command=/home/atguigu/bin/dwd_db.sh ${do_date}
(4)dws.job文件
type=command
do_date=${dt}
dependencies=dwd
command=/home/atguigu/bin/dws_db_wide.sh ${do_date}
(5)ads.job文件
type=command
do_date=${dt}
dependencies=dws
command=/home/atguigu/bin/ads_db_gmv.sh ${do_date}
(6)export.job文件
type=command
dependencies=ads
command=/home/atguigu/bin/sqoop_export.sh ads_gmv_sum_day
(7)将以上6个文件压缩成gmv-job.zip文件
创建Azkaban工程,并上传gmv-job.zip文件。
页面上创建工程执行gmv-job.zip任务,查看结果
十五、拉链表
1、使用
2、形成过程
3、制作过程
制作当日变动数据(包括新增,修改)每日执行
2019-02-14日新增2条订单数据
CALL init_data('2019-02-14',2,5,10,TRUE);
步骤2:先合并变动信息,再追加新增信息,插入到临时表中
步骤3:把临时表覆盖给拉链表
hive (gmall)>
insert overwrite table dwd_order_info_his
select * from dwd_order_info_his_tmp;
十六、项目总结
1、熟悉8张表的业务字段
2、数仓理论
3、Sqoop参数
4、sqoop导出时的存储一致性、运行机制等问题
5、拉链表
1)通过关系型数据库的create time和operation time获取数据的新增和变化。
2)用临时拉链表解决Hive了中数据不能更新的问题。
6、Azkaban
1)每天集群运行多少job?
2)多个指标(200)*6=1200(1000-2000个job)
3)每天集群运行多少个task? 1000*(5-8)=5000多个
7、表关系
【离线数仓】Day03-系统业务数据仓库:数仓表概念、搭建、数据导入、数据可视化、Azkaban全调度、拉链表的使用的更多相关文章
- 数仓1.4 |业务数仓搭建| 拉链表| Presto
电商业务及数据结构 SKU库存量,剩余多少SPU商品聚集的最小单位,,,这类商品的抽象,提取公共的内容 订单表:周期性状态变化(order_info) id 订单编号 total_amount 订单金 ...
- C/S系统实现两数求和(非阻塞+epoll+心跳包检测用户在线状况+滚动日志+配置文件.)
C/S系统实现两数求和 任务要求: 实现配置文件 实现日志滚动 设置非阻塞套接字,EPOLL实现 检测客户端的连接,设置心跳检测 主线程 + 心跳检测线程 + EPOLL的ET模式处理事务线程 注意事 ...
- Win7系统system进程句柄数一直增加解决方案
公司内部最近有个服务端的同事电脑句柄数一开机就一直增加 一台Windows7x64系统16G 其实物理内存使用情况在开机后并没有太大的变化,但虚拟内存占用明显在不停的增加. 我通过“任务管理器”一直也 ...
- 在HUE中将文本格式的数据导入hive数仓中
今天有一个需求需要将一份文档形式的hft与fdd的城市关系关系的数据导入到hive数仓中,之前没有在hue中进行这项操作(上家都是通过xshell登录堡垒机直接连服务器进行操作的),特此记录一下. - ...
- HAWQ取代传统数仓实践(十二)——维度表技术之分段维度
一.分段维度简介 在客户维度中,最具有分析价值的属性就是各种分类,这些属性的变化范围比较大.对某个个体客户来说,可能的分类属性包括:性别.年龄.民族.职业.收入和状态,例如,新客户.活跃客户.不活跃客 ...
- 袋鼠云研发手记 | 开源·数栈-扩展FlinkSQL实现流与维表的join
作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...
- WMS移动仓库管理系统 PDA仓库管理系统
电子仓库管理系统,简称WMS系统,英文名Warehouse Management System,是应用条码和RFID自动识别技术的现代化仓库管理系统,能有效地对仓库流程和空间进行管理,实现批次管理.快 ...
- 作业:WordCount--实现字符数,单词数,行数的统计
1. Gitee 地址 https://gitee.com/fyxiaobai/wordcount 2. PSP表格 PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning ...
- 根据CPU核心数确定线程池并发线程数(转)
一.抛出问题 关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下: 第一派:<Java Concurrency in Practice>即&l ...
- 吉特仓库管理系统-ORM框架的使用
最近在园子里面连续看到几篇关于ORM的文章,其中有两个印象比较深刻<<SqliteSugar>>,另外一篇文章是<<我的开发框架之ORM框架>>, 第一 ...
随机推荐
- 1.云原生之Docker容器技术基础知识介绍
转载自:https://www.bilibili.com/read/cv15180540/?from=readlist
- Solutions:如何运用Elastic App Search快速建立出色的React搜索体验
建立搜索体验是一项艰苦的工作. 乍一看似乎很容易:建立一个搜索栏,将数据放入数据库,然后让用户输入对该数据库的查询. 但是,在数据建模,底层逻辑以及(当然)总体设计和用户体验方面,有很多事情要考虑. ...
- Kafka QuickStart
环境版本 操作系统:CentOS release 6.6 (Final) java版本: jdk1.8 kafka 版本: kafka_2.11-1.1.1.tgz 安装kafka 1. 下载压缩包, ...
- ofd格式文件转换成pdf格式的方法
ofd格式文件很多人还比较陌生,很多人接收到文件都不知如何打开阅读,把文件发给对方,还需要对方安装个专门的阅读软件,我们还有另一个办法,就是将OFD文件转换为PDF格式文件,然后把PDF格式文件发给对 ...
- ERP 系统最重要的是什么?
ERP系统最重要的就是内部业务逻辑,这也是ERP复杂.专业性的体现!ERP系统可以算是当今最复杂的应用系统,也是最昂贵的,头部厂商一套系统动辄上千万,实施费用也常常达到千万级,实施周期动辄半年一年的, ...
- FEX-EMU Wine踩坑记录
FEX是一个用于在ARM64平台运行X86软件的工具,比较成熟,但是网上资料很少,所以就写了这篇FEX运行Wine踩坑记录. Termux的Fex不能用(2022年5月) 要在debian系统安装fe ...
- P7361 「JZOI-1」拜神 (字符串)
题意: 给一个串,\(Q\) 次询问区间 \([l,r]\) 中至少出现两次的子串的最大长度. 写LCT是什么东东 以下做法很经典: 先求出 SA 以及 height 数组,然后按 height 从大 ...
- Java问题之超过数值表示范围(例如64位)结果是什么 (阶乘)
关于老师在课上所提及的这个问题 我做了验证 截图如下 只是一个简单的计算阶乘的代码 在运行时得到了如下结果 可以看到,对于部分数字如果超出范围会从64位处自动截断,而这时由于是二进制表示,首位默认是符 ...
- 换工作?试试远程工作「GitHub 热点速览 v.22.40」
近日,潜在某个技术交流群的我发现即将毕业的小伙伴在焦虑实习.校招,刚好本周 GitHub 热榜有个远程工作项目.不妨大家换个思路,"走"出去也许有更多的机会.当然,除了全球的远程工 ...
- SpringBoot(一) - SpringBoot 初识
1.创建SpringBoot项目 1.1 使用Spring Initializr 的 Web页面创建项目 创建网址:https://start.spring.io/ 1.2 使用IDEA创建 省略: ...