1 实验目的熟悉数据集构成与半结构化日志数据特点掌握文本日志解析、字段拆分的实操方法完成数据规整将零散原始日志转化为标准结构化数据表实现多维度数据聚合、字段衍生与跨表关联搭建适配分析场景的指标体系完成机器学习特征工程处理产出可直接使用的预测建模数据集2 实验环境实验平台助睿在线实验平台 https://lab.guilian.cn/本次实验使用助睿数智Uniplore作为一站式数据科学平台。该平台覆盖从数据接入、ETL处理、机器学习建模到可视化展示的全链路零代码功能适用于数据分析教学与企业数据加工场景。产品官网为 https://www.uniplore.com/数据处理助睿 ETL 数据集成平台数据规模1000 用户800 万 条行为记录约 825MB3 实验数据本实验基于首届中国互联网数据挖掘竞赛公开数据集开展是非常典型的计算机用户行为半结构化日志数据专门用于用户行为分析、习惯挖掘、活跃度预测与用户画像研究。3.1 数据集整体构成数据集包含三大核心部分用户基本信息表demographic.csv存储用户 ID、性别、年龄、职业、教育程度、收入等人口属性信息。浏览器上网记录日志中包含 URL、域名、访问时间等。软件使用记录日志中包含进程名、程序名、使用时长、窗口切换等。数据总大小解压后约825MB原始行为记录800 多万条覆盖1000 名用户连续4 周的电脑使用行为横跨 4 个月每月抽取 1 周数据。第 1 周2012-05-07 至 2012-05-13第 2 周2012-06-04 至 2012-06-10第 3 周2012-07-02 至 2012-07-08第 4 周2012-08-06 至 2012-08-123.2 数据文件结构所有数据分为两部分behavior/文件夹按日期归档存放数万条 TXT 行为日志demographic.csv用户属性表两个数据通过用户 IDuser_id唯一关联。3.3 日志文件命名规则每个 TXT 文件 一个用户一次开机产生的行为日志文件名格式用户ID_日期_开机时间.txt示例0AB6BBBEDFF24EC8BAAC905F45AE314C_2012-05-07_21-22-38.txt从文件名可直接解析出user_id用户唯一标识file_date日志日期file_start_time开机时间3.4 日志文件内部格式每个日志文件固定分为三部分第 1 行Last 数字表示日志最后一条记录距离开机的秒数。第 2 行L_Start 时间表示本次开机的绝对时间。**第 3 行及以后行为记录核心数据**格式示例T177[]P360se.exe[]I5572[]W30378[]V4,1,6,6[]N360安全浏览器[]C360.cn采用固定分隔符字段名与值分隔[]字段与字段之间分隔3.5 字段含义必须掌握3.6 数据特点属于半结构化数据无固定行列不能直接分析数据量大、文件分散、格式统一、规则明确4 实验步骤4.1 创建实验项目点击“新建项目”输入项目名称“互联网用户行为日志数据加工”点击“确定”创建成功后即可在数据集成页面看到新创建的项目4.2 日志数据结构化转换4.2.1 数据资源获取注意由于本次实验的数据量过大我们仅使用其中20个TXT数据来学习如何将半结构化数据转换为结构化数据本实验的部分原始数据20个TXT数据已经上传公共空间为方便后续的数据使用我们可以将原始数据导入我们自己的文件目录下项目创建成功后点击该项目右上角“…”点击“打开项目”在项目页面可以看到左侧有3个菜单资源库、文件、元数据资源库用于对工作流的管理包括新建、删除、修改、查看工作流的信息导出导入工作空间调度管理等操作文件库用于保存工作流中需要用到的文件和工作流产生的文件元数据管理是助睿ETL的重要基石可以为工作流定义“运行配置”、“数据库”、“flink集群”等配置首先获取本次的实验数据集点击“文件库”右键根目录点击“新建目录”输入目录名称为“互联网用户行为日志数据集”点击“确定”接下来我们将公共空间的数据资源导入到这个目录下点击公共空间再点击“数据资源”点击属于“互联网用户行为日志数据集”下的数据卡片右上角的“更多”并点击“导出”在弹出的窗口中选择导出到刚刚新创建的目录下点击“确定”接下来重复以上导出操作将本次实验用到的20个数据都导出到“互联网用户行为日志数据集”4.2.2 建立数据源连接在之前的实验《学生用户画像-考勤主题标签构建》中我们已经创建了团队私有数据库的连接无需再建立数据源连接如果还未创建的可以参考《学生用户画像-考勤主题标签构建》的4.2.2 建立数据源连接小节的内容下创建连接。4.2.3 创建原始用户行为日志表新建转换工作流并命名为“创建原始行为日志数据表”在该工作流中拖拽“执行一个SQL脚本”组件通过执行SQL脚本来创建一个标签表。整个转换流如下所示配置说明在组件中填写SQL脚本选择目标数据库连接“团队私有数据库”确保脚本执行权限SQL脚本如下其他参数使用默认选项完成后组件配置如下完成后运行转换流运行过程会定时刷新组件状态并画布下面显示执行日志。由于原始的数据是半结构化的数据无法直接通过文件输入组件获取数据所以需要换一种思路通过 “获取文件名” 组件批量读取并定位日志文件再交由 “Java 代码” 组件完成半结构化日志的解析含字段拆分接着通过 “字段选择” 组件筛选并规整有效字段最终输出为标准结构化数据表实现原始文本日志到可分析数据的标准化转换。4.2.4 获取文件名日志文件批量采集新建转换工作流并命名为“行为日志数据转为结构化数据”在该工作流中拖拽“获取文件名”组件双击“获取文件名”组件在配置窗口中点击文件或目录后后的“浏览文件”按钮在弹出的窗口中选择我们上面创建的目录“互联网用户行为日志数据集”再点击“确定”选择目录后点击“增加”选择的目录出现在下方的路径中点击“确认”4.2.5 Java 代码日志解析与结构化转换根据实验数据说明我们可以通过 java 代码来读取日志文件、解析文件名、提取用户与开机信息、跳过文件头部、按分隔符拆分半结构化行为记录将原始 TXT 日志中的 T、P、I、U、V、W、N、C 等关键字段逐一解析提取最终输出包含会话 ID、用户信息、行为详情的标准结构化数据完成从半结构化数据到结构化数据的转换。拖拽一个“Java 代码” 组件到画布中并创建“获取文件名”组件到“Java 代码” 组件的连线连接线类型选择“主输出步骤”双击“Java 代码” 组件输入以下代码在字段空白表格处右键点击“插入”双击插入的行字段名输入“session_id”类型选择“String”继续插入行依次将java代码中输出的字段进行配置参考如下配置完成后点击“确认”4.2.6 字段选择有效字段筛选与规整右键“java 代码”组件点击“预览输出字段”可以看到有很多字段是我们不需要也不属于原始数据字段的需要移除拖拽“字段选择”组件到画布中并创建“Java 代码”组件到“字段选择”组件的连线连接线类型选择“主输出步骤”双击“字段选择”组件点击tab选项“移除”并在字段名称下方空白处右键点击“获取字段”选中上一步骤中的Java代码输出的字段后右键点击“删除选中的行”最后剩下多余的字段即可点击“确认”4.2.7 表输出结构化数据表落地接下来我们将已经转换为结构化的数据输出到数据库中以便后续使用拖拽“表输出”组件到画布中并创建“字段选择”组件到“表输出”组件的连线连接线类型选择“主输出步骤”双击“表输出”组件选择“团队私有数据库”连接勾选“裁剪表”这样表输出组件在插入数据前会清空原始表数据避免重复插入勾选“指定数据库字段”建立工作流字段与数据库表字段的映射关系。勾选后会激活“数据库字段”tab页在数据库字段tab页右键选择“获取字段”我们在4.2.3小节中创建的表字段与流字段是不一样的双击表字段在下拉框中选择正确的表字段设置完成后点击“确认”4.2.8 执行转换流执行转换流点击工具栏中的“执行”按钮在弹出执行配置窗口中选择默认配置然后点击“启动”按钮启动工作流查看日志工作流执行后会打开日志页面定期刷新工作流日志数据。查看数据库结果打开“元数据”tab页在“团队私有数据库”连接上右键选择“加载元数据”然后进入数据探查页面展开“团队私有数据库”双击目标表“behavior_events”在右侧页面选择“查询”tab标签查看数据库表数据是否符合预期4.3 数据分析方向确定得到 behavior_events 后我们需要决定分析什么。对 behavior_events 按进程名 process_name 统计使用人数可以快速看出哪些程序覆盖的用户最广。这个统计的价值在于它能帮我们从九百多万条杂乱记录中迅速锁定最值得分析的候选对象。4.3.1 创建进程统计表新建转换工作流并命名为“创建进程统计表”在该工作流中拖拽“执行一个SQL脚本”组件通过执行SQL脚本来创建一个标签表。整个转换流如下所示配置说明在组件中填写SQL脚本选择目标数据库连接“团队私有数据库”确保脚本执行权限SQL脚本如下其他参数使用默认选项完成后组件配置如下由于数据量较大为了顺利运行转换流我们点开“元数据”双击“团队私有数据库”勾选“使用结果流”完成后运行转换流运行过程会定时刷新组件状态并画布下面显示执行日志。4.3.2 统计进程用户规模每个进程得用户规模即用户数量 每个进程名称得用户ID计数新建转换流“统计进程用户规模”拖拽“表输入”组件到画布中数据库连接选择“团队私有数据库”并获取 behavior_events 得所有SQL查询语句拖拽“字段选择”组件到画布中并创建“表输入”组件到“字段选择”组件得连线双击“字段选择”组件点击tab选项“移除”然后再字段名称下方空白处右键点击“获取字段”统计每个进程得用户数量只需用到 user_id、process_name 两个字段所以需要移除其他字段选中user_id、process_name 两个字段右键点击“删除选中的行”删除后点击“确认”字段 process_name 可能存在空值为避免后续操作错误需要将空值替换为“未知”。拖拽“替换NULL值”组件到画布中并创建“字段选择”组件到“替换NULL值”组件的连线连接线类型选中“主输出步骤”双击“替换NULL值”组件勾选“选择字段”在下方字段表格中插入一行并输入字段process_name值替换为未知是否为空否分组聚合之前需要对数据进行排序否则分组计算结果可能出错。拖拽“排序字段”组件到画布中创建“替换NULL值”组件到“排序记录”组件的连线连接线类型选中“主输出步骤”双击“排序记录”组件将数据按照“process_name”字段升序排序接下来就可以对排序后的数据进行分组聚合统计了拖拽“分组”组件到画布中创建“排序记录”组件到“分组”组件的连线双击“分组”组件在分组字段空白处获取字段后仅保留“process_name”在聚合表格空白处右键点击“插入”双击插入的空白行名称输入“user_count”subject选择“user_id”类型选择“个数”最后点击“确认”分组聚合后的数据我们需要输出到4.3.1小节创建的统计表中拖拽“表输出”组件创建“分组”组件到“表输出”组件的连线双击“表输出”组件选择“团队私有数据库”连接勾选“裁剪表”这样表输出组件在插入数据前会清空原始表数据避免重复插入勾选“指定数据库字段”建立工作流字段与数据库表字段的映射关系。勾选后会激活“数据库字段”tab页在数据库字段tab页右键选择“获取字段”最后执行转换流即可4.3.1 观察数据确定分析方向为了确定覆盖用户最广的进程/软件我们使用助睿BI来观察数据点击实验平台左边菜单“助睿BI”进入助睿BI首页由于之前的实验已经创建了团队私有数据库的数据源连接本次实验无需再创建数据源连接可直接创建数据集点击“数据集”菜单在数据集页面点击“” - “新建数据集”数据集名称和备注信息都输入“进程用户数据统计”点击“确认”右上角数据源选择进程统计表 program_stats 所在的“商业数据分析” - “labs”将 program_stats 拖拽至画布中可以看到 program_stats 的数据结果为了方便观察可以将字段备注修改为中文修改完成后点击“保存”保存并发布数据集点击“工作表”进入工作表页面后点击“” - “新建工作表”输入工作表名称和备注信息后点击“确认”数据集选择刚刚创建的数据集“进程用户数据统计”图表类型选择“水平条图”将字段“program_name”拖拽至Y轴“user_count”拖拽至X轴并将“user_count”按照降序排序由此我们可以看到浏览器类进程chrome.exe、360chrome.exe、sogouexplorer.exe、QQBrowser.exe的用户数明显高于其他软件如QQ.exe、EXCEL.EXE、WINWORD.EXE。这表明浏览器是覆盖面最广的应用样本充足同时浏览器记录包含url可进一步分析网站偏好。因此确定浏览器为分析对象。4.4 分析方案设计与数据确定根据 4.3 节的统计结果我们发现浏览器类进程的用户覆盖率远高于其他软件且浏览器记录包含url字段可以挖掘用户网站偏好。因此我们将分析对象锁定为浏览器并围绕以下业务问题展开分析浏览器市场格局哪些浏览器用户最多、使用时长最长用户画像不同浏览器的用户在年龄、职业上有何差异使用习惯用户集中在什么时段使用浏览器竞争迁移用户是否会从一款浏览器切换到另一款流失预测哪些用户可能停止使用 iexplore.exe 浏览器个性化推荐根据用户的网站访问历史可以推荐哪些网站为了回答这些问题我们可以预先设计一套可视化方案将在下一实验完成。下表列出了每张图表对应的业务问题、所需数据字段以及最终输出的数据表名后续数据加工将围绕它们展开。输出表名内容粒度browser_coverage.csv每个浏览器的用户数、总使用时长每个浏览器一行browser_hourly.csv每个浏览器按小时统计活跃用户数浏览器 × 小时browser_demographic.csv每个浏览器按年龄分段、职业的用户分布浏览器 × 年龄组 × 职业browser_retention.csv每个浏览器从第3周到第4周的留存率每个浏览器一行browser_migration.csv用户从第3周主用浏览器切换到第4周主用浏览器的迁移对及人数源浏览器 → 目标浏览器churn_features.csv每个用户前三周的 Chrome 行为特征及标签每个用户一行churn_probability.csv每个用户的流失概率AI Studio 输出每个用户一行feature_importance.csv流失预测模型的特征重要性每个特征一行high_risk_users.csv流失概率最高的 20% 用户及其关键特征每用户一行约200行本次实验我们先完成前2个数据的加工首先需要在团队私有数据库中先创建这2个数据表创建两个转换流“创建浏览器的用户数总使用时长统计表”、“创建每个浏览器按小时统计活跃用户数统计表”两个转换流都拖拽“执行一个SQL脚本”组件到画布中分别输入以下SQL创建浏览器的用户数总使用时长统计表的“执行一个SQL脚本”组件配置如下SQL创建每个浏览器按小时统计活跃用户数统计表的“执行一个SQL脚本”组件配置如下SQL最后分别执行两个转换流即可4.5 数据清洗、聚合与关联加工在4.1章节转换后得到明细结构化数据单条记录仅反映单次电脑操作行为无法直观体现用户整体使用习惯因此开展清洗、聚合与关联加工提炼核心统计指标并结合用户基础属性信息形成具备分析价值的整合数据集。解析完成的behavior_events行为明细表同时引入demographic.csv用户人口属性数据表依靠用户唯一编号完成两份数据联动处理。注包含全部数据的behavior_events行为明细表已经存放在线上公共数据库中可以直接使用新建转换流“互联网用户行为日志数据清洗抽取”4.5.1 表输入读取行为日志数据拖入“表输入”组件到画布中连接线上公共数据源因为团队私有数据库中的数据只有20个数据仅作教学全部数据已存放在线上公共数据源中的 behavior_events 表中获取 behavior_events 的所有SQL查询语句4.5.2 字段选择删除冗余字段拖拽“字段选择”组件到画布中创建“表输入”组件到“字段选择”组件的连线双击“字段选择”组件点击“移除”tab选项在字段名称下方空白处右键点击“获取字段”选中 session_id, user_id, session_start_time, process_name, url, event_seconds 后删除选中的行保留下来的字段就是要移除的字段点击“确认”4.5.3 过滤记录筛选进程为主要浏览器的数据拖拽“过滤记录”组件到画布中创建“字段选择”组件到“过滤记录”组件的连线连接线类型选择“主输出步骤”双击“过滤记录”组件可以看到需要配置匹配和不匹配的结果的输出步骤因此我们先将后续的步骤的组件拖进来拖拽“排序记录”组件到画布中创建“过滤记录”组件到“排序记录”组件的连线连接线类型选择“True输出”再拖一个“空操作 (什么也不做)”组件到画布中创建“过滤记录”组件到“空操作 (什么也不做)”组件的连线连接线类型选择“False输出”再次双击“过滤记录”组件发送匹配的结果给“排序记录”发送不匹配的结果给“空操作 (什么也不做)”接下来配置过滤条件点击第一个“field”选择“process_name”表示过滤条件为process_name的值点击函数符号选择“IN LIST”点击“value”在弹出的窗口中类型选择“String”值为“iexplore.exe;360chrome.exe;360se.exe;chrome.exe;sogouexplorer.exe;EXCEL.EXE;WINWORD.EXE;AlilM.exe;QQBrowser.exe”表示process_name的值在其中的记录则为True否则为False最后点击“确认”4.5.4 计算停留时长原始日志只记录了焦点切换的时刻没有直接给出停留时长。但通过前后两条记录的event_seconds相减就能算出用户在每个窗口上停留了多久。这个时长是后续聚合总使用时长的基础数据。这一步骤需要用到3个组件排序记录按session_id和event_seconds升序排列确保同一个会话内的行为按时间顺序处理分析查询获取同一会话内下一行的event_seconds值存入新字段next_event_seconds计算器计算next_event_seconds - event_seconds得到停留时长duration_sec首先“排序记录”组件在上一步骤已经拖入了双击“排序记录”组件按session_id和event_seconds升序排列拖拽“分析查询”组件到画布中创建“排序记录”组件到“分析查询”组件的连线双击“分析查询”组件分组字段为“session_id”新增加的字段“next_event_seconds”要取值的字段为“event_seconds”类型“前第N行”N为“1”获取同一会话内下一行的event_seconds值存入新字段next_event_seconds拖拽“计算器”组件到画布中创建“分析查询”组件到“计算器”组件的连线双击“计算器”组件插入新字段行新字段输入“duration_sec”计算公式选择“A - B”字段A选择“next_event_seconds”字段B选择“event_seconds”值类型为“Integer”4.5.5 字段选择保留必要字段使用“字段选择”只保留user_id,process_name,session_start_time,url,duration_sec4.5.6 过滤记录筛选停留时长0的数据使用“过滤记录”组件过滤掉duration_sec 0的记录最后一条记录没有下一条时长无效忽略4.5.7 剪切字符串提取日期后续很多分析需要按天、按时段聚合比如每日使用时长、时段热力图。提前提取好日期和小时后续分组时直接使用避免重复解析。session_start_time的格式为yyyy-MM-dd HH:mm:ss通过剪切字符串组件可以直接获取yyyy-MM-dd拖拽剪切字符串组件到画布中创建过滤记录 1组件到拖拽剪切字符串组件的连线连接线类型选择“Trur输出”剪切字符串组件的配置如下4.5.8 字段选择设置日期格式目前获取的数据中session_start_time的类型为String为方便提前提取好小时需要将session_start_time的类型设置为Date拖拽字段选择组件到画布中创建剪切字符串组件到字符选择组件的连线连接线类型选择“主输出步骤”字段选择2组件的配置如下4.5.9 计算器提取小时通过计算器组件我们可以提取 yyyy-MM-dd HH:mm:ss 中的HH拖拽计算器组件到画布中创建字符选择组件到计算器组件的连线连接线类型选择“主输出步骤”计算器 1组件的配置如下4.5.10 生成用户-日-浏览器-小时明细原始数据是每条窗口切换记录粒度太细。我们真正关心的是“每个用户每天每浏览器每小时用了多久、启动了几次”。这一步将数据压缩到合适的粒度同时为后续所有统计表提供统一的基础数据。接下来我们就可以分组聚合组件来统计用户每天使用浏览器的时段数据了但在分组聚合前先使用排序记录组件进行排序避免分组聚合结果出错拖拽排序记录组件到画布中创建“计算器 1”组件到“排序记录 1”组件的连线排序记录 1组件的配置如下接下来拖拽分组组件创建“排序记录 1”组件到分组组件的连线分组组件的配置如下以上步骤获取的数据已经是比较合适颗粒度的数据了可以以此为基础抽取不同维度的数据以便用来实现后续的可视化分析4.5.11 分支A生成市场格局表目标统计每个浏览器的总用户数和总使用时长这两个指标直接回答“哪种浏览器覆盖最广、用得最久”。去重计数能避免同一用户被重复计算总时长反映真实使用强度。拖拽分组组件到画布中创建“分组”组件到“分组 1”组件的连线“分组 1”组件只按process_name分组聚合user_count COUNT(user_id) 有多少不同用户使用过该浏览器total_duration SUM(total_duration_sec) 所有用户的累计使用时长分组聚合的结果需要落地数据库拖拽“表输出”组件到画布中创建“分组 1”组件到“表输出 组件的连线”表输出组的配置如下4.5.12 分支B生成时段统计表目标统计每个浏览器在每个小时的使用情况用于分析用户的时间段偏好通过这张表可以绘制柱状图或折线图展示不同浏览器的使用高峰时段。例如白天工作时间 Chrome 使用量高晚上娱乐时段 360 浏览器更活跃。按小时聚合已经足够不需要更细的粒度此分支的分组字段包含浏览器、小时即process_name、hour而前一个排序记录只对process_name排序所以在这里需要按照process_name、hour升序排序拖拽“排序记录”组件到画布中创建“分组”组件到“排序记录 2”组件的连线数据传输模式选择复制发送“排序记录 2”组件的配置如下拖拽分组组件到画布中创建“排序记录 2”组件到“分组 2”组件的连线“分组 2”组件按process_name、hour分组聚合active_user_count user_id个数分组聚合的结果需要落地数据库拖拽“表输出”组件到画布中创建“分组 2”组件到“表输出 1组件的连线”表输出组的配置如下4.5.13 执行转换流点击运行按钮4.5.14 查看结果点击“元数据”tab选项右键团队私有数据并点击“加载元数据”接着点击“数据探查”可以看到团队私有数据库目录点击 browser_coverage、browser_hourly 两个数据表查询数据情况是否符合预期5 问题与解决半结构化日志无法直接入库分析问题原始行为日志为 TXT 文本半结构化数据无固定行列分隔符复杂无法直接导入数据库做统计分析。解决用获取文件名批量读取日志通过Java 代码解析文件名与日志内容按/[]拆分字段再经字段选择规整最终用表输出落地为标准结构化数据表。行为记录无停留时长无法统计使用强度问题日志仅记录行为发生秒数缺少单次窗口停留时长无法计算浏览器总使用时长。解决按会话与时间排序用分析查询获取下一行行为秒数通过计算器计算差值得到停留时长过滤无效时长后用于后续聚合统计。6 实验总结本次实验以互联网用户行为半结构化日志为对象在助睿 ETL 平台完成从日志解析、结构化转换、数据清洗到多维度聚合的全流程加工。先将零散 TXT 日志转为标准行为明细表再筛选浏览器数据计算停留时长、提取日期小时最终产出浏览器覆盖度与时序活跃两张核心统计表。实验掌握了半结构化数据解析、字段衍生、分组聚合与跨组件流设计方法形成可直接支撑用户画像、使用习惯分析与可视化的高质量数据集完整落地了日志数据从 “不可用” 到 “可分析” 的工程化过程。