【ETL】系列五:核心轉換場景-字段合并與字段拆分

上一篇主要講到了單表間直接轉換的場景,本文我們介紹第二種核心轉換場景:字段合并與字段拆分。

字段合并是指將不同字段的值,進行合并,形成新的合并列,比如字段A+字段B=字段AB。

字段拆分是指將一個字段中的值,進行拆分,形成新的拆分列,比如字段AB=字段A+字段B。

首先,我們介紹字段合并。

(一)字段合并

應用場景:對于部分來源表的轉換需求而言,希望將來源表的字段值進行合并,再將合并后的值映射到目標表的某個字段,比如常見的來源表字段中姓和名合并為姓名,如姓【張】名【三】,映射到目標表之后為【張三】,接下來將以金融數(shù)據(jù)中的證券名稱(萬科A)和證券代碼(000002)合并為【萬科A0000002】為例進行實操。

業(yè)務目標:將來源庫A中的表A【sec_basic_info1(證券基本信息表)】的數(shù)據(jù)推送到目標數(shù)據(jù)庫B中的表B【sec_basic_info2(證券基本信息表)】,并將來源表A的sec_name(證券名稱)和sec_code(證券代碼)字段合并映射到目標表B的remark(備注)字段中。

業(yè)務流程分析:

抽取數(shù)據(jù):抽取來源庫A的數(shù)據(jù)表A【sec_basic_info1(證券基本信息表)】的數(shù)據(jù),可以定義抽取數(shù)據(jù)范圍;

轉換數(shù)據(jù):來源表A的sec_name(證券名稱)和sec_code(證券代碼)字段合并映射到目標表B的remark(備注),其他字段直接映射;

加載數(shù)據(jù):數(shù)據(jù)加載到目標庫B的數(shù)據(jù)表B【 sec_basic_info2(證券基本信息表)】中,目標表已有數(shù)據(jù),進行更新;否則,新增數(shù)據(jù)。

操作步驟:

1、啟動Spoon,進入主界面。點擊左上角的文件 新建 轉換,?新建一個轉換;或者在歡迎頁tab,主對象樹窗口雙擊轉換快速新建。

新建轉換入口1


新建轉換入口2

2、點擊左側的核心對象,選擇表輸入并把它拖到右側的編輯區(qū)中進行配置。

由于抽取的數(shù)據(jù)來源某個數(shù)據(jù)庫的數(shù)據(jù)表,因此拖選【表輸入】插件,為了方便業(yè)務理解,可以將插件重命名。

數(shù)據(jù)抽取【表輸入】插件拖選

表輸入插件是為了查詢來源數(shù)據(jù),也就是抽取的數(shù)據(jù),因此需要將來源庫表信息進行填寫或選擇后,進行抽取SQL的定義。

關于數(shù)據(jù)庫連接的方式,此處不做贅述,可參考kettle數(shù)據(jù)庫連接。

數(shù)據(jù)抽取【表輸入】插件配置

表輸入配置完成后,保存轉換文件,可點擊【運行這個轉換】按鈕進行本地運行。

數(shù)據(jù)抽取【表輸入】插件運行

3、點擊左側的?核心對象?,選擇?javaScript腳本?并把它拖到右側的編輯區(qū)中,按住?shift?畫線連接 “表輸入(查詢來源數(shù)據(jù))”。

javaScript代碼腳本提供了很多轉換函數(shù),在進行字段的轉化過程中比較方便。

數(shù)據(jù)轉化【javaScipt代碼】插件拖選

雙擊編輯區(qū)的“javascript腳本”,編輯腳本信息,主要信息如下:

(1)變量信息輸入: 由于“sec_name ” 和 “sec_code” 合并,因此我們只需要在 “java script:”下的輸入框中輸入聲明變量;

var allsecname =sec_name + sec_code

(2)手動獲取變量:點擊【獲取變量】自動將我們定義的變量輸出到字段欄中,我們也可以修改字段名稱。

數(shù)據(jù)轉化【javaScipt代碼】插件配置??

【javaScipt代碼】配置完成后,保存轉換文件,可點擊【運行這個轉換】按鈕進行本地運行。

數(shù)據(jù)轉化【javaScipt代碼】插件運行

4、點擊左側的核心對象,選擇插入/更新并把它拖到右側的編輯區(qū)中,按住shift鍵連接 “javaScipt代碼(證券名組合)”。

表輸出插件是為了將抽取數(shù)據(jù)輸出到目標表,因此主要做三件事:

(1)目標數(shù)據(jù)庫表信息進行填寫或選擇;

(2)進行目標表字段唯一索引字段的配置,根據(jù)唯一索引,查看數(shù)據(jù)是否存在,當數(shù)據(jù)存在,更新數(shù)據(jù);若不存在,則插入數(shù)據(jù);

(3)目標表字段與來源表字段的映射關系配置,需要將上一步驟定義的變量字段與目標表字段進行正確的映射。


數(shù)據(jù)加載【插入/更新】插件配置

