第十三周 综合项目:电商数据仓库之商品订单数仓2
拉链表
什么是拉链表
1 | 针对订单表、订单商品表,流水表,这些表中的数据是比较多的,如果使用全量的方式,会造成大量的数据冗余,浪费磁盘空间。 |
1 | 想要解决这个问题,一般有这么几种方案: |
1 | 拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有历史变化的信息。 |

1 | 说明: |
如何制作拉链表
1 | 那针对我们前面分析的订单表,希望使用拉链表的方式实现数据采集,因为每天都保存全量订单数据比较浪费磁盘空间,但是只采集增量的话无法反应订单的状态变化。 |


1 | 基于订单表中的这些数据如何制作拉链表? |

1 | 2:在3月2号的时候,需要将订单表中发生了变化的数据和新增的订单数据 整合到之前的拉链表中 |

1 | 解释: |
【实战】基于订单表的拉链表实现
1 | 下面我们开始实现: |
1 | ods_user_order在前面已经使用过,所以在这只需要将2026-03-01、2026-03-02和2026-03-03的数据加载进去即可 |



1 | insert overwrite table dwd_mall.dwd_user_order partition(dt='20260301') select |



1 | 2:创建拉链表,基于每日更新订单表构建拉链表中的数据 |
1 | create external table if not exists dws_mall.dws_user_order_zip( |
1 | 在windows中编写sql语句,回车时可能会有tab制表符,这样的sql复制到hive中执行会报错;对于复制到hive中连成一行无法解析的情况,可以在复制前给每一行的最后添加一个空格 |


1 | sql语句里的时间改成20260302后再执行 |



1 | sql语句里的时间改成20260303后再执行 |


1 | 查询3月1日的切片数据 |

1 | 查询3月2日的切片数据 |

1 | 查询3月3日的切片数据 |
1 | 查询有效数据 |
1 | 此时,如果想要翻旧账,查看某一个订单的历史变化情况,可以这样查询 |

拉链表的性能问题(面试爱问)
1 | 拉链表也会遇到查询性能的问题,假设我们存放了5年的拉链数据,那么这张表势必会比较大,当查询的时候性能就比较低了 |
1 | 还有什么是拉链表,如何制作拉链表也爱问 |
商品订单数据数仓总结
数据库和表梳理

任务脚本梳理

数据可视化和任务调度实现
数据可视化
1 | 数据可视化这块不是项目的重点,不过为了让大家能有一个更加直观的感受,我们可以选择一些现成的数据可视化工具实现。 |
Zeppelin安装部署
1 | 注意:不要使用Zeppelin0.8.2版本,这个版本有bug,无法使用图形展现数据。 |
1 | 把下载好的安装包上传到bigdata04的/data/soft目录中 |
1 | 3:增加Hive依赖jar包 |
1 | 4:启动 |
Zepplin的界面参数配置
1 | Zepplin启动之后可以通过8080端口进行访问 |

1 | 搜索jdbc |

1 | 修改这四项的内容即可,这里的内容其实就是我们之前学习hive的jdbc操作时指定的参数 |

1 | 注意:需要在192.168.182.103这台机器上启动hiveserver2服务,否则在zeppline中连不上hive |
Zepplin的使用
1 | 创建一个note,类似于工作台的概念 |

1 | 此时就可以在里面写SQL了。 |


1 | 对于想制作一些复杂的图表,可以用sqoop导出到mysql,让前端的人去制作。这里当然也很方便直接与hive交互 |
任务调度
1 | 针对数据仓库中的任务脚本我们前面已经整理过了,任务脚本还是比较多的,针对初始化表的脚本只需要 |
Crontab调度器的使用
1 | 咱们前面在学习Linux的时候学过一个crontab调度器,通过它可以实现定时执行指定的脚本。 |
1 | 此时使用crontab调度两个有依赖关系的任务,脚本该如何实现呢? |
1 | !/bin/bash |
1 | 如果jobA成功执行,则jobB也可以执行,如果jobA执行失败,则jobB不会执行,脚本会生成告警信息。 |
Azkaban调度器的使用
1 | 对于定时执行的脚本很多,可以使用可视化管理界面的任务调度工具进行管理:azkaban(轻量级),Ooize(重量级) |
Azkaban介绍
1 | 在实际工作中如果需要配置很多的定时任务,一般会采用一些支持界面操作的调度器,例如:Azkaban、Ooize |
1 | 那我们首先把Azkaban安装部署起来 |
Azkaban安装部署
1 | 把编译后的Azkaban安装包 azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz 上传到bigdata04的/data/soft目录下 |
1 | 3:启动 |
1 | 启动成功之后,azkaban会启动一个web界面,监听的端口是8081 |

1 | 用户名和密码默认都是 azkaban |
提交独立任务
1 | 如何向Azkaban中提交任务呢? |

1 | 此时test项目中就包含hello这个任务,点击execute flow执行 |



1 | 此时这个任务执行一次就结束了,如果想要让任务定时执行,可以在这配置。 |


1 | 点击Schedule,进入配置定时信息 |


1 | 这就将test项目中的hello.job配置了定时任务。 |


1 | 如果想查看某一次任务的具体执行情况,可以点击execution id |
1 | 这是一个基本的独立任务的执行,如果是有依赖的多个任务,如何配置呢? |
提交依赖任务
1 | 下面再看一个例子: |

1 | 点击Execute Flow,也可以看到任务之间的依赖关系 |

1 | 最后查看jobList,可以看到这个项目中的两个任务的执行顺序 |

1 | 这就是带依赖的任务的任务调度。 |
在数仓中使用Azkaban
1 | 下面我们来看一下针对数仓中的多级任务依赖,如何使用Azkaban实现 |
collect.job
1 | # collect.job |
ods.job
1 | # ods.job |
dwd.job
1 | # dwd.job |
app.job
1 | # app.job |

1 | 还要把job文件里涉及的sh脚本上传到linux上指定目录 |
项目优化
1 | Sqoop数据采集参数调优,它只会生成一个map任务,性能较低 |