[数据仓库] 腾讯数据仓库规范体系 [转]

news/2025/11/5 0:59:32/文章来源:https://www.cnblogs.com/johnnyzen/p/19142478

1 数据仓库模型设计

1.1 数据分层模型

image

1.2 数据分层边界

image

1.3 数据主题域

  • 主题域是面向业务分析,将业务分析过程进行高度概括及抽象,是在较高层次上将企业信息系统中的数据综合、归类并进行分析利用的抽象。

目前互联网缺少相应标准模型的定义,可供参考讨论。

  • 用户主题域:描述各类参与人(个人、群、团体等)在腾讯各类业务场景所处角色的各类信息,包括资料信息、身份信息、人口统计、费用、账户信息及特殊信息等。
  • 行为主题域:描述各类参与人(个人、群、团体等)在腾讯各类业务场景行为信息,包括 ugc 发表、评论、登录、下载、付费等行为主题。
  • 内容主题域:
  • 产品主题域:
  • 渠道主题域:

附录提供电信行业数据主题域模型设计。

2 数据仓库规范定义

2.1 表命名规则

  • 总体命名规则: 见名知义,做到统一标准,降低数据沟通成本及使用成本。

整体命名规范

  • [ 数据分层_[BG][_ 业务域][_ 主题域][_ 业务描述][_ 刷新周期][_ 存储策略] ]

其中:
(1)数据分层:主要包括 ods/dwd/dws/dwm/dim/app
(2)BG:WXG,PCG,IEG,CSIG,TEG,CDG
(3)业务域:主要为业务线,比如应用宝(简称 yyb), 信息安全(infosec) 等
(4)主题域:主要为业务线内的业务过程的抽象,例如用户(user),广告(ad),游戏(game)等
(5)业务描述:简单的 BG 业务过程提炼
(6)刷新周期:主要包括小时(h)/天(d)/周(w)/月(m)/季度(q)/年(y)
(7)存储策略:增量(i)和全量(f)

  • 平台校验规则,其中 1,2,3,6,7 强校验,4,5 可由业务自行定义

image

2.2 分层命名细则

2.2.1 ODS层

ODS接入层的命名细则

  • ods_[BG]_[业务域]_[业务描述]_[刷新周期][存储策略]

举例如下:

数据源类型 表命名 表注释
ods_pcg_yyb_user_info_df 用户基础信息表、接入层、按天全量

DW层

DIM维表层的命名细则

  • dim_[BG]_[业务域]_[业务描述][_ 刷新周期][_ 存储策略]

其中,静态维表可以去掉增量/全量标识和更新频率标识,举例如下:
yyb : 应用宝

表命名 表注释
dim_yyb_city 城市维表、维度层、静态数据
dim_yyb_channel_df 渠道维表、维度层、按天全量

DWD明细层的命名规则

  • dwd_[BG]_[业务域]_[业务描述]_[刷新周期][存储策略]

举例如下:

表命名 表注释
dwd_pcg_yyb_user_info_df 用户基础信息表、明细层、按天全量
dwd_pcg_yyb_click_log_di 点击日志表、明细层、按天增量
dwd_wxg_game_gamecenter_click_di 微信增值业务部,游戏中心点击表,天级增量
dwd_teg_infosec_user_uin_info_df 信息安全部-用户资料表-天全量

DWS汇总层的命名细则

  • dws_[BG]_[业务域]_[业务描述][_ 刷新周期][存储策略]

注意:主题域可以根据业务特性决定是否使用
其中,主题域为统一分配,举例如下:

表命名 表注释
dws_pcg_yyb_user_dau_di 用户日活相关汇总表、汇总层、按天增量
dws_wxg_game_gamecenter_click_di 微信-增值业务部-游戏中心点击表-天级增量
dws_teg_infosec_content_ugc_pic_hit_di 信安-内容域-ugc 图片点击日增量表

DWM集市层的命名细则

  • dwm_[BG]_[业务域]_[主题域][_ 业务描述][_ 刷新周期][存储策略]

注意:主题域可以根据业务特性决定是否使用

