1. 概述
1.1 应用场景
某公司的闸机系统会按照人员编号、通行门禁除、通信时间3个字段,记录每一个人员,经过每一处门禁,具体经过的时间。
希望可以将原始通行明细数据,汇总成按:每人每天一条汇总通行详情,且通行详情需要按照时间先后排序。
例如原始数据如下图所示:
期望数据处理后的结果:
1.2 实现思路
1)将通行时间_日期字段拆分称日期和时间两个字段。
2)拼接通行门禁字段和时分秒字段。
3)按照编码和通行时间_日期对数据进行排序,然后按照编号、通行年月日进行汇总,同时将每天的打卡详情数据进行拼接。
FineDataLink 中的数据处理过程,详情参见:https://demo.finedatalink.com/ 「按编号和日期汇总顺序拼接数据」。
2. 操作步骤
示例数据:数据清洗处理.xlsx
2.1 拆分日期和时间字段
新建定时任务,使用数据转换节点,进入编辑界面,拖入DB表输入算子,并取出数据库中需要处理的数据,如下图所示:
使用新增列将通行时间字段转成文本字段,如下图所示:
使用字段拆列对通行时间进行拆分,拆分出日期和时分秒字段,如下图所示:
点击「数据预览」,得到如下拆分结果:
使用「字段设置」修改拆分后的字段名,如下图所示:
2.2 拼接打卡地点和时分秒字段
将打卡处与时分秒拼接在一起,使用「新增字段列」,输入函数 CONCATENATE,如下图所示:
2.3 排序和汇总
按照编号和日期升序排列,使用 SparkSQL 算子,输入以下语法,如下图所示:
select * from 新增计算列1 order by 新增计算列1.`编号`,新增计算列1.`通行时间_日期`
点击「数据预览」,即可看到按照编号和日期升序排列后的结果,如下图所示:
然后按照编号、通行年月日进行汇总,同时将每天的打卡详情数据进行拼接,如下图所示:
SELECT
Spark SQL.`编号`,
Spark SQL.`通行时间_年月日`,
CONCAT_WS('\n',COLLECT_LIST(Spark SQL.`打卡详情`))AS detail
FROM Spark SQL
GROUP BY $park SQL.`编号`,Spark SQL.`通行时间_年月日`
2.4 效果查看
点击「数据预览」,即可看到汇总排序拼接后的结果,如下图所示:
然后即可将处理结果进行输出,如下图所示: