一、实验背景

1.1 实验目的

基于“数智教育”大赛数据集,设计并实现学生多维度考勤统计的助睿ETL转换流,掌握ETL数据处理全流程(数据接入、关联、衍生、聚合、落地),解决校园考勤人工统计效率低、口径不统一的问题;同时结合实际数据情况,优化空值处理逻辑,确保转换流可正常运行,输出精准的多维度考勤统计结果,为校园考勤管理提供数据支撑。

1.2 实验环境

  • 工具:助睿零代码在线实验平台
    本次实验使用 助睿数智(Uniplore)
  • 数据源:“数智教育”大赛数据集(共包含7张核心业务表)
  • 实验设备:计算机(支持助睿ETL平台运行,具备数据库连接权限)

1.3 实验范围

本次实验覆盖助睿ETL转换流全流程配置,包括多表数据接入、多表关联、考勤行为标签衍生、多维度聚合统计及结果落地入库;重点验证数据关联的精准性及统计指标的准确性,结合实验数据实际情况优化配置,确保实验顺利完成。

1.4 源数据说明

本次转换流处理的数据来源于“数智教育”大赛数据集,原始数据集共包含7张表:

文件名内容说明
1_teacher.csv教师信息
2_student_info.csv学生信息
3_kaoqin.csv考勤主表
4_kaoqintype.csv考勤类型码表
5_chengji.csv成绩信息
6_exam_type.csv考试类型
7_consumption.csv消费信息

本次实验聚焦 考勤主题,分析以上7张表后,发现与考勤行为直接相关且能支撑多维度分析的表为以下3张:

  • 3_kaoqin.csv:考勤主表,核心事实表,记录每次考勤行为
  • 4_kaoqintype.csv:考勤类型码表,提供考勤行为的标准化名称,是行为标签生成的关键
  • 2_student_info.csv:学生信息表,提供学生基础属性(住校、性别等),支撑维度拆分

这三张表形成了 事实表 + 维度表 + 属性表 的完整星型模型结构。各表核心作用及关键字段如下:

数据源表核心作用关键字段
考勤主表(3_kaoqin)存储学生每日原始打卡记录、考勤行为明细学生ID、班级ID、学期(qj_term)、打卡时间(DataDateTime)、考勤类型ID(ControllerID)、考勤描述(controler_name)
考勤类型码表(4_kaoqintype)标准化考勤事件名称,区分正常与异常考勤类型考勤类型ID(controller_id)、考勤事件名称(control_task_name)
学生信息表(2_student_info)提供学生基础属性,支撑多维度学生画像学生ID(bf_StudentID)、班级ID(cla_id)、学生姓名(bf_Name)、性别(bf_sex)、出生日期(bf_BornDate)、政治面貌(bf_policy)、是否住校(bf_zhusu)

1.5 标签设计

学生考勤主题标签可分为三类:学生基础属性标签、学生画像维度标签和考勤行为指标标签。

1.5.1 学生基础属性标签

标签字段数据来源选择依据
学生ID考勤主表/学生信息表学生唯一标识,用于关联和去重
学生姓名考勤主表/学生信息表便于结果查阅和人工核对
班级ID考勤主表/学生信息表班级唯一标识,用于班级维度统计
班级名称考勤主表/学生信息表班级名称,用于提取年级和校区类型
性别学生信息表可按性别维度分析考勤行为差异
出生日期学生信息表学生出生年份,可用于年龄维度分析
政治面貌学生信息表可按政治面貌维度分析不同群体的考勤行为

选表依据:这些字段是学生的基础身份信息,主要从学生信息表(2_student_info)获取。考勤主表中也包含部分学生信息,可作为交叉验证。这些基础属性是后续分维度统计的核心依据。

示例用途:可按性别分析男生与女生的迟到差异,可按政治面貌分析不同群体的考勤行为特点。

1.5.2 学生画像维度标签

标签字段衍生逻辑选择依据
年级从班级名称(cla_name)中提取学校管理通常按年级统计考勤情况,便于分层管理
是否住校映射学生信息表 bf_zhusu 字段住校生与走读生的考勤行为模式不同,便于针对性管理。观察数据发现:1→“是”,0→“否”,空值→“未知”
校区类型从班级名称(cla_name)中判断数据说明中提到2017年启用新校区,新校区统一命名为“白-高二(01)”和“东-高二(01)”等格式

选表依据:这三个标签字段属于衍生维度,原始数据中没有直接提供,需要根据班级名称和住校字段进行二次加工。年级维度有助于学校按年级进行考勤管理和对比分析;住校维度用于区分住校生和走读生,两者的考勤行为模式存在差异;校区类型维度源于数据说明中提到的2017-2018年新校区启用情况,不同校区的管理规则可能不同。

示例用途:可按住校状态分析走读生是否更容易迟到,可按校区类型对比新旧校区的校服穿戴规范执行情况。

1.5.3 考勤行为统计标签

