ETL电商项目总结

news2024/11/23 7:47:27

ETL电商项目总结

ETL电商业务简介及各数据表关系

业务背景

​ 本案例围绕某个互联网小型电商的订单业务来开发。某电商公司,每天都有一些的用户会在线上采购商品,该电商公司想通过数据分析,查看每一天的电商经营情况。例如:电商公司的运营部门想要清楚的看到每天的订单笔数、订单的下单总额、不同支付类型对应的订单笔数和总额等等。
​ 为了实现公司的数据分析业务,我们需要开发一套数据分析的系统以实现电商公司的需求。

​ 下面以京东电商为例,京东首页浏览商品页面:这个页面主要涉及的是《产品分类表》,往往电商网站只会有一个产品分类表;这个《产品分类表》的查询方式采用自连接查询方式,通常类似于这种大类套小类的场景,如同省,市,县这样分层的场景,都是采用“自连接”查询方式。

在这里插入图片描述

电商的购物流程

​ 以京东电商网上购物为例,在京东上购买商品的一般流程是这样的:每一个用户购买商品,都会浏览商品、提交订单。所以商品、订单是电商中非常重要的。本次的综合案例,将主要围绕商品、订单展开。整个电商购物流程如下图所示:

在这里插入图片描述

电商系统结构介绍

​ 电商系统简单结构介绍:1、用户打开浏览器,访问电商页面。→2、用户按下回车后,浏览器发出请求,请求电商网站的Web服务器。→3、Web服务器从数据库取出数据。→4、返回前端页面展示数据。

在这里插入图片描述

电商相关业务术语

​ 电商相关业务术语:**一、商品:**1、商品的标题;2、商品的所属分类;3、商品的价格;4、商品的颜色;5、商品的版本;6、商品的介绍。**二、商品分类:**绝大多数的电商都有商品分类。每个商品一定是会属于某个类别。例如:电冰箱属于(家用电器 > 大家电分类)。不同的商品可能对应的分类是不一样的。**三、订单(订单表):**用户购买商品是通过提交订单来完成的。用户每一次购物都会有订单,订单中包含了订单号、收货人、订单状态、支付方式、商品评价等。**四、订单详情(订单详情表,订单表和订单详情表通常是一对多关系):**用户可能在一次购买中,买了多个商品。订单详情指的是订单走过来包含的具体信息。例如:订单中包含的商品信息、商品金额、商品数量等。**五、用户:**想要购买商品,需要先在电商网站上注册用户。用户包含了很多信息,例如:用户名、密码、性别、生日、以及手机、密码等信息。**六、区域:**每个订单都有区域的概念,例如:我们可以选择配送到哪儿,是配置到北京市昌平区百善镇还是其他地方。

在这里插入图片描述

技术方案

​ 本项目基于MySQL搭建数据仓库,使用Kettle进行数据处理,编写SQL脚本,对MySQL数据仓库中的数据进行数据分析(分组、聚合等),并将分析后的结果保存。最后使用帆软FineBI借助Mysql搭建的数据仓库实现数据可视化分析。项目使用MySQL作为数据分析的存储以及查询引擎、以Kettle作为数据处理脚本执行工具、以及帆软FineBI实现数据可视化展示。

在这里插入图片描述

电商项目下属业务数据表

业务数据库(itcast_shop)下属各表:

在这里插入图片描述

表名说明
ityewu_areas行政区域表,例如:北京市、昌平区等。
ityewu_goods商品表,保存了商品的基本信息。例如:商品的唯一标识、商品的名称、店铺ID、商品的图片等。
ityewu_goods_cats商品分类表,每一个商品都有自己的分类。例如:海尔的某个冰箱属于:家用电器 > 大家电 > 冰箱 这样的一个分类。
ityewu_orders订单表,用户提交的订单将保存在该表中。表中包含了:下订单的用户、订单的状态、订单的支付金额、订单所属的区域、用户所属的地址等。
ityewu_order_goods订单明细表,订单明细表包含了订单中的包含的商品信息。用户可以同时买多个商品,然后提交一个订单。例如:提交的订单中包含一个手机、和一个电冰箱。订单明细中包含了用户买的商品数据和订单信息。例如:该订单明细对应的订单是什么、买了几个这样的商品、商品的ID是什么等。
ityewu_users用户信息表,包含了用户的ID、用户名、密码等信息。
ityewu_areas行政区域表
字段名说明
areaId区域ID
parentId父ID
areaName地区名称
areaKey地区首字母
areaType级别标志,0:省,,1:市,2:县区
createTime创建时间
ityewu_goods商品表
字段名说明
goodsId商品id:相当于主键
goodsSn商品编号:如超市商场上商品条形码,是商品的唯一编码
goodsName商品名称
goodsImg商品图片
shopId门店ID
marketPrice市场价
shopPrice门店价
isHot是否热销产品 0:否 1:是
goodsCatIdgoodsCatId 最后一级商品分类ID
saleNum总销售量
createTime创建时间
ityewu_goods_cats商品分类表
字段名说明
catId品类ID
parentId父ID
catName分类名称
dataFlag删除标志 1:有效 -1:删除
createTime创建时间
cat_level分类级别,共3级
ityewu_orders订单表
字段名说明
orderId订单id:主键,和实际业务没啥关系,只是为了方便后期查询标注
orderNo订单编号
shopId门店id
userId用户id
orderStatus订单状态 -3:用户拒收 -2:未付款的订单 -1:用户取消 0:待发货 1:配送中 2:用户确认收货
goodsMoney商品金额
deliverMoney运费
totalMoney订单金额(包括运费)
realTotalMoney实际订单金额(折扣后金额)
payType支付方式,0:未知;1:支付宝,2:微信;3、现金;4、其他
isPay是否支付 0:未支付 1:已支付
userName收件人姓名
userAddress收件人地址
userPhone收件人电话
createTime创建时间
payTime支付时间
totalPayFee总支付金额
ityewu_order_goods订单明细表

