1 实验说明

1.1 实验目的

本实验基于 “数智教育” 大赛数据集,构建学生多维度考勤统计的 ETL 转换流。通过数据接入、关联、衍生、聚合及落地等全流程操作,掌握 ETL 数据处理方法,以解决校园考勤人工统计效率低、口径不一致的问题。同时,结合真实数据优化空值处理策略,保证转换流平稳运行,输出准确的多维度考勤统计结果,为校园考勤管理提供可靠数据支撑。

1.2 实验环境

工具平台:助睿零代码在线实验平台(https://lab.guilian.cn/)

实验依托助睿数智(Uniplore)—— 一款 AI 驱动的一站式数据科学平台。该平台提供从数据接入、ETL 处理、机器学习建模到可视化展示的全链路零代码功能,适用于数据分析教学及企业数据加工场景。产品官网为 https://www.uniplore.com/ 。

数据源:“数智教育” 大赛数据集,包含 7 张核心业务表。

实验设备:计算机(可运行助睿 ETL 平台,具备数据库连接权限)。

1.3 实验范围

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

2 转换流整体设计

2.1 功能用途与业务价值

该转换流用于替代人工 Excel 统计,实现从原始打卡数据到标准化考勤结果的闭环处理,批量产出多维度指标。其价值在于固化统计口径、提升效率、沉淀台账,并提供灵活扩展能力 —— 新增考勤类型时无需修改转换流,高度适配校园考勤管理的核心需求。

2.2 核心处理逻辑

转换流遵循 “接入三大数据源 → 多表关联 → 标记考勤行为 → 计算核心指标 → 基础属性关联 → 结果落地” 的自动化处理链路,全程通过助睿 ETL 平台的可视化界面完成配置。

3 数据与标签梳理

3.1 源数据说明

本实验使用 “数智教育” 大赛数据集,共 7 张原始表。聚焦 “考勤主题”,从中筛选出与考勤行为直接相关的三张表,形成 “事实表 + 维度表 + 属性表” 的星型模型:

本次实验共使用三张核心数据源表,共同构成考勤分析的星型数据模型。

考勤主表(3_kaoqin) 用于存储学生每日打卡记录与考勤行为明细,关键字段包含学生 ID、班级 ID、学期、打卡时间、考勤类型 ID 及考勤描述。

考勤类型码表(4_kaoqintype) 用于提供考勤行为的标准名称,区分正常与异常考勤状态,关键字段为考勤类型 ID 与考勤事件名称。

学生信息表(2_student_info) 用于提供学生基础属性信息,支撑多维度统计分析,关键字段包括学生 ID、班级 ID、姓名、性别、出生日期、政治面貌及是否住校。

3.2 标签字段说明

考勤主题标签划分为三类:

3.2.1 学生基础属性标签 包括学生 ID、姓名、班级 ID、班级名称、性别、出生日期、政治面貌等,主要来源于学生信息表。这些字段是后续分维度统计的核心基础。

3.2.2 学生画像维度标签 衍生逻辑:从班级名称提取 “年级”;将 “是否住校” 字段映射为可读文本并处理空值;根据班级名称前缀判断 “校区类型”(新校区 / 老校区)。

3.2.3 考勤行为统计标签 聚焦四类异常行为:迟到次数、早退次数、请假次数、未穿校服次数,作为学生行为规范考核的关键指标。

3.3 标签处理口径

3.3.1 基础属性字段处理口径

  • 学生 ID、姓名、班级 ID、班级名称:直接取自考勤主表。

  • 性别、出生日期、政治面貌:从学生信息表获取,若为空则替换为 “未知”。

3.3.2 衍生维度字段处理口径

  • 年级:根据班级名称包含 “高一”“高二”“高三” 判定,否则为 “未知”。

  • 是否住校:1→“是”,0→“否”,空值→“未知”。

  • 校区类型:班级名以 “白 -” 或 “东 -” 开头为新校区,否则为老校区。

3.3.3 考勤行为指标统计口径

  • 迟到次数:考勤事件名包含 “迟到” 或 “晚到” 且非请假的记录数。

  • 早退次数:考勤事件名包含 “早退” 且非请假的记录数。

  • 请假次数:考勤事件名包含 “请假” 的全部记录数。

  • 未穿校服次数:考勤事件名包含 “校服” 的记录数。

4 实验步骤

4.1 创建实验项目

登录平台后,点击 “新建项目”。 填写项目名称 “学生用户画像标签构建”,确认创建。

创建成功,在数据集成页面可见新项目。

4.2 数据资源获取与管理

4.2.1 获取实验数据集

进入项目,在 “文件库” 右键根目录,新建目录 “数智教育数据集”。

进入 “公共空间”→“数据资源”,将实验所需的 3_kaoqin.csv、4_kaoqintype.csv、2_student_info.csv 依次导出至该目录。

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

4.2.2 建立数据源连接

在 “元数据” 页,右键 “关系数据库” 新建数据源。连接类型选择 MySQL,填入助教提供的服务器地址、端口、数据库名、账号密码,驱动选 “MySQL 8+”,命名为 “团队私有数据库”。测试连接成功后保存。

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

[4.2.3.1](4.2.3.1) 原始考勤记录表导入 新建转换流 “创建原始_学生考勤表”,使用 “执行 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='原始_学生考勤表';

再新建转换流 “导入原始考勤数据”,使用 “CSV 文件输入” 组件加载 3_kaoqin.csv,通过 “表输出” 组件将数据写入 raw_attendance 表。
点击文件名后的“浏览文件”按钮,在弹出的窗口中选择“3_kaoqin.csv”,点击“确定”

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

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

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

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

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

[4.2.3.2](4.2.3.2) 原始考勤类型表导入 参照上述步骤,创建 raw_attendance_type 表,SQL 如下:

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='原始_考勤类型表';

导入 4_kaoqintype.csv 时请注意:该 CSV 列分隔符为制表符(TAB),编码为 GB2312。

表输出组件的配置与“4.2.3.1 原始考勤记录表数据导入”小节的一样

[4.2.3.3](4.2.3.3) 原始学生基本信息表导入 建表 raw_student_info,SQL 如下:

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='原始_学生信息表';

导入 2_student_info.csv 时,需使用 “字段选择” 组件将 bf_zhusu、bf_qinshihao 字段的元数据设置为 Integer,再通过表输出写入目标表。

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

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

执行转换流:

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

新建转换流,执行 SQL 脚本创建 student_attendance_stats 表:

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='学生考勤主题标签表';

4.3 学生考勤主题标签构建

4.3.1 转换流逻辑说明

本转换流按 “数据接入 — 清洗整合 — 维度拆解 — 标签标记 — 指标计算 — 结果落地” 流程运行,各组件作用如下:

  • 表输入:读取原始数据

  • 排序记录:为连接准备有序数据

  • 记录集连接:关联考勤与类型表、关联学生信息

  • JavaScript 脚本:生成异常行为标记

  • 分组:聚合统计各类次数

  • 替换 NULL 值 / 值映射:处理空值、转换住校状态

  • 表输出:写入目标表

4.3.2 数据接入

新建转换流 “学生考勤主题标签”,解锁画布后,拖入三个 “表输入” 组件,分别配置为 “考勤记录”、“考勤类型”、“学生信息”,从对应原始表获取全部字段。

在数据库中选择“raw_attendance”原始_学生考勤表

同样的,参考以上步骤,将“表输入 1”和“表输入 2”组件分别命名为“考勤类型”和“学生信息”,分别获取“raw_attendance_type”考原始_考勤类型表和“raw_student_info”原始_学生信息表所有字段数据

4.3.3 关联考勤记录与考勤类型

对 “考勤记录” 添加 “排序记录” 组件,按 attendance_type_id 和 attendance_task_order_id 排序;再拖入 “记录集连接” 组件,以左外连接方式关联已排序的考勤记录与 “考勤类型” 表,连接字段同上。

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

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

2个Transform字段中仅保留“attendance_type_id”、“attendance_task_order_id”字段,这样做表示使用这2个字段进行记录连接。可以使用“删除选中的行”批量删除多个字段。

4.3.4 行为标签衍生

添加 “JavaScript 代码” 组件,编写脚本根据 attendance_type_name 和 attendance_task_name 生成四个标记(值为 1 或 0)。核心代码如下:

// 初始化变量
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;
    }
}

