跳到主要内容

数仓规范

· 阅读需 14 分钟

一、前提概要

http://mp.weixin.qq.com/s?__biz=MzI3NjA1MTcyMQ==&mid=2650482778&idx=1&sn=6a4a6b3bf16ab818aa38d222ce46fed6&chksm=f374ea3cc403632a0f6ef1a9728393b459c3d19926f8e9672467f278e9f56abb010b198d2b34&scene=21#wechat_redirect 发布一段时间后,有小伙伴表示我汤姆就是个Sql Boy,可否来个 数据仓库开发规范示例?安排! 

调侃归调侃,如果想做一名合格的Sql Boy,还真不容易...... 

一臻在此,对过去和做数仓Ing的小伙伴们,行361°C鞠躬Respect以表敬意。

图片

二、数仓分层原则及定义

1. 数仓分层原则

数仓分层的目的是为了给业务提供高效的数据支撑,和层次清晰、功能明确的数据存储,为企业各角色提供稳定、准确、多元化的高可用数据,同时为数据提供更方便的管理和运维。

2. 数仓分层定义

数仓主要包含ODS/DWD/DWS/DIM/DM几个标准化的分层,同时结合企业实际的情况,如补录的数据,在数据ETL过程中的临时处理数据等,根据用途汇总为贴源层、数据共享层、数据服务层。

① ODS(Operational Data Store): 贴源层数据,仅导入业务业务数据,不做任何数据的清洗转换和修改,保持与源库一致。具体情况根据项目场景设定。除了业务系统的数据,还包括补录数据处理,源系统数据快照处理等。 

② DWD(Data Warehouse Detail): 数仓明细层数据,保留业务实体的原子粒度,并且通过数据清洗和一定程度的数据转换,保障数据质量。数据来源于ODS层,保留所有历史数据。业务实体、数据行、字段级的完整性,在该层实现。

③ DWS(Data WareHouse Service): 数仓服务层,数仓的服务层,与之前所提到的数据服务层不同,DWS层为公共汇总层,指标均可在DWS层落地。该层使用DWD层数据,维度数据,对业务上有关联的实体做连接,形成统一粒度的,跨业务流程的,多业务实体的,轻度汇总数据。

④ DIM(Dimension): 数据维度层,存储维度(含主数据)信息表或配置表,来源数据质量高的ODS数据(如主数据)和DWD层数据。 

⑤ DM(Data Market): 数据集市层,提供数据服务的分层,有明确的分析主题,基于具体的业务需求场景或者分析场景,数据仅包含维度和指标,没有复杂的逻辑处理。数据来源于DWD,DWS,DIM层,大多数为指标宽表,有较多的维度和指标。

⑥ TMP:临时数据处理层,用于各层的数据加工处理过程中的临时数据处理,临时需求场景加工数据的处理。   

三、数仓公共开发规范

1. 分层调用规范

数据分层的标准流向(不含维度)为ODS->DWD->DWS->DM标准流向中,禁止出现反向依赖

维度流向为DWD->DIM或者ODS->DIM,使用ODS直接到DIM的情况,必须保障足够高的数据质量。

DIM、DWS和DM可以往自身分层写入数据,如不同粒度的数据写入。

图片

数据流向如下图所示:

图片

2. 数据类型规范

在保障数据不失真,且不会增加数据存储复杂度,不增加数据处理计算量的情况下,尽量减少数据类型的数量,兼容原始数据原有的类型。 

数据类型依据具体的数据存储环境而定,比如使用Apache Doris的情况如下:

  • ID类:BIGINT

  • 标签枚举:INT

  • 字符串:STRING

  • 状态描述:STRING

  • 日期:DATE yyyy-MM-dd

  • 日期时间:DATETIME yyyy-MM-dd HH:mm:ss.SSSSSS

  • 业务数额类默认使用 DECIMAL,精度根据实际情况做调整

3. 数据冗余规范

宽表的冗余字段要确保以下原则:

  • 冗余字段要使用高频,下游3个或以上使用

  • 冗余字段引入不应造成本身数据产生过多的延后

  • 冗余字段和已有字段的重复率不应过大,原则上不应超过 60%,如需要可以选择join或原表拓展

4. NULL字段处理规范

  • 数据类型为int的默认为-999

  • 数据类型为bigint的默认为-999999

  • 数据类型为decimal的默认为0

5. 公共字段规范

所有数仓分层中的字段,均为小写,且不可出现中文。

物理表中的公共字段信息如下:

图片

6. 数据表处理规范

  • 增量表

  • 依据具体的时间和其他标签粒度,做对应的分区或多层分区

  • 处理过程中,源表必须包含可增量的属性字段,确保数据的完整性

  • 全量表

  • 每次写入的数据都是最新的

  • 每次写入的数据都是完整的全量数据

  • 拉链表

  • 记录一个事物从开始,一直到当前状态的所有变化的信息

  • 拉链表每次上报的都是历史记录的最终状态,是记录在当前时刻的历史总量

  • 当前记录存的是当前时间之前的所有历史记录的最后变化量(总量)

7. 事实表划分规范

在维度建模中,按粒度划分,数据表分为维度表和事实表,事实表包含三种:事务型事实表,周期快照型事实表,累计快照型事实表。

  • 事务型事实表:事务事实表记录事务层面的事实,保存最为原子的数据,其数据在事务发生后发生,粒度为每一行数据。

  • 周期快照型事实表:有规律的,可预见的时间间隔的业务累计数据,比如按天、周、月等做业务的统计度量。

  • 累计快照型事实表:在整个业务的生命周期中,表述业务多个阶段的开始和结束过程,通常有多个时间字段,并且时间不可预测,随着阶段周期的变化,记录也会随着变化而发生修改

四、数仓各层开发规范

1. 分层实例

数仓分层实例如下表所示:

图片

2. 表的属性词条相关规范

表的属性中会存在以下的属性词条,需要通过业务元数据去描述,不直接通过表名,避免表名太长的问题:

  • 是否宽表

  • 时效: 实时和非实时

  • 更新方式:增量,全量

以下属性需要通过表名去区分:

  • 统计周期:y表示年,m表示月,w表示周,d表示天,h表示小时,mi表示分钟

  • 维度类型:缓慢变化维(scd),非缓慢变化维

3. ODS层设计规范

① 命名规则

  • ODS层表命名规则:ods_[类别]_[表内容]

  • 类别:

  • 业务表(business简称bsn)

  • 快照表(snapshot简称snap)

  • 补录表(amended简称amd)

  • 示例:ods_doris_load.ods_snap_stream_load

    其中ods_doris_load是库名,doris是系统,load 是导入库,snap表示是快照表,stream_load是stream_load导入方式表名

② 处理内容

  • 源系统数据的采集和同步,保持和源系统数据的一致性。处理过程分为实时和离线,实时接入的数据需要有对应的数据写入状态(新增、修改、删除),实时数据写入时间

  • 快照表处理

  • 对于源表数据量少于100万的,可按天/周/月不同的周期间隔,做全量快照表

  • 对于源表数据量大于1000万的,需要根据业务主键做拉链表对于源表数据量

  • 大于100万小于1000万的,根据具体业务的需求,做全量快照

  • 补录表处理

  • 主要针对业务系统中没有的数据,需要导入或者补录平台录入的,用以修复数据或者完善指标规则的,如财务手工账,订单时效的基线等。

  • 补录数据需要有以下约束:固定的模板,数据适用范围和有效期,补录数据的更新机制,补录数据更新后的数据处理机制,补录表需在表中增加字段(表述补录类别和用途) 

4. DWD层设计规范

① 命名规则

  • DWD层表命名规则:dwd_[实体名]

  • 示例:dwd_doris.dwd_doris_load,其中dwd_doris是库名,doris表示AP域,doris_load表示导入凭证

② 处理内容

  • 数据的完整性,包括实体的完整性(分段的业务表),数据行的完整性(不同阶段的业务周期的汇集),字段的完整性(关键业务字段)

  • 数据清洗,对于脏数据按规则进行清洗,保障原子粒度的数据质量

  • 维度关联映射

5. DWS层设计规范

① 命名规则

  • DWS层表命名规则:dws_[主题内容]_[统计周期]

  • 示例:dws_doris.dws_load_d,其中dws_doris是库名,load是导入全流程相关的主题内容,最后的d表示按天统计

② 处理内容

  • 不同实体间的关联和逻辑转换

  • 维度退化

  • 不同粒度的指标度量表,以及轻度汇总

  • 不同类型的事实表

  • 粒度较细的宽表

6. DIM设计规范

① 命名规则

  • DIM表命名规则:dim_[主题域][维度类型][维度],维度统一库名,对于有主题域来源,通过表名识别主题域

  • 示例:dim.dim_doris_scd_load,其中dim表示维度的库名,doris 表示AP域,scd 表示缓慢变化维,load表示导入维度

② 处理内容

  • 维度的一致性和准确性

  • 数据行中,为空维度的兼容

  • 缓慢变化维

7. DM层设计规范

① 命名规则

  • DM层表命名规则:dm_[项目/分析域][主题内容][统计周期]

  • 示例:dm_doris.dm_doris_load_d,其中dm_doris是库名,doris是表示AP项目,load 表示导入相关的分析,最后的d表示按天统计

② 处理内容

  • 基于不同分析主题的宽表,基于应用场景的维度和指标的提取

  • 指标粒度的一致性

  • 数据的高度汇总

  • 保障维度完整性(所有的维度,包含为空的兼容都可在维表中关联)

8. TMP层设计规范

① 命名规则

  • TMP层表命名规则

  • ETL作业:tmp_[分层库名_分层表名][流水]

  • 临时使用的表:tmp[用户][表内容][有效期]

② 处理内容

  • ETL作业中的临时表,可在ETL中临时创建和删除,必须满足模型管理员清理TMP层数据策略的要求

  • 临时使用的表,必须有确定的生命周期,不确定有效期的,可设置较长的有效期,模型管理员根据有效期和用户,不定时沟通确认该临时表的清理计划

五、总结

图片

规范示例仅作为参考,实际开发中需要根据业务要求和场景进行调整适配。

在线课程

· 阅读需 5 分钟

Spring Boot 系列

尚硅谷Java项目SpringSecurity+OAuth2权限管理实战教程

SpringSecurity是一款广泛使用的安全框架,提供了一系列功能来保证应用程序的安全性。OAuth2是一种开放标准的授权协议,用于在不暴露用户凭证的情况下进行身份验证和授权。本套教程让学习者短时间即可上手,快速掌握SpringSecurity和OAuth2的底层逻辑,并举一反三地应用到实际项目中。

教程讲解了SpringSecurity和OAuth2的核心概念、原理,以及在实际开发中的应用。内容分为六大部分:快速入门、SpringSecurity自定义配置、在前后端分离的场景下使用SpringSecurity、身份认证中的典型案例、SpringSecurity的授权功能、详解OAuth2,教程最后实现了一个基于Github的OAuth2授权登录案例。

本套教程适合具有SSM框架基础的学习者。教程中采用的软件版本分别为:SpringBoot 3.2.0、SpringSecurity 6.2.0、JDK 17、MySQL 8.0。

教程目录

01.教程简介

02.入门-SpringSecurity基本功能

03.入门-实现最简单的身份认证

04.入门-使用动态链接

05.入门-登录页面加载慢的问题

06.入门-SpringSecurity默认做了什么

07.入门-SpringSecurity底层原理

08.入门-DefaultSecurityFilterChain

09.入门-SecurityProperties

10.自定义配置-基于内存的用户认证

11.自定义配置-用户认证源码分析

12.自定义配置-基于数据库的数据源

