大數據平臺數倉數湖hive之拉鏈表高效實現

對于緩慢變化的維度表,如客戶表,員工表,為了不丟失歷史數據,又不至于太浪費存儲空間,我們采用拉鏈表實現。
實現過程如下:

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…