1. 概述
1.1 应用场景
从接口取数后,数据保存格式为:{{主数据},{子数据1,子数据2}{子数据a,子数据b}};其中,子数据中包含多个字段,以逗号分割存储。如下图所示:
实际业务场景中,每个子数据相当于一个分组,希望所有子数据按照分组内的数据顺序进行匹配(上图相同颜色的在同行展示)。希望得到的数据如下图所示:
使用两个「字段拆行」算子分别拆分职务、分公司字段时,出现笛卡尔积。如下图所示:
黄色标记的字段非实际需要数据。
1.2 实现思路
1)使用 SQL 语句对职务字段根据,进行拆分,分割成多个子字符串;并对每个子字符串进行展开,展开的每一行中包含子字符串在原先值中的位置(pos字段)、子字符串值(col字段)、共同的其他分组标识字段雇员ID(数据表主键)
2)分公司字段拆分逻辑同职务字段。拆分结果如下图所示:
3)使用pos、雇员ID字段作为关联字段,关联拆分后的结果。如下图所示:
取关联后的 col、col1 字段即可。
1.3 任务展示
FineDataLink 中的数据处理过程,详情参见:https://demo.finedatalink.com/ 「多个逗号分隔的字段按照分组顺序匹配」。
2. 操作步骤
2.1 模拟数据源
示例数据:员工信息表.xls
本文示例中,格式为{{主数据},{子数据1,子数据2}{子数据a,子数据b}}的数据,保存在数据库表中。
1)新建定时任务,拖入「数据转换」节点,进入「数据转换」节点。
2)拖入「DB表输入」算子,取出待处理的数据。如下图所示:
2.2 处理数据
1)拖入「Spark SQL」算子,使用 SQL 语句对数据进行处理。如下图所示:
with tbl_time as (SELECT posexplode(split($[DB表输入].`职务`, ',')) AS (pos, col),$[DB表输入].`雇员ID` FROM $[DB表输入]),
tbl_note as (SELECT posexplode(split($[DB表输入].`分公司`, ',')) AS (pos, col),$[DB表输入].`雇员ID` FROM $[DB表输入])
select tbl_time.`雇员ID`,tbl_time.col as `职务`,tbl_note.col as `分公司` from tbl_time left join tbl_note
on tbl_time.pos = tbl_note.pos and tbl_time.`雇员ID`=tbl_note.`雇员ID`
注:上述语句中,$[DB表输入].`职务`格式的数据需要点击生成;中文字段名称需要用``包裹。
SQL 语句详解:
使用 SQL 语句对职务字段根据,进行拆分,获取拆分后字段、组内序号、共同标识字段雇员ID,形成临时表 tbl_time。
使用 SQL 语句对分公司字段根据,进行拆分,获取拆分后字段、组内序号、共同标识字段雇员ID,形成临时表 tbl_note。
使用 SQL 将 tbl_time 和 tbl_note 表按照组内序号 pos 以及共同标识字段雇员ID进行关联得到需要的结果。
2)点击「数据预览」,如下图所示:
若用户需要最终预览数据中包含姓氏、名字、尊称、出生日期、雇用日期字段,SQL 语句修改为:
with tbl_time as (SELECT posexplode(split($[DB表输入].`职务`, ',')) AS (pos, col),$[DB表输入].`雇员ID`,$[DB表输入].`姓氏`,$[DB表输入].`名字`,$[DB表输入].`尊称`,
$[DB表输入].`出生日期`,$[DB表输入].`雇用日期` FROM $[DB表输入]),
tbl_note as (SELECT posexplode(split($[DB表输入].`分公司`, ',')) AS (pos, col),$[DB表输入].`雇员ID` FROM $[DB表输入])
select tbl_time.`雇员ID`,tbl_time.`姓氏`,tbl_time.`名字`,tbl_time.`尊称`,tbl_time.`出生日期`,tbl_time.`雇用日期`,tbl_time.col as `职务`,tbl_note.col as `分公司` from tbl_time left join tbl_note
on tbl_time.pos = tbl_note.pos and tbl_time.`雇员ID`=tbl_note.`雇员ID`
注:上述语句中,$[DB表输入].`职务`格式的数据需要点击生成;中文字段名称需要用``包裹;绿色标志的为新增展示字段需要的 SQL 语句。
点击「数据预览」,如下图所示:
2.3 保存数据
用户可对数据进一步处理;本文示例,将数据保存到数据库表中。
拖入「DB表输出」算子,将处理后的数据保存到数据库表中。如下图所示:
写入方式选择「追加写入数据」即可。
2.4 发布任务到生产模式
用户可点击「发布」按钮,将任务发布到 生产模式 中。如下图所示: