一、实验背景

1.1 实验目的

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

1.2 实验环境

  • 工具:助睿零代码在线实验平台
    本次实验使用 助睿数智(Uniplore) —— AI驱动的一站式数据科学平台,覆盖数据接入、ETL处理、机器学习建模到可视化展示的全链路零代码功能。
  • 数据源:“数智教育”大赛数据集(共包含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.csv2_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_zhusubf_qinshihao 这两个字段为Integer类型,为避免出现小数,需要使用“字段选择”组件来固化并规范。

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

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

双击“字段选择”组件,在配置窗口中点击“元数据”,并在空白处插入2行,将 bf_zhusubf_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_idattendance_task_order_id 两个字段(因为下一步连接使用这两个字段)。最后设置步骤名称为“按照考勤类型和考勤任务类型排序”。

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

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

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

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

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

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

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

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

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

两个Transform中仅保留 attendance_type_idattendance_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_idstu_namecla_idcla_name

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

设置聚合字段为:late_countearly_leave_countleave_countuniform_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_sexborn_datepolicylive_on_campus 可能存在空值,需要对空值进行处理。

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

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

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

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

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

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

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

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

继续插入行,将 born_datepolicylive_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_attendanceraw_attendance_typeraw_student_info)的创建与数据导入。
  • 实现考勤记录、考勤类型、学生信息三表关联。
  • 完成空值处理、字段标准化、标签衍生与指标统计。
  • 成功生成学生考勤主题标签表 student_attendance_stats
  • 输出字段包含学生基础信息、年级、校区、住校状态及四类异常考勤统计,可直接用于学生用户画像分析。

五、实验总结

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

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

Logo

一站式 AI 云服务平台

更多推荐