一、实验背景

1. 实验目的

这次实验,我打算用助睿数智平台,完成学生用户画像里考勤主题标签的构建。做之前我就给自己定了几个核心目标:

  1. 完整走一遍零代码平台的数据接入、ETL 清洗、标签计算到结果输出的全流程,把这些操作练熟;
  2. 搞懂学生基础属性(比如年级、校区、住校状态)和考勤行为数据之间的关联逻辑,搭一套能复用的标准化考勤标签体系;
  3. 学会处理数据空值、字段不规范、多表关联失败这些实验里常见的坑;
  4. 最后输出一份完整、准确的学生考勤标签宽表,为之后的学生行为分析和教育管理决策提供数据支撑。

2. 实验环境

  • 平台全称:助睿数智(Uniplore)一站式数据科学实验平台,该平台无需编写复杂代码,通过可视化组件拖拽即可完成数据处理操作,非常适合数据处理初学者使用。
  • 产品官网:https://www.uniplore.com/
  • 平台地址:https://lab.guilian.cn/
  • 使用数据:本次实验采用教育大数据课程提供的专用数据集,包含三类CSV格式数据表,分别是`student_info.csv`(存储学生基础信息,如学号、姓名、班级、出生日期等)、`kaoqin.csv`(存储学生考勤记录,如考勤ID、学号、考勤类型ID、考勤日期等)、`control.csv`(存储考勤类型字典,用于对应考勤类型ID和具体的考勤行为名称,如迟到、早退等)。
  • 核心工具:主要使用助睿平台内置的零代码ETL组件,包括表输入、记录集连接、字段选择、替换NULL值、JavaScript脚本编辑、表输出等,这些组件覆盖了数据处理的全流程,可满足本次实验的所有操作需求。

3. 整体处理流程

结合实验目的和数据特点,我梳理了本次实验的核心处理流程,整体遵循“数据接入→数据清洗与标准化→多表关联→行为标签计算→结果输出”的逻辑顺序,每一步都环环相扣,确保数据处理的准确性和完整性,具体流程拆解如下:

  1. 数据接入:先将本地的三类CSV数据表上传至助睿平台,导入到团队私有数据库中,完成原始数据的入库操作,为后续处理奠定基础;
  2. 数据清洗与标准化:对学生基础信息表进行清洗,处理空值、规范字段格式,同时从班级字段中提取年级、校区信息,对住校状态进行标准化映射,生成学生基础主题标签表;
  3. 多表关联:将考勤记录表与考勤类型字典表进行关联,补充考勤行为的语义信息,让考勤记录更易理解;再将关联后的考勤数据与学生基础主题标签表关联,实现学生基础信息与考勤行为数据的对应;
  4. 行为标签计算:按学号分组,统计每个学生的总考勤次数、迟到次数、早退次数等核心考勤指标,生成考勤行为标签;
  5. 结果输出:清洗冗余字段、处理剩余空值,生成最终的学生考勤主题标签宽表,完成整个实验流程。

二、实验步骤

本次实验的步骤的我按照整体处理流程逐步推进,我每一步操作都经过反复验证,确保操作正确、数据无误,具体详细步骤如下:

(一) 实验项目创建与数据资源获取

实验的第一步是创建专属实验项目,并完成原始数据的导入和入库,这是后续所有操作的基础,具体操作如下:

1、 创建实验项目

  • 我们首先需打开助睿数智实验平台的登录页面,点击「ETL数据集成环境」,成功登录平台后,进入首页的项目管理界面;

  • 在项目管理界面中,先要选择所属团队(可以选择个人团队),找到「新建项目」按钮并点击,弹出项目创建窗口,输入项目名称为“学生用户画像-考勤标签构建”,点击「确定」按钮,完成实验项目的创建;

  • 项目创建完成后,我点击进入项目内部,在左侧导航栏中找到「文件库」模块,点击“文件库”,右键根目录,点击“新建目录”,输入目录名称为“数智教育数据集”,点击“确定”。

2、 数据资源导入

  • 接下来我们将公共空间的数据资源导入到这个目录(数智教育数据集)下,点击「公共空间」,进入内部,再点击「获取资源」按钮,依次将公共空间的`2_student_info.csv`、`3_kaoqin.csv`、`4_kaoqinytpe.csv`三个文件上传至该目录,上传完成后,可在目录中看到三个文件的名称。

  • 为了方便后续对数据进行处理,我需要将这三个CSV文件数据导入到团队私有数据库中,所以我们先要连接团队私有数据库。点击「元数据」,关系数据库右键打开菜单,选择「新建数据源」。

  • 弹出新建数据库连接窗口,连接类型选择“MySQL”,用户名和密码使用助教提供的账号和密码。服务器主机名使用助教提供的数据库连接地址“rm-2vc3qok06bag39a5n.mysql.cn-chengdu.rds.aliyuncs.com”,端口号为3306,数据库名为助教提供的数据库名称,驱动类型选择“MySQL 8+”,连接名称为“团队私有数据库”,点击「测试连接」,提示连接成功后,点击「配置」按钮,完成数据库连接的配置。

3、 原始数据表结构创建与数据导入

由于导入数据库的原始数据没有规范的表结构,无法直接进行后续处理,因此我需要为每个原始数据表创建规范的表结构,并将CSV文件中的数据导入到对应的数据表中,三张表按相同步骤操作:

(1)创建原始_学生考勤表
  • 点击左侧导航栏的「资源库」模块,右键根目录点击「新建转换流程」,输入流程名称为“创建原始_学生考勤表”,点击「确定」,进入转换流程编辑界面;

  • 在编辑界面左侧的「组件库栏」中,我们需在该工作流中拖拽「执行一个SQL脚本」组件,通过执行SQL脚本来创建一个标签表,在组件中填写SQL脚本,选择目标数据库连接“团队私有数据库”,确保脚本执行权限,然后其他参数使用默认选项,我们可以不做处理。

SQL脚本如下:

