【ETL】系列六:核心转换场景-行转列与列转行

前面我们介绍了2大类核心转换场景。

【ETL】系列四:核心转换场景—单表间直转

【ETL】系列五:核心转换场景-字段合并与字段拆分

接下来我们介绍第三类核心转换场景——行转列与列转行。

简单来说,行转列是指横表转竖表,列转行是指竖表转横表。

横表的特点是一个ID对应所有的值信息,以行Key-Value1-Value2-Value3的方式存储;

竖表的特点是每行仅存储该ID的某一个类别字段的值,以行Key-Value的方式存储。

我们这里看下网上常见的行转列(横表转竖表)与列转行(竖表转横表)例子以方便理解。

横表示例
竖表示例

关于横表和竖表的介绍可参考:数据库设计---关于建表的时候选择横表和竖表(纵表)的一点思考

在本文的样例中,依然以金融数据的行转列(横表转竖表)与列转行(竖表转横表)例子来进行实操。

利润表-横表示例
利润表-竖表示例

在以往的数据业务中,由于各种原因,数据仓库中存储的来源表是横表或纵表,在产品端的用到的是纵表或横表,那就需要在数据处理环节,用到行转列或列转行这样的功能进行数据的同步。

首先,我们介绍行转列。

(一)行转列

应用场景:不同的业务数据表,数据存储的方式不同,在不同使用场景下,涉及到不同的数据处理方式,希望将横表的字段及数据作为值抽取出来并同步到竖表的记录行中,比如常见的姓名、科目、分数,一个姓名下所有科目的分数一行存储,映射到目标表之后一个姓名下一个科目的分数一行存储。接下来将以金融数据中利润表的财务科目存储中,来源表是横表的数据同步到目标表是竖表的数据为例进行实操。

业务目标:将来源库A中的表A【com_income1(利润表横表)】的数据推送到目标数据库B中的表B【com_income2(利润表竖表)】,并将来源表-利润表横表如overall_income、main_income、overall_cost等利润表科目字段及值映射到目标表-利润表竖表对应的stand_pro_name(标准科目名称)字段值中。

业务流程分析:

抽取数据:抽取来源库A的数据表A【com_income1(利润表横表)】的数据,可以定义抽取数据范围;

转换数据:将来源表-利润表横表如overall_income、main_income、overall_cost等字段转为目标表-利润表竖表stand_pro_name(标准科目名称)的值,将来源表-利润表横表如overall_income、main_income、overall_cost等字段的数据转为了目标表-利润表竖表cur_amount(本期金额)的值,其他字段直接映射;

加载数据:数据加载到目标库B的数据表B【 com_income2(利润表竖表)】中,目标表已有数据,进行更新;否则,新增数据。

操作步骤:

1、点击左侧的核心对象,选择表输入并把它拖到右侧的编辑区中进行配置。

数据抽取【表输入】插件拖选

选择表输入并把它拖到右侧的编辑区中进行配置,主要是进行自定义来源表的抽取SQL语句。

数据抽取【表输入】插件配置

如截图所示,将来源库表信息进行填写或选择后,进行来源表的抽取SQL的定义,此处限制抽取数据的范围,只处理一个公司的利润表科目数据。

2、选择行转列并把它拖到右侧的编辑区中进行列转行配置。

在这里,需要理解key字段、字段名称、key值、value字段的含义。

1.Key字段:行转列之后,overall_income、main_income、overall_cost等字段会变成一个新的字段的值,Key字段就是这个新字段的名称,该样例中关键字段为stand_pro_name;

2.字段名称:填写横表需要行转列的字段,在这写的字段会从原来的字段名转变为一列数据,这列数据的列名为上面设置的Key字段名,该样例中的字段名称为overall_income、main_income、overall_cost等财务科目名称;

3.Key值:转为列之后key字段的值,该样例中的key值为营业总收入、营业收入、营业总成本等;

4.Value字段:行转列的那些字段是有数据的,这些数据转换为竖表的值,需要给这些数据起个名字,名字需要都一致,该样例中的value字段为cur_amount。

3、选择插入/更新并把它拖到右侧的编辑区中进行相关配置。

数据转换【行转列】插件配置

如截图中的配置,选择完目标数据库和目标数据表之后,用来查询的关键字,选择id,表示这里按照id查询,如果此id存在,则更新数据,若不存在则插入数据;获取目标表字段和来源表的流字段映射关系,排除在上一步【行转列】配置的字段名称。

插入/更新配置完成后,保存转换文件,可点击【运行这个转换】按钮进行本地运行。

数据加载【插入/更新】插件运行

4、转换成功后,也可以检查本地数据库,查看数据是否推送成功,是否进行了行转列。

来源表抽取数据截图


推送目标表后的数据截图

到这里,行转列的转换流程就配置成功了,后续打开.ktr后缀的文件即可。与行转列相对的,就是列转行了。

(二)列转行

应用场景:不同的业务数据表,数据存储的方式不同,希望将竖表的数据抽取作为新的字段同步到目标表中,比如常见的姓名、科目、分数,一个姓名下一个科目的分数一行存储,映射到目标表之后一个姓名下所有科目的分数一行存储。接下来将以金融数据中利润表的财务科目存储中,来源表是竖表的数据同步到目标表是横表的数据为例进行实操。

