银行数据仓库体系实践(5)--数据转换

        数据转换作业主要是指在数据仓库内的结构化数据批量加工,对于非结构化数据以及在线查询接口、数据流的开发主要是遵循代码开发规范以及各中间件的开发规范,如使用java来开发遵守java开发规范,使用Kafka需要遵循Kafka的使用和设计规范。同时做好组件的设计,提高复用程度和开发效率。这里就不再赘述,那对于批量加工数据各平台也有相应的开发规范,对于不同的平台有不同的规范,用来提高代码的运行效率和可维护性,以下是一些共性的设计规范。

1、常见算法及选择

       数据转换作业从开发上可以分为两个步骤,一是数据映射,即每个字段的来源即计算方式,比如 目标表D字段是来自于源表S字段,计算方式是SUM(S)。二是目标表加工的算法,比如delete/insert,upsert等,它是将增量数据如何和历史数据融合转化为全量数据的常用处理方式,以下是在数据仓库中经常使用的一些算法:

       (1)delete all/insert:先删除目标表当前所有数据,再插入全量最新数据,此算法适用于数据量较小且不需要保留历史数据的表。如代码表、参数表。例如:

Delete from D ; 

insert D select * from A;

        (2) Append:增量追加:将当前源表数据直接追加到目标表中。此算法需要源表数据以增量提供。这种算法一般在事件表(交易流水表)和总账表中使用较多,用来记录所有的历史交易记录,记录每天的交易以及总账的切片数据。

delete from D where trans_date=current_date ;

insert into A select * from S wheretrans_date=current_date ;

        (3)UPSERT:使用源表数据更新目标表。如果新来的源数据已经在目标表中存在,则使用新来的源数据更新目标表中的相应数据,如果新来的源数据在目标表中不存在,则直接将其加入目标表中。针对此算法,源表选择全量或增量方式提供数据均可以。此算法适应于不保留历史的当前表。如集市区的账户或客户基本信息当前表。简要步骤如下:

步骤1:根据映射关系生成临时目标表T,已有目标表为D;

步骤2:update D set D.C1=T.C1 …  where D.key in ( select T.key from T);

步骤3:insert D select * from T whereT.key not in (select key from D); 

        (4)标准历史拉链:由于数据仓库的一个特点就是保留历史数据,因此在主数据区的数据表基本都保留历史数据,那历史数据保留的算法除了Append方式就是历史拉链链方式。即在目标表中增加start_date(开始时间)和end_date(结束时间)字段,用来保存数据的历史变化。相对于Append算法堆加方式,此方法可以减少历史数据存储的空间要求并方便对历史数据的访问。适用于部分字段发生变化的表,如客户主表、账户主表等,针对此算法,源表选择全量或增量方式提供数据均可以。标准历史拉链的算法的举例和加工流程如下图所示:

那对于不同的情况如存在删除数据情况下,在标准历史拉链的基础上又演变出了几种拉链算法,以下是几种变形算法:

       (5)经济型历史拉链:在“标准历史拉链”算法的基础上,对PK外属性字段为0、’’等情况下的记录做关链处理。处于节约空间的考虑。允许断链存在,不影响金额统计的正确性。比如将协议金额历史表中余额为0的记录不放到目标表。一般较少使用到。

       (6)全量数据的历史拉链:在“标准历史拉链”算法的基础上,对源数据中已经删除的记录打标记,并修改目标表中end_date来关闭该数据当前的时间链。此算法要求源表提供全量数据或能表示出删除数据的增量数据。适用于源系统表存在删除的情况;

       (7)全主键历史拉链:“标准历史拉链”算法的变种,特点是表中全部字段(除了开始和结束日期外)都是拉链主键,没有属性。比如协议当事人关系表中,借据和担保人是多对多的关系,需要同时做PK。

       (8)自拉链:对保留历史状态的源表进行历史拉链,如果源表已经保留了历史状态信息,但没有使用历史拉链(start_date/end_date)的方式,则通过对该源表进行自连接,将源表的数据以历史拉链的形式保存到目标表中。源表数据可能是保存了一段时间的历史数据。