测试脚本确保标记只包含 1 和 0,预览数据确认行为识别准确。

4.3.5 多维度分组聚合

拖入 “分组” 组件,分组字段设为 stu_id、stu_name、cla_id、cla_name,聚合字段对 isLate、isEarly、isLeave、isNoUniform 使用 SUM 函数,得到迟到、早退、请假、未穿校服次数。

4.3.6 关联学生信息

为 “学生信息” 表添加排序组件,按 stu_id 排序;将上一步聚合结果也按 stu_id 排序。再拖入 “记录集连接” 组件,左外连接学生信息,为数据补充性别、出生日期、政治面貌、住校状态等。

由于考勤记录数据不是按“学号”升序记录的,所以在进行记录关联前,也需要对数据进行排序。再次添加“排序记录”,并建立“记录集连接”组件到“排序记录”组件的连接线

4.3.7 移除冗余字段

使用 “字段选择” 组件,仅保留后续需要的核心字段:学生 ID、姓名、班级 ID、班级名称、四项行为次数、性别、出生日期、政治面貌、住校状态。

在获取的字段中,**删除以下核心字段外,其他字段保留,**为后续时间维度拆解和行为标签衍生奠定基础:

学生 ID(stu_id)

学生姓名(stu_name)

班级 ID(cla_id)

