一、实验背景
1.实验目的
基于“数智教育”大赛数据集,设计并实现学生多维度考勤统计助睿ETL转换流,掌握ETL数据处理全流程(数据接入、关联、衍生、聚合、落地),解决校园考勤人工统计效率低、口径不统一的问题;同时结合实验实际数据情况,优化空值处理逻辑,确保转换流可正常运行,输出精准的多维度考勤统计结果,为校园考勤管理提供数据支撑。
2.实验环境
工具平台:本次实验使用助睿数智(Uniplore)一站式数据科学平台。该平台覆盖从数据接入、ETL处理、机器学习建模到可视化展示的全链路零代码功能,适用于数据分析教学与企业数据加工场景。
平台访问地址:https://lab.guilian.cn/
产品官网:https://www.uniplore.com/
实验设备:计算机(支持助睿ETL平台运行,具备数据库连接权限)
数据源:“数智教育”大赛数据集,共包含7张核心业务表。本次实验聚焦考勤主题,实际使用以下3张表:
3_kaoqin.csv:考勤主表(事实表)
4_kaoqintype.csv:考勤类型码表(维度表)
2_student_info.csv:学生信息表(属性表)
3.处理流程
本次ETL转换流的整体处理逻辑如下,共分为五个阶段:
数据接入阶段:使用三个【表输入】组件分别读取考勤主表、考勤类型码表和学生信息表。
多表关联阶段:通过【记录集连接】组件依次完成两张关联操作。首先将考勤主表与考勤类型码表按考勤类型ID进行左外连接,为打卡记录补充标准化考勤事件名称;然后将关联结果与学生信息表按学生ID进行左外连接,引入学生基础属性。
字段处理与标签衍生阶段:
使用【字段选择】筛选保留核心字段;
使用【替换空值】对性别、政治面貌、出生日期等字段的空值统一替换为“未知”;
使用【字段衍生】基于班级名称生成“年级”和“校区类型”,基于住校字段生成“是否住校”标签。
指标聚合计算阶段:
使用【过滤记录】组件,根据考勤事件名称关键词并遵循“排除请假”口径,分别筛选出迟到/晚到、早退、请假、未穿校服四类行为记录;
使用【分组聚合】组件,以学生ID为分组维度,对四类行为分别进行计数统计。
结果落地阶段:使用【表输出】或【Excel输出】组件将最终统计结果写入目标数据库或文件,完成全流程处理。
二、实验步骤
1.准备工作
1.1导入文件
新建项目,名字为“学生用户画像标签构建”
打开项目
点击文件库,右键根目录,新建目录,名字为“数智教育数据集”
点击公共空间
点击数据资源
输入"3_kaoqin.csv",点更多,再点导出
选择导出路径,再点确定
同样输入“4_kaoqintype.csv“,“2_student_info.csv”,导出到我们新建的目录
可以看到目录下多了三个文件
1.2连接数据源
点击元数据,右键关系数据库,新建数据源
名字为“团队私有数据库”,其他按图中填写,用户名要和数据库名称一致,然后点击测试,测试成功后,点击添加
2.数据导入”团队私有数据库“
2.1创建原始_学生考勤表数据
点击资源库,右键根目录,点击新建转换流
名字为“创建原始_学生考勤表”,点击确定
双击进入转换流
点击组件库,搜索“执行一个SQL脚本”,把这个组件拖入画布
双击组件,选择团队私有数据库,把代码复制进去,点击确认
代码:
CREATE TABLE IF NOTEXISTS `raw_attendance` ( `id` bigintNOT NULL AUTO_INCREMENT COMMENT '自增ID', `attendance_id` varchar(64) DEFAULTNULL COMMENT '考勤ID', `learn_term` varchar(30) DEFAULTNULL COMMENT '学期', `data_datetime` varchar(50) DEFAULTNULL COMMENT '时间和日期', `attendance_type_id` varchar(64) DEFAULTNULL COMMENT '考勤类型ID', `attendance_name` varchar(100) DEFAULTNULL COMMENT '考勤名称', `attendance_task_order_id` varchar(64) DEFAULTNULL COMMENT '考勤事件ID', `stu_id` varchar(64) DEFAULTNULL COMMENT '学生ID', `stu_name` varchar(100) DEFAULTNULL COMMENT '学生姓名', `cla_name` varchar(100) DEFAULTNULL COMMENT '班级名', `cla_id` varchar(64) DEFAULTNULL COMMENT '班级ID', `create_time` datetime DEFAULTCURRENT_TIMESTAMP COMMENT '入库时间', PRIMARY KEY (`id`), KEY `idx_student_id` (`stu_id`), KEY `idx_term` (`learn_term`) ) COMMENT='原始_学生考勤表';
点击运行并启动
2.2原始_学生考勤表数据导入
新建转换流,名字为“导入原始_学生考勤数据”
点击组件库输入“CSV文件输入”,把组件拖入画布
步骤名称为“考勤记录”,文件为“3_kaoqin.csv”,编码为“UTF-8”
右键,获取字段
获取后点击确认
把表输出拖入画布,并连接,选择主输出步骤
双击表输出,选择“团队私有数据库”,目标表选择“raw_attendance”,勾上图中所示
获取字段
双击修改表字段,点击确认
运行
2.3创建原始_考勤类型表
接下来和上面类似
新建转换流,命名为“创建原始_考勤类型表”
拖入“执行一个SQL脚本”组件,
把代码复制进去,然后点击确认
代码:
CREATE TABLE IF NOTEXISTS `raw_attendance_type` ( `id` bigintNOT NULL AUTO_INCREMENT COMMENT '自增ID', `attendance_type_id` varchar(64) NOT NULL COMMENT '考勤类型id', `attendance_type_name` varchar(100) DEFAULTNULL COMMENT '考勤类型名称', `attendance_task_order_id` varchar(64) DEFAULTNULL COMMENT '考勤事件id', `attendance_task_name` varchar(100) DEFAULTNULL COMMENT '考勤事件名', `create_time` datetime DEFAULTCURRENT_TIMESTAMP COMMENT '入库时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_attendance_type_id` (`attendance_task_order_id`) )COMMENT='原始_考勤类型表';
运行
2.4导入原始_考勤类型表数据
新建转换流,命名为“导入原始_考勤类型表数据”
点击组件库输入“CSV文件输入”,把组件拖入画布
步骤名称为“考勤类型”,文件为“4_kaoqintype.csv”,列分隔符插入制表符,编码为“GB2”
右键,获取字段
获取后点击确认
把表输出拖入画布,并连接,选择主输出步骤
双击表输出,选择“团队私有数据库”,目标表选择“raw_attendance_type”,勾上图中所示
获取字段
双击修改表字段,点击确认
运行
2.5创建原始_学生基本信息表
新建转换流,命名为“创建原始_学生基本信息表”
拖入“执行一个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.6导入原始_学生基本信息表数据
新建转换流,命名为“导入原始_学生基本信息表数据”
点击组件库输入“CSV文件输入”,把组件拖入画布
文件为“2_student_info.csv”,编码为“UTF-8”
右键,获取字段
获取字段时,需要将“bf_leaveSchool”的字段类型修改为“String”
获取后点击确认
把表输出拖入画布,并连接,选择主输出步骤
双击表输出,选择“团队私有数据库”,目标表选择“raw_student_info”,勾上图中所示
获取字段
双击修改表字段,点击确认
运行
2.7创建学生考勤主题标签表
新建转换流,命名为“创建学生考勤主题标签表”
拖入“执行一个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='学生考勤主题标签表';
运行
2.8学生考勤主题标签构建
2.8.1获取考勤记录、考勤类型数据、学生信息数据
新建转换流,命名为“学生考勤主题标签”
拖入三个表输入
双击表输入,点击获取SQL查询语句
选择“raw_attendance“
点击确定,把步骤名称改为考勤记录,然后确认
双击表输入1,点击获取SQL查询语句
选择“raw_attendance_type“
点击确定,把步骤名称改为考勤类型,然后确认
双击表输入2,点击获取SQL查询语句
选择“raw_student_info“
点击确定,把步骤名称改为学生信息,然后确认
2.8.2关联考勤记录+考勤类型
把排序记录拖入画布,连接考勤记录
双击排序记录,步骤名称为“按照考勤类型和考勤任务类型排序”,然后获取字段
字段只留“attendance_type_id”、“attendance_task_order_id”,因为下一步连接是使用这两个字段进行连接,所以采用这两个字段对记录进行排序,点击确认
把记录集连接拖入画布
连接组件
双击记录集连接,配置如图所示,然后获取字段
字段只留“attendance_type_id”、“attendance_task_order_id”,然后点击确认
2.8.3统计学生异常考勤次数
拖入“JavaScript代码”组件到画布,连接
双击“JavaScript代码”组件,命名为“提取异常考勤记录”,输入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; } }
点击获取变量
点击测试脚本,出现我们定义的变量
然后点击确认
2.8.4多维度分组聚合统计
聚合规则
聚合函数:SUM(迟到标记)→ 迟到次数(late_count);
聚合函数:SUM(早退标记)→ 早退次数(early_count);
聚合函数:SUM(请假标记)→ 请假次数(leave_count);
聚合函数:SUM(没穿校服标记)→ 没穿校服次数(no_uniform_count)
拖入“分组”组件,并连接
双击“分组”组件,设置分组字段为“stu_id”、“stu_name”、“cla_id”、“cla_name”
设置句话字段为“leave_count”,“late_count”,"early_count","no_uniform_count"
2.8.5关联学生信息
拖入“排序记录”,连接
双击“排序记录”,名称为“按照学生编号进行排序”,只留“stu_id”,点击确认
复制
连接分组
名称为“考勤数据按学号排序”,点击确认
拖入”记录集连接“,连接组件
双击,配置组件,点击确认
2.8.6移除冗余字段
拖入”字段选择“
我们只要
学生 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)
所有要移除这些字段,点击确认
2.8.7空值处理
3个数据表关联后,字段“stu_sex”、“born_date”、“policy”、“live_on_campus”存在空值,需要对这么空值进行处理。
拖拽“替换NULL值”组件至画布,创建“移除冗余字段”字段选择组件到“替换NULL值”组件的连线,连线类型选择“主输出步骤”
双击“替换NULL值”组件,勾选“选择字段”
插入“stu_sex”、“born_date”、“policy”、“live_on_campus”,空值均替换为“未知”
2.8.8学生基础属性标准化处理
经过多表关联与字段筛选后,原始数据中住校状态为编码值,且缺少年级、校区类型等画像分析必需字段,无法直接用于学生考勤标签输出与后续用户画像分析。因此需要对学生基础属性进行标准化映射、缺失字段衍生,统一数据格式、补齐分析维度,保证标签表规范可用。
添加“值映射”组件到画布中,并创建替换NULL值组件到值映射组件的连线,并选择“主输出步骤”
双击“值映射”组件,步骤名称改为“住校状态映射”,使用的字段名为“live_on_campus”,不匹配时的默认值为“否”
插入
配置如图
拖拽“JavaScript代码”组件至画布中,创建住校状态映射组件到JavaScript代码组件的连线
双击“JavaScript代码”组件,步骤名称改为“从班级提取年级”,并输入代码:
代码:var gra_nameif (cla_name == null){ gra_name='未知'}elseif(cla_name.includes('高一')){ gra_name='高一'}elseif (cla_name.includes('高二')){ gra_name='高二'}elseif (cla_name.includes("高三")){ gra_name='高三'} else{ gra_name='未知'}
插入字段“gra_name”,类型为“String”,替换“字段名”或“重命名”值选择“否”,设置完成后点击“确认”
添加“JavaScript代码”组件.连接
命名为“校区类型判定”
代码:var class_campus_typeif (cla_name == null){ class_campus_type='未知'}elseif(cla_name.startsWith('白-') || cla_name.startsWith('东-')){ class_campus_type='新校区'}elseif (cla_name != null && !isEmpty(cla_name)){ class_campus_type='老校区'} else{ class_campus_type='未知'}
插入字段名称“class_campus_type”,类型为“String”,替换“字段名”或“重命名”值选择“否”
2.8.9结果入库
添加表输出组件,并创建“校区类型判定”“JavaScript代码组件到表输出组件的连线
基本配置
双击表字段中的字段名称,在下拉框中选择正确的对应字段
运行
三、实验结果
加载元数据
点击数据探查,双击目标表“student_attendance_stats”,在右侧页面选择“查询”tab标签
点击查询
空值为未知,违规次数也统计了
四、问题与解决
问题现象:修改表字段时不知道怎么修改
解决方法:双击字段名
五、实验总结
在实验过程中,我学会了使用平台如何排序,处理空值,如何分组,如何标准化,也深刻体会到ETL在校园数据治理中的实际价值。标准化的考勤统计流程可推广至学校日常管理,为教学管理、学生行为分析、异常预警等提供准确、及时的数据支撑。