第8章 综合案例—构建DVD租赁商店数据仓库

2024-03-24 18:40

本文主要是介绍第8章 综合案例—构建DVD租赁商店数据仓库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

案例背景结束:
对于在线DVD租赁商店的决策者来说,他们需要从多个不同的商业角度观察数据,例如时间、电影、演员、用户等角度观察数据,并进行相关的分析得出决策,但是数据库中的数据不适合从多个角度进行分析,无法得出战略决策。然而,数据仓库支持复杂的分析操作,侧重于决策支持,并且还提供直观易懂的查询结果,因此我们需要基于数据库sakila创建一个DVD租赁商店数据仓库,并将sakila数据库中的数据加载到数据仓库中,便于在线DVD租赁商店的决策者对数据进行分析得出商业决策。

数据下载:
我们可以从MySQL的官网下载数据库sakila的建库脚本,若是在Windows环境下安装数据库sakila,则下载名称为sakila-db.zip的压缩包文件;若是在Linux环境下安装数据库sakila,需要下载名称为sakila-db.tar.gz的压缩包文件。
本书下载的是名称为sakila-db.zip的压缩包文件,该压缩包文件中包含三个文件,分别是文件sakila.mwb、文件sakila-data.sql和文件sakila-schema.sql。其中,文件sakila.mwb是一个MySQL Workbench数据模型,用于查看数据库结构;文件sakila-data.sql是用于创建数据库sakila的数据;文件sakila-schema.sql是用于创建数据库sakila的数据结构。

数据库介绍
数据库sakila中一共含有十六张数据表,分别是actor(演员)表、address(地址)表、category(类别)表、city(城市)表、country(国家)表、customer(顾客)表、film(电影)表、film_actor(演员所属电影)表、film_category(电影所属的类别)表、film_text(电影描述)表、inventory(库存)表、language(语言)表、payment(付款)表、rental(租赁)表、staff(工作人员)表以及store(商店)表。
数据表关系:
在这里插入图片描述
数据表字段介绍
数据表film:
用于储存电影基本信息及相关介绍的数据,该数据表各个字段的含义如表。
在这里插入图片描述在这里插入图片描述
数据表file_category:
用于储存定义电影id所属电影类别id的数据,该数据表各个字段的含义如表。
在这里插入图片描述
数据表category
用于储存电影类别名称所属类别id的数据,该数据表各个字段的含义如表。
在这里插入图片描述
数据表film_actor
用于储存定义演员id所属电影id的数据,该数据表各个字段的含义如表。
在这里插入图片描述
数据表actor
用于储存演员id对应的姓和名字数据,该数据表各个字段的含义如表。
在这里插入图片描述
数据表language
用于储存电影语言id对应的语言名称数据,该数据表各个字段的含义如表。
在这里插入图片描述
数据表film_text
用于储存电影id对应的电影名及描述的数据,该数据表各个字段的含义如表。
在这里插入图片描述
数据表store
用于储存商店id对应管理人员id和商店地址id数据,该数据表各个字段含义如表。
在这里插入图片描述
数据表staff
用于储存员工的基本信息及员工所属商店的数据,该数据表各个字段的含义如表。
在这里插入图片描述
在这里插入图片描述
数据表inventory
用于储存库存编号对应的电影id和商店id数据,该数据表各个字段的含义如表。
在这里插入图片描述
数据表customer
用于储存顾客的基本信息数据,该数据表各个字段的含义如表。
在这里插入图片描述
在这里插入图片描述
数据表rental
用于储存租借相关信息数据,该数据表各个字段的含义如表。
在这里插入图片描述
数据表payment
用于储存租赁时付款的相关信息,该数据表各个字段的含义如表。
在这里插入图片描述
数据表country
用于储存国家id对应的国家名称数据,该数据表各个字段的含义如表。
在这里插入图片描述
数据表city
用于储存城市id对应的城市名称以及所属国家id这一类数据,该数据表各个
字段的含义如表。
在这里插入图片描述
数据表address
用于储存城市地址及地址邮编、所属区域等相关信息,该数据表各字段含义如表。
在这里插入图片描述
构建数据仓库
我们基于数据库sakila构建一个星型模型的DVD租赁商店数据仓库,并命名为sakila_dw。数据仓库sakila_dw中的事实表fact_rental是根据数据库sakila中的数据表rental创建的;维度表是根据数据表sakila中数据表的分类创建的,即从人员、时间、地点以及事件四个角度进行创建数据仓库sakila_dw的维度表,具体如下:
1、从人员角度角度创建维度表dim_customer和维度表dim_staff,分别表示租赁业务中的客户和员工;
2、从时间角度创建维度表dim_date和维度表dim_time,用于记录所有DVD的租赁时间和归还时间;
3、从地点角度创建维度表dim_store,用于记录DVD光盘是从哪个商店租赁的;
4、从事件角度创建维度表dim_actor和维度表dim_film,其中维度表dim_actor用于记录演员的基本信息,维度表dim_film用于记录电影的基本信息。由于电影是租赁和归还的实际对象,因此维度表dim_film应与事实表fact_rental关联。一部电影是由多位演员出演,所以会有桥接表dim_film_actor_bridge,该表将电影与演员相关联。