​ ityewu_orders(订单表)与ityewu_order_goods(订单明细表)存在一对多的关系。

字段名说明
ogId订单明细ID
orderId订单ID
goodsId商品ID
goodsNum商品数量
goodsPrice商品价格
payPrice实际支付价格
goodsName商品名称
goodsImg商品相片
createtime创建时间
ityewu_users用户表
字段名说明
userId用户ID
loginName登录名
loginSecret登录秘钥
loginPwd登录密码
userSex用户性别
userName用户名
trueName
brithday
userPhoto
userQQ
userPhone
userScore
userTotalScore
userFrom
userMoney
lockMoney
createTime
payPwd
rechargeMoney

创建数仓数据库(itcast_shop_bi)

​ 执行下面代码,创建出一个名称为(itcast_shop_bi)的数据库。

create database itcast_shop_bi default charset = utf8;

​ 目前,(itcast_shop_bi) 中是没有任何数据的,是一个空的数据库。而后续我们的所有数据分析都将在该数据库中进行。我们第一件事情就是要将 (itcast_shop)数据库中的所有表抽取到(itcast_shop_bi)数据仓库中。要抽取并装载数据到(itcast_shop_bi)中,我们首先要在(itcast_shop_bi)中创建对应的表。

数据抽取业务分析

​ 我们已经大概熟悉了上面的6张表,这6张表有时候并不是将所有数据一次性原封不动地同步到数据仓库中,而是有一些处理细节。考虑以下几个可能出现的业务场景:
​ 1、每一天都需要进行订单的分析,例如:2020年4月18日一共有多少笔订单、订单的总额是多少。
​ 2、每一天都需要进行用户的分析,例如:2020年4月18日一共注册有多少个用户。
​ 3、商品分类、区域的变化率很少,因为分类、区域几乎都是常年不变的(可以设置半年或一年抽取更新一次)。
​ 4、商品的数据和订单的数据相对变化频率较高,因为可能每天都会有商品信息的更新。

​ 因此,结合上述的业务场景,我们可以确定数据的抽取周期:

各业务表抽取周期

​ kettle中,如果抽取的过程是:表输入→表输出,通常是全量抽取,而表输入→插入/更新,通常是增量抽取。

表名说明装载表抽取方式抽取周期
ityewu_areas行政区域表(很久才更新)ods_ityewu_areas同步增量抽取(数据量小时,也可全量)每月
ityewu_goods商品表ods_ityewu_goods同步增量抽取每天
ityewu_goods_cats商品分类表(很久才更新)ods_ityewu_goods_cats同步增量抽取(数据量小时,也可全量)每月
ityewu_orders订单表ods_ityewu_orders同步增量抽取每天
ityewu_order_goods订单明细表ods_ityewu_order_goods同步增量抽取每天
ityewu_users用户信息表ods_ityewu_users同步增量抽取每天
ODS的含义

​ ODS(英语:Operational 业务/ Data 数据/ Store 存储)是一种数据架构或数据库设计的概念,出现原因是来自于当需要集成来自多个系统的数据,结果又要给一或多个系统使用时,我们就可以把源数据表抽取到ODS层中。数据仓库的ods表是将业务系统数据库表原样抽取进来,结构几乎是一样的,只不过加了一个抽取数据的日期字段,因为他有个时间限制,而这个时间就取进行抽取时的日期时间值。有了这个时间字段才可以方便后期统计时效性,因为一般数仓的超过一定的时间,就失效了,需要重新加载更新。

kettle概念模型

在这里插入图片描述

​ kettle的执行分为两个层次:job(作业)和transformation(转换)。transformation由两个核心构成,一个是Step(步骤:可以给Hop发送数据,也可以读取hop里的数据),一个是Hop(跳,可以将数据发给Step)。

​ Job主要是做一些执行,得到文件,及校验,job可以执行本身,也可以执行转换(transformation),也可以校验数据表或文件是否存在,也可以执行Shell脚本或SQL脚本,也可以发送邮件。得到文件可以使用FTP,SFTP,HTTP。

kettle创建资源库

1、数据库资源库

​ 数据库资源库是将作业和转换相关的信息存储在数据库中,执行的时候直接去数据库读取信息,很容易跨平台使用。