2、作业设计规范

(1)作业划分及拆分

       数据转换作业名一般以目标表作为一个加工作业,可以参考以下规则来命名:

目标表名[_顺序号](例如T01_PARTY、RMRT_AGREEMENT_001)

       其中T01_PARTY、T03_AGREEMENT是目标表名,不同的数据区域会有不同的命名规范,如RMRT表示是零售集市数据区,T01表示主模型的PARTY主题表;顺序标识如001可省略。

        顺序标识主要是因为同一个目标表可能需要通过几个独立的作业来实现,则需要使用顺序标识来区分,比如在整合模型区的T01_PARTY 表需要从核心、公贷、理财系统数据进行加工,但是核心系统数据提供比较晚,公贷和理财源系统数据提供比较早,为了提高后续作业效率,避免不必要的等待,可以按照源系统数据的到达时间进行分组,让到达时间相近的源系统在一个加载任务中,如公贷和理财系统数据入T01_PARTY作为1组,核心数据入T01_PARTY 为第2组。

(2)支持重跑

       数据加工作业也需要支持重跑,方便作业异常重新发起,而不需要先手工清洗数据,因此在作业设计事需要

        1)第1步就是需要恢复数据,比如历史拉链表加工T日数据第一步是将数据恢复到T-1日批后状态(参考标准历史拉链算法流程)。

       2)使用临时表,将当天数据在临时表先加工完成,只在最后一次性更新目标表或者在最后直接以临时表作为最终的目标表。

       3)最后更新目标表时需要使用事务,避免中间异常无法回退数据;

(3)支持历史数据处理;

       作业支持重跑一般只支持当日数据重跑,对于T-N(N>1)日的历史数据重新跑到T日的话,除了APPEND及delete all/insert算法,一般需要手动先恢复到T-N日批后数据,再逐日跑数到T日,因此作业设计时也要考虑到这种情况,特别是在作业上线时会需要追数,因此在设计时需要对于存储历史数据的源表使用时需要使用作业参数中的数据日期(tx_date)来获得当日的数据,比如对于历史拉链表作为源表,使用时用tx_date来获得tx_date当日数据:

select * from T01_PARTY_H where start_dt<=tx_date and end_dt>tx_date

(4)作业监控

       数据转换作业设计时,需要确保每一步加工的信息在日志输出,包括执行的sql语句,SQL执行的结果比如更新记录多少条、错误信息等,以便错误时快速查找原因,在调度系统集成中也需要能快速查看转换作业的日志。

(5)代码转换公共作业

       在主数据区需要进行代码标准化,即将源系统的代码转换为数据仓库中定义的代码,这和个也是数据标准在数据仓库实施的一部分,因此会经常使用到代码转换,可以设计一张代码转换表,以源系统表名、源系统字段、源系统字段代码值为主键:

       在转换作业中可以通过统一的方法即通过关联代码转换表获取对应的映射字段,不仅可以规范代码映射方法,也可以通过维护代码转换表获得数据仓库的代码标准和代码转换视图;

(6)表所属数据库或SCHEMA配置化

       由于生产环境和测试环境可能不同,一套物理测试环境可能分开发、SIT和UAT环境,对于各表的所属schema或数据库需要可配置化(参数化),以便脚本在测试环境中运行,同时也需要做好生产脚本参数和测试环境参数的代码管理。