一、通过Kettle工具加载日期数据至dim_date日期维度表。
组件准备
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
表输出的数据库字段是关键,选择获取字段,然后删去一些数据库中没有的字段,这时候可能还有错,按照日记提示,修改掉匹配错误的字段
在这里插入图片描述
结果:
在这里插入图片描述

在这里插入图片描述

二、通过Kettle工具加载时间数据至日期维度表dim_time。

选择组件,构成转换
在这里插入图片描述
在生成记录中,将限制设为24,表示生成24小时的记录

增加序列中,将值的名称改为hours24 每一列增加1
在这里插入图片描述
在JavaScript代码中输入以下代码将24小时的12小时制表示出来,并选择获取变量

//Script here
//生成12小时格式
var hours12=hours24.getInteger()%12;
//生成AM。PM格式
var am_pm=hours24.getInteger()>12?"PM":"AM";

在这里插入图片描述
生成记录二中,生成的是代表分钟的序列:
在这里插入图片描述
增加序列二中,把分钟0~59分钟表示了出来:
在这里插入图片描述
生成记录三,生成秒,生成60秒的记录
在这里插入图片描述
增加序列三,把秒对应的0~59秒表示出来
在这里插入图片描述
记录关联:不需要配置,它会自动将1小时对应60分钟,1分钟对应60秒关联对应起来
会得到:
在这里插入图片描述
JavaScript代码2:输入代码获取time字段和timekey:

//Script here
//生成time
var time = hours24.getInteger() + ":" + minutes.getInteger() + ":" + seconds.getInteger();
//time_key
var time_key = (hours24.getInteger()<10?"0":"")+hours24.getInteger()+(minutes.getInteger()<10?"0":"")+minutes.getInteger()+(seconds.getInteger()<10?"0":"")+seconds.getInteger();

配置表输出:
在这里插入图片描述
结果:
在这里插入图片描述
三、通过Kettle工具加载员工数据至员工维度表dim_staff。
选择好组件,配置转换
在这里插入图片描述
在SQL框中编写SQL语句,用于获取字段staff_last_update中的最大值,将该值替换为”1970-01-01 00:00:00”并赋值给临时字段max_dim_staff_last_update;单击“预览”按钮,查看临时字段max_dim_staff_last_update是否将默认值设置为“1970-01-01 00:00:00”,如图所示。
在这里插入图片描述
表输入二,获取staff中的数据
在这里插入图片描述
字段选择中,修改active的类型
在这里插入图片描述
值映射中,将Y对应yes,N对应NO
在这里插入图片描述
维度查询/更新:
单击目标表右侧的【浏览】按钮,选择输出的目标表,即维度表dim_staff;在“关键字”选项卡处添加关键字字段staff_id,用于指定维度表字段和值映射控件流中字段的比较条件,若维度表中的数据有更新,则通过字段staff_id进行更新操作;在“字段”选项卡处添加查询/更新字段,用于更新目标维度表中的字段数据;在“代理关键字段”处的下拉框中选择staff_key为代理关键字段,并指定“创建代理键”是使用自增字段;在“Version字段”处的下拉框中选择staff_version_number;在“Stream日期字段”处的下拉框中选择last_update;在“开始日期字段”处的下拉框中选择staff_valid_from;在“截止日期字段”处的下拉框中选择staff_valid_through,如图所示(见下页)。
在这里插入图片描述
结果:
在这里插入图片描述

