文章目录

  • 零 DIM层最终建模结果
  • 一 商品维度表(全量)
    • 1 商品维度表
    • 2 建模过程分析
    • 3 建表语句
    • 4 装载数据
      • (1)逐步分析
      • (2)完整装载sql
  • 二 优惠券维度表(全量)
    • 1 建表语句
    • 2 数据装载
  • 三 活动维度表(全量)
    • 1 建表语句
    • 2 数据装载
  • 四 地区维度表(特殊)
    • 1 建表语句
    • 2 数据装载
  • 五 时间维度表(特殊)
    • 1 建表语句
    • 2 数据装载
      • (1)创建临时表格
      • (2)上传到HDFS
      • (3)导入
      • (4)校验

零 DIM层最终建模结果

时间 用户 地区 商品 优惠券 活动 度量值
订单 运费/优惠金额/原始金额/最终金额
订单详情 件数/优惠金额/原始金额/最终金额
支付 支付金额
加购 件数/金额
收藏 次数
评价 次数
退单 件数/金额
退款 件数/金额
优惠券领用 次数

一 商品维度表(全量)

1 商品维度表

商品维度表分区:

2 建模过程分析

需要将以上正方形圈起来的八张表建模成一张商品维度表,主键为sku_id。圆形圈起来的几张表可选,此项目不考虑这几张表。

以ods_sku_info(id, spu_id, price, sku_name, sku_desc, weight, tm_id, category3_id, is_sale, create_time, dt)表为基础去join其他表【表一】

根据ods_sku_info表中spu_id列可以获得ods_spu_info表中的内容(spu_name, category3_id,tm_id)【表二】

根据ods_sku_info表中category3_id可以获得ods_base_category3表中的信息(name[cat3_name], category2_id)【表三】

根据category2_id可以获取ods_base_category2表中的内容(name[cat2_name], category1_id)【表四】

根据category1_id可以获取ods_base_category1表中的内容(name[cat1_name])【表五】

根据ods_sku_info表中tm_id列可以获得ods_base_trademark表中的内容(tm_name)【表六】

目前已经整合了六张表,此外还需要整合销售属性和平台属性,以上六张表没有平台属性和销售属性的信息,所以分别去找平台属性和销售属性对应的表格(ods_sku_attr_value,ods_sku_sale_attr_value)。

ods_sku_attr_value表中的内容(id, attr_id, value_id, sku_id, attr_name, value_name ),根据sku_id扩展开,这时粒度不再是sku_id,而是自己的id,一个属性一行,一个sku_id对应多个平台属性,所以sku_id不再是主键。从sku_id的角度去看平台属性,应该是将多行整合成一行,最终表现形式,array<平台属性>,即一个sku_id对应多个平台属性,正规写法为array<struct<attr_id, attr_name, value_id, value_name>>,这张表重新以sku_id为粒度。

ods_sku_sale_attr_value表中的内容(id, sku_id, spu_id, sale_attr_value_id, sale_attr_id, sale_attr_name, sale_attr_value_name),同平台表,一个sku_id对应多个销售属性,即array<销售属性>

以上就是商品维度表中的所有列,根据需求,其中不需要的列可以去除,再次进行精简。

建模过程:找到最关键的八张表,将这八张表的信息以sku_id为粒度将它们整合在一起,商品维度表就应该以商品的id为粒度,所以主键就是sku_id,数据来源于原来关系建模表中的数据–ods层。

3 建表语句

DROP TABLE IF EXISTS dim_sku_info;
CREATE EXTERNAL TABLE dim_sku_info (`id` STRING COMMENT '商品id',`price` DECIMAL(16,2) COMMENT '商品价格',`sku_name` STRING COMMENT '商品名称',`sku_desc` STRING COMMENT '商品描述',`weight` DECIMAL(16,2) COMMENT '重量',`is_sale` BOOLEAN COMMENT '是否在售',`spu_id` STRING COMMENT 'spu编号',`spu_name` STRING COMMENT 'spu名称',`category3_id` STRING COMMENT '三级分类id',`category3_name` STRING COMMENT '三级分类名称',`category2_id` STRING COMMENT '二级分类id',`category2_name` STRING COMMENT '二级分类名称',`category1_id` STRING COMMENT '一级分类id',`category1_name` STRING COMMENT '一级分类名称',`tm_id` STRING COMMENT '品牌id',`tm_name` STRING COMMENT '品牌名称',`sku_attr_values` ARRAY<STRUCT<attr_id:STRING,value_id:STRING,attr_name:STRING,value_name:STRING>> COMMENT '平台属性',`sku_sale_attr_values` ARRAY<STRUCT<sale_attr_id:STRING,sale_attr_value_id:STRING,sale_attr_name:STRING,sale_attr_value_name:STRING>> COMMENT '销售属性',`create_time` STRING COMMENT '创建时间'
) COMMENT '商品维度表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dim/dim_sku_info/'
TBLPROPERTIES ("orc.compress"="snappy");

4 装载数据

数据来源为ods层,ods层每天都会导入一些数据,需要去查看每天导入的数据是些什么样的数据

这八张表全部都是全量导入,每天库中都是全量信息,将每天的全量信息join到一起就是当天的全量信息,所以这八张表数据的导入方式就是将信息进行join和整理以后,直接每天导入到维度表中,维度表按照日期分区,所以维度表每天都是最新的维度信息。

(1)逐步分析

首先需要从ods表格中将当天所有信息查询出来,如插入06-14的数据,代码如下

with
sku as
(selectid,price,sku_name,sku_desc,weight,is_sale,spu_id,category3_id,tm_id,create_timefrom ods_sku_infowhere dt='2020-06-14'
),

说明:将这张表作为一张临时表格,后面调用sku指的就是上面()中的内容,共十列。

join spu表

spu as
(selectid,spu_namefrom ods_spu_infowhere dt='2020-06-14'
),

category3

c3 as
(selectid,name,category2_idfrom ods_base_category3where dt='2020-06-14'
),

连接category2

c2 as
(selectid,name,category1_idfrom ods_base_category2where dt='2020-06-14'
),

join category1

c1 as
(selectid,namefrom ods_base_category1where dt='2020-06-14'
),

连接tm

tm as
(selectid,tm_namefrom ods_base_trademarkwhere dt='2020-06-14'
),

连接平台属性,此表粒度比sku小,所以需要聚合,将四列合并成一个结构体,最终呈现结果就是一列数据,使用named_struct()函数完成,再将sku合并成一个数组,使用collect_set()函数。

核心思想:以sku为基础进行聚合。

attr as
(selectsku_id,collect_set(named_struct('attr_id',attr_id,'value_id',value_id,'attr_name',attr_name,'value_name',value_name)) attrsfrom ods_sku_attr_valuewhere dt='2020-06-14'group by sku_id
),

连接销售属性

sale_attr as
(selectsku_id,collect_set(named_struct('sale_attr_id',sale_attr_id,'sale_attr_value_id',sale_attr_value_id,'sale_attr_name',sale_attr_name,'sale_attr_value_name',sale_attr_value_name)) sale_attrsfrom ods_sku_sale_attr_valuewhere dt='2020-06-14'group by sku_id
)

目前八张临时表格全部准备就绪,接下来以这八张表格为基础,进行如下操作

insert overwrite table dim_sku_info partition(dt='2020-06-14')
selectsku.id,sku.price,sku.sku_name,sku.sku_desc,sku.weight,sku.is_sale,sku.spu_id,spu.spu_name,sku.category3_id,c3.name,c3.category2_id,c2.name,c2.category1_id,c1.name,sku.tm_id,tm.tm_name,attr.attrs,sale_attr.sale_attrs,sku.create_time
from sku
left join spu on sku.spu_id=spu.id
left join c3 on sku.category3_id=c3.id
left join c2 on c3.category2_id=c2.id
left join c1 on c2.category1_id=c1.id
left join tm on sku.tm_id=tm.id
left join attr on sku.id=attr.sku_id
left join sale_attr on sku.id=sale_attr.sku_id;

(2)完整装载sql

