【ETL】系列六:核心轉(zhuǎn)換場景-行轉(zhuǎn)列與列轉(zhuǎn)行

前面我們介紹了2大類核心轉(zhuǎn)換場景。

【ETL】系列四:核心轉(zhuǎn)換場景—單表間直轉(zhuǎn)

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

接下來我們介紹第三類核心轉(zhuǎn)換場景——行轉(zhuǎn)列與列轉(zhuǎn)行。

簡單來說,行轉(zhuǎn)列是指橫表轉(zhuǎn)豎表,列轉(zhuǎn)行是指豎表轉(zhuǎn)橫表。

橫表的特點是一個ID對應(yīng)所有的值信息,以行Key-Value1-Value2-Value3的方式存儲;

豎表的特點是每行僅存儲該ID的某一個類別字段的值,以行Key-Value的方式存儲。

我們這里看下網(wǎng)上常見的行轉(zhuǎn)列(橫表轉(zhuǎn)豎表)與列轉(zhuǎn)行(豎表轉(zhuǎn)橫表)例子以方便理解。

橫表示例
豎表示例

關(guān)于橫表和豎表的介紹可參考:數(shù)據(jù)庫設(shè)計---關(guān)于建表的時候選擇橫表和豎表(縱表)的一點思考

在本文的樣例中,依然以金融數(shù)據(jù)的行轉(zhuǎn)列(橫表轉(zhuǎn)豎表)與列轉(zhuǎn)行(豎表轉(zhuǎn)橫表)例子來進行實操。

利潤表-橫表示例
利潤表-豎表示例

在以往的數(shù)據(jù)業(yè)務(wù)中,由于各種原因,數(shù)據(jù)倉庫中存儲的來源表是橫表或縱表,在產(chǎn)品端的用到的是縱表或橫表,那就需要在數(shù)據(jù)處理環(huán)節(jié),用到行轉(zhuǎn)列或列轉(zhuǎn)行這樣的功能進行數(shù)據(jù)的同步。

首先,我們介紹行轉(zhuǎn)列。

(一)行轉(zhuǎn)列

應(yīng)用場景:不同的業(yè)務(wù)數(shù)據(jù)表,數(shù)據(jù)存儲的方式不同,在不同使用場景下,涉及到不同的數(shù)據(jù)處理方式,希望將橫表的字段及數(shù)據(jù)作為值抽取出來并同步到豎表的記錄行中,比如常見的姓名、科目、分數(shù),一個姓名下所有科目的分數(shù)一行存儲,映射到目標表之后一個姓名下一個科目的分數(shù)一行存儲。接下來將以金融數(shù)據(jù)中利潤表的財務(wù)科目存儲中,來源表是橫表的數(shù)據(jù)同步到目標表是豎表的數(shù)據(jù)為例進行實操。

業(yè)務(wù)目標:將來源庫A中的表A【com_income1(利潤表橫表)】的數(shù)據(jù)推送到目標數(shù)據(jù)庫B中的表B【com_income2(利潤表豎表)】,并將來源表-利潤表橫表如overall_income、main_income、overall_cost等利潤表科目字段及值映射到目標表-利潤表豎表對應(yīng)的stand_pro_name(標準科目名稱)字段值中。

業(yè)務(wù)流程分析:

抽取數(shù)據(jù):抽取來源庫A的數(shù)據(jù)表A【com_income1(利潤表橫表)】的數(shù)據(jù),可以定義抽取數(shù)據(jù)范圍;

轉(zhuǎn)換數(shù)據(jù):將來源表-利潤表橫表如overall_income、main_income、overall_cost等字段轉(zhuǎn)為目標表-利潤表豎表stand_pro_name(標準科目名稱)的值,將來源表-利潤表橫表如overall_income、main_income、overall_cost等字段的數(shù)據(jù)轉(zhuǎn)為了目標表-利潤表豎表cur_amount(本期金額)的值,其他字段直接映射;

加載數(shù)據(jù):數(shù)據(jù)加載到目標庫B的數(shù)據(jù)表B【 com_income2(利潤表豎表)】中,目標表已有數(shù)據(jù),進行更新;否則,新增數(shù)據(jù)。

操作步驟:

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

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

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

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

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

2、選擇行轉(zhuǎn)列并把它拖到右側(cè)的編輯區(qū)中進行列轉(zhuǎn)行配置。

在這里,需要理解key字段、字段名稱、key值、value字段的含義。

1.Key字段:行轉(zhuǎn)列之后,overall_income、main_income、overall_cost等字段會變成一個新的字段的值,Key字段就是這個新字段的名稱,該樣例中關(guān)鍵字段為stand_pro_name;

