news 2026/5/21 6:21:11

助睿实验作业2-学生用户画像考勤-主题标签构建

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
助睿实验作业2-学生用户画像考勤-主题标签构建

一、实验背景

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在校园数据治理中的实际价值。标准化的考勤统计流程可推广至学校日常管理,为教学管理、学生行为分析、异常预警等提供准确、及时的数据支撑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 6:20:41

我用 AI 造了个“头条精灵“,从此热点追踪快人一步!

AiPy Pro 是知道创宇推出的 AI 智能体软件,可以用大白话完成 PPT 制作、股票量化研究、文档处理分析等任务。今天我用它创建了一个专属的今日头条技能,效率提升简直不要太爽! 为什么我要创建一个"头条技能"? 作为一个…

作者头像 李华
网站建设 2026/5/21 6:19:19

程序员修炼之道:从代码到思维的进阶指南

论一个程序员的修养:从代码到思维的技术修炼之路 一、 引言:何为“程序员修养”? 1.1 定义:超越单纯技术能力的综合素养 1.2 重要性:提升代码质量、工作效率、团队协作、职业发展的基石 1.3 目标:成为值得信赖、高效、可持续成长的工程师 二、 核心思维修养 2.1 严谨的逻…

作者头像 李华
网站建设 2026/5/21 6:11:06

DAC代码干扰分析与硬件设计解决方案

1. 项目概述:当DAC输出“打架”时,我们该怎么办?在模拟电路设计,尤其是涉及高精度数据转换的领域里,工程师们常常会遇到一个令人头疼的现象:你给一个数模转换器(DAC)输入一个稳定的数…

作者头像 李华
网站建设 2026/5/21 6:09:42

从链表到队列再到递归:三种方法搞定约瑟夫环,哪种才是你的菜?

约瑟夫环问题:循环链表、队列与递归的三重解法深度剖析 约瑟夫环问题作为经典的算法题目,在技术面试和算法竞赛中频繁出现。这个问题不仅考察编程者对数据结构的理解,更考验其在不同解决方案间权衡取舍的能力。本文将深入探讨循环链表、STL队…

作者头像 李华