CREATE TABLE IF NOT EXISTS `t_student_info` (
  `stu_id` varchar(50) NOT NULL COMMENT '学号,作为主键,唯一标识每个学生',
  `stu_name` varchar(50) DEFAULT NULL COMMENT '学生姓名',
  `cla_name` varchar(50) DEFAULT NULL COMMENT '学生所在班级',
  `grade` varchar(10) DEFAULT NULL COMMENT '学生所在年级',
  `born_date` varchar(20) DEFAULT NULL COMMENT '学生出生日期',
  `policy` varchar(10) DEFAULT NULL COMMENT '学生政治面貌',
  `live_on_campus` varchar(10) DEFAULT NULL COMMENT '学生是否住校',
  PRIMARY KEY (`stu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生基础信息表';

  • 完成后运行转换流,运行过程会定时刷新组件状态,并画布下面显示执行日志。

(2)导入原始考勤数据
  • 点击「资源库」新建转换工作流,并命名为“导入原始考勤数据”,并在「组件库」中拖拽一个“CSV文件输入”组件到画布。

  • 双击该组件后,我在步骤名称中输入“考勤记录”,配置文件路径为“教育数据集”目录下的`3_kaoqin.csv`文件(点击文件名后的“浏览文件”按钮,在弹出的窗口中选择“3_kaoqin.csv”,点击“确定”),然后设置字段分隔符为逗号(默认),编码格式为UTF-8,点击「预览」,确认能正常读取CSV文件中的数据后,点击「确定」;

  • 为了确保CSV文件中的字段与创建的数据库表字段一一对应,我添加了「字段选择」组件,拖拽至编辑区域,将「CSV文件输入」组件的输出端口与「字段选择」组件的输入端口连接,双击「字段选择」组件,将CSV文件中的字段与`raw_attendance`表中的字段进行一一映射。

  • 完成后运行转换流,运行过程会定时刷新组件状态,并画布下面显示执行日志。

(3)创建原始_考勤类型表
  • 我们首先需点击左侧导航栏的「资源库」模块,然后右键根目录点击「新建转换流程」,并输入流程名称为“创建原始_考勤类型表”,点击「确定」,进入转换流程编辑界面;

  • 仿照“创建原始_学生考勤表”实验操作,我们需完成原始考勤类型表“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='原始_考勤类型表';

(4)导入原始考勤类型数据
  • 点击「资源库」新建转换工作流,并命名为“导入原始考勤类型数据”,并在「组件库」中拖拽一个“CSV文件输入”组件到画布。

  • 使用CSV文件输入组件时,考勤类型原始表的列分隔符和考勤表的不一样,我们在配置中,需将列分隔符设为“插入制表符(TAB)”、编码为“GB2312”,其余操作和“导入原始考勤数据”类似。

  • 表输出组件的配置与“ 原始考勤记录表数据导入”的一样,映射表选择“raw_attendance_type”。

  • 完成后运行转换流,运行过程会定时刷新组件状态,并画布下面显示执行日志。

(5)创建原始_学生信息表
  • 点击左侧导航栏的「资源库」模块,右键根目录点击「新建转换流程」,输入流程名称为“创建原始_学生信息表”,点击「确定」,进入转换流程编辑界面;

  • 仿照“创建原始_学生考勤表”实验操作,完成原始考勤类型表“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='原始_学生信息表';

(6)导入原始学生基本信息数据
  • 点击「资源库」新建转换工作流,并命名为“导入原始学生基本信息数据”,并在「组件库」中拖拽一个“CSV文件输入”组件到画布。

  • 我们需使用“CSV文件输出”组件输入“2_student_info.csv”数据,编码使用UTF-8,获取字段时,然后我们需要将“bf_leaveSchool”的字段类型修改为“String”,其余默认。特别说明:bf_zhusubf_qinshihao 这2个字段是Integer,为避免出现小数,需要使用“字段选择”组件来固化并规范

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

  • 双击“字段选择”组件,在配置窗口中,点击“元数据”,并在空白处插入2行,将“bf_zhusu”、“bf_qinshihao”字段的元数据设置如下:

  • 表输出组件的配置与“ 原始考勤记录表数据导入”的一样,映射表选择“raw_student_info”,将“2_student_info.csv”数据输出到团队私有数据库的“raw_student_info”中。

  • 完成后运行转换流,运行过程会定时刷新组件状态,并画布下面显示执行日志。

(7)创建学生考勤主题标签表
  • 我们先点击左侧导航栏的「资源库」模块,然后右键根目录点击「新建转换流程」,输入流程名称为“创建学生考勤主题标签表”,点击「确定」,进入转换流程编辑界面;

  • 在该工作流中我们需拖拽“执行一个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='学生考勤主题标签表';

(二) 学生基础主题标签构建(数据清洗与标准化)

原始的学生基础信息表中存在空值、字段格式不规范等问题,无法直接作为标签使用,因此我们需要对其进行清洗和标准化处理,提取核心基础属性标签,生成学生基础主题标签表。

1、 数据转换流逻辑说明

转换流遵循“数据接入—清洗整合—维度拆解—标签标记—指标计算—结果落地”的核心逻辑:

  • 数据接入:接入考勤原始打卡表、考勤类型码表、学生信息基础表
  • 数据整合:多表关联,给原始打卡记录绑定学生班级、住校属性、考勤事件名称
  • 标签标记:通过考勤事件名称自动识别迟到、早退、请假、未穿校服等行为
  • 指标计算:按日核算在校时长,按多维度聚合统计各类异常次数
  • 结果落地:统一写入考勤统计结果表,供报表、查询、分析直接使用

各组件作用:

组件

作用
1 表输入

读取数据库中的原始数据表

2

排序记录

按照指定字段对数据进行排序,为记录集连接做准备

3

记录集连接

按关联字段连接两表,补充考勤行为名称或学生属性

4

字段选择

移除冗余字段,保留核心必要字段

5

JavaScript脚本

执行脚本,通过关键词匹配提取异常考勤记录,生成二进制标记

6

分组

按指定维度分组,使用SUM函数聚合统计各类异常次数

7

替换NULL值

将空值字段替换为“未知”

8

值映射

将住校状态编码(0/1)映射为“否”/“是”

9

表输出

输出最终结果到数据库目标表

2、 数据接入(获取考勤记录、考勤类型数据、学生信息数据)

  • 我们需新建了一个转换流程,命名为“学生考勤主题标签”,进入流程编辑界面,首先添加三个「表输入」组件(获取考勤记录、考勤类型数据、学生信息数据)。

  • 双击第一个表输入组件,在配置窗口中,我们需将步骤名称修改为“考勤记录”,数据库连接选择“团队私有数据库”,并点击“获取SQL查询语句”,在数据库中选择“raw_attendance”原始_学生考勤表。

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

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,通过连接字段使用“attendance_type_id”、“attendance_task_order_id”两个字段进行左外连接——右键点击→获取字段,然后我们需要保留这两个字段,其余字段删除。

  • 通过预览数据,我发现部分字段存在空值,比如`policy`(政治面貌)、`born_date`(出生日期)、`live_on_campus`(是否住校)字段有部分空值,这些空值会影响后续标签计算的准确性,因此我添加了「替换NULL值」组件,与「字段选择」组件连接,双击该组件,对空值进行统一处理:
    • `policy`字段的空值替换为“未知”;
    • `born_date`字段的空值替换为“未知”;
    • `live_on_campus`字段的空值替换为“未知”。
  • 配置完成后,运行该部分流程,预览数据,确认所有空值都已替换完成,数据格式基本规范。

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_early、is_leave等)仅存在1和0两个值,标签判断准确(如迟到记录对应is_late_early=1,正常出勤对应is_compliant=1),无异常,若未显示这几个字段:
  • 先确认后再重新点击测试。

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”五个字段。

6、 关联学生信息

基于上述结果,使用记录集连接组件,关联学生信息表——因为考勤记录表仅包含学生ID和班级ID,缺少学生是否住校的核心属性,通过按学生ID关联学生信息表,可补全该属性,支撑住校相关维度的统计。具体操作如下:

  • 由于“学生信息”数据表中的学号不是升序记录的,所以在进行记录关联前,我们需要先对数据进行排序。即建立“学生信息”表输入组件到“排序记录”组件的连接线(通过对“stu_id”字段进行排序),并将排序步骤命名为“按照学生编号进行排序”。

  • 我们需要拖拽“记录集连接”组件至画布中,并创建“按照学生编号进行排序”排序记录组件到“记录集连接 1”组件的连接线。

  • 由于考勤记录数据不是按“学号”升序记录的,所以在进行记录关联前,也需要对数据进行排序。我们需要再次添加“排序记录”,并建立“记录集连接”组件到“排序记录”组件的连接线,然后通过字段使用“stu_id”进行升序排序。

  • 我们还需创建“考勤数据按学号排序”记录排序组件到“记录集连接 1”组件的连线,关联学生信息和考勤记录信息。记录集连接 1组件的第一个Transform选择“考勤数据按学号排序”,第二个Transform选择“按照学生编号进行排序”,连接类型选择LEFT OUTER,连接字段都使用“stu_id”。

7、 字段选择(移除冗余字段)

我们经过多表关联和前期接入,数据中会包含大量与考勤统计无关的字段(如学生信息表中的非必要属性),我们需要对关联后的数据进行冗余字段移除,因为这些冗余字段不仅会增加数据处理的负担,还可能导致后续聚合、计算出现干扰,我们只有移除冗余字段,保留核心有用字段,才能提升处理效率,确保统计逻辑清晰。具体操作如下:

  • 搜索“字段选择”,拖拽至画布中,创建“记录集连接 1”组件到字段选择组件的连接线。

  • 双击字段选择组件,在配置弹窗中,步骤名称输入“移除冗余字段”,点击“移除”Tab标签,右键空白处并点击“获取字段”。在获取的字段中,我们需要删除以下核心字段外,其他字段保留,可为后续时间维度拆解和行为标签衍生奠定基础:
    • 学生 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)

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

8、 空值处理

3个数据表关联后,字段“stu_sex”、“born_date”、“policy”、“live_on_campus”存在空值,需要对这么空值进行处理。

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

  • 双击“替换NULL值”组件,勾选“选择字段”,字段名称选择“stu_sex”、“born_date”、“policy”、“live_on_campus”,并将对应的空值均替换为“未知”。

9、 学生基础属性标准化处理

经过多表关联与字段筛选后,原始数据中住校状态为编码值,且缺少年级、校区类型等画像分析必需字段,无法直接用于学生考勤标签输出与后续用户画像分析。因此需要对学生基础属性进行标准化映射、缺失字段衍生,统一数据格式、补齐分析维度,保证标签表规范可用。

(1)住校状态标准化(字段映射)

原始的`live_on_campus`字段中,部分数据用“0”和“1”表示,部分数据用“是”和“否”表示,格式不统一,无法作为标准化标签,因此我需要对该字段进行标准化映射,具体操作如下:

  • 在转换流程中,添加「值映射」组件,与「替换NULL值」组件连接,双击该组件,配置目标字段为`live_on_campus`(需要标准化的字段);

  • 在映射规则中,我设置了以下对应关系,确保字段值统一:
    • 源值`0` → 目标值`否`;
    • 源值`1` → 目标值`是`;
    • 不匹配的默认值设置为`未知`,避免出现未映射的异常值。

双击“值映射”组件,步骤名称改为“住校状态映射”,使用的字段名为“live_on_campus”,不匹配时的默认值为“否”。

(2)年级字段提取(JavaScript脚本处理)

原始的`grade`字段中,部分数据为空,部分数据与班级信息不匹配,因此我决定通过JavaScript脚本,从`cla_name`(班级)字段中提取年级信息,确保年级字段的准确性,具体操作如下:

  • 在转换流程中,继续添加「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”,确保与表结构一致;

(3)校区字段提取(JavaScript脚本处理)

原始数据中没有专门的校区字段,但班级名称中包含校区信息(如“东校区高一(1)班”),因此我同样通过JavaScript脚本,从`cla_name`(班级)字段中提取校区信息,新增校区标签,具体操作如下:

  • 在转换流程中,添加「JavaScript脚本」组件,命名为“校区类别判断”,与“从班级提取年级”脚本组件连接;

  • 双击该组件,然后步骤名称改为“校区类型判定”,并输入以下JavaScript脚本,核心逻辑是判断班级名称中是否包含“东校区”“老校区”关键词,提取对应的校区信息,若班级名称为空或无对应关键词,则设置为“其他校区”,同时配置输出字段,新增`campus_type`(校区)字段,设置数据类型为“String”,添加到数据结构中:
    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='未知'
    }

10、 基础标签表输出

完成学生基础信息的清洗、标准化和字段提取后,我需要将处理后的数据输出为学生基础主题标签表,用于后续与考勤数据关联,具体操作如下:

  • 在转换流程中,添加「表输出」组件,与“校区类别判断”脚本组件连接;

  • 双击「表输出」组件,配置目标数据库连接为“团队私有数据库”,目标表选择`student_attendance_stats`表;

  • 勾选「清空表再插入」选项,建立工作流字段与数据库表字段的映射关系。勾选后会激活“数据库字段”tab页,然后点击数据库字段tab页,配置`student_attendance_stats`表的映射。

(三) 执行工作流

  • 执行转换流,点击工具栏中的“执行”按钮,在弹出执行配置窗口中,选择默认配置,然后点击“启动”按钮,启动工作流。

  • 查看日志,工作流执行后会打开日志页面,定期刷新工作流日志数据。

  • 打开“元数据”tab页,在“团队私有数据库”连接上右键选择“加载元数据”,然后进入数据探查页面,展开“团队私有数据库”,查看数据库表数据是否符合预期。

三、问题与解决

在本次实验过程中,我遇到了多个常见的数据处理问题,通过逐步排查、查阅平台帮助文档和反复测试,最终成功解决了所有问题,确保实验顺利推进。现将实验中遇到的主要问题、问题原因及解决方法详细记录如下,为后续类似实验提供参考:

1、 问题1:JavaScript脚本提取年级字段结果为空

  • 问题现象:运行“从班级提取年级”的JavaScript脚本后,预览数据发现,`grade`字段全部显示为“未知”,没有成功提取到“高一”“高二”“高三”的年级信息,脚本运行无效。
  • 问题原因:我仔细检查了脚本代码和字段信息,发现脚本中使用的字段名是`cla_name`,但在之前的「字段选择」组件中,我不小心将班级字段的名称修改为`class_name`,导致脚本无法读取到班级字段的数据,进而无法提取年级信息,所有结果均显示为“未知”。
  • 解决方法:我重新进入「字段选择」组件,确认班级字段的实际名称为`class_name`,然后修改JavaScript脚本中的字段名,将`cla_name`全部替换为`class_name`,保存脚本后重新运行组件,成功提取到年级信息,`grade`字段显示正常,无异常。

2、 问题2:表输出组件无“raw_attendance”字段

  • 问题现象:在配置「表输出」组件,将处理后的数据写入目标表时,测试数据库连接显示成功,且SOL语句正确执行,但表输出获取不到“raw_attendance”字段。
  • 问题原因:我通过增加「表输入」组件查看数据库状态,发现数据库没有更新“raw_attendance”,而是旧的内容,导致无法获取新字段,在执行SQL语句只执行了判断和建表语句,不包含对已有表的更改。
  • 解决方法:在执行SQL建表语句前,插入了DROP TABLE IF EXISTS `raw_attendance`;先判断是否存在raw_attendance表,若存在就先删除再创建。

五、实验总结

这次实验我围绕学生用户画像里的考勤主题标签构建,从数据接入到结果输出,完整走了一遍零代码 ETL 数据处理流程。整个做下来,我不仅练熟了具体操作,也踩了不少数据处理的坑,对用户画像构建的逻辑也有了更实在的理解,下面简单总结一下。

(1)实验收获

  1. 操作能力有了明显提升,这次实验里,我把助睿数智平台零代码 ETL 工具的核心组件都用了一遍,包括表输入、CSV 文件输入、字段选择、NULL 值替换、值映射、JavaScript 脚本编辑、记录集连接、分组、表输出这些。现在我能独立走完数据接入、清洗、关联、聚合、输出的全流程,不用再对着教程一步步问了。
  2. 把理论和实操串起来了,之前只在课本上知道用户画像有基础属性标签和行为标签,这次实际做了才明白,基础属性标签是行为标签的前提,而行为标签是对学生行为的量化体现,两者结合才能形成完整的用户画像。也更直观地感受到,多表关联、字段标准化、空值处理这些步骤,对数据处理的结果有多关键。
  3. 问题排查能力比之前强多了,实验过程中踩了不少常见的数据处理坑,比如关联报错、脚本跑不起来、数据有异常值、权限不足、中文乱码这些。我是通过一步步排查、翻资料、反复试错才把问题都解决的。现在再遇到类似的问题,我大概知道从哪里入手了,也明白数据处理真的要细心,一个小失误就可能导致整个流程跑不起来。
  4. 脚本应用能力也有进步,这次我用 JavaScript 脚本在零代码平台里实现了一些复杂的字段提取,也学会了怎么调试脚本、定位错误,能补全可视化组件实现不了的功能局限。

(2)对助睿数智平台的整体感受

这次实验我全程用的是助睿数智(Uniplore)一站式数据科学实验平台,整体体验下来,感觉它对初学者和教学实验场景都很友好。

  • 上手门槛低,很适合教学:平台是零代码、可视化拖拽的方式,不用写复杂代码,就算没什么编程基础,也能很快上手,很适合课堂实验这种场景。
  • 功能够全,也有扩展空间:内置的 ETL 组件覆盖了数据处理的全流程,同时支持 SQL 和 JavaScript 脚本扩展,既能做简单的数据清洗,也能处理复杂的字段提取和多表关联,兼顾了易用性和灵活性。
  • 报错提示很实用:流程跑失败的时候,平台的报错提示和日志能直接告诉我大概问题出在哪,帮我省了不少排查时间,实验效率高了很多。
  • 场景贴合实际,能感受到数据的价值:这次实验的流程设计,和教育行业的实际业务场景是对得上的,从学生基础信息处理到考勤标签构建,能直接对应到实际的学生行为分析和教育管理决策里,让我更直观地感受到了数据处理的实际意义。

当然也有一些可以优化的地方,比如部分组件的操作提示不够详细,刚开始上手的时候,得花点时间自己摸索配置方法;另外自动建表的权限限制,也让我多走了几步流程。但总体来说,这个平台完全能满足这次实验的需求,对数据处理初学者和教学实验来说,是个很合适的工具。

(3)实验不足和后续改进方向

虽然这次顺利完成了考勤主题标签的构建,但回头看还有不少可以优化的地方,后续可以从这几方面改进:

  1. 标签体系可以更细化:这次只做了基础的考勤行为标签,后续可以再加一些更细的维度,比如迟到时长标签、请假类型标签(事假、病假等),让标签体系更丰富,分析价值也更高。
  2. 数据验证可以更全面:这次我主要从数据完整性、空值、合理性这几个方面做了验证,后续可以加上数据一致性验证,比如核对学生学号的唯一性、考勤日期的合理性,进一步确保数据的准确性。
  3. 脚本可以写得更高效:这次用的 JavaScript 脚本逻辑比较简单,后续我打算多学一点复杂的脚本写法,让字段处理更灵活,也能提高数据处理的效率和准确性。

这次实验做下来,我不仅练熟了零代码数据处理的方法,也更深刻地体会到了数据处理的严谨性和重要性。后续我会多做一些类似的实操练习,把数据处理的基础打牢,为之后的学习和项目打好底子。

本文为 AI 辅助整理、本人实操完成的实验报告,核心操作与总结为原创

#助睿数智 #商业数据分析 #数据集成 #用户画像

Logo

一站式 AI 云服务平台

更多推荐