数据仓库设计规范
一、模型层次结构
ODS 原始数据层
由业务方生成的原始数据,直接放入原始数据层
如果需要查原始日志可以从ODS层进行检查
DWD 仓库明细层
是对原始数据层的提炼和清洗,这一层注重对原始数据的清洗和简单汇总
DWB 仓库核心明细层
这一层主要是还是明细,在这一层中,可以和其他的维表进行关联,进而产生产品经理或分析师较为关注的字段
DWS 仓库核心汇总
在这一层中,主要是汇总信息,比如统计ID访问次数,PC登陆人数等汇总后的统计信息
ST / DIM 应用层
主要用于业务部门使用,该层是最后一层,也是终端展示层
二、表的命名规范
第一个字段:T 和TMP
T: T表为临时表的一种,一般T表只会保留最近一段时间的数据。现在大部分CBAS的表都为这种类型,保留最近的一段时间,该表多为日志明细表,数据量大,保存时间短,这种表保存时间短,该表内的汇总信息会长时间保存。
针对T表,后缀内容需要注意
分表后缀由两个字母组成,结构及含义如下:[时间周期 D, W, T, M, Q, Y][增量S/全量D]
DD:标示该表是按日运行生成,任何一个分区都保存当前的全量明细数据,即最新分区即可取到最新的全量数据。
MS:标示该表是按月运行生成,任何一个分区保存当前数据周期计算数据,即一个分区对应该数据日期当日的增量或汇总数据。
TMP:tmp表是一个完整的php脚本执行过程中使用的临时表,每个php脚本中都可以根据需要设置若干个tmp表
tmp表的名字具有唯一性
tmp表的使用具有独占性,即一个tmp表只能被一个php脚本使用,生命周期在该php内。
php脚本执行前,需要先清空所有用到的tmp表(分区)
tmp表命名规则:
[tmp][php脚本名称][序号] tmp_dws_biz_operate_base_ds_01
第二个字段:模型层次
遵循仓库模型架构定义的层次结构命名
如ODS, DWD, DWB,DWS, DM,ST……
第三个字段:主题
用户(CRD) 用户信息,标签等以用户(不包括游客)为维度的数据集合
订单(ORD) 交易购买行为,包括购买的产品,基金,股票等
行为(ACT) 用户(包括游客)在网页,PC客户端,app,股灵通等平台或者产品上的行为基础数据,通用的行为分析数据
产品/业务(BIZ) 各产品或业务的基础层独立数据,特别分析数据,包括效果分析等,如果是较为通用的行为分析,可以放到行为主题中
其它(OTH) 只有公共类维表等与业务无关的小数据表可以放到该主题中,如dim_oth_pub_date
客服(CRM) 客服工作量等客服相关,或者给客服提供的服务数据
第四个字段:有意义的名字
取业务相关的名称即可
三、建表规范
建表时使用三种字段类型
string(字符串)
bigint(长整型,用于金额等字段类型,如金额单位为元,从dwb层开始需要转换成分)
double(仅用于服务费率等含小数字段类型,以及源系统单位是元的同步数据)
除tmp表之外,一律建成外部表
表数据存储格式一律用textfile,非压缩,字段间用制表符(\t)分割,行间隔用换行符(\n)分割
如果采用分区表,分区字段定义为p_date;除维表(dim)之外,其余表建成分区表(使用时需要避免全表扫描)
建表语句模板:
CREATE EXTERNAL TABLE dim_oth_stock_code
(
stock_code string
,stock_name string
,stock_parent_id string
,begin_date string
,end_date string
,gmt_ins string
)
partitioned by (p_date string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
STORED AS TEXTFILE
LOCATION ‘/user/hive/warehouse/dim/oth/dim_oth_stock_code’
;
alter table dim_oth_stock_code set serdeproperties(‘serialization.null.format’ = ‘’);
四、数据格式
日期格式字段统一使用yyyymmdd的格式,类型使用string
Timestamp格式字段统一使用yyyy-mm-dd hh24:mi:ss的格式,类型使用string,hive处理时会自动做为时间型数据来处理
如建成分区表,分区字段p_date格式为“yyyymmdd”
五、数据仓库存储结构
HADOOP目录/ 模型层次/ 主题域
例:
/user/hive/warehouse/ods(dwd、dwb、dws、dm、st、dim、t、tmp…)/crd(ord、act、biz、oth、crm…)/dim_oth_stock_code/p_date=20141031/
六、PHP调度脚本规范
php程序命名
ETL清洗任务: [目标表名].php
程序名称一律小写
例:
目标表: dim_oth_stock_code
对应的php名称: /dim_oth_stock_code/dim_oth_stock_code.php
特殊情况
多个php脚本往一个表生成数据,通过[目标表名]+[序列号].php 实现
例:
dim_oth_stock_code_1.php
dim_oth_stock_code_2.php
具体可见PHP 模板
七、常用HQL语句模板
常用建表语句模板
CREATE TABLE tmp_dim_biz_percentile_period
(
report_date string
,sec_desc string
,amt_per_00 string
,amt_per_01 string
,amt_per_02 string
,amt_per_03 string
,amt_per_04 string
,amt_per_05 string
,amt_per_06 string
,amt_per_07 string
,amt_per_08 string
,amt_per_09 string
,amt_per_10 string
,gmt_ins string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
STORED AS TEXTFILE
LOCATION ‘/user/hive/warehouse/dim/biz/tmp_dim_biz_percentile_period’
;
alter table tmp_dim_biz_percentile_period set serdeproperties(‘serialization.null.format’ = ‘’);
常用ETL插入表数据语句模板
insert overwrite table dim_biz_percentile_period partition(p_date)
select report_date
,sec_desc
,amt_per_00
,amt_per_01
,amt_per_02
,amt_per_03
,amt_per_04
,amt_per_05
,amt_per_06
,amt_per_07
,amt_per_08
,amt_per_09
,amt_per_10
,from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss') as gmt_ins
,a.report_date as p_date
from tmp_dim_biz_percentile_period a
where a.report_date is not null