大數據里的拉鏈表:數據版本管理的時間膠囊

哈嘍各位數據打工人~今天咱們來聊聊大數據領域一個超實用的神器 ——拉鏈表!聽起來像時尚單品?NoNoNo,它可是數據倉庫里管理歷史數據的寶藏工具? 就算你是剛入門的小白也能輕松聽懂,咱們全程少玩比喻多講人話,走起~

一、拉鏈表:數據的 "時光記錄儀" 是什么鬼??

先想個問題:假如你要存用戶信息,用戶每天可能改昵稱、換手機號,傳統表只能存最新版,歷史記錄全丟了咋辦?😭 這時候拉鏈表就出場啦!?

它的核心秘密:給數據加 "時間標簽"?

拉鏈表本質是一張能記錄數據每個版本生效時間的表,結構比普通表多兩個關鍵字段:?

  • start_time:這條數據開始生效的時間(比如 2023-01-01 00:00:00)?
  • end_time:這條數據失效的時間(默認用9999-12-31 23:59:59表示當前有效)?

舉個🌰:用戶小明 1 月 1 號手機號是 138,3 月 1 號換成 139,拉鏈表會存兩條記錄:?

用戶 ID?

手機號?

start_time?

end_time?

1001?

138?

2023-01-01 00:00:00?

2023-03-01 00:00:00?

1001?

139?

2023-03-01 00:00:00?

9999-12-31 23:59:59?

這樣就能隨時查看小明歷史上所有用過的手機號啦~是不是很像給數據版本拉了條 "時間拉鏈",把不同時期的狀態都串起來了?這就是名字的由來哦~

二、啥時候該用拉鏈表?記住這 3 個場景!?

別覺得它萬能,這 3 種情況用它最香👇?

場景 1:緩慢變化維表(重點!)?

比如用戶表、商品表這種數據更新頻率低,但需要保留歷史變更的表。如果每天全量存儲歷史數據,數據量會爆炸💥 拉鏈表用增量方式記錄變更,省空間又能看歷史。?

場景 2:需要追溯數據變更過程?

比如訂單狀態變化(已創建→待支付→已支付→已完成),想知道每個狀態持續了多久?拉鏈表按狀態變更時間拆分記錄,輕松統計每個狀態的時間跨度~?

場景 3:數據不能丟但又不想存全量歷史?

舉個真實例子:某電商每月要分析用戶地址變更對復購率的影響,如果不用拉鏈表,就得存 3 年每天的全量用戶表,存儲空間直接翻倍😱 拉鏈表只存變更記錄,空間節省 70%+!

三、拉鏈表怎么玩?3 步搞定創建和使用!?

前面講了拉鏈表的核心操作,其實在實際項目中,我們經常會用 Sqoop 從 MySQL 等關系型數據庫抽取增量數據,給拉鏈表 "喂飯"~ 啥是 Sqoop?簡單說就是數據搬家的叉車🚚,專門在關系型數據庫和 Hadoop 生態(比如 Hive)之間搬數據,增量抽取還能省流量!

第 1 步:建表時加兩個時間字段

CREATE TABLE user_zip (user_id STRING,        -- 用戶ID(主鍵)name STRING,           -- 姓名phone STRING,          -- 手機號start_time TIMESTAMP,  -- 生效開始時間end_time TIMESTAMP,    -- 生效結束時間PRIMARY KEY (user_id, start_time)
);

劃重點:主鍵必須包含用戶 ID 和生效時間,不然會重復哦!?

第 2 步:數據插入有講究?

新增數據(比如新用戶):?

直接插入,end_time 默認設為最遠未來時間9999-12-31 23:59:59~?

更新數據(比如用戶改手機號):?

分兩步走:?

  1. 先找到該用戶當前有效的記錄(end_time 是 9999...),把它的 end_time 更新為當前更新時間的前一秒(比如 2023-03-01 00:00:00 更新,就設為 2023-02-28 23:59:59)?
  2. 插入一條新記錄,start_time 是更新時間,end_time 還是 9999...?

第 3 步:查詢時用時間范圍過濾?

想查 2023 年 2 月小明的手機號?一句 SQL 搞定:

SELECT phone 
FROM user_zip 
WHERE user_id = 1001 AND start_time <= '2023-02-28 23:59:59' AND end_time > '2023-02-28 23:59:59';

簡單來說就是:開始時間≤查詢時間,結束時間 > 查詢時間,就能拿到當時的有效數據啦~?

第 4 步:用 Sqoop 實現增量數據抽取(重點新增!)?

