上一篇主要講到了單表間直接轉換的場景,本文我們介紹第二種核心轉換場景:字段合并與字段拆分。
字段合并是指將不同字段的值,進行合并,形成新的合并列,比如字段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,主對象樹窗口雙擊轉換快速新建。


2、點擊左側的核心對象,選擇表輸入并把它拖到右側的編輯區(qū)中進行配置。
由于抽取的數(shù)據(jù)來源某個數(shù)據(jù)庫的數(shù)據(jù)表,因此拖選【表輸入】插件,為了方便業(yè)務理解,可以將插件重命名。

表輸入插件是為了查詢來源數(shù)據(jù),也就是抽取的數(shù)據(jù),因此需要將來源庫表信息進行填寫或選擇后,進行抽取SQL的定義。
關于數(shù)據(jù)庫連接的方式,此處不做贅述,可參考kettle數(shù)據(jù)庫連接。

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

3、點擊左側的?核心對象?,選擇?javaScript腳本?并把它拖到右側的編輯區(qū)中,按住?shift?畫線連接 “表輸入(查詢來源數(shù)據(jù))”。
javaScript代碼腳本提供了很多轉換函數(shù),在進行字段的轉化過程中比較方便。

雙擊編輯區(qū)的“javascript腳本”,編輯腳本信息,主要信息如下:
(1)變量信息輸入: 由于“sec_name ” 和 “sec_code” 合并,因此我們只需要在 “java script:”下的輸入框中輸入聲明變量;
var allsecname =sec_name + sec_code
(2)手動獲取變量:點擊【獲取變量】自動將我們定義的變量輸出到字段欄中,我們也可以修改字段名稱。

【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ù)表之后,用來查詢的關鍵字,選擇sec_uni_code,表示這里按照sec_uni_code查詢,如果此sec_uni_code存在,則更新數(shù)據(jù),若不存在則插入數(shù)據(jù);獲取目標表字段和來源表的流字段映射關系,javascript中定義的變量字段需要與目標表字段進行正確映射,然后點擊保存即可。
插入/更新配置完成后,保存轉換文件,可點擊【運行這個轉換】按鈕進行本地運行。

5、轉換成功后,也可以檢查本地數(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 后是來源表抽取后的流字段。

如上截圖,需要將sec_name和sec_code進行合并,輸入CONCAT(sec_name,sec_code )AS remark語句即可。
2、選擇插入/更新并把它拖到右側的編輯區(qū)中進行相關配置。

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

運行該轉換配置,可以正常運行,并將來源表的字段進行正確合并并同步到目標數(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的定義,此處限制抽取數(shù)據(jù)的范圍,只處理萬科A的數(shù)據(jù)。
2、選擇拆分字段并把它拖到右側的編輯區(qū)中進行拆分字段配置。

字段拆分插件有三個要點:
(1)選擇需要進行拆分的字段,當前的例子是選擇來源表的used_name字段;
(2)拆分的字段需要有分隔符標記,可以輸入分割符,也可以定義變量,當前的例子是輸入->;
(3)拆分后形成的新字段,定義新的字段名和相關字段屬性,支持拆分為1個或多個字段,當前的例子我們拆分了三個新字段;
3、選擇插入/更新并把它拖到右側的編輯區(qū)中進行相關配置。

如截圖所示,將拆分字段形成的新字段usename1與目標表字段remark進行映射,其他字段直接映射即可。
插入/更新配置完成后,保存轉換文件,可點擊【運行這個轉換】按鈕進行本地運

4、轉換成功后,也可以檢查本地數(shù)據(jù)庫,查看數(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 后是來源表抽取后的流字段。

更多字符串截取函數(shù)的用法可參考:SQL中字符串截取函數(shù)(SUBSTRING)
2、選擇插入/更新并把它拖到右側的編輯區(qū)中進行相關配置。

3、查看轉換結果。

運行該轉換配置,可以正常運行,并將來源表的字段進行正確拆分并同步到目標數(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)有了答案。歡迎各位進一步交流哦!