表命名 表注释
dwm_wxg_game_behavior_gamecenter_click_di 微信-增值业务部-游戏中心点击表-天级增量
dwm_teg_infosec_user_ugc_post_d 信安-用户 ugc 发表行为-天增量表

APP层

APP应用层的命名细则

  • app_[BG]_[应用系统标识][_ 业务描述][_ 刷新周期][存储策略]

举例如下:

表命名 表注释
app_pcg_yyb_show_user_dau_di 用户日活相关 show 报表、展示层、按天增量
app_wxg_game_open_social_di 微信-增值业务部-游戏-open 开放平台-社交报表-天增量
app_teg_index_galilei_doc_profile_df 腾讯指数-伽利略文章画像-天全量表

TMP层

TMP临时层的命名细则

注意:这里的临时表是指在定时脚本中建的临时表,日常的临时表不做限制。

  • tmp_正式表名_时间戳(yyyyMMdd)_[编号]

举例如下:

表命名 表注释
tmp_app_yyb_show_user_dau_di_20190501_001 app_yyb_show_user_dau_di 表 20190501 天 001 编号临时表

建表决策树

  • 持续完善到表命名级别

image

2.3 字段命名规范

  • 原则上,除了一些约定的标准维度,常用字段规范外,每个属性/列的名字均可以自行确定,见名知意,不限制字段长度,以看得懂为原则,英文名应尽量是字段的全称,单词间用下划线,一些特殊的约定如下:

2.3.0 标准维度字段

维度类型 字段 命名 格式 示例
时间类 统计日期 stat_date YYYY-MM-DD 2019-08-02
计小时 stat_hour HH 22
地点类 ip 地址 ip
城市编码 city_id 001
账号类 账号 user_id
群号 group_id
应用类 app 编码 app_id
渠道类 渠道编码 channel_id

2.3.1 属性字段

  • 属性字段指的是文本字段,比如网点名称、网点地址等,这些字段不加前缀或者后缀,尽可能使用通用的英文单词表示。

如果字段直接来自上游的 ODS 表,则保持和源系统字段名称一致;
如果与系统关键字相冲突时后面加一个 _col 后缀,即【源字段_col】;
一些有歧义的地方可以适当加前后缀

2.3.2 指标字段

  • 定义:基础指标=修饰词(可选)+原子词+时间修饰
  • 例子:最近七天微信支付金额 修饰词(wx)+原子词(pay_ord_amt)+时间修饰(1w) = wx_pay_ord_amt_1w

2.3.3 计数字段

  • 定义:计数字段指的是单量、件数、用户数等整型信息字段,计数主体指计数运算的对象
  • 格式:<计数主体>_cnt
  • 示例:用户数 user_cnt

2.3.4 比例字段

  • 定义:比例字段指的是占比、百分率等 double 值型信息字段。
  • 格式:<计数主体>_rate
  • 示例:支付占比 pay_rate

2.3.5 费用字段

  • 定义:各类费用、收入相关字段。
  • 格式:<计数主体>_amt
  • 示例:pay_amt

2.3.6 标识字段

  • 定义:指的取值为 Y/N 的二元值字段
  • 格式: is_<标识主体>
  • 示例:是否活跃 is_active

2.3.7 时间字段

  • 定义:指数据类型为 String,格式为 YYYY-MM-DD HH:Mi:SS 带有小时分钟秒等精度的字段
  • 格式<业务主体>_time
  • 示例下单时间 order_time

2.3.8 日期字段

  • 定义: 指数据类型为 String,格式为 YYYY-MM-DD 的精度到天的时间字段
  • 格式<业务主体>_date
  • 示例统计日期 stat_date

2.3.9 分区字段

  • 分区字段的含义需要在 HIVE 表的情况说明中进行明确,分区深度不建议超过 3 层
类型 字段名 备注
日/报表周/周分区 ds 格式为 yyyyMMdd,默认业务运行日期(yyyyMMdd)
月/季度/年分区 ds 格式 yyyyMM、yyyyNN、yyyy,默认月最后一天,季度最后一天,年最后一天
小时分区 hh 格式 00..23
分钟分区 mm 格式 00,15,30,45
业务分区 按照业务需求进行分区,例如:channel

2.3.10 时间维度规范

中文名 时间维度命名 缩写 描述
最近一天 1day _1d 最近一天
最近三天 3day _3d 最近三天
最近七天 7week _1w 最近七天
最近14天 2week _2w 最近14天
最近30天 1month _1m 最近30天
最近60天 2month _2m 最近60天
最近90天 3month _3m 最近90天
最近180天 6month _6m 最近180天
180天以前 before 6month _b6m 180天以前
自然周 calendar week _cw 自然周
自然月 calendar month _cm 自然月
自然季度 calendar quarter _cq 自然季度
自然年 calendar year _cy 自然年
财年 finance year _fy 财年
半财年 half finance year _hfy 半财年
历史截止到当日 start to day _std 历史截止到当日
自然年初截止到当日 year to day _ytd 自然年初截止到当日
自然季度初截止到当日 quarter to day _qtd 自然季度初截止到当日
自然月初截止到当日 month to day _mtd 自然月初截止到当日
自然周初截止到当日 week to day _wtd 自然周初截止到当日
财年初截止到当日 finance to day _ftd 财年初截止到当日
最近一小时 1hour _1h 最近一小时
0 点截止当前小时 day to hour _dth 0 点截止到当前小时
0 点截止当前 day to realtime _dtr 0 点截止当前
小时截止当前 hour to realtime _htr 小时截止当前
分钟截止到当前 minute to realtime _mtr 分钟截止到当前
活动开始截止到当日 activity start to day _atd 活动开始截止到当日
活动开始截止到当前小时 activity start to hour _ath 活动开始截止到当前小时
活动开始截止到当前 activity start to realtime _atr 活动开始截止到当前
未来七天 predict 1week _p1w 未来七天
未来 4 周 predict 1month _p1m 未来 4 周
混合多天 nd _nd 混合多天
报表周 report week _rw 上周四到本周三
15 分钟 quarter _qh 一刻钟

3 数据仓库开发规范

3.1 原则约定

3.1.1 数据复用,共享精神

各业务优先使用公共数据中间层数据,个性化指标可自行设计数据模型,统一命名。

3.1.2 命名规范化,一致性

采用统一命名规范,见名知意,做到统一数据语境开发,降低数据沟通成本及使用成本。

3.2 数据层级调用规范(强校验)

  1. 各业务、应用优先使用 DW 公共数据中间层数据。
  2. 已经存在中间层数据,不允许应用层跨过中间层从 ODS 重复加工数据。
  3. 各业务、应用团队也需积极配合公共数据中间层团队进行数据建设的改造和迁移。
  4. 公共数据中间层团队应该积极了解应用层数据的建设需求,将公用数据沉淀到公共层,为其他团队提供数据服务。

3.3 数据脚本开发规范

数据开发通常采用脚本语言进行开发,本规范对脚本开发模板结构进行约定:

  1. 原则上一个脚本产生一个表。

  2. 原则上一个脚本命名与生成表命名一致。

  3. 脚本统一采用 Git 管理。

  4. 注释规范:

    • 程序头注释:功能、人员、时间等信息。
    • 代码段注释:每段代码前必须包含注释行,描述代码功能。
    • 表注释:每个表需要填写注释,描述表功能、使用说明等,供元数据系统抓取管理。
    • 字段注释:填写字段说明,字段为枚举值时,可填写相应维表或罗列具体值含义。
  5. 代码流程开发规范

image

同时提供 python 版开发模板及主要功能函数封装供使用。

3.4 建表规范(强校验)

  1. 建表时遵守命名规范,优先建立分区表。
  2. 禁止通过程序批量新建以时间戳为后缀的非分区表,需优化为分区表,以时间戳作为分区字段。
  3. 每个表需要填写注释,描述表功能、使用说明等,供元数据系统抓取管理。
  4. 字段注释:填写字段说明,字段为枚举值时,可填写相应维表或罗列具体值含义,禁止全空备注信息建表。

3.5 计算时间窗口规范(强校验)

  1. 全量计算转日增量
    对于跨多日期窗口计算任务(如对 ods 近 7 天数据进行查询及汇总计算),单分区超过 5G 或任务执行超过 1 小时,需拆分为每日增量进行计算落地中间数据,再基于中间数据进行进一步汇总计算。

3.6 数据层级调用规范(强校验)

  1. 各业务、应用优先使用 DW 公共数据中间层。
  2. 已经存在中间层数据,不允许应用层跨过中间层从 ODS 重复加工数据。

3.7 SQL 编码规范

3.7.1 总原则

  • 代码功能完整、健壮。
  • 代码行清晰、整齐,具有一定的可观赏性。
  • 代码编写要充分考虑执行速度最优的原则。
  • 代码行整体层次分明,结构化强。
  • 代码中应有必须的注释以增强代码的可读性。
  • 规范要求非强制性约束代码开发人员的代码编写行为,在实际应用中在不违反常规要求的前提下允许存在可理解的偏差。
  • SQL 代码中应用到的所有关键字、保留字都使用大写,如 SELECT、FROM、WHERE、AND、OR、UNION。
  • SQL 代码中应用到的除关键字、保留字之外的代码,都使用小写,如字段名、别名等。
  • 四个空格为一个缩进量,所有的缩进皆为一个缩进量的整数倍,按代码层次对其。
  • 对应的括号要求在同一列的位置上。

3.7.2 字段排列

  • SELECT 语句选择的字段按照每一行一个字段的方式编排。
  • SELECT 单字后面一个缩进量后直接跟某个选择的字段,即字段名首起二两缩进。
  • 其他字段前导两个缩进量再跟一个点后放置字段名。
  • 两个字段之间的点分隔符紧跟在第二个字段的前面。
  • AS 语句应与相应的字段在同一行;多个字段的 AS 建议尽量对其在同一列上。

如图:

SELECTuserId        AS userId, gender        AS gender, city          AS cityName, prov          AS provName
FROM default.table1
WHERE 1=1AND ds = '%yyyyMMdd%'

image

3.7.3 SELECT 子句

  • SELECT 语句中所用到的 FROM、WHERE、GROUP BY、HAVING、ORDER BY、JOIN、UNION 等子语句,需要遵循如下要求:
  • 换行编写。
  • 与相应的 SELECT 语句左对齐编排。
  • 子句后续的代码跨行首字母两个缩进量起编写。
  • WHERE 子句下的逻辑判断符 AND、OR 等与 WHERE 左对齐编排。
  • 超过两个缩进量长度的子句加一空格后编写后续代码,如:ORDER BY、GROUP BY 等。
SELECTuserId        AS userId        -- 用户ID, MAX(trade_date) AS last_trade_date -- 首次访问时间, MIN(trade_date) AS first_trade_date -- 最后一次访问时间
FROM default.table1 -- 用户访问明细表
WHERE 1=1AND ds = '%yyyyMMdd%' -- 时间分区
GROUP BY userId        -- 用户ID
ORDER BY userId DESC   -- 排序

3.7.4 CASE 语句

  • SELECT 语句中对字段值进行判断取值的操作将用到 CASE 语句,正确的编排 CASE 语句的写法对加强代码行的阅读性也是很关键的一部分。

对 CASE 语句编排如下约定:

  • WHERE 子句在 CASE 语句的同一行并缩进一个缩进量后开始进行编写。
  • 每个 WHEN 子句一行编写,当然如果语句比较长可以换行编写。
  • CASE 语句必须包含 ELSE 子句,ELSE 子句与 WHERE 子句对齐。
SELECTuserId        AS userId, (CASE WHEN gender = 0 THEN '男'WHEN gender = 1 THEN '女'WHEN gender > 1 THEN '未知'ELSE '未知' END) AS gender_cn
FROM default.table1
WHERE 1=1AND ds = '%yyyyMMdd%'

image

3.7.5 子嵌套语句

子查询嵌套在数据仓库系统 ETL 开发中是经常要用到的。因此,代码的分层编排就非常重要。

  • 子嵌套语句与父语句整体缩进一个缩进量
SELECTuserId,gender_cn
FROM (SELECTuserId        AS userId,(CASEWHEN gender = 0 THEN '男'WHEN gender = 1 THEN '女'WHEN gender > 1 THEN '未知'ELSE '未知' END) AS gender_cnFROM default.table1WHERE ds = '%yyyyMMdd%'
) a
WHERE 1 = 1AND a.gender_cn = '女'

image

3.7.6 INSERT 子句

  • INSERT 子句写在同一行,不需要换行
INSERT OVERWRITE TABLE demo_table PARTITION(ds = '%yyyyMMdd%')
SELECT ...

3.7.7 运算符前后间隔

  • 算数运算符、逻辑运算符前后要保留一个空格,除非超过每行 80 个字符长度限制,否则都写在同一行。
SELECTuserId        AS userId, (CASE WHEN gender = 0 THEN '男'WHEN gender = 1 THEN '女'WHEN gender > 1 THEN '未知'ELSE '未知'END) AS gender_cn
FROM default.table1
WHERE 1=1AND ds = '%yyyyMMdd%'

3.X 总原则

规范要求非强制性约束代码开发人员的代码编写行为,本规范不仅对日常的代码开发工作起到指导作用,而且不断进行完善和补充。

  • 代码功能完整。
  • 代码行清晰、整齐,代码行的整体层次分明、结构化强,具有一定的可观赏性。
  • 代码编写要充分考虑执行速度最优的原则。
  • 代码中应有必要的注释以增强代码的可读性。
  • SQL 代码中应用到的所有关键字、保留字都使用大写,如 SELECT、FROM、WHERE、AND、OR、UNION、INSERT、DELETE、GROUP、HAVING、COUNT 等。
  • SQL 代码中应用到的除关键字、保留字之外的代码,也都使用小写,如字段名、表别名等。
  • 四个空格为一个缩进量,所有的缩进皆为一个缩进量的整数倍,按代码层次对齐。
  • 禁止使用 select * 操作,所有操作必须明确指定列名。
  • 对应的括号要求在同一列的位置上。
  • SELECT 语句选择的字段按每一行一个字段方式编排。
  • SELECT 单字后面一个缩进量后直接跟首个选择的字段,即字段名首起二个缩进量。
  • 其它字段前导二个缩进量,再在逗号后放置字段名。
  • 两个字段之间的逗号分割符紧跟在第二个字段的前面。
  • AS 语句应与相应的字段在同一行。多个字段的 AS 建议尽量对齐在同一列上。

Z 附录

附录1: 电信行业主题域设计

image

X 参考文献

  • 腾讯数据仓库规范体系(PPT) - Weixin

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

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

相关文章

20251104 之所思 - 人生如梦

20251104 之所思1. 今天在过问题的时候因为一个事情两名同事起了争执,我这边主观上维护了其中的一名,对另一名同事的工作方式做了批评,导致该同事受到了委屈,会后给我发了很多信息,以为我是针对她,想赶她走,虽然…

【电子工程师の设备】用于拆焊PCB的热风枪的品牌

用于拆焊PCB的热风枪的品牌, 下面这个表格汇总了部分品牌及型号信息: 品牌 特点/定位 提及型号举例Quick 快克 国内知名品牌,注重防静电设计 (ESD),适合精密PCB维修。 990A, 990AD, 850A JBC 欧洲领先的专业焊接设…

20232407 2025-2026-1 《网络与系统攻防技术》 实验四实验报告

1.实验内容 一、恶意代码文件类型标识、脱壳与字符串提取 二、使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息。 三、分析一个自制恶意代码样本rada,并撰写报告,回答以下…

怎么设计一个好的Selenium/Appium 自动化框架? 需要考虑哪些问题

架构原则:分层(Test / PageObjects / Services/API / Utils / Drivers / Data),单一职责,易扩展、易维护。测试用例组织:小而独立、幂等、可重跑。按功能/模块/标签分组,支持并行与分布式执行。抽象驱动层:统一…

AIChatManager 应用功能总结

AIChatManager 应用功能总结 概述Qoder生成的应用,浏览器打开html即可使用,无服务无后台,部分功能不太完善,欢迎自行补充完善AIChatManager 是一个功能完整的AI聊天应用,采用纯前端架构,支持多种AI模型提供商(O…

[Doris] 度言软件:复杂查询响应速度提升10+倍,基于 Apache Doris 实时数仓建设实践 [转]

0 序原始作者 | 杭州度言软件大数据团队 发布时间 | 2022.12.27杭州度言软件有限公司(度言软件)成立于2014年,是信贷不良资产处置技术服务供应商,以“智能科技赋能不良资产处置,推动贷后行业合规高效发展”为使命…

第15天(中等题 滑动窗口)

打卡第十五天 2道中等题恰好型滑动窗口:耗时≈一小时 明天继续

Rust-闭包

一、Rust 闭包基础 1. 什么是闭包 闭包是能捕获其定义环境中变量的匿名函数。 // 基本语法 let closure = |x: i32| x + 1; let result = closure(5); // 6// 多参数 let add = |x, y| x + y; let sum = add(3, 4); //…

[docker note]

# ==== Docker 傻瓜式笔记 ==== # 一句话总结:Docker 是用来"装程序的盒子",让程序在任何电脑上都能一模一样地运行 # 核心概念: # 1. 镜像(Image):"盒子的模板",包含程序和运行环境(比如一…

数据加工1

一、数据连接 1. 数据库连接 2. 上传数据文件 3. 管理数据源:左上角项目名 → 右键 → 返回项目列表 → 数据源 二、数据导入(将数据库下的物理表导入为数据模型) 新建 → 数据库表模型 → 搜索 → 导入目录 → 连接…

异常介绍

如果代码没有语法问题,可以运行,但会出运行时的错误,例如除零错误,下标越界等问题,这种在运行期间检测到的错误被称为异常。 出现了异常必须处理,否则程序会终止执行,用户体验会很差。 Phthon 支持程序员自己处…

AE学习

AE学习 1. 音乐时间调整 合成设置再把图层向右拖拽即可

微服务的挑战与优势,什么时候上微服务?

我不排除微服务,但是我想说不要为微服务而微服务。曾经在一个公司做一个物流系统,每天的单都不到100 200单,直接上微服务,除了高大上和给公司带来更大的支出外,别无好处,这个量直接单体应用都撑得住。有时候简单…

利用 chrome-devtools MCP 让 AI 操作便携版浏览器(可指定 Data)

利用 chrome-devtools MCP 让 AI 操作便携版浏览器(可指定 Data)说明:文中出现的具体视频链接、演示路径、用户名、端口号等均为示例,读者需按需替换。 1. 需求 (1)使用 chrome-devtools-mcp 打开 https://www.b…

[OLAP] 技术选型对比:Clickhouse vs Doris

0 序Doris和ClickHouse是两款热门的OLAP数据库,它们在架构、功能、性能和易用性等方面存在差异1 架构设计Doris:采用MPP架构,分为Frontend(FE)和Backend(BE)节点。FE 负责元数据管理和查询规划,BE 负责数据存储…

计算天数

程序示例: # date = input(Enter a date: ) # 2024-12-21 # year = int(date[0:4]) # month = int(date[5:7]) # day = int(date[8:]) date = input(Enter a date: ).split("-") year = int(date[0]) month…

「学习笔记」正则表达式

正则表达式 正则表达式(Regular Expression,简称 Regex 或 RegExp)是一种用来匹配字符串中字符组合的模式。 正则表达式是一种用于模式匹配和搜索文本的工具。 正则表达式提供了一种灵活且强大的方式来查找、替换、…

11月4日日记

1.今天工程实训学习了铁道的基本知识 2.明天先学习离散数学,然后是马哲 3.数据库连接如何通过 Java Bean 封装实现 “配置与代码分离”?

三、字符设备驱动(基于北京迅为电子)

一、概述 字符设备的驱动包括设备号、字符设备结构体、自动创建设备节点、fops结构体 二、知识点设备号:一个32bit的数据,高12bit表示主设备号,低20bit表示次设备号 宏定义:MAJOR(dev),MINOR(dev),MKDEV(ma,mi) 分…

使用1panel一键建站

摘要 文章最初发布于:使用1panel一键建站 使用宝塔建站时,因为测试用的SSL证书迟迟无法申请成功。偶然发现1Panel可以丝滑申请泛域名证书,并且能自动续签。果断尝试以下,以下是一些踩坑记录。 坑1、SSL。宝塔泛域名…