数据库资源库搭建步骤:
1、点击右上角connect→Repository Manager(存储库管理器),然后点击Other Resporitory(其他存储库)按钮。

在这里插入图片描述

	2、点击Database Repository(数据库存储库)按钮→Get Started(开始)按钮。

在这里插入图片描述

	3、设置连接详细信息,依次填写“显示名称”,“数据库连接名称”,勾选“启动时连接”(可勾选可不勾选)。

在这里插入图片描述

	4、点击上一步的“数据库连接名称”右侧的向右箭头,弹出的功能框中点击“Create New Connection(创建新连接)”按钮,然后设置对应的数据库连接,选择相应的数据库类型(如mysql),设置“主机名称”,“数据库名称”,“端口号”,“用户名”,“密码”,设置完毕后点击“测试”按钮,显示测试成功后,点击“确定”按钮,然后点击“确认”按钮完成数据库资源库的配置。

在这里插入图片描述

​ 5、第4步配置成功后,点击“Back“按钮返回到第3步的界面中,然后点击”Finish”按钮,系统显示“Congratulations(成功)”,再然后点击“Connect Now(现在连接)按钮”连接资源库,默认账号密码均为admin(也可以直接关闭后从步骤1右上端的Connect连已经配置好的数据库资源库)。

在这里插入图片描述

	6、将本地存在的转换或者job导入资源库。选择“从XML文件导入”按钮,选中本地的转换或job后,在数据库资源库对应的存储位置点击确认即完成本地上传到资源库的操作。(连接好数据库资源库后,第1步右上端的connect上会显示对应的资源库名称),如果数据库资源库上有多个转换或者job的话,在“工具”→“资源库”→“探索资源库”中看到一大推的转换或者job。

在这里插入图片描述

2、 文件资源库

	文件资源库是:将作业和转换相关的信息存储在指定的目录中,其实和XML的方式一样。创建方式跟创建数据库资源库步骤类似,只是不需要用户密码就可以访问,跨平台使用比较麻烦。

文件资源库搭建步骤:
1、点击右上角connect→Repository Manager(存储库管理器)→Add按钮→Other Resporitory(其他存储库)按钮→点击File Repository(数据库存储库)按钮→Get Started(开始)按钮。

在这里插入图片描述

	2、填写相关信息,点击Finish按钮进行保存。

在这里插入图片描述

3、建立数据库连接

​ 新建数据库连接:1、输入数据库连接名称如(itcast_shop_db)。→2、选择所需要的数据库类型。→3、依次设置主机名称,数据库名称,用户名及密码等等。→4、最后测试通过后点击确认即可完成数据库连接配置。注意:如果今后有多处项目都需要利用该数据库连接,可以选中(DB连接下的itcast_shop_db数据库连接),右键,弹出的功能中点击(共享)按钮,所创建的数据库连接就会变成深色。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

ODS层抽取区域表和商品分类表

​ 每月数据抽取作业开发:根据之前的分析,行政区域表和商品分类表都是为增量同步抽取,所以我们只需要全部抽取到数据仓库中建表即可。但需要注意:我们需要清晰地标识出数据是哪天抽取过来的,所以需要额外添加一个当前日期的字段。

创建数据流图

​ 因为行政区域表和商品分类表都是为增量同步抽取,且都是很久才更新一次,设定两者的抽取周期都是(每月)更新一次。

​ 注意:其他的客户表,订单表,订单明细表,商品表的ODS抽取方式与行政区域表和商品分类表的抽取方式类似,只不过在配置定时调度时,需要修改定时调度的时间。

在这里插入图片描述

表输入配置

​ 1、输入表输入的名称(如这里的区域表输入)。→2、选择对应的数据库连接。→3、输入相应的SQL语句(如下的SQL代码)。→4、点击“预览”按钮查看数据。→5、预览数据确认无误后点击“确定”按钮完成“表输入”配置。

SELECT *,current_date() as dt
FROM itcast_shop.ityewu_areas

SELECT *,current_date() as dt
FROM itcast_shop.ityewu_goods_cats

在这里插入图片描述

插入/更新配置

​ 1、选择对应的数据库连接。→2、输入目标表名称。→3、点击(用来查询的关键字)栏目框右侧的(获取字段)按钮,保留areaId字段,删除多余的字段。→4、点击(更新字段)栏目框右侧的(获取和更新字段)按钮,注意需要让(表字段)和(流字段)一一对应。→5、因为之前所粗昂见的数据仓库(itcast_shop_bi)目前是一个空库,里面没有数据表,所以需要点击右下角的(SQL)按钮,在弹出的(简单SQL编辑器)中点击(执行)按钮来新建一个名称为(ods_ityewu_areas)的新表。→6、最后点击右下角的(确定)按钮完成(插入/更新)配置。

在这里插入图片描述

配置ODS层定时调度抽取区域表和商品分类表作业

​ 1、将上一步所创建的转换代入作业中,点击(Transformation)栏目右侧的(浏览)按钮,找到对应的(转换),然后点击(确定)按钮即可。

在这里插入图片描述