假設源表(比如用戶表)有個last_update_time字段,每次數據變更時會更新這個時間,我們就靠它定位增量數據~?

① 先定好增量抽取的 "錨點"?

Sqoop 增量抽取有兩種模式:?

  • append 模式:適合自增 ID(比如 user_id),每次抽id > 上次最大id的數據?
  • lastmodified 模式:適合時間戳(比如last_update_time),抽last_update_time > 上次抽取時間的數據?

拉鏈表常用第二種,因為數據變更可能不是單純的 ID 自增,而是任意行的更新~?

② 寫一條會 "記住進度" 的 Sqoop 命令

sqoop import \
--connect jdbc:mysql://xxx.xxx.xxx:3306/source_db \
--username root \
--password 123456 \
--table user \
--incremental lastmodified \  # 按時間戳增量模式  
--check-column last_update_time \  # 監控的時間字段  
--last-value "2023-01-01 00:00:00" \  # 上次抽取的截止時間,第一次用初始值  
--target-dir /hive/input/user_incremental \  # 抽到HDFS的路徑  
--fields-terminated-by '\t' \  # 字段分隔符  
--null-string '\\N' --null-non-string '\\N'  # 處理空值  

劃重點:--last-value會把每次抽取的截止時間存到.sqoop.counter文件里,下次不用手動改,超智能!?

③ 把 Sqoop 抽到的數據喂給拉鏈表?

假設抽到的增量數據里包含變更的用戶 ID、新數據、變更時間,接下來分兩步更新拉鏈表(和之前的更新邏輯一致):?

1、關閉舊版本:

UPDATE user_zip 
SET end_time = '新數據的變更時間 - 1秒'  # 比如2023-03-01 00:00:00變更,就設為2023-02-28 23:59:59  
WHERE user_id = 變更的用戶ID AND end_time = '9999-12-31 23:59:59';  # 只改當前有效的那條  

2、插入新版本:?

直接把 Sqoop 抽到的新數據插入,start_time設為變更時間,end_time還是默認的最遠未來~

舉個接地氣的🌰?

比如小明 3 月 1 號改了手機號,源表的last_update_time變成 2023-03-01 10:00:00。?

  • 凌晨 Sqoop 跑批時,發現last_update_time > 上次抽取時間(2023-02-28 23:59:59),就會把這條變更記錄抽出來?
  • 然后拉鏈表先把舊手機號的end_time改成 2023-03-01 09:59:59,再插入新手機號記錄,完美銜接!

四、拉鏈表的優缺點:先說優點再潑冷水?

?優點超實用:?

  1. 省空間小能手:只存變更數據,比每天全量存儲節省 60%-80% 空間,再也不怕老板罵存儲太貴啦~?
  2. 歷史記錄全保留:想查 3 個月前用戶是什么狀態?分分鐘調出來,數據回溯超方便~?
  3. 增量更新效率高:每次只處理有變化的數據,比全量更新快 N 倍,凌晨跑批再也不用熬夜等啦~?
  4. 以前手動處理增量數據像搬磚🧱,現在用 Sqoop 一鍵抽取,增量更新流程全自動!尤其適合數據源是 MySQL、Oracle 這種關系型數據庫的場景,再也不用寫復雜的 ETL 腳本啦~

??缺點也得知道:?

  1. 查詢稍微麻煩點:因為數據按版本存,復雜查詢可能需要關聯自己(比如查用戶所有歷史手機號),不過習慣就好啦~?
  2. 初始數據要處理:如果導入歷史數據,得先確定每條記錄的生效時間,前期準備工作多一丟丟~?
  3. 刪除數據難處理:如果數據被刪除,拉鏈表通常用特殊 end_time 標記(比如設為刪除時間),不能直接物理刪除哦~
  4. 源表必須有唯一主鍵(比如 user_id)和增量字段(時間戳或自增 ID),不然 Sqoop 找不到從哪開始抽
  5. 如果源表數據被批量回溯修改(比如把 3 天前的last_update_time改成今天),會導致重復抽取,記得加數據校驗哦~

五、新手常見問題 Q&A?

Q:拉鏈表和快照表啥區別??

A:快照表是每天存全量數據(比如 user_20230101、user_20230102),空間占用大;拉鏈表是把歷史數據 "縫" 在一張表里,更省空間但結構復雜一丟丟~?

Q:必須用 9999-12-31 當默認結束時間嗎??

A:不一定!看公司習慣,也可以用2099-12-31或者一個特殊值(比如 - 1),但記住別用 NULL,不然查詢會出錯哦~?

