赞
踩
数据仓库,通过数仓建模更好的组织管理和存储数据,以便在性能、成本、效率和质量之间取得最好的平衡。
ETL(extraction Transformation Loading)负责将分散的、异构数据源中的数据抽取到临时中间层后进行清洗、转换、集成,最后加载到数据仓库或者数据集市中。ETL是实施数据仓库的核心和灵魂。
ODS层的处理比较简单,基本上是将业务系统数据原封不动的同步即可,一般采用增量、或者全量的方式。
数据引入层:将原始数据几乎无处理的存放在数据仓库系统中,结构上与源系统基本保持一致,是数据仓库的数据准备区。这一层的主要职责是将基础数据同步、存储。一般来说ODS层的数据和源系统的数据是同构的,主要目的是简化后续数据加工处理的工作。从数据粒度上来说ODS层的数据粒度是细的。ODS层的表通常包括两类,一个用于存储当前需要加载的数据,一个用于存储处理完后的历史数据。历史数据一般保存3-6个月后需要清楚,以节省空间。但是不同的项目要区别对待,如果源系统的数据量不大,可以保留更长的时间,甚至全量保存。
数据源是业务数据库,公司所有系统产生的数据
是通过在客户端埋点上报,收集用户的行为日志,以及一些后端日志的日志类型数据源。对于埋点行为日志来说,一般会经过一个这样的流程,首先数据会上报到Nginx然后经过Flume收集,然后存储到Kafka这样的消息队列,然后再由实时或者离线的一些拉取任务,拉取到我们的离线数据仓库HDFS。
外部数据:包括合作数据以及爬虫获得的数据,将所采集的数据汇总到一起。
增量存储:为了满足历史数据分析需求,可以在ODS层表中添加时间维度作为分区字段,以天为单位的增量存储,以业务日期作为分区,每个分区存放日增量的业务数据。交易、日志等事务性较强的ODS表适合增量存储方式,这类表数据量较大,采用全量存储的方式存储成本压力大,此外,这里表的下游应用对于历史全量数据访问的需求较小。
全量存储:以天为单位的全量存储,以业务日期作为分区,每个分区存放截止到当前业务日期位置的全量业务数据。对于小数据量的缓慢变化维度数据,例如商品类目,可直接使用全量存储。
拉链存储:拉链存储通过新增两个时间戳字段(start_dt和end_dt),将所有以天为粒度的变更数据都记录下来,通过分区字段也是这两个时间戳字段
公共层主要通过抽象、复用、沉淀物理或逻辑的模型,以提供整体架构的数据效率并确保口径一致性。整个公共层设计要点在于需求上识别公共性逻辑,设计上抽象复用模型,现实上平衡易用性和稳定性。一般要遵循以下几点原则:
数据仓库层(DW):数据仓库层是我们在做数据仓库时要核心设计的一层,本层将从ODS层中获得的数据按照主题建立各种数据模型,每一个主题对应一个宏观的分析领域,数据仓库层排除对决策无用的数据,提供特定主题的简明视图。DW层会保存BI系统中所有的历史数据。
DW存放明细事实数据、维度数据以及公共指标汇总数据。其中,明细事实数据、维表数据一般根据ODS层数据加工生成。公共指标汇总数据一般根据维表数据和明细事实数据加工生成。
DW层有细分为维度层(DIM)、明细数据层(DWD)和汇总数据层(DWS),采用维度模型方法作为理论基础,可以定义维度模型主键与事实模型中外键关系,减少数据冗余,也提高明细数据表的易用性。在汇总数据层同样可以关联复用统计粒度中的维度,采取更多的宽表化手段构建公共指标数据层,提升公共指标的复用性,减少重复加工。
主题域:面向业务过程,将业务活动时间进行抽象的集合,如下单、支付、退款等都是业务过程,针对公共明细层(DWD)进行主题划分。主题域通常是联系较为紧密的数据主题的集合,可以根据业务的关注点,将这些数据主题划分到不同的主题域(也就是对某个主题进行分析后确定的主题的边界)
数据域:面向业务分析,将业务过程或者维度进行抽象的集合,针对公共汇总层进行数据域划分。
命名:dwd_{业务板块/pub}_{数据域缩写}_{业务过程缩写}{_{自定义表命名标签缩写}}_{单分区增量全量标识}。pub表示数据包括多个业务板块的数据。单分区增量全量标识:i表示增量,f表示全量。例如交易商品信息事实表:dwd_asale_trd_itm_di;交易会员信息事实表:ods_asale_trd_mbr_di;交易订单信息事实表:dwd_asale_trd_ord_di。
- CREATE TABLE IF NOT EXISTS dwd_asale_trd_itm_di
- (
- item_id BIGINT COMMENT '商品ID',
- item_title STRING COMMENT '商品名称',
- item_price DOUBLE COMMENT '商品价格',
- item_stuff_status BIGINT COMMENT '商品新旧程度_0全新1闲置2二手',
- item_prov STRING COMMENT '商品省份',
- item_city STRING COMMENT '商品城市',
- cate_id BIGINT COMMENT '商品类目ID',
- cate_name STRING COMMENT '商品类目名称',
- commodity_id BIGINT COMMENT '品类ID',
- commodity_name STRING COMMENT '品类名称',
- buyer_id BIGINT COMMENT '买家ID',
- )
- COMMENT '交易商品信息事实表'
- PARTITIONED BY (ds STRING COMMENT '日期')
- LIFECYCLE 400;
数据清洗过滤
去除废弃字段、去除格式错误的信息
去除丢失关键字段的信息
过滤核心字段无意义的数据,比如订单id为null的,支付表支付id为空的
对手机号、身份证号等敏感信息数据脱敏
去除不含时间信息的数据
数据映射、转换
将GPS经纬度转换成省市县详细地址。业界常用gps快速查询一般将地理位置知识库使用genhash映射,然后将需要比对的gps转换为geohash后跟知识库中的geohash对比,查找出地理位置信息;
将IP地址也转换为省市县详细地址,这个有很多快速查找库,不过基本原理都是二分查找,因为IP地址可以转换为长整数,典型的如ip2region库
将时间转换成年、月、日甚至周、季度维度信息
数据规范化:因为大数据处理的数据可能来自不同的部门,不同的项目、不同的客户端,这个时候可能相同的业务数据字段、数据类型、空值等都不一样,需要在DWD层做抹平,否则后续处理使用的时候,会造成很大的困扰。
如boolean,有使用0、1标识的,也有使用true、false标识的
如字符串空值,有使用’‘的,也有使用null的,统一为null即可
如日期格式,这种差异性更大,需要根据实际业务数据决定,不过一般都格式化为YYYY-MM-dd HH:mm:ss这类标准格式
维度退化:对业务数据传过来的表进行维度退化和降维。订单id冗余在事实表。
DWS层(数据汇总)宽表,面向主题的汇总,维度相对来说比较少,DWS是根据DWD层基础数据各个维度ID进行粗粒度汇总聚合,如按交易来源,交易类型进行汇总。整个汇总成分析某一个主题域的服务数据,一般是宽表,用于提供后续的业务查询,OLAP分析、数据分发等。
- drop table
- if exists dws_sale_detail_daycount;
- create external table dws_sale_detail_daycount(
- user_id string comment '用户 id',
- --用户信息
- user_gender string comment '用户性别',
- user_age string comment '用户年龄',
- user_level string comment '用户等级',
- buyer_nick string comment '买家昵称',
- mord_prov string comment '地址',
- --下单数、 商品数量, 金额汇总
- login_count bigint comment '当日登录次数',
- cart_count bigint comment '加入购物车次数',
- order_count bigint comment '当日下单次数',
- order_amount decimal(16,2) comment '当日下单金额',
- payment_count bigint comment '当日支付次数',
- payment_amount decimal(16,2) comment '当日支付金额',
- confirm_paid_amt_sum_1d double comment '最近一天订单已经确认收货的金额总和'
- order_detail_stats array<struct<sku_id:string,sku_num:bigint,order_count:bigint,order_amount:decimal(20,2)>> comment '下单明细统计'
-
- ) comment '每日购买行为'
- partitioned by(`dt`
- string)
- stored as parquet
- location '/warehouse/gmall/dws/dws_sale_detail_daycount/'
- tblproperties("parquet.compression" = "lzo");
首次、末次登录时间
首次、末次下单时间
首次、末次支付时间
最近30天下单的次数、金额
最近30天支付次数、金额
累计登录天数、最近30天的登录天数
累计下单次数、金额
累计支付次数、金额
应用层的定位是根据特定业务需求,按照业务角度组织数据以快速满足业务需求。应用层研发核心关注研发效率、口径一致性,以及核心应用的稳定性。设计原则以下:
- CREATE TABLE app_usr_interact( user_id string COMMENT '用户id',
- nickname string COMMENT '用户昵称',
- register_date string COMMENT '注册日期',
- register_from string COMMENT '注册来源',
- remark string COMMENT '细分渠道',
- province string COMMENT '注册省份',
- pl_cnt bigint COMMENT '评论次数',
- ds_cnt bigint COMMENT '打赏次数',
- sc_add bigint COMMENT '添加收藏',
- sc_cancel bigint COMMENT '取消收藏',
- gzg_add bigint COMMENT '关注商品',
- gzg_cancel bigint COMMENT '取消关注商品',
- gzp_add bigint COMMENT '关注人',
- gzp_cancel bigint COMMENT '取消关注人',
- buzhi_cnt bigint COMMENT '点不值次数',
- zhi_cnt bigint COMMENT '点值次数',
- zan_cnt bigint COMMENT '点赞次数',
- share_cnts bigint COMMENT '分享次数',
- bl_cnt bigint COMMENT '爆料数',
- fb_cnt bigint COMMENT '好价发布数',
- online_cnt bigint COMMENT '活跃次数',
- checkin_cnt bigint COMMENT '签到次数',
- fix_checkin bigint COMMENT '补签次数',
- house_point bigint COMMENT '幸运屋金币抽奖次数',
- house_gold bigint COMMENT '幸运屋积分抽奖次数',
- pack_cnt bigint COMMENT '礼品兑换次数',
- gold_add bigint COMMENT '获取金币',
- gold_cancel bigint COMMENT '支出金币',
- surplus_gold bigint COMMENT '剩余金币',
- event bigint COMMENT '电商点击次数',
- gmv_amount bigint COMMENT 'gmv',
- gmv_sales bigint COMMENT '订单数'
- )
- PARTITIONED BY( dt string)
- --stat_dt
- date COMMENT '互动日期',
日活、月活、周活、留存、留存率、新增(日、月、年)、转化率、流失、回流、7天内连续3天登录(点赞、收藏、评价、购买、下单、活动)、连续3周(月)登录、GMV、复购率、退款人数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。