保姆级教程!互联网用户行为日志数据加工全流程(解析 + 结构化 + 聚合分析,附完整代码 + 踩坑)
#助客数智 #商业数据分析 #数据集成 #用户行为分析 #ETL 数据加工目录一、实验背景1.1 实验目的1.2 实验环境1.3 实验数据1.3.1 数据集整体构成1.3.2 数据文件结构1.3.3 日志文件命名规则1.3.4 日志文件内部格式1.3.5 关键字段含义1.3.6 数据特点1.4 处理流程二、实验步骤2.1 创建实验项目2.2 日志数据结构化转换2.2.1 数据资源获取2.2.2 建立数据源连接2.2.3 创建原始用户行为日志表2.2.4 获取文件名日志文件批量采集2.2.5 Java 代码日志解析与结构化转换2.2.6 字段选择有效字段筛选与规整2.2.7 表输出结构化数据表落地2.2.8 执行转换流2.3 数据分析方向确定2.3.1 创建进程统计表2.3.2 统计进程用户规模2.3.3 助睿 BI 观察数据确定方向2.4 分析方案设计与数据表创建2.4.1 创建浏览器覆盖率表2.4.2 创建浏览器小时活跃表2.5 数据清洗、聚合与关联加工2.5.1 表输入读取全量行为数据2.5.2 字段选择保留关键字段2.5.3 过滤记录筛选主流浏览器2.5.4 计算停留时长2.5.5 数据清洗与时间提取2.5.6 生成用户 - 日 - 浏览器 - 小时明细2.5.7 分支 A生成浏览器市场格局表2.5.8 分支 B生成浏览器时段统计表2.5.9 执行与结果查看三、实验结果四、问题与解决问题 1Java 代码组件执行后数据表无数据问题 2分组聚合结果异常问题 3日志解析时部分文件报错问题 4表输出数据重复五、实验总结5.1 实验收获5.2 平台评价一、实验背景1.1 实验目的本次实验围绕互联网用户行为半结构化日志展开全流程数据加工核心目标如下熟悉数据集构成与半结构化日志数据特点掌握文本日志解析、字段拆分的实操方法完成数据规整将零散原始日志转化为标准结构化数据表实现多维度数据聚合、字段衍生与跨表关联搭建适配分析场景的指标体系掌握助睿数智平台 ETL 流程搭建、Java 代码解析、分组聚合、数据落地等核心技能1.2 实验环境实验平台助睿在线实验平台 https://lab.guilian.cn/平台全称助睿数智Uniplore一站式数据科学实验平台平台定位覆盖数据接入、ETL 处理、机器学习建模到可视化分析的全链路 Agentic 零代码数据智能产品官网https://www.uniplore.com/数据处理助睿 ETL 数据集成平台数据规模1000 用户800 万 条行为记录约 825MB1.3 实验数据本实验基于首届中国互联网 数据挖掘竞赛公开数据集是典型的计算机用户行为半结构化日志数据适用于用户行为分析、习惯挖掘、活跃度预测与用户画像研究。1.3.1 数据集整体构成用户基本信息表demographic.csv用户 ID、性别、年龄、职业、教育程度、收入浏览器上网记录URL、域名、访问时间等软件使用记录进程名、程序名、使用时长、窗口切换等数据覆盖 1000 名用户连续 4 周电脑使用行为总大小约 825MB原始行为记录 800 多万条。1.3.2 数据文件结构behavior / 文件夹按日期归档存放数万条 TXT 行为日志demographic.csv用户属性表关联字段user_id用户 ID1.3.3 日志文件命名规则文件名格式用户ID_日期_开机时间.txt可解析字段user_id、file_date、file_start_time1.3.4 日志文件内部格式第 1 行Last 数字最后一条记录距离开机秒数第 2 行L_Start 时间开机绝对时间第 3 行及以后行为记录核心数据分隔符字段名与值分隔、[]字段间分隔1.3.5 关键字段含义表格字段含义T距离开机秒数行为发生时间P进程名I进程 IDU浏览器访问 URLW非浏览器窗口句柄V程序版本号N程序名称C开发公司名称1.3.6 数据特点半结构化数据无固定行列不可直接分析数据量大、文件分散、格式统一、规则明确1.4 处理流程创建项目→导入数据→日志结构化转换→进程统计确定分析方向→浏览器数据清洗聚合→数据落地与结果验证二、实验步骤2.1 创建实验项目点击新建项目输入项目名称互联网用户行为日志数据加工点击确定创建成功后在数据集成页面查看新项目2.2 日志数据结构化转换2.2.1 数据资源获取本次仅使用20 个 TXT 数据学习结构化转换操作步骤进入项目点击文件库→右键根目录→新建目录目录名称互联网用户行为日志数据集确定点击公共空间→数据资源找到对应数据集点击更多→导出选择导出到新建目录确定重复操作导入全部 20 个数据文件2.2.2 建立数据源连接本次实验沿用之前实验已创建的团队私有数据库连接无需重复创建未创建可参考往期实验步骤。2.2.3 创建原始用户行为日志表新建转换工作流命名创建原始行为日志数据表拖拽执行一个 SQL 脚本组件选择数据库连接团队私有数据库执行 SQL 创建表sqlCREATE TABLE behavior_events ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 自增主键, session_id VARCHAR(255) COMMENT 会话唯一ID, user_id VARCHAR(100) COMMENT 用户ID, session_start_time VARCHAR(50) COMMENT 会话开始时间, event_seconds INT COMMENT 事件发生秒数, process_name VARCHAR(255) COMMENT 进程名称, process_id VARCHAR(100) COMMENT 进程ID, url TEXT COMMENT 访问网址, addr_handle VARCHAR(255) COMMENT 地址栏句柄, tab_handle VARCHAR(255) COMMENT 标签页句柄, browser_version VARCHAR(100) COMMENT 浏览器版本, window_handle VARCHAR(255) COMMENT 窗口句柄, app_name VARCHAR(255) COMMENT 程序名称, company_name VARCHAR(255) COMMENT 开发公司, source_file VARCHAR(255) COMMENT 原始日志文件名, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 入库时间, INDEX idx_session_id (session_id), INDEX idx_user_id (user_id) ) COMMENT 用户行为事件明细表;运行转换流完成表创建2.2.4 获取文件名日志文件批量采集新建转换工作流命名行为日志数据转为结构化数据拖拽获取文件名组件双击配置浏览文件选择目标目录点击增加→确认2.2.5 Java 代码日志解析与结构化转换核心逻辑读取文件→解析文件名→跳过头部→按分隔符拆分字段→输出结构化数据拖拽Java 代码组件连接 “获取文件名”主输出步骤双击输入代码// 全局变量定义 String pathField; String shortFilenameField; public boolean processRow() throws HopException { if (first) { pathField filename; shortFilenameField short_filename; first false; } Object[] r getRow(); if (r null) { setOutputDone(); return false; } String path get(Fields.In, pathField).getString(r); String short_filename get(Fields.In, shortFilenameField).getString(r); String user_id ; String l_start ; if (short_filename ! null) { String name short_filename.replace(.txt, ); String[] parts name.split(_); if (parts.length 3) { user_id parts[0]; l_start parts[1] parts[2].replace(-, :); } } String session_id user_id _ l_start; java.io.BufferedReader br null; try { br new java.io.BufferedReader(new java.io.FileReader(path)); String line ; // 跳过前两行Last和L_Start br.readLine(); br.readLine(); while ((line br.readLine()) ! null) { if (line.trim().isEmpty()) { continue; } // 解析键值对 String[] kvPairs line.split(\\[\\]); String t ; String p ; String i ; String u ; String a ; String b ; String v ; String w ; String n ; String c ; for (String kv : kvPairs) { int sepIdx kv.indexOf(); if (sepIdx -1) { continue; } String key kv.substring(0, sepIdx).trim(); String val kv.substring(sepIdx 3); if (T.equals(key)) { t val; } else if (P.equals(key)) { p val; } else if (I.equals(key)) { i val; } else if (U.equals(key)) { u val; } else if (A.equals(key)) { a val; } else if (B.equals(key)) { b val; } else if (V.equals(key)) { v val; } else if (W.equals(key)) { w val; } else if (N.equals(key)) { n val; } else if (C.equals(key)) { c val; } } // 创建输出行 Object[] outRow createOutputRow(r, data.outputRowMeta.size()); get(Fields.Out, session_id).setValue(outRow, session_id); get(Fields.Out, user_id).setValue(outRow, user_id); get(Fields.Out, l_start).setValue(outRow, l_start); get(Fields.Out, t).setValue(outRow, t); get(Fields.Out, p).setValue(outRow, p); get(Fields.Out, i).setValue(outRow, i); get(Fields.Out, u).setValue(outRow, u); get(Fields.Out, a).setValue(outRow, a); get(Fields.Out, b).setValue(outRow, b); get(Fields.Out, v).setValue(outRow, v); get(Fields.Out, w).setValue(outRow, w); get(Fields.Out, n).setValue(outRow, n); get(Fields.Out, c).setValue(outRow, c); get(Fields.Out, source_file).setValue(outRow, short_filename); putRow(data.outputRowMeta, outRow); } } catch (Exception e) { logError(e.getMessage(), e); } finally { try { if (br ! null) { br.close(); } } catch (Exception e) { // ignore } } return true; }右键插入字段配置如下 | 字段名 | 类型 | | ---- | ---- | | session_id | String | | user_id | String | | l_start | String | | t | String | | p | String | | i | String | | u | String | | a | String | | b | String | | v | String | | w | String | | n | String | | c | String | | source_file | String |⚠️踩坑提醒字段类型若变为 0需重新配置否则无数据输出。2.2.6 字段选择有效字段筛选与规整拖拽字段选择组件连接 Java 代码组件双击进入移除页获取字段后删除多余字段保留有效字段确认配置2.2.7 表输出结构化数据表落地拖拽表输出组件连接字段选择组件选择团队私有数据库勾选裁剪表、指定数据库字段建立工作流字段与数据库表字段映射确认配置2.2.8 执行转换流点击执行按钮默认配置启动工作流查看执行日志确认运行成功元数据→加载元数据→数据探查查看 behavior_events 表数据2.3 数据分析方向确定通过统计进程用户数锁定浏览器为核心分析对象用户覆盖率最高、含 URL 可深度挖掘。2.3.1 创建进程统计表新建转换工作流命名创建进程统计表拖拽执行一个 SQL 脚本组件执行 SQL-- 创建程序/软件统计表 CREATE TABLE program_stats ( program_name VARCHAR(255) NOT NULL, -- 程序/软件名称 user_count INT NOT NULL -- 使用用户数 );元数据→团队私有数据库→勾选使用结果流运行转换流2.3.2 统计进程用户规模新建转换流统计进程用户规模拖拽表输入读取 behavior_events 数据字段选择仅保留 user_id、process_name替换 NULL 值process_name 空值替换为 “未知”排序记录按 process_name 升序分组按 process_name 分组统计 user_id 个数user_count表输出数据落地 program_stats 表执行转换流2.3.3 助睿 BI 观察数据确定方向进入助睿 BI→数据集→新建数据集进程用户数据统计选择 program_stats 表保存发布新建工作表选择水平条图Y 轴 program_name、X 轴 user_count降序结论浏览器用户数最高确定为分析方向2.4 分析方案设计与数据表创建围绕浏览器设计分析方向市场格局、用户画像、使用习惯、竞争迁移、流失预测、个性化推荐。 本次先创建 2 张核心表2.4.1 创建浏览器覆盖率表CREATE TABLE browser_coverage ( browser_name VARCHAR(50) NOT NULL COMMENT 浏览器进程名, user_count INT NOT NULL COMMENT 使用用户数去重, total_duration_sec BIGINT NOT NULL COMMENT 总使用时长秒 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT浏览器用户覆盖率与总时长;2.4.2 创建浏览器小时活跃表CREATE TABLE browser_hourly ( browser_name VARCHAR(50) NOT NULL COMMENT 浏览器进程名, hour TINYINT NOT NULL COMMENT 小时0-23, active_user_count INT NOT NULL COMMENT 活跃用户数, PRIMARY KEY (browser_name, hour) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT浏览器按小时活跃用户数;2.5 数据清洗、聚合与关联加工基于全量 behavior_events 数据公共数据库完成清洗、计算、聚合。2.5.1 表输入读取全量行为数据拖拽表输入连接公共数据源读取 behavior_events 全量数据。2.5.2 字段选择保留关键字段保留session_id、user_id、session_start_time、process_name、url、event_seconds。2.5.3 过滤记录筛选主流浏览器过滤条件process_name INiexplore.exe;360chrome.exe;360se.exe;chrome.exe;sogouexplorer.exe;QQBrowser.exe2.5.4 计算停留时长排序记录按 session_id、event_seconds 升序分析查询同一会话获取下一行 event_secondsnext_event_seconds计算器duration_sec next_event_seconds - event_seconds2.5.5 数据清洗与时间提取字段选择保留 user_id、process_name、session_start_time、url、duration_sec过滤记录保留 duration_sec0 的数据剪切字符串提取日期yyyy-MM-dd字段选择将 session_start_time 设为 Date 类型计算器提取小时HH2.5.6 生成用户 - 日 - 浏览器 - 小时明细排序记录按 user_id、process_name、日期、小时排序分组聚合生成基础明细数据2.5.7 分支 A生成浏览器市场格局表分组 1按 process_name 分组统计去重用户数、总使用时长表输出落地 browser_coverage 表2.5.8 分支 B生成浏览器时段统计表排序记录 2按 process_name、hour 升序分组 2按 process_name、hour 分组统计活跃用户数表输出落地 browser_hourly 表2.5.9 执行与结果查看运行转换流元数据→数据探查查看 browser_coverage、browser_hourly 数据是否符合预期。三、实验结果结构化结果成功将半结构化 TXT 日志转换为 behavior_events 标准数据表字段完整、数据准确进程统计结果浏览器类进程用户覆盖率远高于其他软件确定核心分析对象聚合分析结果成功生成 browser_coverage浏览器市场格局、browser_hourly小时活跃两张分析表可支撑后续可视化与建模数据完整性全量数据清洗聚合后无丢失、无重复指标计算准确四、问题与解决问题 1Java 代码组件执行后数据表无数据问题现象流程运行成功但 behavior_events 表无数据写入问题原因Java 代码输出字段类型被重置为 0类型不匹配导致数据无法写入解决方法重新进入 Java 代码组件检查并修正所有字段类型为 String重新执行流程问题 2分组聚合结果异常问题现象分组统计的用户数与预期不符问题原因分组前未对字段排序数据乱序导致聚合错误解决方法分组前增加排序组件按分组字段升序排列后再聚合问题 3日志解析时部分文件报错问题现象少数 TXT 文件解析失败流程中断问题原因文件为空、格式不规范或编码异常解决方法在 Java 代码中增加空行 / 异常捕获跳过异常文件保证流程正常运行问题 4表输出数据重复问题现象多次执行后表内数据重复问题原因未开启裁剪表每次执行追加数据解决方法表输出组件勾选裁剪表执行前清空表数据五、实验总结5.1 实验收获掌握半结构化日志解析核心方法能独立完成文本→结构化数据转换熟练使用助睿数智平台 ETL 组件文件读取、Java 代码、字段选择、分组聚合、表输出等理解用户行为数据加工全流程数据导入→清洗→解析→聚合→落地→分析学会通过数据统计确定分析方向搭建业务导向的指标体系积累 ETL 流程踩坑与排错经验提升数据处理稳定性5.2 平台评价助睿数智Uniplore平台零代码 低代码结合友好ETL 组件丰富支持 Java 代码扩展能覆盖从数据接入到分析的全链路操作平台界面清晰、操作拖拽化适合教学与企业实战对数据分析新手友好可快速落地复杂数据加工任务。