业务目标:将来源库A中的表A【com_income1(利润表竖表)】的数据推送到目标数据库B中的表B【com_income2(利润表横表)】,并将来源表A的stand_pro_name(标准科目名称)的值映射到目标表B对应科目的字段值中。

业务流程分析:

抽取数据:抽取来源库A的数据表A【com_income1(利润表竖表)】的数据,可以定义抽取数据范围;

转换数据:将来源表A的stand_pro_name(标准科目名称)的值映射到目标表B对应科目的字段值中,目标表B的com_uni_code(公司统一编码)、decl_date(公告日期)、statement_name(报表类型名称)为一组,其他字段直接映射;

加载数据:数据加载到目标库B的数据表B【 com_income2(利润表横表)】中,目标表已有数据,进行更新;否则,新增数据。

操作步骤:

1、点击左侧的核心对象,选择表输入并把它拖到右侧的编辑区中进行配置。

数据抽取【表输入】插件拖选

选择表输入并把它拖到右侧的编辑区中进行配置,主要是进行自定义来源表抽取SQL语句。

数据抽取【表输入】插件配置

如截图所示,将来源库表信息进行填写或选择后,进行来源表的抽取SQL的定义,此处限制抽取数据的范围,只处理一个公司的利润表科目数据。

2、选择列转行并把它拖到右侧的编辑区中进行列转行配置。

数据转换【列转行】插件配置

在这里,需要理解关键字段、分组字段、目标字段、数据字段、关键字值、类型/长度/精度的含义。

1.关键字段:列转行的核心字段,此字段会进行聚合操作,聚合结果作为之后横表的新字段名,该样例中关键字段是stand_pro_name(标准科目名称),即以这个标准科目名称的值作为横表的新字段名,如转换为【营业总收入】、【营业收入】、【营业总成本】等字段。

2.分组字段:关键字段的数据(营业总收入,营业收入, 营业总成本等)有重复,利润表的数据来源于公司发布的财报数据,每个公司每个报告期会发布合并利润表和母公司利润表,即每一个唯一标识的公司com_uni_code(公司统一编码)在decl_date(公告日期)发布合并或母公司利润表statement_name(报表类型名称)就会增加一条记录,其关键字段的数据就会重复一次,其中决定重复的字段就是com_uni_code、decl_date、statement_name,这三个字段就是分组字段。

3.目标字段:关键字段的数据去重后(营业总收入,营业收入, 营业总成本等)变成的字段名,这个目标字段也就是转换后目标表的物理名,比如overall_income、main_income、overall_cost等。

4.数据字段:在竖表中,有一个与关键字段一一对应的数据字段,它的字段名填在这,该样例中为cur_amount(本期金额);

5.关键字值:关键字值是关键字段的数据,关键字段的数据去重后(营业总收入,营业收入, 营业总成本等)有多少列,关键字值就有多少个;

6.类型/长度/精度:定义关键字值的数据类型、长度和精度,该样例中利润表科目中的数值是分别为number、18、4。

3、选择插入/更新并把它拖到右侧的编辑区中进行相关配置。

数据加载【插入/更新】插件配置

如截图中的配置,选择完目标数据库和目标数据表之后,用来查询的关键字,选择id,表示这里按照id查询,如果此id存在,则更新数据,若不存在则插入数据;获取目标表字段和来源表的流字段映射关系,排除在上一步【列转行】配置的目标字段。

插入/更新配置完成后,保存转换文件,可点击【运行这个转换】按钮进行本地运行。

数据加载【插入/更新】插件运行

4、转换成功后,也可以检查本地数据库,查看数据是否推送成功,是否进行列转行。

来源表抽取数据截图
推送目标表后的数据截图

到这里,列转行的转换流程就配置成功了,后续打开.ktr后缀的文件即可。

除了用kettle的转换插件,行转列与列转行同样可以使用SQL语句来实现,与上一篇【ETL】系列五:核心转换场景-字段合并与字段拆分的流程类似,在表输入的SQL抽取语句中进行抽取SQL的定义,以进行横表和竖表的互转。详情可以参考这篇文章:纵表和横表的概念及其相互转换

以上是行转列和列转行2类转换场景的操作方式。

最后,那么问题来了,对于B端工具类产品经理来说,有什么启发?

B端产品是为了解决业务问题而设计的,重点是满足业务需求

作为B端产品经理,一定要非常懂业务。只有足够的了解业务逻辑,才能把B端产品相应的功能做好,并推动整个B端生态体系搭建。

行转列和列转行的转换场景,是数据业务的常见应用场景,只有深入了解数据业务方的数据加工处理逻辑,才能抽象出功能点,在kettle这款成熟的产品中体现出来的是【行转列】、【列转行】的插件功能设计,那如果是自研的ETL工具呢,作为产品经理,你又会怎么设计呢?

诚然,kettle的【行转列】、【列转行】功能已相当完善,但也存在应用场景引导不明显、批量操作不方便等问题,这些易用性问题也比较影响工具的使用效率。

针对工具类产品的设计原则和方法,我会在后续的文章中做详细的总结和分享。欢迎大家关注哦!

本文其他参考文章:kettle 行转列 与 列转行

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容