标签字段选择依据
迟到次数学生行为规范的核心指标之一
早退次数学生行为规范的核心指标之一
请假次数区分正常缺勤与异常缺勤
没穿校服次数学校日常行为规范的重要维度

选表依据:这四类异常考勤行为是学校日常学生管理的核心关注点。迟到和早退反映学生的时间管理能力和纪律意识,请假次数可用于区分正常缺勤与异常缺勤,校服穿戴是学校行为规范的重要考核项。根据数据说明中的描述,“校服[移动考勤]”特指未穿校服的情况。

示例用途:可分析学生不同异常考勤次数,判断考勤风险等级。

1.6 标签处理口径

所有标签口径统一固化,确保统计结果准确可比。

1.6.1 基础属性字段处理口径

字段处理方式口径说明
学生ID直接读取从考勤主表获取
学生姓名直接读取从考勤主表获取
班级ID直接读取从考勤主表获取
班级名称直接读取从考勤主表获取
性别空值替换从学生信息表获取,空值替换为“未知”
出生日期空值替换从学生信息表获取,空值替换为“未知”
政治面貌空值替换从学生信息表获取,空值替换为“未知”

1.6.2 衍生维度字段处理口径

字段处理方式口径说明
年级从 class_name 提取包含“高一”→高一,包含“高二”→高二,包含“高三”→高三,其他→未知
是否住校映射 + 空值替换bf_zhusu=1→“是”,bf_zhusu=0→“否”,空值→“未知”
校区类型从 class_name 判断以“白-”或“东-”开头→新校区,其他→老校区

1.6.3 考勤行为指标统计口径

指标统计逻辑口径说明
迟到次数COUNT(迟到/晚到 AND 非请假)考勤事件名称包含“迟到”“晚到”关键词,且排除请假的记录条数
早退次数COUNT(早退 AND 非请假)考勤事件名称包含“早退”关键词,且排除请假的记录条数
请假次数COUNT(包含请假)考勤事件名称包含“请假”关键词的所有记录总条数(含事假、病假等)
没穿校服次数COUNT(包含校服)考勤事件名称包含“校服”的异常情况记录条数

统计口径设计理由:

  • 排除请假记录:请假属于正常缺勤,不应计入迟到或早退的违规统计,避免重复计数和误判。
  • 请假全覆盖:只要考勤事件名称中包含“请假”关键词,无论事假、病假或其他类型,均计入请假次数。
  • 校服违规唯一识别:根据数据说明,考勤类型中的“校服[移动考勤]”明确指未穿校服,因此包含“校服”关键词的记录即为违规。

二、实验步骤

2.1 创建实验项目

点击“新建项目”。

输入项目名称“学生用户画像标签构建”,点击“确定”。

创建成功后,可在数据集成页面看到新创建的项目。

2.2 数据资源获取

为方便后续数据使用,我们将原始数据导入团队的私有数据库。

项目创建成功后,点击该项目右上角的“…”,选择“打开项目”。

(此处为原文档图:打开项目菜单)

在项目页面,左侧有三个菜单:资源库、文件库、元数据。

  • 资源库:用于工作流的管理,包括新建、删除、修改、查看工作流信息;导出导入工作空间;调度管理等。
  • 文件库:用于保存工作流中需要的文件以及工作流产生的文件。
  • 元数据管理:助睿ETL的重要基石,可为工作流定义“运行配置”、“数据库”、“flink集群”等配置。

(此处为原文档图:左侧菜单截图)

2.2.1 获取实验数据集

点击“文件库”,右键根目录,选择“新建目录”。

(此处为原文档图:新建目录操作)

输入目录名称“数智教育数据集”,点击“确定”。

(此处为原文档图:输入目录名称)

接下来将公共空间的数据资源导入到此目录下。

点击“公共空间”。

(此处为原文档图:公共空间入口)

点击“数据资源”。(此处为原文档图:数据资源列表)点击“3_kaoqin.csv”卡片右上角的“更多”,选择“导出”。
(此处为原文档图:导出操作菜单)

在弹出的窗口中选择导出到刚刚新建的目录。
(此处为原文档图:选择导出目标目录)

点击“确定”。
(此处为原文档图:确认导出)

可以看到“数智教育数据集”目录下新增了 3_kaoqin.csv。

(此处为原文档图:导出成功的文件列表)

重复以上导出操作,将本次实验所需的 4_kaoqintype.csv 和 2_student_info.csv 也导出到“数智教育数据集”。

(此处为原文档图:导出其他文件)

2.2.2 建立数据源连接

在“元数据”标签页,右键“关系数据库”,选择“新建数据源”。

(此处为原文档图:新建数据源菜单)

弹出新建数据库连接窗口,连接类型选择“MySQL”,用户名和密码使用助教提供的账号。服务器主机名使用助教提供的数据库连接地址 rm-2vc3qok06bag39a5n.mysql.cn-chengdu.rds.aliyuncs.com,端口号 3306,数据库名称为助教提供的名称,驱动类型选择“MySQL 8+”,连接名称设为“团队私有数据库”。

在这里插入图片描述

填写完毕后,点击“测试”按钮验证信息是否正确。如果无误,会返回“数据库连接成功”。

在这里插入图片描述

最后点击“添加”,完成数据库连接的创建。添加成功后,“关系数据库”节点下会增加一个子节点。

(此处为原文档图:连接添加成功后的节点)

2.2.3 数据导入团队私有数据库

2.2.3.1 原始考勤记录表数据导入

(1)创建原始_学生考勤表

新建转换流,命名为“创建原始_学生考勤表”。在该工作流中拖拽“执行一个SQL脚本”组件,通过执行SQL脚本来创建目标表。整个转换流如下:

(此处为原文档图:创建原始考勤表的转换流截图)

配置说明:在组件中填写SQL脚本,选择目标数据库连接“团队私有数据库”,确保脚本执行权限。

SQL脚本如下:

CREATE TABLE IF NOT EXISTS `raw_attendance` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `attendance_id` varchar(64) DEFAULT NULL COMMENT '考勤ID',
  `learn_term` varchar(30) DEFAULT NULL COMMENT '学期',
  `data_datetime` varchar(50) DEFAULT NULL COMMENT '时间和日期',
  `attendance_type_id` varchar(64) DEFAULT NULL COMMENT '考勤类型ID',
  `attendance_name` varchar(100) DEFAULT NULL COMMENT '考勤名称',
  `attendance_task_order_id` varchar(64) DEFAULT NULL COMMENT '考勤事件ID',
  `stu_id` varchar(64) DEFAULT NULL COMMENT '学生ID',
  `stu_name` varchar(100) DEFAULT NULL COMMENT '学生姓名',
  `cla_name` varchar(100) DEFAULT NULL COMMENT '班级名',
  `cla_id` varchar(64) DEFAULT NULL COMMENT '班级ID',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间',
  PRIMARY KEY (`id`),
  KEY `idx_student_id` (`stu_id`),
  KEY `idx_term` (`learn_term`)
) COMMENT='原始_学生考勤表';

其他参数使用默认选项。完成后组件配置如下:

(此处为原文档图:SQL脚本组件配置)

运行转换流,运行过程中会定时刷新组件状态,并在画布下方显示执行日志。

(此处为原文档图:执行日志)

(2)导入原始考勤数据

新建转换流,命名为“导入原始考勤数据”。在该工作流中拖拽一个“CSV文件输入”组件到画布。

(此处为原文档图:拖拽CSV文件输入组件)

双击CSV文件输入组件,步骤名称设为“考勤记录”。

(此处为原文档图:CSV输入基本配置)

点击“文件名”后的“浏览文件”按钮,在弹出的窗口中选择 3_kaoqin.csv,点击“确定”。

(此处为原文档图:选择CSV文件)

列分隔符和封闭符使用默认参数,编码选择“UTF-8”。

(此处为原文档图:编码与分隔符设置)

下滑至字段表格,在空白处右键点击“获取字段”。

(此处为原文档图:获取字段操作)

字段获取成功后点击“确认”。

(此处为原文档图:字段列表)

接下来拖拽一个“表输出”组件到画布,并创建从“考勤记录”CSV文件输入组件到“表输出”组件的连线,连线类型选择“主输出步骤”。

(此处为原文档图:连线操作)

双击“表输出”组件,在基本配置中,数据库连接选择“团队私有数据库”,目标表输入之前SQL组件创建的 raw_attendance,具体配置如下:

(此处为原文档图:表输出基本配置)

点击“数据库字段”标签,在空白处右键“获取字段”。

(此处为原文档图:获取数据库字段)

将表字段修改为建表语句中对应的字段,点击“确认”。

(此处为原文档图:字段映射配置)

完成后运行转换流,执行日志显示成功。

(此处为原文档图:执行日志)

2.2.3.2 原始考勤类型表数据导入

参照“2.2.3.1 原始考勤记录表数据导入”小节的操作,完成原始考勤类型表 4_kaoqintype.csv 数据导入到团队私有数据库。

建表SQL为:

CREATE TABLE IF NOT EXISTS `raw_attendance_type` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `attendance_type_id` varchar(64) NOT NULL COMMENT '考勤类型id',
  `attendance_type_name` varchar(100) DEFAULT NULL COMMENT '考勤类型名称',
  `attendance_task_order_id` varchar(64) DEFAULT NULL COMMENT '考勤事件id',
  `attendance_task_name` varchar(100) DEFAULT NULL COMMENT '考勤事件名',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_attendance_type_id` (`attendance_task_order_id`)
) COMMENT='原始_考勤类型表';

执行创建表的转换流:

(此处为原文档图:创建考勤类型表的转换流)

特别说明:使用CSV文件输入组件时,考勤类型原始表的列分隔符为“插入制表符(TAB)”,编码为“GB2312”。

(此处为原文档图:CSV输入配置——列分隔符)

(此处为原文档图:CSV输入配置——编码)

表输出组件的配置与“2.2.3.1”小节相同。

(此处为原文档图:表输出基本配置)

(此处为原文档图:表输出字段映射)

配置完成后执行转换流,日志显示成功。

(此处为原文档图:执行日志)

2.2.3.3 原始学生基本信息表数据导入

参照上述操作,完成原始学生基本信息表 2_student_info.csv 数据导入到团队私有数据库。

建表SQL为:

CREATE TABLE IF NOT EXISTS `raw_student_info` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `stu_id` varchar(64) NOT NULL COMMENT '学生ID',
  `stu_name` varchar(100) DEFAULT NULL COMMENT '学生姓名',
  `stu_sex` varchar(10) DEFAULT NULL COMMENT '性别',
  `stu_nation` varchar(50) DEFAULT NULL COMMENT '民族',
  `born_date` varchar(10) DEFAULT NULL COMMENT '出生日期(年)',
  `cla_name` varchar(100) DEFAULT NULL COMMENT '班级名',
  `native_place` varchar(200) DEFAULT NULL COMMENT '家庭住址',
  `residence_type` varchar(50) DEFAULT NULL COMMENT '家庭类型',
  `policy` varchar(50) DEFAULT NULL COMMENT '政治面貌',
  `cla_id` varchar(64) DEFAULT NULL COMMENT '班级ID',
  `cla_term` varchar(30) DEFAULT NULL COMMENT '班级学期',
  `live_on_campus` varchar(10) DEFAULT NULL COMMENT '是否住校',
  `leave_school` varchar(10) DEFAULT NULL COMMENT '是否退学',
  `dormitory_no` varchar(50) DEFAULT NULL COMMENT '宿舍号',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_student_id` (`stu_id`),
  KEY `idx_cla_id` (`cla_id`)
) COMMENT='原始_学生信息表';

执行创建表的转换流:

(此处为原文档图:创建学生信息表的转换流)

使用“CSV文件输入”组件读取 2_student_info.csv 数据。

(此处为原文档图:CSV输入组件配置)

获取字段时,需要将 bf_leaveSchool 的字段类型修改为“String”。

(此处为原文档图:修改字段类型)

特别说明:bf_zhusu、bf_qinshihao 这两个字段为Integer类型,为避免出现小数,需要使用“字段选择”组件来固化并规范。

拖拽“字段选择”组件到画布中,创建从CSV文件输入组件到字段选择组件的连线,连线类型选择“主输出步骤”。

(此处为原文档图:添加字段选择组件)

双击“字段选择”组件,在配置窗口中点击“元数据”,并在空白处插入2行,将 bf_zhusu、bf_qinshihao 字段的元数据设置如下:

(此处为原文档图:字段选择元数据配置1)

(此处为原文档图:字段选择元数据配置2)

使用“表输出”组件将数据输出到团队私有数据库的 raw_student_info 表中。

(此处为原文档图:表输出基本配置)

(此处为原文档图:表输出字段映射)

执行转换流,日志显示成功。

(此处为原文档图:执行日志)

2.2.4 创建学生考勤主题标签表

新建转换流,命名为“创建学生考勤主题标签表”。在该工作流中拖拽“执行一个SQL脚本”组件,通过执行SQL脚本来创建标签表。

(此处为原文档图:创建标签表的转换流)

SQL脚本如下:

CREATE TABLE IF NOT EXISTS student_attendance_stats (
  id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
  student_id INT NOT NULL COMMENT '学生ID',
  student_name VARCHAR(50) NOT NULL COMMENT '学生姓名',
  class_id INT NOT NULL COMMENT '班级ID',
  class_name VARCHAR(50) NOT NULL COMMENT '班级名称',
  grade VARCHAR(10) NOT NULL COMMENT '年级',
  gender VARCHAR(10) NOT NULL COMMENT '性别',
  birth_date VARCHAR(10) NOT NULL COMMENT '出生日期',
  political_status VARCHAR(20) NOT NULL COMMENT '政治面貌',
  is_boarder VARCHAR(10) NOT NULL COMMENT '是否住校',
  campus_type VARCHAR(10) NOT NULL COMMENT '校区类型',
  late_count INT NOT NULL DEFAULT 0 COMMENT '迟到次数',
  early_leave_count INT NOT NULL DEFAULT 0 COMMENT '早退次数',
  leave_count INT NOT NULL DEFAULT 0 COMMENT '请假次数',
  uniform_violate_count INT NOT NULL DEFAULT 0 COMMENT '没穿校服次数',
  create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '统计入库时间',
  INDEX idx_student (student_id),
  INDEX idx_class (class_id),
  INDEX idx_grade (grade)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生考勤主题标签表';

其他参数使用默认选项。完成后运行转换流,日志显示成功。

(此处为原文档图:SQL脚本组件配置)

(此处为原文档图:执行日志)

2.3 学生考勤主题标签构建

2.3.1 数据转换流逻辑说明

转换流遵循“数据接入 → 清洗整合 → 维度拆解 → 标签标记 → 指标计算 → 结果落地”的核心逻辑:

  • 数据接入:接入考勤原始打卡表、考勤类型码表、学生信息基础表
  • 数据整合:多表关联,给原始打卡记录绑定学生班级、住校属性、考勤事件名称
  • 标签标记:通过考勤事件名称自动识别迟到、早退、请假、未穿校服等行为
  • 指标计算:按多维度聚合统计各类异常次数
  • 结果落地:统一写入考勤统计结果表,供报表、查询、分析直接使用

整体逻辑流程图如下:

(此处为原文档图:整体逻辑流程图)

各组件作用汇总:

组件作用
表输入读取数据库中的原始数据表
排序记录按照指定字段对数据进行排序,为记录集连接做准备
记录集连接按关联字段连接两表,补充考勤行为名称或学生属性
字段选择移除冗余字段,保留核心必要字段
JavaScript脚本执行脚本,通过关键词匹配提取异常考勤记录,生成二进制标记
分组按指定维度分组,使用SUM函数聚合统计各类异常次数
替换NULL值将空值字段替换为“未知”
值映射将住校状态编码(0/1)映射为“否”/“是”
表输出输出最终结果到数据库目标表

2.3.2 数据接入:获取考勤记录、考勤类型数据、学生信息数据

首先,我们需要获取考勤记录、考勤类型数据、学生信息数据。考勤记录表记录了每位学生每天的考勤行为,考勤类型表定义了每种考勤行为对应的类型名称(如正常考勤、没穿校服等),学生信息表提供了学生是否住校的核心属性。只有将这三份数据分别接入并后续关联起来,才能完整判断学生的每次考勤是正常还是违纪,同时支撑住校相关维度的统计。

切换到“资源库”,右键根目录,点击“新建转换流”。

(此处为原文档图:新建转换流)

输入转换流名字“学生考勤主题标签”,点击“确定”。

(此处为原文档图:命名转换流)

创建成功后进入转换流设计页面。

(此处为原文档图:设计页面空白画布)

转换流设计页面每次打开都是锁定状态,需要点击解锁图标进行解锁。

(此处为原文档图:解锁画布图标)

点击“组件库”,搜索“表输入”,拖拽3个表输入组件至画布中。

(此处为原文档图:拖拽三个表输入组件)

双击第一个表输入组件,在配置窗口中,步骤名称修改为“考勤记录”,数据库连接选择“团队私有数据库”,并点击“获取SQL查询语句”。

(此处为原文档图:表输入配置——考勤记录)

在数据库中选择 raw_attendance(原始_学生考勤表)。

(此处为原文档图:选择表)

系统提示弹窗中点击“确认”,获取 raw_attendance 表的所有字段。

(此处为原文档图:确认获取字段)

获取SQL查询语句后,点击“确认”。

(此处为原文档图:SQL自动填充)

参考以上步骤,将另外两个表输入组件分别命名为“考勤类型”和“学生信息”,分别获取 raw_attendance_type(原始_考勤类型表)和 raw_student_info(原始_学生信息表)的所有字段数据。

(此处为原文档图:考勤类型表输入配置)

(此处为原文档图:学生信息表输入配置)

2.3.3 数据关联:关联考勤记录 + 考勤类型

使用表输入组件读取考勤记录、考勤类型数据后,需通过记录集连接组件完成数据关联,补充关键业务信息,为后续指标计算奠定基础。具体操作为:将考勤主表与考勤类型码表关联,因为考勤记录表只有考勤类型ID和考勤任务顺序ID,缺少具体的考勤行为名称,通过记录集连接即可为每条考勤记录补充“正常考勤”“没穿校服”“迟到”“请假”等具体行为信息。

在组件库搜索“记录集连接”组件,拖拽至画布中。

(此处为原文档图:拖拽记录集连接组件)

创建“考勤记录”表输入组件到记录集连接组件的连接线。

(此处为原文档图:创建连接线)

在建立连接线时,会出现“排序需要”的提示。这是由于记录集连接组件是按接收数据的顺序进行关联的,如果数据无序,可能会导致连接结果出错。

(此处为原文档图:排序提示)

为避免排序问题,在“考勤记录”与“记录集连接”之间添加一个“排序记录”组件。

(此处为原文档图:添加排序记录组件)

双击“排序记录”组件,通过“获取字段”功能获取字段列表,然后删除多余字段,只保留 attendance_type_id、attendance_task_order_id 两个字段(因为下一步连接使用这两个字段)。最后设置步骤名称为“按照考勤类型和考勤任务类型排序”。

(此处为原文档图:排序记录配置)

创建“考勤类型”表输入组件到记录集连接组件的连接线。由于“考勤类型”组件的记录默认是按 attendance_type_id、attendance_task_order_id 升序的,所以无需再排序。

(此处为原文档图:连接考勤类型到记录集连接)

双击记录集连接组件,在下拉列表中选择需要连接的数据来源:第一个Transform选择“按照考勤类型和考勤任务类型排序”,第二个Transform选择“考勤类型”,连接类型选择 LEFT OUTER。

(此处为原文档图:记录集连接基本配置)

点击第一个Transform的“连接字段”中的“获得连接字段”按钮,获取考勤记录的字段。

(此处为原文档图:获取第一个Transform的连接字段)

同样,获取第二个Transform的连接字段。

(此处为原文档图:获取第二个Transform的连接字段)

两个Transform中仅保留 attendance_type_id 和 attendance_task_order_id 字段(表示使用这两个字段进行连接)。可以使用“删除选中的行”批量删除多余字段。

(此处为原文档图:删除多余字段)

删除完成后点击“确认”。若删除错误,可重新获取连接字段后再删除。

(此处为原文档图:确认连接配置)

2.3.4 行为标签衍生:统计学生异常考勤次数

通过JavaScript脚本生成考勤行为二进制标记,为后续聚合统计提供支撑,确保标签判断精准。

添加“JavaScript代码”组件,对接记录集连接组件的输出,通过关键词匹配生成二进制判断标签(1=是,0=否),用于后续指标聚合。

(此处为原文档图:拖拽JavaScript代码组件)

双击“JavaScript代码”组件,命名为“提取异常考勤记录”,在Script1中输入以下脚本:(此处为原文档图:JavaScript代码配置——获取变量)

// 初始化变量
var isLate = 0;
var isEarly = 0;
var isLeave = 0;
var isNoUniform = 0;

// 核心判断逻辑
if(attendance_type_name != null && attendance_task_name != null){
    // 迟到判断(排除请假)
    if((attendance_type_name.includes("迟到") || 
        attendance_type_name.includes("晚到") || 
        attendance_task_name.includes("迟到") || 
        attendance_task_name.includes("晚到")) && 
        !attendance_task_name.includes("请假")){
        isLate = 1;
    }
    // 早退判断(排除请假)
    if((attendance_type_name.includes("早退") || 
        attendance_task_name.includes("早退")) && 
        !attendance_task_name.includes("请假")){
        isEarly = 1;
    }
    // 校服违规:只要包含"校服"就标记违规
    if(attendance_type_name.includes("校服") || attendance_task_name.includes("校服")){
        isNoUniform = 1;
    }
}
// 请假判断
if(attendance_task_name != null){
    if(attendance_task_name.includes("请假")){
        isLeave = 1;
    }
}

使用“获取变量”获取输出字段,系统将自动解析脚本中的变量定义,生成字段数据。
(此处为原文档图:测试脚本界面)

点击“测试脚本”按钮,确认标记字段(如 isLate、isEarly 等)仅存在 1 和 0 两个值,标签判断准确(迟到记录对应 isLate=1,正常出勤对应各项均为0)。

(此处为原文档图:预览数据)

预览数据如下:
在这里插入图片描述

2.3.5 多维度分组聚合统计

实验核心:按统计维度聚合数据,将明细数据转化为统计指标,满足多层级考勤管理需求。

在助睿ETL平台拖拽2个“分组”组件,对接JavaScript代码组件的输出,按统计维度进行聚合。聚合规则如下:

  • SUM(迟到标记) → 迟到次数(late_count)
  • SUM(早退标记) → 早退次数(early_count)
  • SUM(请假标记) → 请假次数(leave_count)
  • SUM(没穿校服标记) → 没穿校服次数(uniform_violate_count)

添加“分组”组件,并建立从JavaScript组件到分组组件的连接线,连线选择“主输出步骤”。

(此处为原文档图:添加分组组件)

双击“分组”组件,设置分组字段为:stu_id、stu_name、cla_id、cla_name。

(此处为原文档图:分组字段设置)

设置聚合字段为:late_count、early_leave_count、leave_count、uniform_violate_count(原文档中字段名略有差异,我们按最终目标表字段名统一)。

(此处为原文档图:聚合字段设置)

2.3.6 关联学生信息

基于上述结果,使用记录集连接组件关联学生信息表——因为考勤记录表仅包含学生ID和班级ID,缺少学生是否住校等核心属性,通过按学生ID关联学生信息表,可补全这些属性,支撑住校相关维度的统计。

由于“学生信息”数据表中的学号不是升序记录的,所以在进行记录关联前也需要对数据进行排序。再次添加“排序记录”组件,并建立“学生信息”表输入组件到该排序记录组件的连接线。

(此处为原文档图:添加排序记录——学生信息)

双击“排序记录”组件,通过“获取字段”获取字段列表,删除多余字段,只保留 stu_id 字段(因为下一步连接使用此字段)。最后设置步骤名称为“按照学生编号进行排序”。

(此处为原文档图:排序记录配置——学生信息)

拖拽“记录集连接”组件至画布中,创建从“按照学生编号进行排序”组件到“记录集连接1”组件的连接线。

(此处为原文档图:连接排序后学生信息到记录集连接1)

由于考勤记录聚合后的数据也不是按“学号”升序的,所以也需要对聚合结果进行排序。再次添加“排序记录”组件,并建立从分组组件到该排序记录组件的连接线。

(此处为原文档图:添加排序记录——考勤聚合数据)

双击该排序记录组件,按下图配置,步骤名称设置为“考勤数据按学号排序”,排序字段为 stu_id。

(此处为原文档图:排序记录配置——考勤数据)

创建“考勤数据按学号排序”组件到“记录集连接1”组件的连线,关联学生信息和考勤记录信息。

(此处为原文档图:连接考勤排序到记录集连接1)

双击“记录集连接1”组件,第一个Transform选择“考勤数据按学号排序”,第二个Transform选择“按照学生编号进行排序”,连接类型选择 LEFT OUTER。

(此处为原文档图:记录集连接配置——关联学生信息)

点击第一个Transform的“获得连接字段”按钮,获取考勤记录和考勤类型关联后的字段;同样获取第二个Transform的连接字段。两个Transform中均只保留 stu_id 字段,连接类型选择 LEFT OUTER,表示使用考勤记录的 stu_id 与学生信息的 stu_id 进行左外连接。

(此处为原文档图:记录集连接字段配置)

点击“确认”。

(此处为原文档图:确认配置)

2.3.7 字段选择:移除冗余字段

经过多表关联和前期接入,数据中会包含大量与考勤统计无关的字段(如学生信息表中的非必要属性)。需要对这些冗余字段进行移除,保留核心有用字段,以提升处理效率,确保统计逻辑清晰。

搜索“字段选择”组件,拖拽至画布中,创建从“记录集连接1”组件到字段选择组件的连接线。

(此处为原文档图:添加字段选择组件)

双击字段选择组件,在配置弹窗中,步骤名称输入“移除冗余字段”,点击“移除”标签页,右键空白处并点击“获取字段”。

(此处为原文档图:字段选择——获取字段)

在获取的字段中,仅保留以下核心字段,其余删除:

  • 学生ID(stu_id)
  • 学生姓名(stu_name)
  • 班级ID(cla_id)
  • 班级名称(cla_name)
  • 迟到次数(late_count)
  • 早退次数(early_leave_count)
  • 请假次数(leave_count)
  • 没穿校服次数(uniform_violate_count)
  • 性别(stu_sex)
  • 出生日期(born_date)
  • 政治面貌(policy)
  • 是否住校(live_on_campus)

(此处为原文档图:保留字段设置)

在字段选择组件上右键,点击“显示输出字段”,查看输出字段是否正确。

(此处为原文档图:显示输出字段)

(此处为原文档图:输出字段列表)

2.3.8 空值处理

三表关联后,字段 stu_sex、born_date、policy、live_on_campus 可能存在空值,需要对空值进行处理。

拖拽“替换NULL值”组件至画布,创建从“移除冗余字段”组件到“替换NULL值”组件的连线,连线类型选择“主输出步骤”。

(此处为原文档图:添加替换NULL值组件)

双击“替换NULL值”组件,勾选“选择字段”。

(此处为原文档图:替换NULL值基本配置)

在字段空白表格中右键,点击“插入”。

(此处为原文档图:插入空值替换字段)

双击插入的行,字段名称选择 stu_sex,将空值替换为“未知”。

(此处为原文档图:配置性别空值替换)

继续插入行,将 born_date、policy、live_on_campus 的空值均替换为“未知”。

(此处为原文档图:配置其他字段空值替换)

2.3.9 学生基础属性标准化处理

经过多表关联与字段筛选后,原始数据中住校状态为编码值,且缺少年级、校区类型等画像分析必需字段,无法直接用于学生考勤标签输出与后续用户画像分析。因此需要对学生基础属性进行标准化映射、缺失字段衍生,统一数据格式、补齐分析维度,保证标签表规范可用。

2.3.9.1 住校状态映射

原始住校状态以数字形式存储,可读性差且存在空值,通过映射转换为规范文本并处理空值,使标签表更直观,同时满足住校/走读考勤对比分析的需求。

添加“值映射”组件到画布中,并创建从“替换NULL值”组件到值映射组件的连线,选择“主输出步骤”。

(此处为原文档图:添加值映射组件)

双击“值映射”组件,步骤名称改为“住校状态映射”,使用的字段名为 live_on_campus,不匹配时的默认值为“否”。

(此处为原文档图:值映射基本配置)

在下方字段值表格空白处右键,点击“插入”。

(此处为原文档图:插入映射值)

双击插入的行,在“源值”中输入 0,“目标值”输入 否。

(此处为原文档图:映射0→否)

再插入一行,源值输入 1,目标值输入 是,点击“确认”。

(此处为原文档图:映射1→是)

2.3.9.2 从班级名提取年级

原始数据无独立年级字段,无法按年级做考勤统计与画像分群,通过从班级名称中提取年级信息,补齐年级维度,支撑年级层面的考勤分析。

拖拽“JavaScript代码”组件至画布中,创建从“住校状态映射”组件到该JavaScript代码组件的连线。

(此处为原文档图:添加年级提取JavaScript组件)

双击该JavaScript代码组件,步骤名称改为“从班级提取年级”,并输入以下代码:

var gra_name
if (cla_name == null){
    gra_name = '未知'
} else if(cla_name.includes('高一')){
    gra_name = '高一'
} else if (cla_name.includes('高二')){
    gra_name = '高二'
} else if (cla_name.includes("高三")){
    gra_name = '高三'
} else{
    gra_name = '未知'
}

(此处为原文档图:年级提取脚本)

接下来需要设置 gra_name 字段类型。在配置窗口的下方空白表格处右键,点击“插入”。

(此处为原文档图:插入输出字段)

字段名称输入 gra_name,类型为 String,“替换字段名或重命名”选择 否,设置完成后点击“确认”。

(此处为原文档图:设置输出字段类型)

2.3.9.3 校区类型判定

原始数据无校区类型字段,不同校区管理口径与考勤规则可能存在差异,通过班级名称规则判定老校区/新校区,增加校区分析维度,使考勤标签更贴合校园实际管理场景。

参考上一步,再次添加“JavaScript代码”组件,命名为“校区类型判定”,输入的代码如下:

var class_campus_type
if (cla_name == null){
    class_campus_type = '未知'
} else if(cla_name.startsWith('白-') || cla_name.startsWith('东-')){
    class_campus_type = '新校区'
} else if (cla_name != null && !isEmpty(cla_name)){
    class_campus_type = '老校区'
} else{
    class_campus_type = '未知'
}

字段名称 class_campus_type,类型 String,“替换字段名或重命名”选择 否。

(此处为原文档图:校区类型判定脚本及字段设置)

2.3.10 结果入库

将统计结果写入目标表,形成标准化台账,便于后续查询、分析和追溯。

添加“表输出”组件,并创建从“校区类型判定”组件到表输出组件的连线。

(此处为原文档图:添加表输出组件)

双击表输出组件,数据库连接选择“团队私有数据库”。

(此处为原文档图:表输出基本配置)

勾选“裁剪表”(这样在插入数据前会清空原表数据,避免重复插入),勾选“指定数据库字段”(激活“数据库字段”标签页)。在“数据库字段”标签页中,右键选择“获取字段”。

(此处为原文档图:表输出数据库字段获取)

双击“表字段”中的字段名称,在下拉框中选择正确的对应字段。

(此处为原文档图:字段映射)

2.3.11 执行工作流

执行转换流,点击工具栏中的“执行”按钮。

(此处为原文档图:执行按钮)

在弹出的执行配置窗口中,选择默认配置,然后点击“启动”按钮,启动工作流。

(此处为原文档图:启动工作流)

查看日志:工作流执行后会打开日志页面,定期刷新工作流日志数据。

(此处为原文档图:执行日志)

查看数据库结果:打开“元数据”标签页,在“团队私有数据库”连接上右键选择“加载元数据”。

(此处为原文档图:加载元数据)

然后进入数据探查页面,展开“团队私有数据库”。

(此处为原文档图:展开数据库)

双击目标表 student_attendance_stats,在右侧页面选择“查询”标签页。

(此处为原文档图:查询表数据)

查看数据库表数据是否符合预期。

(此处为原文档图:查询结果)


三、问题与解决

问题1:写入目标表时报错 Column ‘gender’ cannot be null

现象:在写入学生考勤主题标签的目标表时,报错 Column ‘gender’ cannot be null。

原因:上游数据中部分学生的 gender 字段值为 NULL,而目标表该字段设置了 NOT NULL 约束,导致插入失败。

解决方法:在“替换NULL值”步骤中,将 gender 字段的所有 NULL 值替换为默认值 '未知'。处理后重新运行转换,不再出现非空约束错误,数据成功写入。

问题2:使用“字段选择”转换类型后预览出现乱码

现象:使用“字段选择”步骤转换类型后,预览数据出现乱码。

解决方法:放弃使用“字段选择”进行类型转换,改为在 CSV 输入组件中直接将字段类型设为 String,从源头保证数据为字符串类型。如果仍然需要字段选择(例如过滤字段或重命名),则只使用其“选择/删除”功能,不修改“元数据”中的类型。


四、实验结果

  • 完成 MySQL 数据源配置与三张原始表(raw_attendance、raw_attendance_type、raw_student_info)的创建与数据导入。
  • 实现考勤记录、考勤类型、学生信息三表关联。
  • 完成空值处理、字段标准化、标签衍生与指标统计。
  • 成功生成学生考勤主题标签表 student_attendance_stats。
  • 输出字段包含学生基础信息、年级、校区、住校状态及四类异常考勤统计,可直接用于学生用户画像分析。

五、实验总结

本次实验完整完成了从数据接入、多表关联、标签衍生、指标聚合到结果落地的 ETL 全流程操作。熟练掌握了 CSV 输入、表输入/输出、排序、记录集连接、JavaScript 脚本、分组、字段选择、空值替换、值映射等组件的用法。通过标准化考勤统计口径,实现了校园考勤数据自动化加工与标签化输出,达到了实训教学与业务应用的双重目标。

#助睿数智 #商业数据分析 #数据集成 #ETL #考勤分析 #学生画像

Logo

一站式 AI 云服务平台

更多推荐