13.自定义配置-基于数据库的用户认证流程分析

14.自定义配置-基于数据库的用户认证流程实现

15.自定义配置-SpringSecurity的默认配置

16.自定义配置-添加用户功能的实现

17.自定义配置-添加用户功能的测试

18.自定义配置-密码加密算法

19.自定义配置-密码加密测试

20.自定义配置-DelegatingPasswordEncoder

21.自定义配置-自定义登录页

22.自定义配置-登录页的细节

23.前后端分离-用户认证流程

24.前后端分离-用户认证成功的代码实现

25.前后端分离-用户认证失败的代码实现

26.前后端分离-用户注销处理

27.前后端分离-请求未认证处理

28.前后端分离-跨域处理

29.前后端分离-用户认证信息

30.前后端分离-会话并发处理

31.授权-用户角色权限资源

32.授权-基于request的授权-权限分配

33.授权-基于request的授权-请求未授权处理

34.授权-基于request的授权-角色分配

35.授权-RBAC

36.授权-基于方法的授权

37.OAuth2-什么是OAuth2

38.OAuth2-角色总结

39.OAuth2-使用场景

40.OAuth2-四种授权模式

41.OAuth2-四种授权模式-授权码模式

42.OAuth2-四种授权模式-隐藏模式

43.OAuth2-四种授权模式-密码模式

44.OAuth2-四种授权模式-凭证式模式

45.OAuth2-授权类型的选择

46.OAuth2-Spring中的OAuth2

47.GitHub授权登录案例-注册客户应用

48.GitHub授权登录案例-创建客户应用和登录测试

49.GitHub授权登录案例-退出和重新登录的测试

50.GitHub授权登录案例-授权登录流程分析

51.GitHub授权登录案例-CommonOAuth2Provider

🎥Spring Boot实现第一次启动时自动初始化数据库

https://xiaojusurvey.didi.cn/

滴滴开源问卷系统 XIAOJUSURVEY !快速打造你的专属问卷系统 !

解决ubuntu下wps卡顿和缺少字体(亲测有效)

· 阅读需 2 分钟

原文链接: https://blog.csdn.net/washingtin/article/details/124194802

问题描述

新装了ubuntu系统,又安装了wps。然后打开word文档卡了半天才能打开,而且不定时的卡死。

分析原因

看网上有更改fctix输入法的,但是装好没有生效(其它人可以参考百度)。 分析主要原因是wps缺少字体,一直在加载字体导致卡慢。

下面是我自己的解决方法,仅供参考。字体安装包请查看附件。

解决步骤

1.下载附件

链接: https://pan.baidu.com/s/1_ZjZCYffd2X-bL1pSChs6g?pwd=6ckn

提取码: 6ckn

2.进到有.ttf格式文件的目录

cd wps缺失字体/

3.复制字体到系统字体目录下的wp-office文件夹

sudo cp * /usr/share/fonts/wp-office/

4.执行命令

sudo mkfontscale

sudo mkfontdir

sudo fc-cache

5.重启wps

重新打开wps,方档非常快的能打开,字体里也有windows下的微软雅黑、宋体等字体。

Element UI主题换肤功能

· 阅读需 2 分钟

安装

mkdir elementui-theme-custom
cd elementui-theme-custom

安装element-theme

npm install element-theme -D

安装element-theme-chalk到dev生产环境

npm install element-theme-chalk -D

安装完毕后,执行

node_modules/.bin/et -i

et指令不可用,一般是因为node版本过高,8~11均可。 node-sass下载失败,需要手动下载node-sass(https://github.com/sass/node-sass/releases/download/v4.14.1/linux-x64-57_binding.node) 放入 node_modules/node-sass/vendor/linux-x64-57/ 目录下, 修改文件名为 binding.node

初始化变量文件,生成element-variables.scss文件

修改主题

修改element-variables.scss文件,修改主题颜色

编译主题

node_modules/.bin/et

编译成功后,会在该目录下生成theme文件夹,引入到项目main.js中。

需要引入theme文件夹里的 css、font 等资源。(theme文件夹里有font文件夹和大量的css文件,css文件只留下index.css,其他的css文件都可以删掉,因为index.css中的样式包含其他全部css文件的样式。)

参考资料

2.6K Star开源工具:有OCR、录屏、截屏、截屏搜索等等等功能

· 阅读需 1 分钟

天地图地理编码接口使用RestTemplate请求报错:Not enough variable values available to expand '"keyWord"'

· 阅读需 1 分钟

接口文档地址: http://lbs.tianditu.gov.cn/server/geocodinginterface.html

地理编码响应示例: 请求:

http://api.tianditu.gov.cn/geocoder?ds={"keyWord":"延庆区北京市延庆区延庆镇莲花池村前街50夕阳红养老院"}&tk=您的密钥
Caused by: java.lang.IllegalArgumentException: Not enough variable values available to expand '"keyWord"'

说明

用Spring RestTemplate请求URL为http://api.tianditu.gov.cn/geocoder?ds={"keyWord":"延庆区北京市延庆区延庆镇莲花池村前街50夕阳红养老院"}&tk=您的密钥时报Not enough variable values available to expand '"keyWord"'异常,其根本原因是RestTemplate认为大括号{…}在给定的URL里作为一个URI变量占位符使用,需要后面传递参数。

解决: 可用ds={ds}替代

Frameworks

· 阅读需 1 分钟

Marko

Marko is HTML re-imagined as a language for building dynamic and reactive user interfaces.

A declarative, HTML-based language that makes building web apps fun

Emotion

  • JavaScript frameworks
  • Development
  • Visit emotion.sh

Emotion is a library designed for writing CSS styles with JavaScript.

styled-components

Styled components is a CSS-in-JS styling framework that uses tagged template literals in JavaScript.

Macaron

Macaron is a high productive and modular web framework in Go.

Semantic UI

Semantic UI is a front-end development framework, powered by LESS and jQuery.

rich-text-editors

· 阅读需 1 分钟

Rich Text Editors

Ace

  • Static site generator
  • Open-source software
  • Visit github.com

Ace is an embeddable code editor written in JavaScript.

docs

· 阅读需 11 分钟

Astro

  • Static site generator
  • JavaScript frameworks
  • Open-source software
  • Visit astro.build

Astro is a new JavaScript-based static site builder.

gatsby

· 阅读需 1 分钟
(base) mjl@ubuntu:~/work/mjl2020$ nvm list
v8.17.0
-> v14.21.3
v16.19.1
v19.6.1
default -> v14.21.3
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v19.6.1) (default)
stable -> 19.6 (-> v19.6.1) (default)
lts/* -> lts/hydrogen (-> N/A)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12 (-> N/A)
lts/fermium -> v14.21.3
lts/gallium -> v16.20.0 (-> N/A)
lts/hydrogen -> v18.16.0 (-> N/A)
(base) mjl@ubuntu:~/work/mjl2020$ nvm use v19.6.1
Now using node v19.6.1 (npm v9.4.0)
(base) mjl@ubuntu:~/work/mjl2020$ npm install -g gatsby-cli

added 333 packages in 11s
npm notice
npm notice New minor version of npm available! 9.4.0 -> 9.8.1
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.8.1
npm notice Run npm install -g npm@9.8.1 to update!
npm notice
(base) mjl@ubuntu:~/work/mjl2020$ gatsby --version
╔════════════════════════════════════════════════════════════════════════╗
║ ║
║ Gatsby collects anonymous usage analytics ║
║ to help improve Gatsby for all users. ║
║ ║
║ If you'd like to opt-out, you can use `gatsby telemetry --disable` ║
║ To learn more, checkout https://gatsby.dev/telemetry ║
║ ║
╚════════════════════════════════════════════════════════════════════════╝
Gatsby CLI version: 5.12.0

(base) mjl@ubuntu:~/work/mjl2020$