如截圖中的配置,選擇完目標數(shù)據(jù)庫和目標數(shù)據(jù)表之后,用來查詢的關鍵字,選擇sec_uni_code,表示這里按照sec_uni_code查詢,如果此sec_uni_code存在,則更新數(shù)據(jù),若不存在則插入數(shù)據(jù);獲取目標表字段和來源表的流字段映射關系,javascript中定義的變量字段需要與目標表字段進行正確映射,然后點擊保存即可。

插入/更新配置完成后,保存轉換文件,可點擊【運行這個轉換】按鈕進行本地運行。

數(shù)據(jù)加載【插入/更新】插件運行

5、轉換成功后,也可以檢查本地數(shù)據(jù)庫,查看數(shù)據(jù)是否推送成功,是否正確將字段進行合并。

來源表抽取數(shù)據(jù)截圖


推送目標表后的數(shù)據(jù)截圖

到這里,字段合并轉換流程就配置成功了,后續(xù)打開.ktr后綴的文件即可,除了這種字段合并轉化方式,我們可以使用SQL語句中 CONCAT函數(shù)更方便地進行字段合并后推送。

SQL CONCAT函數(shù)用于將兩個字符串連接起來,形成一個單一的字符串。接下來,我們做下簡單介紹。

1、選擇表輸入并把它拖到右側的編輯區(qū)中進行配置,主要是進行自定義SQL語句。

SQL語句中,需要注意的2點:

(1)需要正確使用CONCAT函數(shù),??CONCAT(field1,field12) AS field ;

(2)SQL語句的格式,AS 后是來源表抽取后的流字段。

來源表抽取SQL輸入

如上截圖,需要將sec_name和sec_code進行合并,輸入CONCAT(sec_name,sec_code )AS remark語句即可。

2、選擇插入/更新并把它拖到右側的編輯區(qū)中進行相關配置。

數(shù)據(jù)加載【插入/更新】插件配置

如截圖中的配置,由于目標表字段和來源表定義的AS后的流字段一致,直接映射即可,會減少一些字段映射的時間。

3、查看轉換結果。

數(shù)據(jù)加載【插入/更新】插件運行

運行該轉換配置,可以正常運行,并將來源表的字段進行正確合并并同步到目標數(shù)據(jù)表。

以上是字段合并的2中轉換配置方式,可以根據(jù)業(yè)務需求和使用習慣進行配置和執(zhí)行。與字段合并相對的,就字段拆分了。

(二)字段拆分

字段拆分是指一個字段中的值,進行拆分,形成新的拆分列,即字段AB=字段A+字段B。

應用場景:對于部分來源表的轉換需求而言,希望將來源表的字段值進行進行拆分,再將拆分后的值映射到目標表的1個或幾個字段,比如常見的來源表的字段中地址進行拆分,如【湖北省武漢市東湖新技術開發(fā)區(qū)】,映射到目標表需要拆分為【湖北省】、【武漢市】、【東湖新技術開發(fā)區(qū)】,接下來將以金融數(shù)據(jù)中的曾用名(深萬科A->萬科A->G萬科A)拆分為字段(深萬科A)為例進行實操。

業(yè)務目標:將來源庫A中的表A【sec_basic_info1(證券基本信息表)】的數(shù)據(jù)推送到目標數(shù)據(jù)庫B中的表B【sec_basic_info2(證券基本信息表)】,并將來源表A的used_name(曾用名)第一個值進行字段拆分到目標表remark(備注)字段中。

業(yè)務流程分析:

抽取數(shù)據(jù):抽取來源庫A的數(shù)據(jù)表A【sec_basic_info1(證券基本信息表)】的數(shù)據(jù),可以定義抽取數(shù)據(jù)范圍;

轉換數(shù)據(jù):來源表A的used_name(曾用名)第一個值進行字段拆分并映射到目標表B的remark(備注),其他字段直接映射;

加載數(shù)據(jù):數(shù)據(jù)加載到目標庫B的數(shù)據(jù)表B【 sec_basic_info2(證券基本信息表)】中,目標表已有數(shù)據(jù),進行更新;否則,新增數(shù)據(jù)。

與字段合并相似,我們可以使用kettle中的插件來實現(xiàn)字段拆分,也可以使用SQL語句中的函數(shù)進行字段拆分,這里我們將分別介紹這2種字段拆分的實現(xiàn)方式。

【方式一】-使用字段拆分插件進行拆分

操作步驟:

1、選擇表輸入并把它拖到右側的編輯區(qū)中進行配置,主要是進行自定義SQL語句。

來源表抽取SQL輸入

如截圖所示,將來源庫表信息進行填寫或選擇后,進行抽取SQL的定義,此處限制抽取數(shù)據(jù)的范圍,只處理萬科A的數(shù)據(jù)。

2、選擇拆分字段并把它拖到右側的編輯區(qū)中進行拆分字段配置。

拆分字段配置

字段拆分插件有三個要點:

(1)選擇需要進行拆分的字段,當前的例子是選擇來源表的used_name字段;

(2)拆分的字段需要有分隔符標記,可以輸入分割符,也可以定義變量,當前的例子是輸入->;