3、脚本开发自动化

       由于算法相对固定,字段映射不同,因此可以针对不同的算法做好模板,再根据字都映射规则产生SQL填充到模板,这样可以节省代码开发量,同时提高数据转换作业的可维护性,以下时转换作业自动生成代码的关键信息

       (1)基本信息描述:如物理表名称及表说明、开发人员及修改日期、表的主键字段

       (2)任务信息描述:包括作业名称、作业执行频率(日、周、月、季、年)、ETL算法(第1部分提到的算法)。ETL算法如果是UPSERT算法,需要填写比较的字段、更新的字段。如果为拉链算法,需要填写比较的主键以及开始日期和结束日期字段。

       (3)字段映射:字段映射主要包括如下字段映射、映射规则以及表关联:

        由于一个ETL作业可能有很多组映射组成,即有许多源表到目标表的映射加工,所以也需要标识组别,每一组在映射加工脚本前后还需要有自定义的SQL脚本,也可以每组映射只有自定义脚本,以方便SQL加工前处理数据或者适应无法用MAPPING描述的规则。

       在填写配置信息时,需要将需求中的字段映射关系备注也放到配置文件中,对于自定义的SQL也需要做好备注,这些备注也会自动显示在脚本的注释中。增加配置信息及最终生成的脚本的可读性。

       基于以上的信息以及目标表和源表的字段信息,已经具有自动化生成脚本的所有信息,可以根据这些信息自动化产生脚本,配置信息结构以及脚本生成主要步骤如下:


————————————————

版权声明:本文为acumen_leo博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/acumen_leo/article/details/94047730

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

对话泛能网程路:能源产业互联网,行至中程

泛能网的能源产业互联网的标杆价值还不仅于此。其在产业互联之外&#xff0c;也更大的特殊性在于其也更在成为整个碳市场的“辅助运营商”&#xff0c;包括电力、碳等一系列被泛能网帮助企业改造和沉淀的要素资产&#xff0c;都在构成着碳交易市场的未来底层。 这恰是产业互联…

有关Quick BI中Case子句中多次使用lod函数返回空值问题分析

一、Quick BI中的lod_ include函数 lod_ include {维度1[,维度2]...:聚合表达式[:过滤条件]} 作用&#xff1a;将表达式中的维度一起作为分组依据进行订算。其中&#xff0c; 1) 维度1[,维度2]... &#xff1a;声明维度&#xff0c;指定聚合表达式要连接到的一个或多个维…

开源项目Git Commit规范与ChangeLog

一&#xff0c;conventional commit(约定式提交) Conventional Commits 是一种用于给提交信息增加人机可读含义的规范。它提供了一组用于创建清晰的提交历史的简单规则。 1.1 作用 自动化生成 CHANGELOG基于提交类型&#xff0c;自动决定语义化的版本变更向项目相关合作开发…

OpenCV书签 #互信息的原理与相似图片搜索实验

1. 介绍 互信息&#xff08;Mutual Information&#xff09; 是信息论中的一个概念&#xff0c;用于衡量两个随机变量之间的关联程度。在图像处理和计算机视觉中&#xff0c;互信息常被用来度量两幅图像之间的相似性。 互信息可以看成是一个随机变量中包含的关于另一个随机变…

【网站项目】基于SSM的251国外摇滚乐队交流和周边售卖系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

DAY30:回溯算法332\51\37基本思路了解+总结

Leetcode: 332 重新安排行程 代码随想录 这道题目有几个难点&#xff1a; 一个行程中&#xff0c;如果航班处理不好容易变成一个圈&#xff0c;成为死循环&#xff0c;容易出现环路。有多种解法&#xff0c;字母序靠前排在前面&#xff0c;让很多同学望而退步&#xff0c;如…

yolov8上使用gpu教程

yolov8上使用gpu教程 安装Cuda和Cudnnyolov8上使用gpu 安装Cuda和Cudnn 1.查看支持的cuda版本&#xff0c;并去官网下载。 nvidia-smi2.网址&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive 3.安装细节 安装的前提基础是&#xff0c;有vs的C环境。我电脑有…

多流转换 (分流,合流,基于时间的合流——双流联结 )

目录 一&#xff0c;分流 1.实现分流 2.使用侧输出流 二&#xff0c;合流 1&#xff0c;联合 2&#xff0c;连接 三&#xff0c;基于时间的合流——双流联结 1&#xff0c;窗口联结 1.1 窗口联结的调用 1.2 窗口联结的处理流程 2&#xff0c;间隔联结 2.1 间隔联…

Qt单选按钮

前言 本篇文章介绍Qt的单选按钮&#xff0c;就是QRadioButton QRadioButton是一个选项按钮&#xff0c;可以打开&#xff08;选中&#xff09;或关闭&#xff08;取消选中&#xff09;。单选按钮通常向用户提供“众多之一”的选择。 在一组单选按钮中&#xff0c;一次只能选中…

手动搭建koa+ts项目框架(apidoc文档篇)

文章目录 一、安装apidoc工具二、使用1、项目根目录新建apidoc.json2、定义接口路由上方注解对应信息3、配置静态文件访问目录4、生成api文档如有启发&#xff0c;可点赞收藏哟~ 一、安装apidoc工具 全局安装 npm i apidoc -g查看是否安装成功 apidoc -v二、使用 1、项目根…

注解@profile的使用

目录 profile介绍配置演示 profile介绍 profile 通常作用在controller类上&#xff0c;当它标记的环境有效时&#xff0c;该controller类才生效&#xff0c;例如&#xff1a;Profile(“dev”),当dev环境被激活时&#xff0c;Profile(“dev”)所注解的controller类才生效。 配置…

工作软技能第一弹,关于职场沟通、成长的那些事

引言 在谈绩效后&#xff0c;我收获了一些心得&#xff0c;在此梳理出来&#xff0c;加深印象并且共勉 基本信息 在步入职场后&#xff0c;你可能跟我一样虽然技术水平有在上升&#xff0c;但是在处理一些事情上可能偶尔没能获得预期的成果。我在通过绩效沟通以及自我反思后…

【学网攻】 第(10)节 -- 路由器单臂路由配置

系列文章目录 目录 系列文章目录 文章目录 前言 一、单臂路由是什么&#xff1f; 二、实验 1.引入 实验拓扑图 PC配置 Sw配置 Router配置 实验验证 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交…

Vue+OpenLayers7入门到实战:在地图上添加缩放控件、比例尺控件和鼠标经纬度位置显示控件

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章主要介绍如何使用OpenLayers7在地图上添加地图缩放控件,比例尺显示控件和鼠标经纬度位置展示控件这三个Control控件。 二、依赖和使用 "ol": "7.5.2"使用npm安装依赖npm install ol@7.5.…

JVM实战(31)——内存溢出之请求超时

一、简介 本章&#xff0c;我们将通过实际案例讲解一个Web应用的内存溢出问题&#xff0c;该内存溢出问题的排查涉及Tomcat的一些底层原理&#xff0c;最终排查发现是由于请求超时问题导致&#xff0c;我们先来看下系统的背景。 1.1 系统背景 生产环境的一个系统发生告警&…

Linux/Doctor

Enumeration nmap 已知目标开放了22,80,8089端口&#xff0c;扫描详细情况如下 可以看到对外开放了22,80,8089三个端口 TCP/80 SSTI 访问80端口&#xff0c;有一个infodoctors.htb的电子邮件&#xff0c;点击其他的也没有什么反应&#xff0c;猜测有可能需要域名访问 在/et…

day32WEB 攻防-通用漏洞文件上传二次渲染.htaccess变异免杀

本章节知识点&#xff1a; 1 、文件上传 - 二次渲染 2 、文件上传 - 简单免杀变异 3 、文件上传 -.htaccess 妙用 4 、文件上传 -PHP 语言特性 前置知识&#xff1a; 后门代码需要用特定格式后缀解析&#xff0c;不能以图片后缀解析脚本后门代码 ( 解析漏洞除外 ) 如&…

C++ day 1

思维导图 使用C编写一个程序&#xff0c;输入一个字符串&#xff0c;统计大小写字母、数字、空格和其他符号的个数 #include <iostream>using namespace std;int main() {int capital 0;int lower 0;int digit 0;int spaces 0;int others 0;cout << "请…

人工智能时代:让AIGC成为你的外部智慧源(文末送书)

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 什么是AIGC?二. AIGC如何运作&#xff1f;2.1 步骤一&#xff1a;收集数据2.…

web前端javascript笔记——(14)Navigator 、History、Location

Navigator <!DOCTYPE html><head><meta charset"UTF-8"><title></title><style></style><script type"text/javascript">/*DOM文档对象&#xff0c;通过js操作网页BOM 浏览器对象BOM可以使我们通过JS来操…