目錄
一、前言
二、SQL與ETL的概述
三、ETL過程中的SQL示例(GaussDB)
1、提?。‥xtract)
2、轉(zhuǎn)換(Transform)
3、加載(Load)
四、附DataArts Studio介紹
五、小結(jié)
一、前言
在SQL語言中,ETL(抽取、轉(zhuǎn)換和加載)是一種用于將數(shù)據(jù)從源系統(tǒng)抽取到目標(biāo)系統(tǒng)的過程。ETL過程通常包括三個(gè)階段:抽?。‥xtract)、轉(zhuǎn)換(Transform)和加載(Load)。但這些其實(shí)都脫離不了數(shù)據(jù)庫系統(tǒng),本節(jié)從GaussDB數(shù)據(jù)庫生態(tài)出發(fā),給大家簡(jiǎn)單講一下SQL 與 ETL的過程與關(guān)系。
二、SQL與ETL的概述
SQL(結(jié)構(gòu)化查詢語言)
SQL是一種用于管理關(guān)系數(shù)據(jù)庫系統(tǒng)的標(biāo)準(zhǔn)編程語言(例如、MySql、GaussDB等)。它用于查詢、插入、更新和刪除數(shù)據(jù)庫中的數(shù)據(jù)。SQL語言主要用于數(shù)據(jù)庫管理系統(tǒng)的交互,它并不是一種通用的編程語言,而是專門設(shè)計(jì)用于操作關(guān)系數(shù)據(jù)庫的。
ETL(Extract-Transform-Load)
ETL是一個(gè)過程,用于從源系統(tǒng)提取數(shù)據(jù),將其轉(zhuǎn)換為目標(biāo)系統(tǒng)所需的格式,然后將其加載到目標(biāo)系統(tǒng)庫。ETL是數(shù)據(jù)集成的一部分,用于將分散的、不一致的數(shù)據(jù)整合到一起,然后通過統(tǒng)一的接口將數(shù)據(jù)傳輸?shù)侥繕?biāo)系統(tǒng)庫進(jìn)行分析和應(yīng)用。
ETL是數(shù)據(jù)庫處理數(shù)據(jù)的重要環(huán)節(jié),當(dāng)在ETL過程中使用SQL時(shí),通常涉及如下圖操作。
三、ETL過程中的SQL示例(GaussDB)
本章節(jié)涉及到的SQL適用于GaussDB等數(shù)據(jù)庫。
1、提?。‥xtract)
在ETL過程中,抽取是將數(shù)據(jù)從源系統(tǒng)中獲取并傳輸?shù)侥繕?biāo)系統(tǒng)的第一步。這可能涉及到連接到數(shù)據(jù)庫、讀取文件、調(diào)用API等操作。在抽取數(shù)據(jù)時(shí),需要考慮以下幾個(gè)方面:
- 數(shù)據(jù)源的選擇:根據(jù)具體業(yè)務(wù)需求選擇數(shù)據(jù)源,并考慮數(shù)據(jù)量、數(shù)據(jù)質(zhì)量、數(shù)據(jù)類型等因素。
- 抽取方式的選擇:可以選擇增量、全量更新等不同的抽取方式。
- 數(shù)據(jù)抽取的調(diào)度:需要考慮時(shí)間、頻率、并發(fā)等因素,以確保數(shù)據(jù)的及時(shí)性和準(zhǔn)確性。
常用SQL語句示例:
1)全量(表)提取
SELECT * FROM source_table;
2)增量提?。ɡ?,根據(jù)日期字段,按天、月、年提取,或其他維度)
SELECT * FROM source_table WHERE t_date=’20230907’;
Tip:根據(jù)業(yè)務(wù)需求提取全字段或者指定字段。
2、轉(zhuǎn)換(Transform)
在ETL過程中,轉(zhuǎn)換是對(duì)抽取的數(shù)據(jù)進(jìn)行清洗、轉(zhuǎn)換、過濾和格式化等操作,以滿足目標(biāo)系統(tǒng)的需求。轉(zhuǎn)換的主要操作包括:
- 數(shù)據(jù)清洗:包括去重、填充缺失值、異常值處理等操作,以確保數(shù)據(jù)的質(zhì)量和準(zhǔn)確性。
- 數(shù)據(jù)轉(zhuǎn)換:包括數(shù)據(jù)類型轉(zhuǎn)換、字段計(jì)算、格式化等操作,以使數(shù)據(jù)符合目標(biāo)系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類型。
常用SQL語句示例:
1)數(shù)據(jù)行去重
--數(shù)據(jù)行去重(隨機(jī)保留或者優(yōu)先保留)
SELECT order_id, user, product, number
? FROM (
???? SELECT *?,ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY proctime ASC) as row_num
???? FROM Orders)
? WHERE row_num = 1;
-- 參數(shù)說明:
-- ROW_NUMBER(): 從第一行開始,依次為每一行分配一個(gè)唯一且連續(xù)的號(hào)碼。
-- PARTITION BY col1[, col2...]: 指定分區(qū)的列,例如去重的鍵。
-- ORDER BY time_attr [asc|desc]: 指定排序的列。升序( ASC )排列指只保留第一行,而降序排列( DESC )則指保留最后一行。
-- WHERE rownum = 1: 取ROW_NUMBER()生成的編號(hào)1。
可參考上一篇文章:
GaussDB數(shù)據(jù)庫SQL系列-數(shù)據(jù)去重_Gauss松鼠會(huì)的博客-CSDN博客
2)字段清洗(例如:去空格)
通過TRIM()、REPLACE()、CASE WHEN … THEN … END等關(guān)鍵字或函數(shù)進(jìn)行異常字符處理。
--清洗空格
SELECT length(' 去空格 ')
? ? ? ? ? ? ? ,length(TRIM(' 去空格 '))?? ? ??
? ? ? ? ? ? ? ,length(REPLACE(' 去空格 ',' ',''))?
? ? ? ? ? ? ? ,length(CASE WHEN ' 去空格 ' <>'去空格' THEN '去空格' END);
-- 說明:
-- Trim(),通過去空格函數(shù)進(jìn)行清洗
-- Replace(), 通過替換清洗
-- case when … then …end 與字典表比對(duì)進(jìn)行清洗,此處的與字典表比對(duì)省略,具體根據(jù)業(yè)務(wù)需求進(jìn)行。
3)非法日期清洗
創(chuàng)建日歷表calendar,存儲(chǔ)19000101到30001231的所有日期,通過比對(duì)判斷是否為合規(guī)的日期格式。
--與字典表比對(duì)
SELECT *,CASE WHEN create_date NOT IN (SELECT c_date FROM calendar) THEN? 0? ELSE 1 END status FROM T1
--剔除所有非法日期行
DELETE FROM T1 WHERE status =0;
Tip: 上文寫法適合GaussDB等關(guān)系型數(shù)據(jù)庫,且都是比較基礎(chǔ)的示意說明,具體需要根據(jù)業(yè)務(wù)需要進(jìn)行編寫。
3、加載(Load)
在ETL過程中,加載是將轉(zhuǎn)換后的數(shù)據(jù)加載到目標(biāo)系統(tǒng)中,通常是數(shù)據(jù)倉庫或數(shù)據(jù)集市。加載的主要操作包括:
- 數(shù)據(jù)映射。將轉(zhuǎn)換后的數(shù)據(jù)映射到目標(biāo)系統(tǒng)中,包括表、字段等。
- 數(shù)據(jù)加載。將轉(zhuǎn)換后的數(shù)據(jù)加載到目標(biāo)系統(tǒng)中,并進(jìn)行數(shù)據(jù)校驗(yàn)、數(shù)據(jù)整合等操作。
常用SQL語句示例:
1)增量表(累加,字段、表一 一映射)
INSERT INTO target_table (column1, column2, column3) SELECT column1, column2, column3 FROM source_table;
2)全量表(全刪全插,字段、表一 一映射)
--情況目標(biāo)表
TRUNCATE table target_table;
--全量插入
INSERT INTO target_table (column1,column2,…) SELECT column1,column2,… FROM source_table;
3)作業(yè)重跑,清空指定分區(qū)數(shù)據(jù),重新加載
--清理表分區(qū)的數(shù)據(jù)
--清空分區(qū)etl_date
ALTER TABLE orders TRUNCATE PARTITION etl_date;
--或者清空分區(qū)etl_date=20230911。
ALTER TABLE orders TRUNCATE PARTITION for (20230911);
--插入新數(shù)據(jù)
INSERT INTO target_table (column1,column2,…,etl_date) SELECT column1,column2,…,etl_date FROM source_table;
Tip:數(shù)據(jù)加載涉及到的算法及表設(shè)計(jì)非常復(fù)雜,例如,涉及歷史拉鏈表(關(guān)鏈、開鏈)、全量表(全刪全插)、增量表(累加)等。設(shè)計(jì)時(shí)需要從數(shù)倉/數(shù)據(jù)集市的全局架構(gòu)出發(fā),確保合理、準(zhǔn)確、高效等。
四、附DataArts Studio介紹
華為云GaussDB相關(guān)的生態(tài)工具DataArts Studio數(shù)據(jù)治理中心是一個(gè)強(qiáng)大的ETL工具和技術(shù),它可以幫助開發(fā)人員設(shè)計(jì)、編寫和管理ETL腳本。以下是DataArts Studio在這些方面的主要功能和優(yōu)勢(shì):
- 可視化的ETL設(shè)計(jì):DataArts Studio提供了一個(gè)直觀的可視化界面,使開發(fā)人員能夠以圖形化方式設(shè)計(jì)和配置ETL流程。通過拖放組件和連接線,開發(fā)人員可以輕松定義數(shù)據(jù)提取、轉(zhuǎn)換和加載的步驟,而無需編寫復(fù)雜的代碼。
- 內(nèi)置的數(shù)據(jù)轉(zhuǎn)換和處理功能:DataArts Studio提供了豐富的內(nèi)置轉(zhuǎn)換和處理組件,如數(shù)據(jù)清洗、數(shù)據(jù)格式轉(zhuǎn)換、數(shù)據(jù)合并、數(shù)據(jù)計(jì)算等。開發(fā)人員可以直接使用這些組件,而無需自行編寫轉(zhuǎn)換邏輯,從而加快開發(fā)速度并減少錯(cuò)誤。
- 強(qiáng)大的數(shù)據(jù)連接和集成能力:DataArts Studio支持與各種數(shù)據(jù)源的連接和集成,包括關(guān)系型數(shù)據(jù)庫、文件系統(tǒng)、云存儲(chǔ)、API接口等。開發(fā)人員可以輕松地配置數(shù)據(jù)源連接,并直接從這些數(shù)據(jù)源中提取數(shù)據(jù)。
- 可擴(kuò)展的腳本編寫和管理:雖然DataArts Studio提供了可視化的ETL設(shè)計(jì)界面,但它也支持自定義腳本編寫。開發(fā)人員可以使用內(nèi)置的腳本編輯器編寫自定義的ETL腳本,以滿足特定的需求。此外,DataArts Studio還提供了ETL腳本的版本控制和管理功能,方便團(tuán)隊(duì)協(xié)作和腳本的維護(hù)。
- 實(shí)時(shí)監(jiān)控和調(diào)試:DataArts Studio提供了實(shí)時(shí)監(jiān)控和調(diào)試功能,開發(fā)人員可以實(shí)時(shí)查看ETL流程的執(zhí)行狀態(tài)、數(shù)據(jù)處理的結(jié)果和錯(cuò)誤信息。這有助于快速發(fā)現(xiàn)和解決問題,提高ETL腳本的質(zhì)量和可靠性。
五、小結(jié)
SQL與ETL的關(guān)系在于,SQL語言通常用于ETL過程中的數(shù)據(jù)提取和轉(zhuǎn)換階段。通過使用SQL查詢語句,可以從源數(shù)據(jù)庫中提取所需的數(shù)據(jù),然后使用SQL語句對(duì)數(shù)據(jù)進(jìn)行必要的轉(zhuǎn)換和處理,以便將其加載到目標(biāo)系統(tǒng)。 ??
當(dāng)然了,現(xiàn)在好多企業(yè)都有專門的ETL工具,但其實(shí)后臺(tái)都是通過類似“PYTHON + SQL”、“PERL + SQL”等方式實(shí)現(xiàn)的,其重點(diǎn)在于ETL過程中的SQL處理。 同樣,在GaussDB數(shù)據(jù)庫生態(tài)中也是不可或缺的,掌握GaussDB數(shù)據(jù)庫相關(guān)的SQL寫法必不可少。文章來源:http://www.zghlxwxcb.cn/news/detail-712552.html
——結(jié)束文章來源地址http://www.zghlxwxcb.cn/news/detail-712552.html
到了這里,關(guān)于GaussDB數(shù)據(jù)庫SQL系列-SQL與ETL淺談的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!