班级名称(cla_name)

迟到次数(late_count);

早退次数(early_count);

请假次数(leave_count);

没穿校服次数(no_uniform_count)

性别(stu_sex)

出生日期(born_date)

政治面貌(policy)

是否住校(live_on_campus)

在字段选择组件鼠标右键弹出菜单,点击“显示输出字段”,查看输出字段是否正确

4.3.8 空值处理

3个数据表关联后,字段“stu_sex”、“born_date”、“policy”、“live_on_campus”存在空值,需要对这么空值进行处理。拖入 “替换 NULL 值” 组件,将 stu_sex、born_date、policy、live_on_campus 字段的空值统一替换为字符串 “未知”。

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

住校状态映射:添加 “值映射” 组件,将 live_on_campus 字段的 0 映射为 “否”,1 映射为 “是”,不匹配默认 “否”。

从班级名提取年级:使用 “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 字段类型为 String,替换方式为 “否”。

校区类型判定:再添加 “JavaScript 代码” 组件,代码如下:

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,替换方式 “否”。

4.3.10 结果入库

拖入 “表输出” 组件,连接 “团队私有数据库”,目标表为 student_attendance_stats。勾选 “裁剪表” 以避免数据重复,并指定数据库字段映射,确保所有字段正确对应。

勾选“指定数据库字段”,建立工作流字段与数据库表字段的映射关系。勾选后会激活“数据库字段”tab页,在数据库字段tab页,右键选择“获取字段”

4.3.11 执行转换流并验证结果

点击工具栏 “执行” 按钮,使用默认配置启动工作流。观察执行日志,确认所有组件运行成功。

4.3.12 查看数据库结果

在 “元数据” 页刷新数据库连接,展开 “团队私有数据库”,打开 student_attendance_stats 表,进入 “查询” 标签查看数据。核对各维度统计数值是否符合预期。

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

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

五、实验结果分析

数据成功入库,成功将3_kaoqin.csv、4_kaoqintype.csv、2_student_info.csv三张源数据导入 MySQL 数据库,生成raw_attendance、raw_attendance_type、raw_student_info三张原始表。

完成学生考勤主题标签表student_attendance_stats创建,转换流执行无报错,数据正常写入目标表。标签与指标生成正常,成功衍生年级、是否住校、校区类型三类学生画像标签,空值统一替换为 “未知”。

按学生 + 班级维度完成聚合统计,准确输出迟到、早退、请假、未穿校服四项考勤指标。多表关联准确,考勤主表与类型码表、学生信息表左外连接无数据丢失、无重复膨胀,关联键匹配正确。

输出结果符合业务口径,统计规则与实验要求一致,数据可直接用于校园考勤分析与学生行为管理。

六、问题与解决

问题:4_kaoqintype.csv使用 GB2312 编码与 TAB 分隔,直接读取出现乱码。

解决:在 CSV 文件输入组件手动设置编码 = GB2312、列分隔符 = TAB,重新获取字段恢复正常。

字段类型不匹配导致导入失败

问题:bf_zhusu、bf_qinshihao等字段类型与目标表不一致,表输出报错。

解决:添加字段选择组件修改元数据类型,统一为 Integer/String 后再输出。

空值过多导致统计字段显示 NULL

问题:未排序直接连接,出现数据匹配不全。

解决:连接前按关联键attendance_type_id、attendance_task_order_id、stu_id做排序记录,保证连接稳定。

七、实验总结

掌握零代码 ETL 平台完整流程:数据接入→清洗→关联→衍生→聚合→落地。理解星型模型在考勤主题中的应用,学会事实表与维度表的设计与关联。

熟练处理CSV 编码、字段类型、空值、重复数据、连接排序等常见数据质量问题。能够根据业务口径编写JavaScript 标签脚本,实现行为标记与维度衍生。

实验价值

本实验实现校园考勤从人工 Excel 统计到自动化 ETL 处理的升级,统一口径、提升效率、减少错误。输出的student_attendance_stats表可直接支撑班级考勤排名、年级对比、住校 / 走读行为差异、校区对比等分析场景。

改进方向

可增加学期、月份时间维度,实现按时间周期统计。可加入异常值过滤、重复打卡去重逻辑,进一步提升数据质量。可将转换流封装为作业流定时执行,实现每日 / 每周自动更新考勤报表。

本次实验完整完成了学生多维度考勤统计的 ETL 全流程开发,达到实验目标,为后续教育数据治理与学生画像构建打下扎实基础。

Logo

一站式 AI 云服务平台

更多推荐