对于缓慢变化的维度表,如客户表,员工表,为了不丢失历史数据,又不至于太浪费存储空间,我们采用拉链表实现。
实现过程如下:

1、采集初始数据:

1.1 从mysql导出数据到hdfs

/data/dolphinscheduler/loadMysqlTable.sh "${dbConnect}" "select ${slctColums} from loan.${tableName} t where update_time < date_add('${bizDate}', INTERVAL 1 DAY) or update_time is null" "/dmp/${DMP_DB}" "${srcSystem}" "${bizDate}"

关于loadMysqlTable.sh脚本可以看我的另一篇文章:
https://blog.csdn.net/weixin_45357522/article/details/149720803
其中,变量的示例:
${slctColums}:“t.id, t.name, t.age …”
${dbConnect}:“-h host1 -uroot -ppwd123”
${tableName}: “t_customer”
${bizDate}: “2025-07-30”
${srcSystem}: “crm”
${DMP_DB}: 数据中台的hive db name, 如:“rdm”

这里要注意的是sql语句加入一个条件,update_time < date_add(‘${bizDate}’, INTERVAL 1 DAY) or update_time is null,只把T-1以前更新的数据导出来,当时更新的数据要等到第二天才导出,以免重复导入,产生假的变更记录。

1.2 基于上传到hdfs的文件创建一个临时表

1.3 从临时表中过滤掉非法数据,如id为空的数据,加载到ODS

1.4 从ods表加载到dwd,并初始化valid_from = ‘1900-01-01’, valid_to = ‘2999-12-31’

insert overwrite table ${DMP_DB}.dwd_dim_${tableName}
SELECT ${slctColums}, '1900-01-01', '2999-12-31'
from ${DMP_DB}.ods_${srcSystem}_${tableName} t;

其中,${slctColums}的示例:t.id, t.name, t.age …
dwd表最后两个字段分别是valid_from, valid_to, 日期型
表结构示例:

CREATE TABLE cust.dwd_dim_loan_individual_customer (id varchar(32) COMMENT '个人客户id',code varchar(50) COMMENT '客户编号',name varchar(100) COMMENT '客户名称',status tinyint COMMENT '客户状态',id_type int COMMENT '证件类型 id_type',id_code varchar(22) COMMENT '证件号码',id_expire_date timestamp COMMENT '身份证有效期到',gender tinyint COMMENT '性别',age TINYINT COMMENT '年龄',valid_from date COMMENT '生效日期(含)',valid_to date COMMENT '失效日期(不含)'
)  COMMENT '个人客户'
STORED AS parquet 
location '/dmp/cust/dwd/dim/loan_individual_customer';

取数逻辑:

select ... from table1 
where valid_from <= current_date and current_date < valid_to

2、增量数据加载

2.1 从mysql导出数据到hdfs

/data/dolphinscheduler/loadMysqlTable.sh "${dbConnect}" "select ${slctColums} from loan.${tableName} t where update_time < date_add('${bizDate}', INTERVAL 1 DAY) and update_time >= '${bizDate}'" "/dmp/${DMP_DB}" "${srcSystem}" "${bizDate}"

其中,只取更新时间是T-1的数据,T日更新数据留到下一天处理。

2.2 基于上传到hdfs的文件创建一个临时表

2.3 从临时表中过滤掉非法数据,如id为空的数据,加载到ODS

2.4 从ods表加载到dwd

这步比较关键,有些逻辑:

insert overwrite table ${DMP_DB}.dwd_dim_${tableName}
SELECT ${slctColums}, valid_from,
CASE WHEN t.valid_to = to_date('2999-12-31') AND B.id IS NOT NULLTHEN date_add('${bizDate}', 1)  -- 有新记录匹配到了,把valid_to设置为下一天ELSE t.valid_to  -- 没有新记录匹配到,valid_to不变END AS valid_to
FROM cust.dwd_dim_loan_individual_customer t
LEFT JOIN cust.ods_yecai_loan_individual_customer AS b
ON t.id = b.id where valid_from != date_add('${bizDate}', 1) -- 重跑这个条件用于滤除当天先前加入的数据
UNION all -- 把新记录加进去
SELECT ${slctColums},date_add('${bizDate}', 1) AS valid_from, to_date('2999-12-31') AS valid_to
FROM ${DMP_DB}.ods_${srcSystem}_${tableName} AS t

重要优化就是旧表和新表只join一次!!!

示例数据:
a. 老数据

idnameagevalid_fromvalid_to
1张三251900-01-012999-12-31
2李四451900-01-012999-12-31