Q:數據頻繁更新的表能用拉鏈表嗎??

A:不太建議!比如訂單表每秒都在變,拉鏈表會生成海量記錄,反而影響性能。這種適合用事務型歷史表或者其他方案~?

總結:拉鏈表到底該不該學??

如果你在做數據倉庫、需要管理緩慢變化的維度數據,拉鏈表絕對是必學技能!它就像數據的 "時光機",讓你既能節省存儲空間,又能隨時回到過去查看數據狀態~剛開始可能覺得有點繞,但動手寫兩次 SQL 就懂啦~?

最后送大家一句話:拉鏈表用得好,數據回溯沒煩惱~ 趕緊在自己的測試庫試試吧,遇到問題歡迎評論區留言,咱們一起嘮嗑~😊

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86375.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86375.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86375.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker執行yum報錯Could not resolve host: mirrorlist.centos.org

解決辦法&#xff1a; -- 依次執行以下命令cd /etc/yum.repos.d/sed -i s|#baseurlhttp://mirror.centos.org|baseurlhttp://vault.centos.org|g /etc/yum.repos.d/CentOS-*sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-*yum update -yecho "export LC_ALL…

JVM OutOfMemoryError原因及排查解決方案

在Java后端開發中&#xff0c;java.lang.OutOfMemoryError&#xff08;簡稱OOM&#xff09;是一個令開發者頭疼的異常。它通常意味著Java虛擬機&#xff08;JVM&#xff09;在嘗試分配新對象時&#xff0c;發現堆中沒有足夠的空間來容納該對象&#xff0c;或者其他內存區域耗盡…

吐槽之前后端合作開發

大家好&#xff0c;我是佳瑞&#xff0c;從事10多年java開發程序員&#xff0c;爆照一張&#xff0c;存活互聯網。 也做過vue開發自己的網站&#xff0c;覺得前端是真比后端開發輕松很多&#xff0c;就是畫頁面調樣式&#xff0c;打包發布&#xff0c;當然不說是高級源碼修改…

Oracle LogMiner日志分析工具介紹

Oracle LogMiner日志分析工具介紹 LogMiner使用須知LogMiner字典使用online catalog作為日志挖掘字典使用redo日志文件作為日志挖掘字典使用文本文件作為日志挖掘字典Redo日志文件自動獲取日志文件手動獲取日志文件啟動LogMiner進行分析V$LOGMNR_CONTENTS視圖LogMiner使用須知 …

2-4 Dockerfile指令(個人筆記)

以下指令基于 ubuntu Dockerfile整體示例 From&#xff1a;設置基礎鏡像 Maintainer &#xff1a;鏡像維護者信息 COPY/ADD&#xff1a;添加本地文件到鏡像中 WorkDir&#xff1a;設置工作目錄 Run&#xff1a;執行命令 CMD/EntryPoint&#xff1a;配置容器啟動時執行的命令

Redis主從架構哨兵模式

文章目錄 概述一、主從搭建實例二、主從同步原理三、哨兵架構3.1、搭建哨兵架構3.2、演示故障恢復3.3、哨兵日志 概述 在生產環境下&#xff0c;Redis通常不會單機部署&#xff0c;為了保證高可用性&#xff0c;通常使用主從模式或集群架構&#xff0c;同時也面臨著一些問題&am…

基于深度學習yolov5的安全帽實時識別檢測系統

摘要&#xff1a;在現代工業和建筑行業中&#xff0c;確保員工的安全是至關重要的一環。安全帽作為一項基礎的個人防護設備&#xff0c;對于降低頭部受傷的風險發揮著關鍵作用。然而&#xff0c;確保工作人員在施工現場始終正確佩戴安全帽并非易事。傳統的人工檢查方法不僅效率…

GitLab 18.1 發布 Runner、無效的個人訪問令牌查看等功能,可升級體驗!

GitLab 是一個全球知名的一體化 DevOps 平臺&#xff0c;很多人都通過私有化部署 GitLab 來進行源代碼托管。極狐GitLab 是 GitLab 在中國的發行版&#xff0c;專門為中國程序員服務。可以一鍵式部署極狐GitLab。 學習極狐GitLab 的相關資料&#xff1a; 極狐GitLab 官網極狐…

量子計算與AI融合 - 企業級安全威脅應對

量子計算&#xff08;QC&#xff09;雖帶來萬億級市場機遇&#xff08;2025-2035年&#xff09;&#xff0c;但潛藏重大安全風險&#xff1a;可能破解現有加密系統&#xff0c;催生"現在竊取&#xff0c;未來解密"攻擊。美國NIST已啟動后量子加密標準&#xff0c;但技…

Excel:filter函數實現動態篩選的方法

filter的意思是“過濾、篩選”&#xff0c;動態篩選&#xff0c;FILTER()函數可以將對篩選區域內容&#xff0c;并將結果自動溢出生成一個新區域&#xff0c;以下是函數的使用方法&#xff1a; &#xff08;一&#xff09;情景&#xff1a;給定兩列數據&#xff0c;我需要根據…

蘭洋科技上合組織論壇發表專題分享,全球液冷布局引領綠色算力未來

2025年6月17-19日&#xff0c;中國—上海合作組織數字技術合作發展論壇在新疆克拉瑪依市舉辦。作為第四次上海合作組織成員國信息通信技術發展部門負責人會議的配套會議&#xff0c;論壇以“數字化轉型助力可持續發展&#xff0c;數字包容促進上合共同繁榮”為主題&#xff0c;…

LED-Merging: 無需訓練的模型合并框架,兼顧LLM安全和性能!!

摘要&#xff1a;對預訓練大型語言模型&#xff08;LLMs&#xff09;進行微調以適應特定任務&#xff0c;會帶來巨大的計算和數據成本。雖然模型合并提供了一種無需訓練的解決方案&#xff0c;用于整合多個特定任務的模型&#xff0c;但現有方法存在安全性與效用性之間的沖突&a…

火山引擎向量數據庫 Milvus 版正式開放

資料來源&#xff1a;火山引擎-開發者社區 隨著AI技術的不斷演進發展&#xff0c;非結構化數據也迎來了爆發式的增長。Milvus作為一款為大規模向量相似度搜索和 AI 應用開發設計的開源向量數據庫系統&#xff0c;目前已在業界占據領導地位。當前 Milvus 已經被 5,000 家企業所…

SQL SERVER存儲過程

什么是存儲過程 SQL 存儲過程&#xff08;Stored Procedure&#xff09;是一個在數據庫中預編譯并存儲的一組 SQL 語句。它們可以包含查詢、插入、更新、刪除等數據庫操作&#xff0c;甚至包括控制流語句&#xff08;如條件判斷、循環等&#xff09;。存儲過程可以通過調用來執…

Lombok注解 - 提高Java開發效率

01 繁瑣編碼 初入 Java 開發領域時&#xff0c;編寫實體類的瑣碎經歷想必各位都深有感觸。 每當創建一個實體類&#xff0c;鋪天蓋地的 getter、setter、toString 方法接踵而至&#xff0c;手指在鍵盤上頻繁敲擊&#xff0c;酸痛不已。 而 Lombok 這一神器的出現&#xff0c…

Linux修改uboot啟動延時方法詳細攻略,觸覺智能RK3568開發板演示

修改uboot延時 首先查找defconfig文件 ./build.sh uboot #通過編譯日志查看使用的defconfig文件ls u-boot/configs/*3568* #在SDK根目錄下執行該操作 如圖標注處就是所使用的u-boot配置文件。 然后修改延時數&#xff1a; vim u-boot/configs/rk3568_defconfig 將CONFIG_BOO…

dockers virbox 安裝

sudo apt remove docker docker-engine docker.io containerd runc 更新包索引并安裝依賴 sudo apt update sudo apt install ca-certificates curl gnupg 添加Docker官方GPG密鑰 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux…

Restormer: Efficient Transformer for High-Resolution Image Restoration 論文閱讀

題目 (Title): Restormer&#xff1a;用于高分辨率圖像恢復的高效Transformer 摘要 (Abstract): 由于卷積神經網絡&#xff08;CNN&#xff09;在從大規模數據中學習可泛化的圖像先驗方面表現出色&#xff0c;這些模型已被廣泛應用于圖像恢復及相關任務。最近&#xff0c;另一…

音視頻開發協議棧全景解析

音視頻開發協議棧全景解析 引言&#xff1a;協議棧的重要性與演進 在當今數字化時代&#xff0c;音視頻技術已成為互聯網基礎設施的核心組成部分。從視頻會議、直播到智能安防、元宇宙應用&#xff0c;音視頻協議棧的設計直接影響著用戶體驗質量(QoE)。作為開發者&#xff0c…

Java面試題025:一文深入了解數據庫Redis(1)

歡迎大家關注我的JAVA面試題專欄,該專欄會持續更新,從原理角度覆蓋Java知識體系的方方面面。 一文吃透JAVA知識體系(面試題)https://bl