(3)拆分后形成的新字段,定義新的字段名和相關字段屬性,支持拆分為1個或多個字段,當前的例子我們拆分了三個新字段;

3、選擇插入/更新并把它拖到右側的編輯區(qū)中進行相關配置。

數(shù)據(jù)加載【插入/更新】插件配置

如截圖所示,將拆分字段形成的新字段usename1與目標表字段remark進行映射,其他字段直接映射即可。

插入/更新配置完成后,保存轉換文件,可點擊【運行這個轉換】按鈕進行本地運

數(shù)據(jù)加載【插入/更新】插件運行

4、轉換成功后,也可以檢查本地數(shù)據(jù)庫,查看數(shù)據(jù)是否推送成功,是否將字段進行正確拆分。

來源表A抽取數(shù)據(jù)
字段拆分后同步到目標表B的數(shù)據(jù)

到這里,利用字段拆分插件進行字段拆分的轉換就介紹完了,除了上述這種字段轉化方式,我們可以使用SQL語句中 SUBSTRING函數(shù)更方便地進行字段拆分后推送。

【方式二】-使用SUBSTRING 函數(shù)進行字段拆分

SQL SUBSTRING 函數(shù)是用來截取字符串中的一部分字符的。針對以上字段拆分場景,接下來我們進行相關介紹。

1、選擇表輸入并把它拖到右側的編輯區(qū)中進行配置,主要是進行自定義SQL語句。

SQL語句中,需要注意的2點:

(1)需要正確使用SUBSTRING函數(shù),SUBSTRING_INDEX(used_name, '->', 1) AS used_name,代表截取來源表中used_name字段第1個 '->' 之前的所有字符;

(2)SQL語句的格式,AS 后是來源表抽取后的流字段。

來源表抽取SQL

更多字符串截取函數(shù)的用法可參考:SQL中字符串截取函數(shù)(SUBSTRING)

2、選擇插入/更新并把它拖到右側的編輯區(qū)中進行相關配置。

數(shù)據(jù)加載【插入/更新】插件配置

3、查看轉換結果。

數(shù)據(jù)加載【插入/更新】轉換結果

運行該轉換配置,可以正常運行,并將來源表的字段進行正確拆分并同步到目標數(shù)據(jù)表。

在kettle的轉換插件中,會發(fā)現(xiàn)與字段拆分相關的另外一個插件為【列拆分為多行】,這個插件的作用是拆分列里面的字段,且拆分后為多行數(shù)據(jù),具體的操作方式可參考?kettle拆分列里面的字段。此處,不做贅述。

以上是字段合并和字段拆分2類轉換場景的操作方式,在這一過程中,對產(chǎn)品經(jīng)理而言,有哪些思考或啟發(fā)?

在ETL1.0階段,對于字段合并和字段拆分的業(yè)務需求,并沒有很好地被滿足;到了ETL2.0階段,基于Kettle的ETL二次開發(fā),多樣性的轉換需求實現(xiàn)起來顯得如此輕松,有時候在想,如果當初豐富多樣的轉換場景可以準確地被抽象出來、可以給業(yè)務方提供友好的產(chǎn)品功能、技術上可以快速迭代上線,那么現(xiàn)在的ETL是什么樣子?當然,在這里也不是否定站在kettle肩膀上二次開發(fā)的正確性,而是自責作為工具類產(chǎn)品經(jīng)理,已開發(fā)工具沒有很好用的反思。

坦白說,kettle工具也存在一些使用問題,比如說,配置項繁雜、操作沒有很友好、上手的成本高。

產(chǎn)品的易用性和功能的復雜性如何達到平衡?這個問題也一直是ETL產(chǎn)品改進的方向。

如何使用最簡單的方式去達到目標?如何讓業(yè)務方提高使用效率?如何don’t make me think (too much)?

其實,我也已經(jīng)有了答案。歡迎各位進一步交流哦!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 在現(xiàn)實生活中,常發(fā)現(xiàn)這樣的情況:一套剛建成交付使用的住宅,經(jīng)用戶二次裝修以后,原有的電氣設施基本上都被棄用,造成人...
    工程寶閱讀 487評論 0 2
  • 望人言,忘人言,招搖山上故人言 常思量,嘗思量,西海濱邊笑思量
    上江愚夫閱讀 85評論 0 0
  • 之前寫了第一篇和第二篇,接著寫第三篇。 再講一個人,一個故事。 他叫王景軍,獨立家具品牌驢木匠的創(chuàng)辦人。認識他是2...
    祥哥812閱讀 1,103評論 3 50
  • 兩年的時光過去的真快,嗖的一下我就完成了學業(yè),拿到了畢業(yè)證書。 面對著鋪天蓋地的祝福,我好像終于明白了在一個語言文...
    AxiomAcademy閱讀 1,211評論 0 1
  • 一年中,我對于季節(jié),或者是身邊的自然風光,最盼望的:一是七月的巧云,二是中秋的桂花。但是,隨著年歲漸增,我發(fā)現(xiàn),...
    小滿吶閱讀 290評論 0 0

友情鏈接更多精彩內容