​ 2、双击(Start)按钮,弹出的(作业定时调度)设置页面中,勾选(重复)按钮,将(类型)切换为(月),选择(每天)凌晨2点定时执行一次,选择(每月)为1号。这样就配置了该作业在每月1号的凌晨2点执行一次的定时调度设置。

在这里插入图片描述

APP应用层加载数据

​ 在数仓的ODS层有了业务系统中的数据,接下来就可以开始对数据进行分析了,如果是比较麻烦的系统,通常需要进行数仓分层为ODS层,DWD层,DWS层及APP应用层,本示例属于简单的数据分析,直接由ODS层和APP应用层构成。那针对数据仓库应该以什么样的方式来进行分析呢?没错,就是编写SQL语句,但是这个SQL语句的编写方式是涉及许多多表关联的关联查询。在使用SELECT语句可以进行分析时,其分析的结果是需要保存下来的,通常是保存为一个数据表信息,将来进行可视化分析时,直接使用该数据表即可。

​ 分析到这里,要进行数据仓库数据分析,一共会分为以下几步:1.明确数据分析的目标;2.创建用于保存数据分析结果的表;3.编写SQL语句进行数据分析;4.将SQL语句进行数据分析的结果保存到分析结果的表中。

分析某天订单总金额和订单总数

明确数据分析目标

​ 运营部门想要统计每天的订单金额、订单总笔数,用来分析公司的经营状况。例如需要统计(例如2019-09-05)订单支付的总金额、订单的总笔数。这里我们一共要分析两个指标(订单总金额、订单总数量),而且需要在APP应用层中保存下来。共涉及两种表,分别是ods_ityewu_orders(订单表)和ityewu_order_goods(订单明细表)

在数仓(itcast_shop_bi)中创建对应表

​ 为了方便后期管理,APP应用层上的表,表名通常才有app_开头来命名。这里我们创建一个(app_order_total)的表来保存某天订单总金额和订单总数的数据。

# 1.创建用于保存分析结果的表
create table if not exists app_order_total(
    id int primary key auto_increment,
    dt date,
    total_money double,
    total_cnt int
SQL进行数据分析(表输入)

​ 在kettle中采用表输入进行分析,因为刚刚所创建的(app_order_total)有个id主键字段,所以这里需要加上一个null占位,让主键字段自动生成。至于需求中的订单总金额只需要对数仓的(ods_ityewu_orders)表的(realTotalMoney)字段进行汇总,然后按日期进行分组即可;至于需求中的订单总数,只需要数仓的(ods_ityewu_orders)表的行数进行计数即可,一般采用count(*),但是这种计数方式需要对表中的字段进行统计,耗时耗内存,影响查询效率,所以这里采用count(1)进行计数统计。

# 1)确定表
# 取出年月日: substring(字段, 起始位置,字符长度):
#   substring(createTime, 1, 10) :取出创建日期createTime前10个字符
# select distinct substring(createTime, 1, 10)
# from ods_itheima_orders;

# 统计某天的订单支付的总金额、订单的总笔数。
select
	null,   # 占位,主键字段自动生成
    substring(createTime, 1, 10) as dt,
    sum(realTotalMoney) as total_money,
    count(1) as total_cnt
from ods_ityewu_orders
group by substring(createTime, 1, 10);
加载数据到APP应用层表(表输出)

​ 在数仓(itcast_shop_bi)中加载数据到APP应用层表(app_order_total),有两种方法:一种方法:直接在数据库中输入下列代码,将查询所得信息加载到APP应用层表(app_order_total)中,可以保障id主键自增。

# 4.把sql分析的结果保存到结果表里
# 表复制
insert into app_order_total
select
    null,   # 占位,主键字段自动生成
    substring(createTime, 1, 10) as dt,
    sum(realTotalMoney) as total_money,
    count(1) as total_cnt
from ods_ityewu_orders
group by substring(createTime, 1, 10);

​ 一种是直接在kettle中利用(表输出)控件将(表输入)控件的信息加载到APP应用层表(app_order_total)中,但不能保障id主键自增。

在这里插入图片描述

分析下订单的不同用户总数

明确数据分析目标

​ 运营部门想要统计某天下过订单的不同用户总数。例如需要统计(例如2019-09-05)当天下过订单的不同用户总数(注意:1个用户在同一天可以下多个订单,所以需要去重)。这里我们只需要分析一个指标(用户数),而且需要在APP应用层中保存下来。共涉及一张表ods_ityewu_orders(订单表)。

在数仓(itcast_shop_bi)中创建对应表

​ 在数仓(itcast_shop_bi)中我们创建一个(app_order_user)的表来保存某天下订单的不同用户总数的数据。

# 1.创建用于保存分析结果的表
create table if not exists app_order_user(
    id int primary key auto_increment,
    dt date,
    total_user_cnt int
);
SQL进行数据分析(表输入)

​ 在kettle中采用表输入进行分析,因为刚刚所创建的(app_order_user)有个id主键字段,所以这里需要加上一个null占位,让主键字段自动生成。至于需求中的下订单的不同用户总数只需要对数仓的(ods_ityewu_orders)表的(userId)字段进行去重计数即可,计数采用count()函数,至于去重采用distinct函数。

# 3.确定表
#  count(字段) 统计字段非空行数
#  count(distinct 字段) 统计去重后的非空字段行数
select
	null,
    substring(createTime, 1, 10) as dt,
    count(distinct userId) as total_user_cnt
from ods_ityewu_orders
group by substring(createTime, 1, 10);
加载数据到APP应用层表(表输出)

​ 在数仓(itcast_shop_bi)中加载数据到APP应用层表(app_order_user),有两种方法:一种方法:直接在数据库中输入下列代码,将查询所得信息加载到APP应用层表(app_order_user)中,可以保障id主键自增。

# 4.把sql分析的结果保存到结果表里
# 表复制
insert into app_order_user
select
    null,
    substring(createTime, 1, 10) as dt,
    count(distinct userId) as total_user_cnt
from ods_ityewu_orders
group by substring(createTime, 1, 10);

​ 一种是直接在kettle中利用(表输出)控件将(表输入)控件的信息加载到APP应用层表(app_order_user)中,但不能保障id主键自增。截图略。

分析不同支付方式订单总额/订单笔数

明确数据分析目标

​ 运营部门想要统计某天不同支付方式订单总额/订单笔数。例如需要统计(例如2019-09-05)当天不同支付方式订单总额和订单笔数。这里我们只需要分析订单金额(realTotalMoney)字段和订单笔试(订单计数)两个指标,至于不同支付方式,则采用(payType)字段进行区分,而且需要在APP应用层中保存下来。共涉及一张表ods_ityewu_orders(订单表)。

在数仓(itcast_shop_bi)中创建对应表

​ 在数仓(itcast_shop_bi)中我们创建一个(app_order_paytype)的表来保存某天不同支付方式订单总额和订单笔数的数据。

# 1.创建用于保存分析结果的表
create table if not exists app_order_paytype(
    id int primary key auto_increment,
    dt date,
    paytype varchar(20),
    total_money double,
    total_cnt int
);
SQL进行数据分析(表输入)

​ 在kettle中采用表输入进行分析,因为刚刚所创建的(app_order_paytype)有个id主键字段,所以这里需要加上一个null占位,让主键字段自动生成。至于需求中的订单总金额只需要对数仓的(ods_ityewu_orders)表的(realTotalMoney)字段进行汇总,然后按日期进行分组即可;至于需求中的订单总数,只需要数仓的(ods_ityewu_orders)表的行数进行计数即可,一般采用count(*),但是这种计数方式需要对表中的字段进行统计,耗时耗内存,影响查询效率,所以这里采用count(1)进行计数统计。另外一个就是支付方式,根据(payType)字段进行划分,再根据(payType)字段进行分组,所以这里需要两个分组字段,分别是日期字段和(payType)字段。

# 3.确定表
#  count(字段) 统计字段非空行数
#  count(distinct 字段) 统计去重后的非空字段行数
select
	null,
    substring(createTime, 1, 10) as dt,
    case    # 自定义分类
        when payType=1 then "支付宝"
        when payType=2 then "微信"
        when payType=3 then "信用卡"
        when payType=4 then "其他方式"
    end as paytype,
    sum(realTotalMoney) as total_money,
    count(1) as total_cnt
from ods_ityewu_orders
group by substring(createTime, 1, 10), payType;
加载数据到APP应用层表(表输出)

​ 在数仓(itcast_shop_bi)中加载数据到APP应用层表(app_order_paytype),有两种方法:一种方法:直接在数据库中输入下列代码,将查询所得信息加载到APP应用层表(app_order_user)中,可以保障id主键自增。

# 4.把sql分析的结果保存到结果表里
# 表复制
insert into app_order_paytype
select
    null,
    substring(createTime, 1, 10) as dt,
    case    # 自定义分类
        when payType=1 then "支付宝"
        when payType=2 then "微信"
        when payType=3 then "信用卡"
        when payType=4 then "其他方式"
    end as paytype,
    sum(realTotalMoney) as total_money,
    count(1) as total_cnt
from ods_ityewu_orders
group by substring(createTime, 1, 10), payType;

​ 一种是直接在kettle中利用(表输出)控件将(表输入)控件的信息加载到APP应用层表(app_order_paytype)中,但不能保障id主键自增。截图略。

分析订单笔数TOP5用户

明确数据分析目标

​ 运营部门想要知道某天下单笔数最多的5个用户分别是谁?例如需要统计(例如2019-09-05)当天下单笔数最多的5个用户分别是谁?这里我们只需要分析订单笔试(orderId计数)这个指标,然后根据用户(userid,username)维度进行分组,而且需要在APP应用层中保存下来。共涉及一张表ods_ityewu_orders(订单表)。

在数仓(itcast_shop_bi)中创建对应表

​ 在数仓(itcast_shop_bi)中我们创建一个(app_order_user_top5)的表来保存某天订单笔数TOP5用户的数据。

# 1.创建用于保存分析结果的表
CREATE TABLE IF NOT EXISTS app_order_user_top5(
    id INT PRIMARY KEY AUTO_INCREMENT,
    dt DATE,
    userid VARCHAR(20),
    username VARCHAR(50),
    total_cnt INT
);
SQL进行数据分析(表输入)

​ 在kettle中采用表输入进行分析,因为刚刚所创建的(app_order_user_top5)有个id主键字段,所以这里需要加上一个null占位,让主键字段自动生成。至于需求中的查找出下订单笔数TOP5的用户,则需要对数仓的(ods_ityewu_orders)表的(orderId)字段进行计数即可,计数采用count()函数,但是需要根据用户(userid,username)维度进行分组,然后根据count(orderId)进行排序,最后用limit()函数进行限制。

# 3.确定表
#  count(字段) 统计字段非空行数
SELECT
    NULL,
    SUBSTRING(createTime, 1, 10) AS dt,
    userId         userid,
    userName       username,
    COUNT(orderId) AS total_cnt
FROM ods_ityewu_orders
GROUP BY SUBSTRING(createTime, 1, 10), userid,username
ORDER BY total_cnt DESC LIMIT 5;
加载数据到APP应用层表(表输出)

​ 在数仓(itcast_shop_bi)中加载数据到APP应用层表(app_order_user_top5),有两种方法:一种方法:直接在数据库中输入下列代码,将查询所得信息加载到APP应用层表(app_order_user_top5)中,可以保障id主键自增。

# 4.把sql分析的结果保存到结果表里
# 表复制
INSERT INTO app_order_user_top5
SELECT
    NULL,
    SUBSTRING(createTime, 1, 10) AS dt,
    userId         userid,
    userName       username,
    COUNT(orderId) AS total_cnt
FROM ods_ityewu_orders
GROUP BY SUBSTRING(createTime, 1, 10), userid,username
ORDER BY total_cnt DESC LIMIT 5;

​ 一种是直接在kettle中利用(表输出)控件将(表输入)控件的信息加载到APP应用层表(app_order_user_top5)中,但不能保障id主键自增。截图略。

分析商品分类订单总额/订单笔数

明确数据分析目标

​ 运营部门想要统计某天,不同商品分类(一级分类)订单的总金额、订单的总笔数。例如需要统计(例如2019-09-05)当天不同支付方式订单总额和订单笔数。这里我们只需要分析不同商品分类(一级分类)订单的总金额(realTotalMoney)字段、订单的总笔数(订单计数)两个指标,至于不同支付方式,则采用(payType)字段进行区分,而且需要在APP应用层中保存下来。共涉及ods_ityewu_orders(订单表),但是因为订单表是没有分类字段的,所以跟订单表,没有直接关系,因为只有ods_ityewu_goods_cats(分类表),有分类字段(catId,catName),所以需要关联ods_ityewu_goods_cats(分类表),其中分类表中的(catLevel)字段代表分类级别,当catLevel=1时,即找到了一级分类的数据行;当知道某个三级分类的分类ID时,要想获得二级甚至一级分类ID时,需要使用parentId一层一层的获取。另外还需要关联ods_ityewu_goods(商品表)。

在数仓(itcast_shop_bi)中创建对应表

​ 在数仓(itcast_shop_bi)中我们创建一个(app_order_goods_cat)的表来保存某天,不同商品分类(一级分类)订单的总金额、订单的总笔数的数据。

# 1.创建用于保存分析结果的表
CREATE TABLE IF NOT EXISTS app_order_goods_cat(
    id INT PRIMARY KEY AUTO_INCREMENT,
    dt DATE,
    cat_name     VARCHAR(50),
    total_money  DOUBLE,
    total_cnt    INT
);
SQL进行数据分析(表输入)

​ 创建一个中间表来存储商品分类信息。因为这里的商品分类是类似省市区的分层结构(如:橙柚是三级类别,其二级类别是进口水果,其一级类别是时蔬水果),所以采用自连接查询方式(相当于人为的将同一个数据表拆分为多个表,然后用这多个数据表进行关联)来查询,至于这里的where过滤条件(t3.cat_level = 3),那是因为我们购买商品时,第三级分类是最接近商品的,如同省市区的区是最接近个人居住地址的。因此在查询3级类别时,会自动将2级类别和1级类别查询带出,而且还会减少查询数据量,提升SQL查询效率。

在这里插入图片描述

# 3.创建中间表,采用自连接查询获得1,2,3三级分类信息
CREATE TABLE tmp_goods_cat AS
SELECT t3.catId AS cat_id_l3,
t3.catName AS cat_name_l3,
-- 获取三级分类
t2.catId AS cat_id_l2,
t2.catName AS cat_namea_l2,
-- 获取二级分类
t1.catId AS cat_id_l1,
t1.catName AS cat_namea_l1
-- 获取一级分类
FROM ods_ityewu_goods_cats t3,ods_ityewu_goods_cats t2,ods_ityewu_goods_cats t1
WHERE t3.parentId = t2.catId AND t2.parentId = t1.catId AND t3.cat_level = 3;

​ 在kettle中采用表输入进行分析。至于需求中的订单总金额只需要对数仓的(ods_ityewu_order_goods)表的(goodsNum和payPrice)字段进行汇总,然后按日期进行分组即可;至于需求中的订单总数,只需要数仓的(ods_ityewu_order_goods)表的(orderId)进行计数即可,一般采用count()函数。

# 4.确定表
#  count(字段) 统计字段非空行数
SELECT
    t1.cat_id_l1 AS id,
    SUBSTRING(t2.createTime, 1, 10) AS dt,
    t1.cat_namea_l1 AS cat_name,
    SUM(t3.goodsNum * t3.payPrice) AS total_money,
    COUNT(DISTINCT t3.orderId) AS total_cnt
FROM tmp_goods_cat t1
LEFT JOIN ods_ityewu_goods t2 ON t1.cat_id_l3 = t2.goodsCatId
LEFT JOIN ods_ityewu_order_goods t3 ON t2.goodsId = t3.goodsId
GROUP BY SUBSTRING(t2.createTime, 1, 10), t1.cat_id_l1,t1.cat_namea_l1;
加载数据到APP应用层表(表输出)

​ 在数仓(itcast_shop_bi)中加载数据到APP应用层表(app_order_goods_cat),有两种方法:一种方法:直接在数据库中输入下列代码,将查询所得信息加载到APP应用层表(app_order_goods_cat)中,可以保障id主键自增。

# 4.把sql分析的结果保存到结果表里
# 表复制
INSERT INTO app_order_goods_cat
SELECT
    NULL,
    SUBSTRING(t2.createTime, 1, 10) AS dt,
    t1.cat_namea_l1 AS cat_name,
    SUM(t3.goodsNum * t3.payPrice) AS total_money,
    COUNT(DISTINCT t3.orderId) AS total_cnt
FROM tmp_goods_cat t1
LEFT JOIN ods_ityewu_goods t2 ON t1.cat_id_l3 = t2.goodsCatId
LEFT JOIN ods_ityewu_order_goods t3 ON t2.goodsId = t3.goodsId
GROUP BY SUBSTRING(t2.createTime, 1, 10), t1.cat_id_l1,t1.cat_namea_l1;

​ 一种是直接在kettle中利用(表输出)控件将(表输入)控件的信息加载到APP应用层表(app_order_goods_cat)中,但不能保障id主键自增。截图略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1936179.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科普文:字节码class文件和字节码增强技术

1. 引言 1.1. 什么是字节码 Java字节码是指Java语言编译后生成的一种二进制文件格式,它包含了Java程序的所有信息,包括类信息、方法信息、变量信息等。字节码是Java程序执行的基础,它被用于实现Java虚拟机(JVM)的加载…

随手记:vsCode修改主题色为自定义颜色

因为工作需要长时间面对vscode,视力不好,想要把工具改成护眼色,于是就把vscode改成了自定义的护眼色 效果图: 操作步骤: 快捷键打开设置页面: 按住ctrlshiftp 选择Open setting 按回车键 打开setting页面编…

【STM32CubeMX】一 TIME定时器Mode and Configuration的详解

使用STM32CubeMX软件学习配置定时器,对Mode and Configuration进行分析各部分选项的功能。本次以TIM2为例进行分析。 一、 Slave Mode 可以配置的选项有: Disable External Clock Mode 1 外部时钟源模式1 Reset Mode 复位模式 Gated Mode 门控模式 Tri…

采用T网络反馈电路的运算放大器(运放)反相放大器

运算放大器(运放)反相放大器电路 设计目标 输入电压ViMin输入电压ViMax输出电压VoMin输出电压VoMaxBW fp电源电压Vcc电源电压Vee-2.5mV2.5mV–2.5V2.5V5kHz5V–5V 设计说明1 该设计将输入信号 Vin 反相并应用 1000V/V 或 60dB 的信号增益。具有 T 反馈网络的反相放大器可用…

scanf` 和 `printf` 通常比 `cin` 和 `cout` 在处理数据时的分析

#include<bits/stdc.h> using namespace std; int x[5000005],k; int main() {int n;scanf("%d%d",&n,&k);for(int i0;i<n;i)scanf("%d",&x[i]);sort(x,xn);//快排printf("%d",x[k]); }和#include<vector> #include&…

redis数据库(下)

集合键值对 集合的每一个元素也是字符串格式数据,是无序集合,并且元素不可重复(自动去重) 1.集合的创建和添加命令 sadd命令:无责创建有责添加 sadd 键名 元素1 元素2......... 注意:再次添加元素时,如果触发了集合的唯一性,那么命令执行结果就为0,表示执行失败…

JMeter使用小功能-(持续更新)

1、jmeter在同一个线程组内&#xff0c;uuid的复用 方式一&#xff1a; 方式二&#xff1a; 2、获得jMeter使用的线程总数 ctx.getThreadGroup().getNumberOfThreads()来表示活动线程总数 int threadNumctx.getThreadGroup().getNumThreads(); String threads Integer…

折叠屏遇上Galaxy AI,三星新一代Galaxy Z系列开启移动终端新篇章

作者 | 曾响铃 文 | 响铃说 随着换机周期的普遍延长以及智能手机行业内竞争态势的日益激烈&#xff0c;传统的硬件升级与参数比拼已难以全面满足消费者日益多元化的需求。面对这一挑战&#xff0c;行业迫切需要探索新的增长路径与发展方向。 折叠屏技术的兴起&#xff0c;无…

护航信创落地!YashanDB与航天壹进制完成兼容性互认证

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB与航天壹进制黑方容灾备份与恢复系统顺利完成兼容性互认证。测试结果表明&#xff0c;双方产品完全兼容&#xff0c;稳定运行&#xff0c;为用户提供全方位、安全可靠的数据安全保护方案&#xff0c;护航央国企、金融…

【AMD/Xilinx】FPGA远程烧录调试工具安装及使用

问题描述 在学习工作中&#xff0c;本人遇到了连接FPGA的服务器电脑没有Vivado或Vivado版本较低&#xff0c;导致没办法查看ila的情况。在这种情况下一方面重新安装Vivado需要占用大量存储空间&#xff0c;另一方面使用远程桌面软件连接服务器电脑的画质较为模糊&#xff0c;影…

自学第十九天----深入探究数组下

3. 数组越界 数组的下标是有范围限制的。 数组的下规定是从0开始的&#xff0c;如果数组有n个元素&#xff0c;最后一个元素的下标就是n-1。 所以数组的下标如果小于0&#xff0c;或者大于n-1&#xff0c;就是数组越界访问了&#xff0c;超出了数组合法空间的访问。 C语言本身…

即将被淘汰 这几门编程语言!

又到了周五了&#xff0c;忙碌了一周&#xff0c;可以放松放松一下了&#xff01; 在科技迅速发展的今天&#xff0c;编程语言的更新迭代速度令人惊叹。从经典的C语言到现代的Python&#xff0c;编程语言不断进化&#xff0c;满足着不同领域的需求。然而&#xff0c;有些编程语…

AI语音机器人是否可以设计开放式问题

什么叫开放式提问&#xff1f; 是指提出比较概括、广泛、范围较大的问题&#xff0c;对回答的内容限制不严格&#xff0c;给对方充分自由发挥的余地。 试想一下&#xff0c;就算不是语音机器人&#xff0c;是一个真人销售&#xff0c;和客户沟通时提的问题是开放式的&#xf…

【Linux信号】信号检测处理与捕捉

目录 进程什么时候检测处理信号&#xff1f;以及内核如何实现信号的捕捉&#xff1f; sigaction volatile 信号由操作系统发送给相应的进程&#xff0c;进程保存信号&#xff0c;最后再捕捉处理信号。 进程什么时候检测处理信号&#xff1f;以及内核如何实现信号的捕捉&…

java学习--object类方法--equals方法介绍

为真是因为改写了equals方法&#xff0c;判断值是否相等了 package com.equals.test01;public class equals {public static void main(String[] args) {Person person new Person("xaiomi", 19, "nv");Person person1 new Person("xaiomi", …

千万罚单,稠州商业银行屡教不改?

撰稿|芋圆 来源|贝多财经 今年&#xff0c;浙江稠州商业银行&#xff08;以下简称“稠州商行”&#xff09;似乎进入了多事之秋&#xff0c;刚刚兼并两家经营不善的村镇银行就紧接着收到大额罚单。 该行在2023年的经营业绩不算难看。据2023年年报&#xff0c;稠州商行的业绩从…

矩阵形式的bezier曲线

本文分享一段矩阵形式的bezier代码&#xff1a; clc clear% 控制点 P [25;10;5;13]; %% 获得M矩阵 n length(P) - 1; M zeros(n1,n1); for i 1:n1for j 1:n1if(ij<n3)M(i,j) (-1)^(n -i-j2)*nchoosek(n,n-i1)*nchoosek(n-i1,j-1);elseM(i,j) 0;endend end t_temp l…

实战:详解Spring创建bean的流程(图解+示例+源码)

概叙 这篇主要总结Spring中bean的创建过程&#xff0c;主要分为加载bean信息–>实例化bean–>属性填充–>初始化阶段–>后置处理等步骤&#xff0c;且每个步骤Spring做的事情都很多&#xff0c;这块源码还是很值得我们都去看一看的。而Spring中Bean的声明周期其实…

C#数字医学影像系统(RIS/PACS)源码,Oracle数据库,C/S架构,运行稳定

数字医学影像系统&#xff08;RIS/PACS&#xff09;源码&#xff0c;三甲以下的医院都能满足。PACS 系统全套成品源码。 开发技术&#xff1a;C/S架构&#xff0c;C#开发语言&#xff0c;数据库服务器采用Oracle数据库。 医学影像存储与传输系统&#xff0c;融合了医学信息化…

【LeetCode】十五、回溯法:括号生成 + 子集

文章目录 1、回溯法2、leetcode22&#xff1a;括号生成3、leetcode78&#xff1a;子集 1、回溯法 使用场景&#xff0c;如找[1&#xff0c;2&#xff0c;3]的所有子集&#xff1a; 2、leetcode22&#xff1a;括号生成 以n2为例&#xff0c;即两个左括号、两个右括号&#xff0c…