with
sku as
(selectid,price,sku_name,sku_desc,weight,is_sale,spu_id,category3_id,tm_id,create_timefrom ods_sku_infowhere dt='2020-06-14'
),
spu as
(selectid,spu_namefrom ods_spu_infowhere dt='2020-06-14'
),
c3 as
(selectid,name,category2_idfrom ods_base_category3where dt='2020-06-14'
),
c2 as
(selectid,name,category1_idfrom ods_base_category2where dt='2020-06-14'
),
c1 as
(selectid,namefrom ods_base_category1where dt='2020-06-14'
),
tm as
(selectid,tm_namefrom ods_base_trademarkwhere dt='2020-06-14'
),
attr as
(selectsku_id,collect_set(named_struct('attr_id',attr_id,'value_id',value_id,'attr_name',attr_name,'value_name',value_name)) attrsfrom ods_sku_attr_valuewhere dt='2020-06-14'group by sku_id
),
sale_attr as
(selectsku_id,collect_set(named_struct('sale_attr_id',sale_attr_id,'sale_attr_value_id',sale_attr_value_id,'sale_attr_name',sale_attr_name,'sale_attr_value_name',sale_attr_value_name)) sale_attrsfrom ods_sku_sale_attr_valuewhere dt='2020-06-14'group by sku_id
)
insert overwrite table dim_sku_info partition(dt='2020-06-14')
selectsku.id,sku.price,sku.sku_name,sku.sku_desc,sku.weight,sku.is_sale,sku.spu_id,spu.spu_name,sku.category3_id,c3.name,c3.category2_id,c2.name,c2.category1_id,c1.name,sku.tm_id,tm.tm_name,attr.attrs,sale_attr.sale_attrs,sku.create_time
from sku
left join spu on sku.spu_id=spu.id
left join c3 on sku.category3_id=c3.id
left join c2 on c3.category2_id=c2.id
left join c1 on c2.category1_id=c1.id
left join tm on sku.tm_id=tm.id
left join attr on sku.id=attr.sku_id
left join sale_attr on sku.id=sale_attr.sku_id;

二 优惠券维度表(全量)

优惠券维度表分区:

直接每日将ods_coupon_info表中的数据直接导入到DIM层即可

1 建表语句

DROP TABLE IF EXISTS dim_coupon_info;
CREATE EXTERNAL TABLE dim_coupon_info(`id` STRING COMMENT '购物券编号',`coupon_name` STRING COMMENT '购物券名称',`coupon_type` STRING COMMENT '购物券类型 1 现金券 2 折扣券 3 满减券 4 满件打折券',`condition_amount` DECIMAL(16,2) COMMENT '满额数',`condition_num` BIGINT COMMENT '满件数',`activity_id` STRING COMMENT '活动编号',`benefit_amount` DECIMAL(16,2) COMMENT '减金额',`benefit_discount` DECIMAL(16,2) COMMENT '折扣',`create_time` STRING COMMENT '创建时间',`range_type` STRING COMMENT '范围类型 1、商品 2、品类 3、品牌',`limit_num` BIGINT COMMENT '最多领取次数',`taken_count` BIGINT COMMENT '已领取次数',`start_time` STRING COMMENT '可以领取的开始日期',`end_time` STRING COMMENT '可以领取的结束日期',`operate_time` STRING COMMENT '修改时间',`expire_time` STRING COMMENT '过期时间'
) COMMENT '优惠券维度表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dim/dim_coupon_info/'
TBLPROPERTIES ("orc.compress"="snappy");

2 数据装载

insert overwrite table dim_coupon_info partition(dt='2020-06-14')
selectid,coupon_name,coupon_type,condition_amount,condition_num,activity_id,benefit_amount,benefit_discount,create_time,range_type,limit_num,taken_count,start_time,end_time,operate_time,expire_time
from ods_coupon_info
where dt='2020-06-14';

三 活动维度表(全量)

来源于ods_activity_info 和 ods_activity_rule 这两张表,同一个活动可能有多个活动规则,所以以rule的id为粒度来join,即创建activity_rule每条规则的维度表,里面再嵌套activity id

活动维度表分区:

1 建表语句

DROP TABLE IF EXISTS dim_activity_rule_info;
CREATE EXTERNAL TABLE dim_activity_rule_info(`activity_rule_id` STRING COMMENT '活动规则ID',`activity_id` STRING COMMENT '活动ID',`activity_name` STRING  COMMENT '活动名称',`activity_type` STRING  COMMENT '活动类型',`start_time` STRING  COMMENT '开始时间',`end_time` STRING  COMMENT '结束时间',`create_time` STRING  COMMENT '创建时间',`condition_amount` DECIMAL(16,2) COMMENT '满减金额',`condition_num` BIGINT COMMENT '满减件数',`benefit_amount` DECIMAL(16,2) COMMENT '优惠金额',`benefit_discount` DECIMAL(16,2) COMMENT '优惠折扣',`benefit_level` STRING COMMENT '优惠级别'
) COMMENT '活动信息表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dim/dim_activity_rule_info/'
TBLPROPERTIES ("orc.compress"="snappy");

2 数据装载

用activity_rule activity_id 去 join activity_info 的 id