四、通过Kettle工具加载用户数据至用户维度表dim_customer。
配置组件,构成转换:
在这里插入图片描述
在SQL框中编写用于获取字段customer_last_update中的最大值,将该值替换为”1970-01-01 00:00:00”并赋值给临时字段max_dim_customer_last_update;单击“预览”按钮,查看临时字段max_dim_customer_last_update是否将默认值设置为“1970-01-01 00:00:00”,如图所示。在这里插入图片描述
在表输入2中获取customer的数据
按如下所示配置:
在这里插入图片描述
创建一个转换fetch_address:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在load_dim_customer中的映射(子转换)中,将fetch_address浏览进去
在这里插入图片描述
修改active的字段类型
在这里插入图片描述
改值映射
在这里插入图片描述
更新:
在这里插入图片描述
结果:
在这里插入图片描述
在这里插入图片描述
五、通过Kettle工具加载商店数据至商店维度表dim_store。
获取组件,构成转换:
在这里插入图片描述
配置表输入,在创建了数据库连接之后,在SQL框中编写SQL语句,用于获取字段store_last_update中的最大值,将该值替换为”1970-01-01 00:00:00”并赋值给临时字段max_dim_store_last_update;单击“预览”按钮,查看临时字段max_dim_store_last_update是否将默认值设置为“1970-01-01 00:00:00” ,如图所示。
在这里插入图片描述
表输入2,获取store数据
在这里插入图片描述
映射(子转化),使用的子转换还是fetch_address
在这里插入图片描述
数据库查询:
单击表名右侧的【浏览】按钮,添加staff数据表,用于查询商店员工的信息;在“查询所需的关键字”框中,添加查询所需的关键字staff_id,用于指定表字段和流字段的比较条件;在“查询表返回的值”框中,添加查询表返回的值,即员工姓名,如图所示。
在这里插入图片描述
维度更新:
单击【浏览】按钮,选择输出的目标表,即维度表dim_store;在“关键字”选项卡处添加关键字字段store_id,用于指定维度表字段和流字段的比较条件;在“字段”选项卡处添加查询/更新字段,用于指定维度表字段store_id和流字段store_id数据一致需要更新的字段,;在“代理关键字段”处的下拉框中选择store_key为代理关键字段,并指定“创建代理键”是使用自增字段;在“Version字段”处的下拉框中选择store_version_number;在“Stream日期字段”处的下拉框中选择last_update;在“开始日期字段”处的下拉框中选择store_valid_from;在“截止日期字段”处的下拉框中选择store_valid_through,如图所示。
在这里插入图片描述
结果:
在这里插入图片描述
在这里插入图片描述
六、通过Kettle工具加载演员数据至演员维度表dim_actor。
获取组件,构建转换:
在这里插入图片描述
表输入:在创建了数据库连接之后
在SQL框中编写SQL语句,用于获取字段actor_last_update中的最大值,将该值替换为”1970-01-01 00:00:00”并赋值给临时字段max_dim_actor_last_update;单击“预览”按钮,查看临时字段max_dim_actor_last_update是否将默认值设置为“1970-01-01 00:00:00”,如图所示。
在这里插入图片描述
表输入2中获取表actor中的数据:
在这里插入图片描述
插入/更新:单击【获取字段】按钮,用来指定查询数据所需要的关键字,这里选择的是dim_actor数据表中的actor_id字段和输入流里面的actor_id字段;单击【获取和更新字段】按钮,用来指定需要更新的字段,如图所示。
在这里插入图片描述
结果:
在这里插入图片描述
在这里插入图片描述
七、通过Kettle工具加载电影数据至电影维度表dim_film。
获取组件,创建转换
在这里插入图片描述
组件配置如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结果:
在这里插入图片描述
在这里插入图片描述
八、通过Kettle工具加载租赁数据至租赁事实表fact_rental。
获取组件,构建转换:
在这里插入图片描述
组件配置如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结果:
在这里插入图片描述
在这里插入图片描述
创建一个作业load_rentals,并添加Start控件、转换控件、发送邮件控件、中止作业控件以及Hop作业项连接线,如图所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

这篇关于第8章 综合案例—构建DVD租赁商店数据仓库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/842441

相关文章

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD