企业级大数据项目【4】数仓-业务域ODS-DWD-ADS开发篇

企业级大数据项目【4】数仓-业务域ODS-DWD-ADS开发篇1 概要说明业务域的数据来自业务系统的数据库通过 sqoop 或 datax 抽取到数仓的 ods 层在 ods 层对有需要的表进行增量合并 字段选择 反范式话 形成 dwd 明细层表在明细层基础上 进行各类主题的数据统计 分析课程中

大家好,欢迎来到IT知识分享网。

1概要说明

  • 交易域分析
  • 营销域分析
  • 会员域分析
  • 物流域分析
  • 仓储域分析
  • 供应域分析

2Sqoop数据抽取工具

2.1基本概念

sqoop 是 apache 旗下一款“Hadoop中的各种存储系统(HDFS、HIVE、HBASE) 和关系数据库(mysql、oracle、sqlserver等)服务器之间传送数据”的工具。

核心的功能有两个:

导入(迁入) 导出(迁出) 

导入数据:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统
导出数据:从 Hadoop 的文件系统中导出数据到关系数据库 mysql 等 Sqoop 的本质还是一个命令行工具,和 HDFS,Hive 相比,并没有什么高深的理论。
在这里插入图片描述

底层工作机制
将导入或导出命令翻译成 MapReduce 程序来实现
在翻译出的 MapReduce 中主要是对InputFormat 和 OutputFormat 进行定制

2.2使用实例

sqoop import \ --connect jdbc:mysql://h3:3306/ry \ --username root \ --password haitao. \ --hive-import \ --hive-table yiee_dw.doit_jw_stu_base4 \ --as-textfile \ --fields-terminated-by ',' \ --compress \ --compression-codec gzip \ --split-by stu_id \ --null-string '\\N' \ --null-non-string '\\N' \ --hive-overwrite \ --query 'select stu_id,stu_name,stu_age,stu_term from doit_jw_stu_base where stu_createtime>"2019-09-24 23:59:59" and stu_sex="1" and $CONDITIONS' \ --target-dir '/user/root/tmp' \ -m 2 

3DataX数据抽取工具

3.1简介

DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能。

3.2核心架构

在这里插入图片描述

DataX本身作为离线数据同步框架,采用Framework + plugin架构构建。将数据源读取和写入抽象成为Reader/Writer插件,纳入到整个同步框架中。

核心模块介绍:
DataX完成单个数据同步的作业,我们称之为Job,DataX接受到一个Job之后,将启动一个进程来完成整个作业同步过程。DataX Job模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、TaskGroup管理等功能。

DataXJob启动后,会根据不同的源端切分策略,将Job切分成多个小的Task(子任务),以便于并发执行。Task便是DataX作业的最小单元,每一个Task都会负责一部分数据的同步工作。

切分多个Task之后,DataX Job会调用Scheduler模块,根据配置的并发数据量,将拆分成的Task重新组合,组装成TaskGroup(任务组)。每一个TaskGroup负责以一定的并发运行完毕分配好的所有Task,默认单个任务组的并发数量为5。

每一个Task都由TaskGroup负责启动,Task启动后,会固定启动Reader—>Channel—>Writer的线程来完成任务同步工作。

DataX作业运行起来之后, Job监控并等待多个TaskGroup模块任务完成,等待所有TaskGroup任务完成后Job成功退出。否则,异常退出,进程退出值非0

3.3DataX支持的数据通道

3.4DataX基本使用

{ 
    "job": { 
    "content": [ "reader": { 
    }, "writer": { 
    } ], "setting": { 
    "speed": { 
    "channel": "1" } } } } 

具体的reader,writer参数官网有说明。

3,执行 python datax.py xx.json

4,调优,主要是调整channel,byte,record参数,不过具体性能还是取决于源端数据库的表是否适合切分,是否有合适的切分字段,切分字段最好为数字。

3.5DataX实战配置

从mysql抽取数据到hdfs

{ 
    "setting": { 
   }, "job": { 
    "setting": { 
    "speed": { 
    "channel": 2 } }, "content": [ { 
    "reader": { 
    "name": "mysqlreader", "parameter": { 
    "username": "root", "password": "ABC123abc.123", "column": [ "id", "name", "gender", "addr" ], "splitPk": "id", "connection": [ { 
    "table": [ "demo1" ], "jdbcUrl": [ "jdbc:mysql://doitedu01:3306/dataxtest?useUnicode=true&characterEncoding=utf8" ] } ] } }, "writer": { 
    "name": "hdfswriter", "parameter": { 
    "defaultFS": "hdfs://doitedu01:8020", "fileType": "orc", "path": "/user/hive/warehouse/test.db/stu/", "fileName": "stu", "column": [ { 
    "name": "id", "type": "INT" }, { 
    "name": "name", "type": "STRING" }, { 
    "name": "age", "type": "INT" }, { 
    "name": "gender", "type": "STRING" }, { 
    "name": "addr", "type": "STRING" } ], "writeMode": "append", "fieldDelimiter": "\t", "compress":"NONE" } } } ] } } 

4数据抽取策略

本层直接对接DATAX/SQOOP从业务库抽取过来的各类数据表 

实体表
实体表小表(品类信息表,活动信息表,优惠券信息表等),每天抽取过来一份全量(或者一周、一月)
实体表大表(商品信息表),每天抽取过来一份增量数据

事实表
订单相关表
优惠券领取使用记录表
秒杀订阅记录表


每天都会抽取一份增量数据

总原则
小表——全量抽取
大表——增量抽取

5ODS 设计开发

5.1主要表模型

  • 商品信息(主要信息、详情信息、类目信息、属性信息、商品相册信息)
    在这里插入图片描述
  • 用户信息(主要信息、附加信息、会员等级信息)
    在这里插入图片描述
  • 订单信息及购物车相关(主要信息、详情信息、物流信息、评论信息)
    在这里插入图片描述
  • 内容管理(话题,文章,评论)
    在这里插入图片描述
  • 营销管理(优惠券、代金券、活动规则、主题推荐)
    在这里插入图片描述

5.2增量合并

策略
为了便于后续的统计分析方便,用增量抽取策略抽取过来的增量数据,都要每天进行滚动合并
在这里插入图片描述

合并的技术手段
1)方便起见,可以使用 sqoop merge命令进行
2)如果有特别情况,可以自己写spark程序来实现
3)直接用hive的sql来实现(分组top1模式 或者 JOIN模式)


增量合并实战

bin/sqoop codegen \ --connect jdbc:mysql://impala01:3306/sqooptest \ --username root \ --password ABC123abc.123 \ --table stu \ --bindir /opt/apps/code/stu \ --class-name Stu \ --fields-terminated-by "," bin/sqoop merge \ --new-data /sqoopdata/stu1 \ --onto /sqoopdata/stu0 \ --target-dir /sqoopdata/stu_all \ --jar-file /opt/apps/code/stu/Stu.jar \ --class-name Stu \ --merge-key id 

5.3拉链表

5.3.1概念介绍
以订单表为例,表中90%的数据基本不会随着时间而变化,只有最近一段时间内的数据会有变化
对于这种类型的表,我们往往需要保存好每一条数据的每一天的状态

方案1
可以每天保存一份全量表,并长期存储,这样可以实现每天状态的保存,也方便查询任何一天中数据的状态;
弊端:由于表中90%的数据都不会变化,因此,各天的全量表,其实大量数据都是相同的,存储冗余度太高

方案2
使用拉链表模型,来实现每条数据每天状态的变化情况
优点:既能保留每天状态,又比较节省存储空间
弊端:使用、查询的时候,略增加了一点复杂性
在这里插入图片描述



拉链表查询举例:比如查询2020-07-05日的所有订单数据 select * from zipper where and start_dt<='2020-07-05' and end_dt>='2020-07-05' 

5.3.2拉链表开发

  • 整体流程
    在这里插入图片描述
  • 核心逻辑

6DWD层设计开发

本层主要表类型:

  • 存储各业务表的全量快照
  • 存储各业务表的拉链表

6.1订单明细宽表: oms_order

6.2购物车明细宽表 oms_cart

6.3优惠券使用明细表 sms_coupon

6.4秒杀活动订阅明细表 sms_promotion

7DWS层设计开发

本层主要处理: 按照维度建模的思想,按各主题,将核心事实表关联需要的维度表,得到宽表 

7.1订单明细宽表:dws.oms_order_detail

假如有如下报表统计需求:

核心度量

  • GMV金额(GMV包含所有已提交订单)
  • 实付金额(已付款的金额)
  • 优惠券抵扣金额(一些订单中会有使用优惠券)
  • 促销折扣金额
  • 积分抵扣金额

主要维度

  • 时段(小时段,日,周,月,季,…)
  • 品类
  • 品牌
  • 会员等级
  • 订单类型(普通订单,团购订单,秒杀订单)
  • 订单来源(pc,app,微信小程序,H5)
  • 促销活动

我们可以做一张dws层的宽表,来支撑这个统计需求

在这里插入图片描述

7.2订单数量、人数、单价、复购分析

dws.oms_order_and_return

核心度量

  • 订单单数
  • 订单人数
  • 取消单数
  • 取消人数
  • 退货单数(统计口径:按退单申请日作为时间条件)
  • 退货人数
  • 退货件数

主要维度

  • 时段(小时段,日,周,月,季,…)
  • 会员等级
  • 订单类型(普通订单,团购订单,秒杀订单)
  • 订单来源(pc,app,微信小程序,H5)

设计一张DWS层的服务表:订单表 + 退货申请记录表

7.3购物车分析dws表 dws.oms_cart_detail

在这里插入图片描述

7.4优惠券领取数量,使用数量,使用人数分析

核心度量

  • 优惠券领取数量
  • 优惠券使用数量
  • 优惠券领取金额
  • 优惠券使用金额
  • 优惠券使用人数

主要维度

  • 时段(小时段,日,周,月,季,…)
  • 会员等级
  • 优惠券类型
使用到的表: sms_coupon 实体描述表 (优惠券信息表) sms_coupon_history 操作事务表(优惠券领取使用记录表) 

在这里插入图片描述

7.5秒杀订阅人数,成单数,成单金额多维度分析

核心度量

  • 秒杀订阅人数
  • 秒杀成单单数
  • 秒杀成单金额

主要维度

  • 时段(小时段,日,周,月,季,…)
  • 会员等级
  • 秒杀活动场次
使用到的表: sms_flash_promotion_log 操作事务表 (秒杀订阅通知记录) oms_order_item 操作事务表(订单商品详情记录) ums_member 实体表(用户信息表) sms_flash_promotion_session 实体表(秒杀场次信息) 

在这里插入图片描述

7.6用户消费统计画像表

需求说明
给用户打上一些消费相关(下单、退货、金额、客单价)的统计数据标签

drop table if exists ads_user_order_tag; create table ads_user_order_tag( user_id bigint ,--用户 first_order_time string ,--首单日期 last_order_time string ,--末单日期 first_order_ago bigint ,--首单距今时间 last_order_ago bigint ,--末单距今时间 month1_order_cnt bigint ,--30天下单次数 month1_order_amt double ,--30天购买金额(总金额) month2_order_cnt bigint ,--60天购买次数 month2_order_amt double ,--60天购买金额 month3_order_cnt bigint ,--90天购买次数 month3_order_amt double ,--90天购买金额 max_order_amt double ,--最大订单金额 min_order_amt double ,--最小订单金额 total_order_cnt bigint ,--累计消费次数(不含退拒) total_order_amt double ,--累计消费金额(不含退拒) total_coupon_amt double ,--累计使用代金券金额 user_avg_order_amt double ,--平均订单金额(含退拒) month3_user_avg_amt double ,--90天平均订单金额(含退拒) common_address string ,--常用收货地址 common_paytype string ,--常用支付方式 month1_cart_cnt_30 bigint ,--最近30天加购次数 month1_cart_goods_cnt_30 bigint ,--最近30天加购商品件数 month1_cart_cancel_cnt bigint ,--最近30天取消商品件数 dw_date string ,计算日期 ) partitioned by (dt string) ; 
该表的计算,需要用到3张源表: 订单表,退拒货申请记录表,购物车表 《详见项目代码》 

计算方案

代码实现

7.7用户商品退拒画像分析

需求说明

drop table if exists ads_user_profile_reject_tag; create table ads_user_profile_reject_tag( user_id bigint ,-- 用户 p_sales_cnt bigint ,-- 不含退拒商品购买数量 p_sales_amt double ,-- 不含退拒商品购买的商品总价 p_sales_cut_amt double ,-- 不含退拒实付金额(扣促销减免) h_sales_cnt bigint ,-- 含退拒购买数量 h_sales_amt double ,-- 含退拒购买金额 h_sales_cut_amt double ,-- 含退拒购买金额(扣促销减免) return_cnt bigint ,-- 退货商品数量 return_amt double ,-- 退货商品金额 dw_date bigint ) partitioned by (dt string) stored as parquet ; 

计算方案

从 oms_order_item 关联 oms_order_return_apply 得到 如下数据: 订单,商品,商品价格,购买数量,实付金额,是否退货,退货件数,退货的金额 

代码实现

7.8用户购物偏好画像分析

需求说明

drop table if exists ads_user_profile_favor_tag; create table ads_user_profile_favor_tag( user_id bigint ,-- 用户 common_first_cat bigint ,-- 最常购买一级类目名称 common_second_cat bigint ,-- 最常购买二级类目名称 common_third_cat bigint ,--最常购买三级类目名称 most_brand_id bigint ,--最常购买的品牌 second_brand_id bigint ,--第二多购买的品牌 third_brand_id bigint ,--第三多购买的品牌 third_brand_id bigint ,--最喜欢的颜色 dw_date bigint ) partitioned by (dt string) stored as parquet ; 

代码实现

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/126700.html

(0)
上一篇 2025-09-16 18:15
下一篇 2025-09-16 18:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信