b.新数据

idnameage
1张三26

c. 合并后的数据

idnameagevalid_fromvalid_to
1张三251900-01-012025-07-31
1张三262025-07-312999-12-31
2李四451900-01-012999-12-31

sql中“where valid_from != date_add(‘${bizDate}’, 1)”的作用是在重跑数据时把当天新加入的数据滤除掉

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

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

相关文章

【VSCode】常用插件推荐(持续更新~)

以下的这些插件都有使用过&#xff0c;可取对自己编码有用的选择安装。&#x1f9e0; 智能补全 / 提示类插件 1. Auto Import在编码时选择有对应导入包的选项&#xff0c;自动为 JS/TS 文件中的使用项补全并添加 import 声明&#xff0c;极大提高开发效率。2. Iconify IntelliS…

ICML 2025 | 深度剖析时序 Transformer:为何有效,瓶颈何在?

本文介绍帝国理工学院等机构在 ICML 2025 发表的最新研究成果。该研究并未提出新模型&#xff0c;而是对现有时间序列 Transformer 模型进行了一次深刻的拷问——为何结构更简单的 Transformer&#xff08; PatchTST, iTransformer&#xff09;在各大基准测试中&#xff0c;反而…

AIBOX内置5G天线设计

AIBOX内置5G天线设计AIBOX的天线种类天线种类及数量&#xff1a;运营商5G天线*4&#xff0c;1.4G天线*2、wifi天线*1天线形式&#xff1a;内置PCB天线。天线安装方式&#xff1a;卡扣固定&#xff0c;安装至设备外壳内壁。RG-178同轴线或UFL1.37mm同轴线连接至主板&#xff0c;…

低通滤波器的原理以及作用

低通滤波器&#xff08;Low-Pass Filter, LPF&#xff09;是一种允许低频信号通过&#xff0c;同时衰减或阻止高频信号的电子电路或数字信号处理算法。其核心原理和作用如下&#xff1a;一、工作原理 1. 频率选择性- 低通滤波器基于频率对信号进行筛选&#xff0c;其传递函数在…

[AI Coding] 一.腾讯CodeBuddy IDE内测、安装及基本用法(国产AI IDE启航)

在人工智能迅猛发展的今天&#xff0c;AI Coding 正逐步改变传统编程范式。广义上&#xff0c;AI Coding 是指以大语言模型&#xff08;LLMs&#xff09;为核心驱动&#xff0c;借助自然语言理解能力&#xff0c;自动生成、补全、调试与解释代码的智能编程方式。它不仅显著降低…

《网安处罚裁量基准》码农合规指北 v1.0——if (违规) { 罚金++ } else { 合规运行 }

尊敬的审核&#xff1a; 本人文章《〈网安处罚裁量基准〉码农合规指北 v1.0——if (违规) { 罚金 } else { 合规运行 }》 1. 纯属技术交流&#xff0c;无任何违法内容 2. 所有法律引用均来自公开条文 3. 请依据《网络安全法》第12条“不得无故删除合法内容”处理 附&#xff1a…

机器学习——逻辑回归(LogisticRegression)实战案例:信用卡欺诈检测数据集

使用逻辑回归识别 信用卡欺诈行为&#xff1a;基于creditcard.csv的实战与评估分析 项目背景 在金融行业中&#xff0c;信用卡欺诈检测是一项关键任务。欺诈交易在整个交易中占比极低&#xff0c;导致数据极度不平衡。本案例通过经典数据集 creditcard.csv&#xff0c;构建逻辑…

Helm在Kubernetes中的应用部署指南与案例解析

在上一章节中&#xff0c;我们已经介绍了Helm的部署和基本使用方法。本章将通过实际案例&#xff0c;详细演示如何使用Helm在Kubernetes集群中部署应用。一、Helm 核心价值解析优势解决的问题类比传统方式应用模板化重复编写 YAML 文件手动编写 20 资源清单文件版本控制缺乏部署…

如何最简单、通俗地理解线性回归算法? 线性回归模型在非线性数据上拟合效果不佳,如何在保持模型简单性的同时改进拟合能力?

线性回归作为统计学与机器学习领域中最基础且最重要的算法之一&#xff0c;其应用广泛且深远。它不仅是回归分析的入门方法&#xff0c;更是后续复杂模型构建的重要理论基础。理解线性回归算法的本质&#xff0c;既有助于提升数据分析的能力&#xff0c;也能为掌握更复杂的机器…

蓝桥杯----超声波

