学生用户画像构建-考勤数据ETL通关指南:那些文档没告诉你的事
一、实验背景
1 实验说明
1.1 实验目的
基于 “数智教育” 大赛数据集,设计并实现学生多维度考勤统计助睿 ETL 转换流,掌握 ETL 数据处理全流程(数据接入、关联、衍生、聚合、落地),解决校园考勤人工统计效率低、口径不统一的问题;同时结合实验实际数据情况,优化空值处理逻辑,确保转换流可正常运行,输出精准的多维度考勤统计结果,为校园考勤管理提供数据支撑。
1.2 实验环境
-
工具:助睿数智(Uniplore)的数据集成平台(ETL)(实验地址:https://lab.guilian.cn/)、MySQL 数据库
-
数据源:“数智教育” 大赛数据集(共包含 7 张核心业务表)
-
实验设备:计算机(支持助睿 ETL 平台运行,具备数据库连接权限)
1.3 实验范围
本次实验覆盖助睿 ETL 转换流全流程配置,包括多表数据接入、多表关联、考勤行为标签衍生、多维度聚合统计及结果落地入库;重点验证数据关联的精准性及统计指标的准确性,结合实验数据实际情况优化配置,确保实验顺利完成。
2 转换流整体设计
2.1 功能用途与业务价值
本转换流替代人工 Excel 统计,实现考勤数据从原始打卡到标准化结果的闭环处理,批量输出多维度指标;同时固化口径、提升效率、沉淀台账,提供数据支撑,且可灵活扩展新考勤类型,无需修改转换流,适配校园考勤管理的核心需求。
2.2 核心处理逻辑
转换流核心逻辑:接入三大数据源→多表关联→标记考勤行为→计算核心指标→基础属性关联→落地统计结果,实现全流程自动化,通过助睿 ETL 平台可视化界面完成配置。
3 数据与标签梳理
根据转换流的逻辑,需要对数据与标签进行梳理,确定数据源、标签维度、标签计算口径。
3.1 源数据说明
本次转换流处理的数据来源于 “数智教育” 大赛数据集,原始数据集共包含 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.2 标签字段说明
学生考勤主题标签可分为三类:学生基础属性标签、学生画像维度标签和考勤行为指标标签。
3.2.1 学生基础属性标签
选表依据:这些字段是学生的基础身份信息,主要从学生信息表(2_student_info)获取。考勤主表中也包含部分学生信息,可作为交叉验证。这些基础属性是后续分维度统计的核心依据。
示例用途:可按性别分析男生与女生的迟到考勤差异,可按政治面貌分析不同群体的考勤行为特点。
3.2.2 学生画像维度标签
选表依据:这三个标签字段属于衍生维度,原始数据中没有直接提供,需要根据班级名称和住校字段进行二次加工。年级维度有助于学校按年级进行考勤管理和对比分析;住校维度用于区分住校生和走读生,两者的考勤行为模式存在差异;校区类型维度源于数据说明中提到的 2017-2018 年新校区启用情况,不同校区的管理规则可能不同。
示例用途:可按住校状态分析走读生是否更容易迟到,可按校区类型对比新旧校区的校服穿戴规范执行情况。
3.2.3 考勤行为统计标签
选表依据:这四类异常考勤行为是学校日常学生管理的核心关注点。迟到和早退反映学生的时间管理能力和纪律意识,请假次数可用于区分正常缺勤与异常缺勤,校服穿戴是学校行为规范的重要考核项。根据数据说明中的描述,“校服 [移动考勤]” 特指未穿校服的情况。
示例用途:可分析学生不同异常考勤次数,判断考勤风险等级。
3.3 标签处理口径
所有标签口径统一固化,确保统计结果准确可比,具体如下:
3.3.1 基础属性字段处理口径
3.3.2 衍生维度字段处理口径
3.3.3 考勤行为指标统计口径
统计口径设计理由:
-
排除请假记录:请假属于正常缺勤,不应计入迟到或早退的违规统计,避免重复计数和误判。
-
请假全覆盖:只要考勤事件名称中包含 “请假” 关键词,无论事假、病假或其他类型,均计入请假次数。
-
校服违规唯一识别:根据数据说明中的描述,考勤类型中的 “校服 [移动考勤]” 明确指未穿校服,因此包含 “校服” 关键词的记录即为违规。
二、 实验步骤
4.1 创建实验项目
点击 “新建项目”,输入项目名称 “学生用户画像标签构建”,点击 “确定”创建成功后即可在数据集成页面看到新创建的项目
4.2 数据资源获取
为方便后续的数据使用,我们可以将原始数据导入我们的团队私有数据库项目创建成功后点击该项目右上角 “[打开项目]”,点击 “打开项目”
在项目页面,可以看到左侧有个菜单:资源库、文件、元数据
资源库用于对工作流的管理,包括新建、删除、修改、查看工作流的信息;导入 Hdfs 工作空间,调度管理等操作
文件库用于保存工作流中需要用到的文件和工作流产生的文件
元数据管理是工作流中需要用到的可以为工作流定义运行配置、数据库、flink 集群等配置
4.2.1 获取实验数据集
首先获取本次的实验数据集:点击 “文件库”,右键根目录,点击 “新建目录”输入目录名称为 “数智教育数据集”,点击 “确定”
接下来我们将公共空间的数据源导入到这个目录下点击公共空间点击 “数据资源”点击 “3_kaoqin.csv” 卡片右上角的 “更多”,并点击 “导出”,在弹出的窗口中选择导出到刚刚新创建的目录下点击 “确定”可以看到在 “数智教育数据集” 的目录下,新增了 3_kaoqin.csv
按上面导出操作,将本次实验用到的数据表 4_kaoqintype.csv 和 2_student_info.csv 都导出到 “数智教育数据集”
4.2.2 建立数据源连接
在元数据 tab 页,关系数据库右键打开菜单,选择 “新建数据源”弹出新建数据库连接窗口,连接类型选择 “MySQL”,用户和密码使用助睿提供的账号和密码,服务器主机名使用助睿提供的数据库连接地址:rm-2vzqk06bag39a5n.mysql.rds.aliyuncs.com,端口号为 3306,数据库名称为你分配的数据库名称完整参数参考如下:填写完毕后,点击 “测试” 按钮验证填写信息是否正确,如果填写无误,会返回 “数据库连接成功”最后点击 “添加” 增加了一个数据库连接,添加成功后,关系数据库节点会增加一个子节点
4.2.3 数据导入团队私有数据库
4.2.3.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='原始_学生考勤表';
其他参数使用默认选项,完成后组件配置如下:
完成后运行转换流,运行过程会定时刷新组件状态,并画布显示执行日志。
(2)导入原始考勤数据
新建工作流,并命名为 “导入原始考勤数据”,在该工作流中拖拽一个 “CSV 文件输入” 组件到画布
双击 CSV 文件输入组件,在步骤名称中输入 “考勤记录”
点击文件后的 “浏览文件” 按钮,在弹出的窗口中选择 “3_kaoqin.csv”,点击 “确定”
列分隔符选择默认参数,编码选择 “UTF-8”
全部字段获取成功后点击 “确认”
接下来拖拽一个 “表输出” 组件到画布,并创建 “考勤记录 CSV 文件输入” 组件到 “表输出” 组件的连线,连线类型选择 “主输出步骤”
双击“表输出”组件,基本配置中,数据库连接选择“团队私有数据库”,目标表输入我们使用SQL组件创建的“raw_attendance”,具体配置如下:
点击 “数据库字段”,在空白处建 “获取字段”
将表字段修改为建表语句中对应的字段,点击 “确认”
完成后运行转换流,运行过程会定时刷新组件状态,并画布显示执行日志。
4.2.3.2 原始考勤类型表数据导入
可重复 4.2.3.1 原始考勤记录表导入小节中的实验操作,完成原始考勤类型表 4_kaoqintype.csv 数据导入团队私有数据库中。
代码示例:
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”
表输出组件的配置与 “4.2.3.1 原始考勤记录表数据导入” 小节的一样
配置完成后执行转换流,运行过程会定时刷新组件状态,并画布下面显示执行日志
4.2.3.3 原始学生基本信息表数据导入
可重复 4.2.3.1 原始考勤记录表导入小节中的实验操作,完成原始学生信息表 2_student_info.csv 数据导入团队私有数据库中。
代码示例:
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 数据
获取字段时,将 bf_leaveSchool 的字段类型修改为 String
特别说明:bf_zhusu、bf_qinshihao 为 Integer 类型,为避免小数,需用字段选择组件规范并转换
拖拽「字段选择」组件,创建 CSV 文件输入→字段选择的连线(类型为 “主输出步骤”)
双击「字段选择」组件,在配置窗口中点击 “元数据”,新增 2 行,将 bf_zhusu、bf_qinshihao 的数据类型设置如下:
使用表输出组件,将 2_student_info.csv 数据输出到团队私有数据库的 raw_student_info 表中
执行转换流,完成学生信息数据导入
4.2.4 创建学生考勤主题标签表
新建转换工作流并命名为 “创建学生考勤主题标签表”
拖拽「执行一个 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='学生考勤主题标签表';
其他参数使用默认选项,完成组件配置
运行转换流,运行过程会定时刷新组件状态,并在画布下方显示执行日志
4.3 学生考勤主题标签构建
4.3.1 数据转换流逻辑说明
-
整体流程:数据接入→清洗数据→维度拆解→标签运行→指标计算→结果落地
-
数据接入:接入考勤原始表、考勤类型表、学生信息基础表
-
数据整合:多表关联,将原始打卡记录与学生年级、住校属性、考勤事件名称整合
-
指标统计:按已关联的各字段自动多维度聚合统计各类异常次数
-
结果落地:统一写入考勤统计结果表,供报表、查询、分析直接使用
整体逻辑流程
各组件作用
4.3.2 数据接入:获取考勤记录、考勤类型数据、学生信息数据
首先,我们需要获取考勤记录、考勤类型数据、学生信息数据。考勤记录表记录了每位学生每天的考勤行为,考勤类型表定义了每种考勤行为对应的类型名称(如正常考勤、没穿校服等),学生信息表提供了学生是否住校的核心属性。只有将这三份数据分别接入并后续关联起来,才能完整判断学生的每次考勤是正常还是违纪,同时支撑住校相关维度的统计。
-
切换到资源库,在当前根目录下,点击「新建转换流」
-
输入转换流名称 “学生考勤主题标签”,点击 “确定”
-
创建成功后进入转换流设计页面
-
点击「编辑」图标解锁,进入可编辑状态
-
点击「组件」→ 搜索 “表输入”,拖拽 3 个「表输入」组件到画布
双击第一个「SQL 查询」组件,步骤名称修改为 “考勤记录”,数据库连接选择 “团队私有数据库”,并点击 “获取 SQL 查询语句”
在数据库中选择 “raw_attendance” 原始_学生考勤表
系统提示弹窗中点击 “确认”,获取 “raw_attendance” 考勤记录表的所有字段
获取 SQL 查询语句后,点击 “确认”
同样的,参考以上步骤,将 “表输入 1” 和 “表输入 2” 组件分别命名为 “考勤类型” 和 “学生信息”,分别获取 “raw_attendance_type” 考原始_考勤类型表和 “raw_student_info” 原始_学生信息表所有字段数据
4.3.3 数据关联:关联考勤记录 + 考勤类型
使用表输入组件读取考勤记录、考勤类型数据后,需通过记录集连接组件完成数据关联,补充关键业务信息,为后续指标计算奠定基础。使用记录集连接组件,将考勤主表与考勤类型码表关联 —— 因为考勤记录表只有考勤类型 ID(attendance_type_id)和考勤任务顺序 ID(control_task_order id),缺少具体的考勤行为名称,而通过记录集组件进行连接,可为每条考勤记录补充 “正常考勤 / 没穿校服 / 迟到 / 请假” 等具体行为信息,确保后续能准确识别各类考勤行为。具体操作如下:
-
在组件搜索 “记录集连接” 组件,并将组件拖拽至画布中
-
创建 “考勤记录” CSV 文件输入组件到记录集连接组件的连接线
-
在建立连接线时,会出现 “排序需要” 的提示。这是由于记录集连接组件是按接收数据的顺序进行记录关联的,如果接收的数据是无序的,可能会造成记录连接结果出错。
-
为避免因为排序问题造成连接结果出错。添加一个排序记录组件到转换流的 “考勤记录” 与 “记录集连接” 之间。
-
双击 “排序记录” 组件,通过 “获取字段” 功能获取字段列表,然后删除多余字段,只保留 “attendance_type_id”、“attendance_task_order_id” 字段。因为下一步连接是使用这两个字段进行连接,所以采用这两个字段对记录进行排序。最后设置步骤名称为 “按照考勤类型和考勤任务类型排序”。
-
创建 “考勤类型” 表输入组件到记录集连接组件的连接线。由于 “考勤类型” 组件的记录默认是按 “attendance_type_id”、“attendance_task_order_id” 这两个字段升序记录的,所以无需再次排序。
-
需要通过记录集连接组件来配置 “考勤记录” 和 “考勤类型” 两个表的关联关系。双击记录集连接组件,在下拉列表中选择需要连接的数据来源,第一个 Transform 为 “按照考勤类型和考勤任务类型排序”,第二个 Transform 选择 “考勤类型”,连接类型选择 LEFT OUTER。
-
点击第一个 Transform 的连接字段中的 “获得连接字段” 按钮,即可获取考勤记录的字段
-
获取第二个 Transform 的连接字段
-
2 个 Transform 连接中仅保留 “attendance_type_id”、“attendance_task_order_id” 字段,这样做表示使用字段进行连接,可以使用 “删除字段” 的批量删除多个字段。
-
删除完多余字段后,点击 “确认”,若删除错误,可重新获取连接字段再进行删除
4.3.4 行为标签衍生:统计学生异常考勤次数
通过 JavaScript 脚本生成考勤行为二进制标记,为后续聚合统计提供支撑,确保标签判断精准。具体操作如下:
-
添加 “JavaScript 代码” 组件,对接 “记录集连接” 组件的输出,通过关键词匹配,生成二进制判断标签(1 = 是,0 = 否),用于后续指标聚合。
-
双击 “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;
}
}
-
使用 “获取变量” 获取输出字段,系统将自动解析脚本中变量定义代码,生成字段数据。
-
点击 “JavaScript 脚本” 组件的 “测试脚本” 按钮,确认标记字段(is_late、is_early、is_leave 等)仅存在 1 和 0 两值,标签判断准确(如迟到记录对应 is_late=1,正常出勤对应 is_compliant=1),无异常。
4.3.5 多维度分组聚合统计
实验核心:按两大统计维度聚合数据,将明细数据转化为统计指标,满足多层级考勤管理需求。具体操作如下:在考勤 ETL 中拖拽 2 个 “分组” 组件,分别对接 “用户自定义 Java 表达式” 组件的输出,按两大统计维度进行聚合,统一聚合指标,确保数据全覆盖:
聚合规则:
-
聚合函数:SUM(迟到标记)→ 迟到次数(late_count);
-
聚合函数:SUM(早退标记)→ 早退次数(early_count);
-
聚合函数:SUM(请假标记)→ 请假次数(leave_count);
-
聚合函数:SUM(没穿校服标记)→ 没穿校服次数(no_uniform_count)
操作如下:
-
添加 “分组” 组件,并建立连接线,连线选择主输出步骤。
-
双击 “分组” 组件,设置分组字段为
stu_id、stu_name、cla_id、cla_name。 -
设置聚合字段为
late_count、early_count、leave_count、no_uniform_count、compliant_count、total_attendance。
4.3.6 关联学生信息
基于上述结果,使用记录集连接组件,关联学生信息表 —— 因为考勤记录表仅包含学生 ID 和班级 ID,缺少学生是否住校的核心属性,通过按学生 ID 关联学生信息表,可补全该属性,支撑住校相关维度的统计。具体操作如下:
-
由于学生信息数据中的学号表不是升序记录的,所以在进行记录关联前,也需要对数据进行排序。再次添加 “排序记录”,并建立 “学生信息” 表输入组件到 “排序记录” 组件的连接线。
-
双击 “排序记录” 组件,通过 “获取字段” 功能获取字段列表,然后删除多余字段,只保留
stu_id字段。因为下一步连接是使用这个字段进行连接,所以采用这个字段对记录进行排序。最后设置步骤名称为 “按照学生编号进行排序”。
-
拖拽 “记录集连接” 组件至画布中,创建 “按照学生编号进行排序” 排序记录组件到 “记录集连接 1” 组件的连接线。
-
由于考勤记录数据不是按 “学号” 升序记录的,所以在进行记录关联前,也需要对数据进行排序。再次添加 “排序记录”,并建立 “记录集连接” 组件到 “排序记录” 组件的连接线。
-
双击 “排序记录” 组件,按下图进行配置,步骤名称设置为 “考勤数据按学号排序”,排序字段为
stu_id。
-
创建 “考勤数据按学号排序” 记录排序组件到 “记录集连接 1” 组件的连线,关联学生信息和考勤记录信息。
-
“记录集连接 1” 组件的第一个 Transform 选择 “考勤数据按学号排序”,第二个 Transform 选择 “按照学生编号进行排序”,连接类型选择
LEFT OUTER。 -
点击 “第一个 Transform” 的连接字段中 “获得连接字段” 按钮,获取
stu_id;在第二个 Transform 的连接字段中,选择stu_id,用于后续的 LEFT OUTER 连接,表示用考勤记录的字段stu_id与学生信息表的字段stu_id进行左外连接。 -
点击 “确认”,若删除错误,可重新获取连接字段再进行删除。
4.3.7 字段选择:移除冗余字段经过多表关联和前期移入数据中包含大量与考勤统计无关的数据处理(如学生信息中的非必要属性),计算出关联数据后,只保留核心字段,移除冗余字段,才能提升处理效率,确保流转的数据链路清晰。具体操作如下:
-
按 “字段选择” 拖拽到画布中,创建 “记录集连接 1” 组件到 “字段选择” 组件的连接线。
-
双击 “字段选择” 组件,在配置弹窗中,步骤名称输入 “移除冗余字段”,点击 “移除” Tab 标签,右键空白处并点击 “获取字段”,删除以下字段,仅保留以下核心字段,其他字段保留,为后续时间维度拆解和行为标签衍生奠定基础:
-
学生 ID(stu_id)
-
学生姓名(stu_name)
-
班级 ID(cla_id)
-
迟到次数(late_count);
-
早退次数(early_count);
-
请假次数(leave_count);
-
没穿校服次数(no_uniform_count)
-
性别(stu_sex)
-
出生日期(born_date)
-
政治面貌(policy)
-
是否住校(live_on_campus)
-
在字段选择组件鼠标右键弹出菜单,点击 “显示输出字段”,查看输出字段是否正确
4.3.5 空值处理
3 个数据表关联后,字段 “stu_sex”、“born_date”、“policy”、“live_on_campus” 存在空值,需要对这么空值进行处理。拖拽 “替换 NULL 值” 组件,创建 “移除冗余字段” 字段选择组件到 “替换 NULL 值” 组件的连线,连线类型选择 “主输出步骤”
双击 “替换 NULL 值” 组件,勾选 “选择字段”
在字段空白表格中右键。点击 “插入”
双击插入的行,字段名称选择 “stu_sex”
继续插入行,将 “born_date”、“policy”、“live_on_campus”、“cla_id” 的空值均替换为 “未知”
4.3.6 学生基础属性标准化处理
经过多表关联与字段筛选后,原始数据中仅住校状态为编码值,且缺少年级、校区类型等画像分析必需字段,无法直接用于学生考勤标签输出与后续用户画像分析。因此需要对学生基础属性进行标准化映射、缺失字段衍生,统一数据格式、补充分析维度,让标签表现规范可用。
4.3.6.1 住校状态映射
原始住校状态以数字形式存储,可读性差且存在空值,通过映射转换为规范文本并处理空值,使标签表更直观,同时满足住校/走读考勤对比分析的需求。
添加 “值映射” 组件到画布中,并创建替换 NULL 值组件到值映射组件的连线,并选择 “主输出步骤”
双击 “值映射” 组件,步骤名称改为 “住校状态映射”,使用的字段名为 “live_on_campus”,不匹配时的默认值为 “否”
在下方字段值表格空白处右键,点击 “插入”
在源值中输入 “0”,目标值输入 “否”,代表将原数据中的 0 统一映射为否
同样的,再插入一行,在源值中输入 “1”,目标值输入 “是”,并点击 “确认”
4.3.6.2 从班级名提取年级
原始数据无独立年级字段,无法按年级做考勤统计与画像分群,通过从班级名称中提取年级信息,补齐年级维度,支撑年级层面的考勤分析。
拖拽“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”,替换“字段名或重命名值”值选择“否”,设置完成后点击“确认”
4.3.6.3 校区类型判定
原始数据无校区类型字段,不同校区管理口径与考勤规则存在差异,通过班级名称规则判定老校区/新校区,增加校区分析维度,使考勤标签更贴合校园实际管理场景。
参考“4.3.5.2 从班级名提取年级”步骤,添加“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.7 结果入库
实验核心:将统计结果写入目标表,形成标准化台账,便于后续查询、分析和追溯。具体操作如下:
-
添加表输出组件,并创建“校区类型判定”JavaScript代码组件到表输出组件的连线
-
双击表输出组件,选择“团队私有数据库”连接
-
勾选“裁剪表”,这样表输出组件在插入数据前会清空原始数据表,避免重复插入
-
勾选“指定数据库字段”,建立工作流字段与数据库表字段的映射关系。勾选后会激活数据库字段tab页,在数据库字段的页,右键选择“获取字段”,双击表字段中的字段名称,在下拉框中选择正确的对应字段
4.3.8 执行工作流
-
执行转换流,点击工具栏中的“执行”按钮
-
在弹出执行配置窗口中,选择默认配置,然后点击“启动”按钮
-
查看日志,工作流执行后会打开日志页面,定期刷新工作流日志数据
三、实验结果
查看数据库结果
打开“数据资产”,在“团队私有数据库”连接上右键选择“加载元数据”
然后进入数据探查页面,展开“团队私有数据库”
双击目标表“student_attendance_stats”,在右侧页面选择“查询”tab标签
查看数据库数据是否符合预期
四、问题与解决
问题1:表输出报错“Unknown column 'xxx' in 'field list'”
问题现象:
执行Pipeline时,表输出组件报错,提示数据库表中找不到 stu_sex、born_date 等字段。
问题原因:
目标表 student_attendance_stats 的字段结构与表输出组件中配置的映射字段不匹配。手动添加字段时遗漏了部分字段,导致写入失败。
解决方法:
在数据库中对目标表执行ALTER TABLE语句,一次性添加所有缺失的字段,确保表字段与映射关系完全对应。具体添加的字段包括:stu_sex、born_date、policy、live_on_campus、gra_name、class_campus_type 等。
问题2:表输出报错“Column 'class_id' cannot be null”
问题现象:
修复字段缺失问题后,重新运行Pipeline,表输出组件再次报错,提示 class_id 字段不能为空。
问题原因:
建表语句中 class_id 字段设置了 NOT NULL 约束,要求学生必须有班级ID。但实际数据中,部分学生的 cla_id(班级ID)为空值,导致写入数据库时违反了非空约束。
解决方法:
首先排查了学生信息表,确认确实存在部分学生没有班级ID的数据。考虑到这是原始数据质量问题,且不影响整体统计分析,采用了修改表结构的方式,将 class_id 字段改为允许NULL值。执行以下SQL语句:
ALTER TABLE student_attendance_stats MODIFY COLUMN class_id INT NULL;
修改后重新运行Pipeline,问题解决,数据成功写入目标表。
问题3:思考与反思
通过以上两个问题,我深刻体会到:
-
表结构设计要与数据处理逻辑保持一致:建表时需要考虑实际数据情况,合理设置字段约束。
-
ETL开发需要迭代调试:数据流配置很难一次性完美,需要根据报错日志逐步排查和修复。
-
日志是调试的最好帮手:每次报错日志都明确指出了问题所在(哪个字段、什么错误),仔细阅读日志能快速定位问题。
五、实验总结
一、实验收获
通过本次实验,我掌握了以下知识和技能:
1. ETL全流程开发能力
-
熟练使用助睿平台进行多表数据接入、关联、清洗、聚合、落地的完整流程
-
理解了“事实表 + 维度表 + 属性表”的星型模型设计思路
-
掌握了排序记录、记录集连接、分组、字段选择、替换NULL值、值映射等核心组件的配置方法
2. 考勤业务分析能力
-
能够从原始打卡记录中提取迟到、早退、请假、未穿校服等异常行为
-
学会了通过JavaScript脚本进行关键词匹配,对考勤事件进行分类标记
-
掌握了按学生、班级等多维度聚合统计考勤指标的方法
3. 数据标准化处理能力
-
学会了空值替换、值映射、字段衍生等数据清洗方法
-
掌握了通过班级名称提取年级、判断校区类型等衍生维度的实现逻辑
4. 问题排查与解决能力
-
通过不断调试和修复,提升了独立解决问题的能力
-
学会了根据报错日志快速定位并解决问题
二、对助睿数智平台的评价
平台全称:助睿数智(Uniplore)一站式数据科学实验平台
平台定位:覆盖数据接入、ETL处理、机器学习建模到可视化分析的全链路Agentic零代码数据智能
实验地址:https://lab.guilian.cn/
优点:
-
零代码易上手:拖拽式操作降低了ETL开发门槛,不需要编写大量代码即可完成复杂的数据处理任务
-
组件丰富:涵盖了表输入、表输出、排序、连接、分组、脚本等各类数据处理场景
-
日志详细:执行日志信息详尽,便于调试和排错,能够快速定位问题
-
实时执行:支持实时运行验证,修改后可以快速看到效果,开发效率高
待改进:
-
排序要求较高:记录集连接组件对数据顺序有严格要求,初学者容易忽略排序问题导致关联结果错误,建议平台增加自动排序功能
-
错误提示更友好:部分错误提示偏技术化,对初学者不够友好,可以增加更通俗的问题解决建议
三、总体感受
通过本次实验,我不仅掌握了ETL数据处理的实际操作技能,也对零代码数据科学平台有了更深入的认识。助睿数智平台凭借其低门槛、高效率的特点,让没有编程基础的用户也能完成专业的数据处理和分析工作,这对于推动数据技术在更广泛领域的应用具有重要意义。
未来,我希望能够利用该平台完成更多实际的数据分析项目,将课堂所学转化为解决实际问题的能力。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)