2.字段名稱:填寫橫表需要行轉(zhuǎn)列的字段,在這寫的字段會從原來的字段名轉(zhuǎn)變?yōu)橐涣袛?shù)據(jù),這列數(shù)據(jù)的列名為上面設(shè)置的Key字段名,該樣例中的字段名稱為overall_income、main_income、overall_cost等財務(wù)科目名稱;

3.Key值:轉(zhuǎn)為列之后key字段的值,該樣例中的key值為營業(yè)總收入、營業(yè)收入、營業(yè)總成本等;

4.Value字段:行轉(zhuǎn)列的那些字段是有數(shù)據(jù)的,這些數(shù)據(jù)轉(zhuǎn)換為豎表的值,需要給這些數(shù)據(jù)起個名字,名字需要都一致,該樣例中的value字段為cur_amount。

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

數(shù)據(jù)轉(zhuǎn)換【行轉(zhuǎn)列】插件配置

如截圖中的配置,選擇完目標數(shù)據(jù)庫和目標數(shù)據(jù)表之后,用來查詢的關(guān)鍵字,選擇id,表示這里按照id查詢,如果此id存在,則更新數(shù)據(jù),若不存在則插入數(shù)據(jù);獲取目標表字段和來源表的流字段映射關(guān)系,排除在上一步【行轉(zhuǎn)列】配置的字段名稱。

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

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

4、轉(zhuǎn)換成功后,也可以檢查本地數(shù)據(jù)庫,查看數(shù)據(jù)是否推送成功,是否進行了行轉(zhuǎn)列。

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


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

到這里,行轉(zhuǎn)列的轉(zhuǎn)換流程就配置成功了,后續(xù)打開.ktr后綴的文件即可。與行轉(zhuǎn)列相對的,就是列轉(zhuǎn)行了。

(二)列轉(zhuǎn)行

應(yīng)用場景:不同的業(yè)務(wù)數(shù)據(jù)表,數(shù)據(jù)存儲的方式不同,希望將豎表的數(shù)據(jù)抽取作為新的字段同步到目標表中,比如常見的姓名、科目、分數(shù),一個姓名下一個科目的分數(shù)一行存儲,映射到目標表之后一個姓名下所有科目的分數(shù)一行存儲。接下來將以金融數(shù)據(jù)中利潤表的財務(wù)科目存儲中,來源表是豎表的數(shù)據(jù)同步到目標表是橫表的數(shù)據(jù)為例進行實操。

業(yè)務(wù)目標:將來源庫A中的表A【com_income1(利潤表豎表)】的數(shù)據(jù)推送到目標數(shù)據(jù)庫B中的表B【com_income2(利潤表橫表)】,并將來源表A的stand_pro_name(標準科目名稱)的值映射到目標表B對應(yīng)科目的字段值中。

業(yè)務(wù)流程分析:

抽取數(shù)據(jù):抽取來源庫A的數(shù)據(jù)表A【com_income1(利潤表豎表)】的數(shù)據(jù),可以定義抽取數(shù)據(jù)范圍;

轉(zhuǎn)換數(shù)據(jù):將來源表A的stand_pro_name(標準科目名稱)的值映射到目標表B對應(yīng)科目的字段值中,目標表B的com_uni_code(公司統(tǒng)一編碼)、decl_date(公告日期)、statement_name(報表類型名稱)為一組,其他字段直接映射;

加載數(shù)據(jù):數(shù)據(jù)加載到目標庫B的數(shù)據(jù)表B【 com_income2(利潤表橫表)】中,目標表已有數(shù)據(jù),進行更新;否則,新增數(shù)據(jù)。

操作步驟:

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

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

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

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

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

2、選擇列轉(zhuǎn)行并把它拖到右側(cè)的編輯區(qū)中進行列轉(zhuǎn)行配置。

數(shù)據(jù)轉(zhuǎn)換【列轉(zhuǎn)行】插件配置

在這里,需要理解關(guān)鍵字段、分組字段、目標字段、數(shù)據(jù)字段、關(guān)鍵字值、類型/長度/精度的含義。

1.關(guān)鍵字段:列轉(zhuǎn)行的核心字段,此字段會進行聚合操作,聚合結(jié)果作為之后橫表的新字段名,該樣例中關(guān)鍵字段是stand_pro_name(標準科目名稱),即以這個標準科目名稱的值作為橫表的新字段名,如轉(zhuǎn)換為【營業(yè)總收入】、【營業(yè)收入】、【營業(yè)總成本】等字段。

2.分組字段:關(guān)鍵字段的數(shù)據(jù)(營業(yè)總收入,營業(yè)收入, 營業(yè)總成本等)有重復(fù),利潤表的數(shù)據(jù)來源于公司發(fā)布的財報數(shù)據(jù),每個公司每個報告期會發(fā)布合并利潤表和母公司利潤表,即每一個唯一標識的公司com_uni_code(公司統(tǒng)一編碼)在decl_date(公告日期)發(fā)布合并或母公司利潤表statement_name(報表類型名稱)就會增加一條記錄,其關(guān)鍵字段的數(shù)據(jù)就會重復(fù)一次,其中決定重復(fù)的字段就是com_uni_code、decl_date、statement_name,這三個字段就是分組字段。

3.目標字段:關(guān)鍵字段的數(shù)據(jù)去重后(營業(yè)總收入,營業(yè)收入,?營業(yè)總成本等)變成的字段名,這個目標字段也就是轉(zhuǎn)換后目標表的物理名,比如overall_income、main_income、overall_cost等。

4.數(shù)據(jù)字段:在豎表中,有一個與關(guān)鍵字段一一對應(yīng)的數(shù)據(jù)字段,它的字段名填在這,該樣例中為cur_amount(本期金額);

5.關(guān)鍵字值:關(guān)鍵字值是關(guān)鍵字段的數(shù)據(jù),關(guān)鍵字段的數(shù)據(jù)去重后(營業(yè)總收入,營業(yè)收入,?營業(yè)總成本等)有多少列,關(guān)鍵字值就有多少個;

6.類型/長度/精度:定義關(guān)鍵字值的數(shù)據(jù)類型、長度和精度,該樣例中利潤表科目中的數(shù)值是分別為number、18、4。

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

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

如截圖中的配置,選擇完目標數(shù)據(jù)庫和目標數(shù)據(jù)表之后,用來查詢的關(guān)鍵字,選擇id,表示這里按照id查詢,如果此id存在,則更新數(shù)據(jù),若不存在則插入數(shù)據(jù);獲取目標表字段和來源表的流字段映射關(guān)系,排除在上一步【列轉(zhuǎn)行】配置的目標字段。

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

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

4、轉(zhuǎn)換成功后,也可以檢查本地數(shù)據(jù)庫,查看數(shù)據(jù)是否推送成功,是否進行列轉(zhuǎn)行。

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

到這里,列轉(zhuǎn)行的轉(zhuǎn)換流程就配置成功了,后續(xù)打開.ktr后綴的文件即可。

除了用kettle的轉(zhuǎn)換插件,行轉(zhuǎn)列與列轉(zhuǎn)行同樣可以使用SQL語句來實現(xiàn),與上一篇【ETL】系列五:核心轉(zhuǎn)換場景-字段合并與字段拆分的流程類似,在表輸入的SQL抽取語句中進行抽取SQL的定義,以進行橫表和豎表的互轉(zhuǎn)。詳情可以參考這篇文章:縱表和橫表的概念及其相互轉(zhuǎn)換

以上是行轉(zhuǎn)列和列轉(zhuǎn)行2類轉(zhuǎn)換場景的操作方式。

最后,那么問題來了,對于B端工具類產(chǎn)品經(jīng)理來說,有什么啟發(fā)?

B端產(chǎn)品是為了解決業(yè)務(wù)問題而設(shè)計的,重點是滿足業(yè)務(wù)需求。

作為B端產(chǎn)品經(jīng)理,一定要非常懂業(yè)務(wù)。只有足夠的了解業(yè)務(wù)邏輯,才能把B端產(chǎn)品相應(yīng)的功能做好,并推動整個B端生態(tài)體系搭建。

行轉(zhuǎn)列和列轉(zhuǎn)行的轉(zhuǎn)換場景,是數(shù)據(jù)業(yè)務(wù)的常見應(yīng)用場景,只有深入了解數(shù)據(jù)業(yè)務(wù)方的數(shù)據(jù)加工處理邏輯,才能抽象出功能點,在kettle這款成熟的產(chǎn)品中體現(xiàn)出來的是【行轉(zhuǎn)列】、【列轉(zhuǎn)行】的插件功能設(shè)計,那如果是自研的ETL工具呢,作為產(chǎn)品經(jīng)理,你又會怎么設(shè)計呢?

誠然,kettle的【行轉(zhuǎn)列】、【列轉(zhuǎn)行】功能已相當完善,但也存在應(yīng)用場景引導(dǎo)不明顯、批量操作不方便等問題,這些易用性問題也比較影響工具的使用效率。

針對工具類產(chǎn)品的設(shè)計原則和方法,我會在后續(xù)的文章中做詳細的總結(jié)和分享。歡迎大家關(guān)注哦!

本文其他參考文章:kettle 行轉(zhuǎn)列 與 列轉(zhuǎn)行

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容