insert overwrite table dim_activity_rule_info partition(dt='2020-06-14')
selectar.id,ar.activity_id,ai.activity_name,ar.activity_type,ai.start_time,ai.end_time,ai.create_time,ar.condition_amount,ar.condition_num,ar.benefit_amount,ar.benefit_discount,ar.benefit_level
from
(selectid,activity_id,activity_type,condition_amount,condition_num,benefit_amount,benefit_discount,benefit_levelfrom ods_activity_rulewhere dt='2020-06-14'
)ar
left join
(selectid,activity_name,start_time,end_time,create_timefrom ods_activity_infowhere dt='2020-06-14'
)ai
on ar.activity_id=ai.id;

以上三张维度表,每天数据进来后,直接插入就可以,数据之间彼此没有干扰。

四 地区维度表(特殊)

导入一次即可。

数据来源为ods_base_province 和 ods_base_region 两张表。

用ods_base_province 的region_id join ods_base_region 的id以后,将refion_name整合进来就可以了。

地区维度表分区:

1 建表语句

DROP TABLE IF EXISTS dim_base_province;
CREATE EXTERNAL TABLE dim_base_province (`id` STRING COMMENT 'id',`province_name` STRING COMMENT '省市名称',`area_code` STRING COMMENT '地区编码',`iso_code` STRING COMMENT 'ISO-3166编码,供可视化使用',`iso_3166_2` STRING COMMENT 'IOS-3166-2编码,供可视化使用',`region_id` STRING COMMENT '地区id',`region_name` STRING COMMENT '地区名称'
) COMMENT '地区维度表'
STORED AS ORC
LOCATION '/warehouse/gmall/dim/dim_base_province/'
TBLPROPERTIES ("orc.compress"="snappy");

2 数据装载

insert overwrite table dim_base_province
selectbp.id,bp.name,bp.area_code,bp.iso_code,bp.iso_3166_2,bp.region_id,br.region_name
from ods_base_province bp
join ods_base_region br on bp.region_id = br.id;

五 时间维度表(特殊)

ods层中没有时间维度表,时间维度表作用为某日是工作日还是节假日,如果工作日是星期几,节假日是什么节日,是假期的第几天等等诸如此类的信息。这些信息不需要看业务,看日历即可,所以这种表,在建库的时候,通常通过程序生成数据,一次性导入几年的数据。

1 建表语句

DROP TABLE IF EXISTS dim_date_info;
CREATE EXTERNAL TABLE dim_date_info(`date_id` STRING COMMENT '日',`week_id` STRING COMMENT '周ID',`week_day` STRING COMMENT '周几',`day` STRING COMMENT '每月的第几天',`month` STRING COMMENT '第几月',`quarter` STRING COMMENT '第几季度',`year` STRING COMMENT '年',`is_workday` STRING COMMENT '是否是工作日',`holiday_id` STRING COMMENT '节假日'
) COMMENT '时间维度表'
STORED AS ORC
LOCATION '/warehouse/gmall/dim/dim_date_info/'
TBLPROPERTIES ("orc.compress"="snappy");

2 数据装载

(1)创建临时表格

DROP TABLE IF EXISTS tmp_dim_date_info;
CREATE EXTERNAL TABLE tmp_dim_date_info (`date_id` STRING COMMENT '日',`week_id` STRING COMMENT '周ID',`week_day` STRING COMMENT '周几',`day` STRING COMMENT '每月的第几天',`month` STRING COMMENT '第几月',`quarter` STRING COMMENT '第几季度',`year` STRING COMMENT '年',`is_workday` STRING COMMENT '是否是工作日',`holiday_id` STRING COMMENT '节假日'
) COMMENT '时间维度表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/tmp/tmp_dim_date_info/'

(2)上传到HDFS

将数据文件<data_info.txt>上传到HFDS上临时表指定路径/warehouse/gmall/tmp/tmp_dim_date_info/

(3)导入

执行以下语句将其导入时间维度表

insert overwrite table dim_date_info select * from tmp_dim_date_info;

(4)校验

检查数据是否导入成功

select * from dim_date_info;

【电商数仓】数仓搭建之DIM维度层(商品、优惠券、活动、地区、时间维度表)相关推荐

  1. 大数据电商离线数仓项目-上篇

    下一篇:电商数仓项目-下篇 文章目录 第1章 数仓分层 1.1 为什么要分层 1.2 数据集市与数据仓库概念 1.3 数仓命名规范 1.3.1 表命名 1.3.2 脚本命名 1.3.3 表字段类型 第 ...

  2. 电商离线数仓项目实战(下)

    电商离线数仓项目实战(下) 电商分析--核心交易 文章目录 电商离线数仓项目实战(下) 电商分析--核心交易 一.业务需求 二.业务数据库表结构 1. 数据库表之间的联系 img 2. 业务数据库-- ...

  3. 数据仓库项目(第五节)数仓理论、电商业务数仓介绍与创建

    目录 数仓理论 表的分类 实体表 维度表 事务型事实表 周期型事实表 同步策略 实体表同步策略 维度表同步策略 事务型事实表同步策略 周期型事实表同步策略 范式理论 范式概念 函数依赖 三范式区分 关 ...

  4. 电商离线数仓-业务数仓指标(GMV主题/转化率主题)

    GMV和转化率 GMV主题 GMV的概念 GMV表的创建 GMV表里导入数据 转化率 转化率概念 转化率表的创建 转化率表里导入数据 ADS层用户行为漏斗分析 GMV主题 GMV的概念 什么是GMV? ...

  5. 电商数仓数仓环境搭建

    1.hive环境搭建 1.1.hive引擎简介 Hive引擎包括:默认MR.tez.spark Hive on Spark:Hive既作为存储元数据又负责SQL的解析优化,语法是HQL语法,执行引擎变 ...

  6. 大数据电商离线数仓项目-下篇

    上一篇:电商数仓系统1 文章目录 第5章 数仓搭建-DWS层 5.1 业务术语 5.2 系统函数 5.2.1 nvl函数 5.2.2 日期处理函数 5.2.3 复杂数据类型定义 5.3 DWS层 5. ...

  7. 电商零售数仓建模之用户01:用户业务模型

    一.前言 数仓建模的成熟度在金融领域,尤其是银行.保险和证券行业得益于传统数据仓库服务厂商的推动,具有非常好的最佳实践,但是在互联网领域却从未形成真正的标准和规范.本文基于汽车电商零售领域的实践总结和 ...

  8. 电商离线数仓项目-埋点数据/事件日志的基本格式详细理解

    数据格式详解 埋点数据 事件数据 商品点击 商品详情页 商品列表页 广告 消息通知 用户前台活跃 用户后台活跃 评论 收藏 点赞 错误日志数据 启动日志数据 埋点数据 数据埋点产生的Json格式的数据 ...

  9. PB级企业电商离线数仓项目实战

    项目背景:人类从IT走向DT时代.人们往往可以收集到更多的数据.到2020,全球数据总量将超过40ZB,是2011年的22倍.正在呈爆炸式增长. 数据仓库的四大特征:面向主题.集成的.稳定的.反映历史 ...

最新文章

  1. Alcatel 6850实现静态路由
  2. kotlin将对象转换为map_在 Kotlin 的 data class 中使用 MapStruct
  3. 阶段3 1.Mybatis_04.自定义Mybatis框架基于注解开发_2 回顾自定义mybatis的流程分析...
  4. 计算机的软键盘在哪里,Win8软键盘在哪 Win8.1屏幕键盘打开方法图解
  5. 大学计算机计算题乘法,分数乘法计算题100道
  6. vnc远程控制软件配置,vnc远程控制软件怎么配置,教程详解
  7. AngularJS【初体验】-02
  8. matlab正弦函数傅里叶变换,正弦函数及其傅里叶变换(一)
  9. 操作系统-比例份额调度
  10. Python新手接了第一个副业单子,2小时完成:Python修正excel表格数据
  11. 电子邮件服务器怎样匿名转发功能,技巧:你为什么不能匿名发送电子邮件
  12. 2023南京信息工程大学计算机考研信息汇总
  13. 刚闪电入门了树莓派:斩获不止Python,Linux,goLang,还有架构,格局...
  14. wd移动硬盘不能识别_西部数据移动硬盘无法识别恢复
  15. 电视剧《大秧歌》随感
  16. 计算机毕业设计Java网上租房管理(源码+系统+mysql数据库+Lw文档)
  17. 流程图-一些要点总结
  18. 【论文阅读】CT-ICP: Real-time Elastic LiDAR Odometry with Loop Closure
  19. 50个Java精品源码免积分下载
  20. RISC-V MCU 基于嵌入式的歌曲识别

热门文章

  1. 体重秤方案,电子秤方案开发
  2. clickhouse Mutations删除操作报错及解决方案
  3. 波形分析软件 android,新版 PicoScope 软件提供更出色的波形分析和功能 – 免费获取!...
  4. BLE Mesh(一)基础介绍
  5. 亚洲游戏展Freeze化身女神代言《神泣》
  6. 时间戳与日期格式相互转换
  7. mac开机一直报错重启
  8. SSM智能化仓储管理系统 计算机毕设源码30134
  9. python怎么切片提取_彻底搞懂Python切片操作
  10. 在线文本编辑器-ueditor实践