&#xff08;一&#xff09;、超声波1、原理&#xff08;图 一&#xff09;发送信号阶段&#xff1a;单片机通过翻转发送的引脚P1^0&#xff0c;发送8个40MHZ的方波&#xff0c;此时开始计时。等待接收信号&#xff1a;通过单片机的接收引脚P1^1检测&#xff0c;未接收到信号时…

Java学习-运算符

1.在代码中&#xff0c;如果有小数参与计算&#xff0c;结果有可能不精确。2.整数参与计算&#xff0c;结果只能是整数。3.数字进行运算时&#xff0c;数据类型不一样不能运算&#xff0c;需要转成一样的&#xff0c;才能运算。&#xff08;1&#xff09;隐式转换&#xff08;自…

一句话指令实现“2D转3D”、“图片提取线稿”

你是否曾为一张2D图片无法完美展示3D效果而遗憾&#xff1f;是否曾因需要将手绘草图转为清晰线稿而耗时费力&#xff1f;这些曾让设计师、电商卖家、内容创作者头疼的难题&#xff0c;如今只需一句话指令&#xff0c;即可迎刃而解。一、案例一&#xff1a;2D图片→3D模型痛点场…

层次聚类:无需“猜”K值,如何让数据自己画出“家族图谱”?

层次聚类&#xff1a;无需“猜”K值&#xff0c;如何让数据自己画出“家族图谱”&#xff1f;&#x1f44b; 大家好&#xff0c;我是小瑞瑞&#xff01;欢迎回到我的专栏&#xff01; 在上一期&#xff0c;我们学会了强大的K-Means算法&#xff0c;但它也给我们留下了一个“灵魂…

数据结构:链表(Linked List)

目录 结构推导 回到最原始的问题 —— 我们如何存数据&#xff1f; 第二步&#xff1a;我们来看看数组的限制 第三步&#xff1a;那我们该怎么做呢&#xff1f; 第四步&#xff1a;我们推导链表的数据结构 结构讲解 什么是链表&#xff1f; 什么是节点&#xff1f; …

[RK3566-Android11] U盘频繁快速插拔识别问题

问题描述 做老化测试时&#xff0c;在使用U盘频繁快速插拔的情况下&#xff0c;SDCard目录会突然被Kill掉&#xff0c;然后又重新挂载上&#xff0c;这会导致系统及APP的数据因为读写异常&#xff0c;从而界面卡死正常U盘插拔不应该导致内部存储卸载解决方案&#xff1a; SDK根…

【Golang】Go语言Map数据类型

Go语言Map数据类型 文章目录Go语言Map数据类型一、Map1.1.1、map定义1.1.2、map的基本使用1.1.3、判断某个键是否存在1.1.4、map的遍历1.1.5、使用delete()函数删除键值对1.1.6、按照指定顺序遍历map1.1.7、元素为map类型的切片1.1.8、值为切片类型的map一、Map map是一种无序…

Orange的运维学习日记--23.Linux计划任务详解

Orange的运维学习日记–23.Linux计划任务详解 文章目录Orange的运维学习日记--23.Linux计划任务详解一次性计划任务atd 服务at 命令基本语法交互式示例脚本文件示例timespec 格式示例查看与管理任务查看当前队列查看任务详细内容删除任务用户权限控制用户周期性计划任务查看任务…

Ubuntu 24.04.2 LTS 安装mysql8.0.36保姆级教程(从安装到远程连接)

目录 前言 一、系统准备 二、安装 MySQL 8.0.36 1. 查看可用版本 2.如果没有对应版本则需要手动下载mysql-apt-config&#xff08;有则跳过&#xff09; 2.1下图是mysql-apt-config各版本对应的mysql版本 2.2下载mysql apt repository 2.3安装 MySQL APT Repository 包 …

【LLM】讲清楚MLA原理

需要你对MHA、MQA、GQA有足够了解&#xff0c;相信本文能帮助你对MLA有新的认识。 本文内容都来自https://www.youtube.com/watch?v0VLAoVGf_74&#xff0c;如果阅读本文出现问题&#xff0c;建议直接去看一遍。 按照Deepseek设定一些参数值&#xff1a;输入token长度n10&…

谷歌采用 Ligero 构建其 ZK 技术栈

1. 引言 前序博客有&#xff1a; Ligero 和 Ligetron 中的 MPC 和 ZKLigetron&#xff1a;Nim Network开发的针对AI的zkVMLigetron&#xff1a;基于MPC-In-The-Head范式的zkVM简介 在隐私保护身份验证领域迈出重要一步&#xff0c;谷歌最近宣布 将零知识证明&#xff08;ZKP…