助睿平台实战:从半结构化日志到精准画像的数据加工
2026/6/4 16:43:57 网站建设 项目流程

前言

你是否遇到过这样的情况:手里握着海量数据,却像面对一堆“天书”——日志格式千奇百怪,字段挤在一起,完全无法直接分析。这就是典型的半结构化数据困境。而数据加工,正是破解这一困境的钥匙。

本文将基于助睿数智平台,以一份真实的800万条用户浏览器行为日志为原料,带你逐行代码、逐个组件地完成一次完整的数据加工实战。你将亲眼看到,原始日志是如何一步步变成可分析、可洞察的结构化数据表的。

一、实验背景

1.1 数据集的整体构成

本次实验的数据集模拟了真实世界中用户行为日志的复杂性与规模。

用户规模为1000名真实用户的电脑使用行为记录。时间跨度是连续4周,横跨4个月,每月抽取1周。具体来说,第1周是2012年5月7日至5月13日,第2周是2012年6月4日至6月10日,第3周是2012年7月2日至7月8日,第4周是2012年8月6日至8月12日。数据总量解压后约825MB,原始行为记录超过800万条。

数据构成分为两个部分。第一部分是用户基本信息表,文件名为demographic.csv,存储用户ID、性别、年龄、职业、教育程度、收入等人口属性信息。第二部分是行为日志数据,存放在behavior文件夹中,按日期归档了数万个TXT文件,记录了用户详细的浏览器上网记录和软件使用记录。

这是本次实验的核心难点。我们需要完全理解一个TXT日志文件的内容和命名规则,才能编写正确的解析代码。

二、实验步骤

整个实验流程分为四个阶段:环境准备、数据解析、确定分析方向、清洗聚合加工。

2.1 第一阶段:环境准备与数据引入

步骤一:创建实验项目

登录助睿在线实验平台,点击“新建项目”按钮,输入项目名称“互联网用户行为日志数据加工”,然后点击“确定”。创建成功后,即可在数据集成页面看到新创建的项目。

步骤二:获取实验数据

由于完整数据量过大,我们使用其中20个TXT数据来学习解析方法。这些原始数据已经上传到平台公共空间,需要导入自己的文件目录下。

首先点击项目右上角的“...”图标,选择“打开项目”。进入项目页面后,左侧有三个菜单:资源库、文件、元数据。

点击“文件库”,右键根目录选择“新建目录”,输入目录名称“互联网用户行为日志数据集”,点击“确定”。

然后点击左侧“公共空间”,再点击“数据资源”,找到属于“互联网用户行为日志数据集”的数据卡片。点击卡片右上角的“更多”按钮,选择“导出”,在弹出的窗口中选择导出到刚刚创建的目录下,点击“确定”。重复这个操作,将本次实验用到的20个数据文件全部导出到自己的目录中。

2.2 第二阶段:半结构化数据解析

这是整个实验最核心、最复杂的部分。目标是将半结构化的TXT文件解析成规整的二维表结构。

步骤一:创建数据库表

新建一个转换工作流,命名为“创建原始行为日志数据表”。拖拽一个“执行一个SQL脚本”组件到画布中。双击这个组件,在SQL脚本框中输入建表语句。

这张表取名为behavior_events,它需要包含以下字段:自增主键id,会话唯一ID叫session_id,用户ID叫user_id,会话开始时间叫session_start_time,事件发生秒数叫event_seconds,进程名称叫process_name,进程ID叫process_id,访问网址叫url,地址栏句柄叫addr_handle,标签页句柄叫tab_handle,浏览器版本叫browser_version,窗口句柄叫window_handle,程序名称叫app_name,开发公司叫company_name,原始日志文件名叫source_file,以及入库时间create_time。同时要为session_id和user_id建立索引,方便后续查询。

选择目标数据库连接为“团队私有数据库”,确保脚本执行权限。配置完成后运行这个转换流,看到执行成功的绿色标识即可。

步骤二:构建解析工作流

新建另一个转换工作流,命名为“行为日志数据转为结构化数据”。这个工作流包含四个核心组件,按顺序连接:获取文件名 → Java代码 → 字段选择 → 表输出。

组件A:获取文件名

拖拽“获取文件名”组件到画布中。双击这个组件,点击“文件或目录”后面的“浏览文件”按钮,在弹出的窗口中选择我们之前创建的“互联网用户行为日志数据集”目录,点击“确定”。选择目录后点击“增加”,确认路径出现在下方列表中,最后点击“确认”。

组件B:Java代码(核心解析逻辑)

拖拽一个“Java代码”组件到画布中,并创建从“获取文件名”组件到“Java代码”组件的连线,连接线类型选择“主输出步骤”。

双击“Java代码”组件,需要输入完整的解析代码。我们来逐段解释这段代码在做什么。

代码首先定义了两个全局变量,pathField和shortFilenameField,用于接收上游组件传递的文件路径和短文件名。

在processRow方法中,首先要获取上游传递过来的文件路径和短文件名。然后从短文件名中解析用户ID和开机时间。解析逻辑是:去掉.txt后缀,按下划线分割,第一部分就是user_id,第二部分是日期,第三部分中的横杠替换为冒号后就是开机时间。接着用user_id和开机时间拼接成session_id,作为本次开机会话的唯一标识。

然后开始读取文件内容。使用BufferedReader逐行读取。先跳过前两行,因为前两行是Last和L_Start信息,不需要放入明细表。从第三行开始,每读一行就进行解析。

解析每一行时,先按[=]分割成若干个键值对。然后遍历每个键值对,再按<=>分割出键和值。根据键的不同,将值存入对应的变量中。T存入t变量,P存入p变量,I存入i变量,U存入u变量,A存入a变量,B存入b变量,V存入v变量,W存入w变量,N存入n变量,C存入c变量。

全部解析完成后,创建输出行,依次设置session_id、user_id、l_start、t、p、i、u、a、b、v、w、n、c、source_file这些字段的值,然后输出这一行。循环处理完文件中的所有行后,关闭文件读取器。

代码写完后,还需要配置输出字段。在Java代码组件的配置窗口中,字段空白表格处右键点击“插入”。双击插入的行,字段名输入“session_id”,类型选择“String”。继续插入行,依次配置user_id、l_start、t、p、i、u、a、b、v、w、n、c、source_file,全部选择String类型。

这里有一个特别需要注意的坑:部分额外操作可能导致已配置的字段类型变为0。此时转换流程虽然能正常运行,但数据表不会生成任何数据。如果遇到这种情况,请重新配置正确的字段类型,保存后再次执行任务即可。

组件C:字段选择

右键点击“Java代码”组件,选择“预览输出字段”,可以看到有很多字段是我们不需要的。拖拽一个“字段选择”组件到画布中,创建从“Java代码”到“字段选择”组件的连线。

双击“字段选择”组件,点击“移除”选项卡,在字段名称下方空白处右键点击“获取字段”,会看到所有上游字段。选中我们需要保留的字段之外的其余字段,右键点击“删除选中的行”。需要保留的字段是:session_id、user_id、l_start、t、p、i、u、a、b、v、w、n、c、source_file。

组件D:表输出

拖拽“表输出”组件到画布中,创建从“字段选择”到“表输出”组件的连线。

双击“表输出”组件,选择“团队私有数据库”连接。勾选“裁剪表”,这样在插入数据前会清空原始表数据,避免重复插入。勾选“指定数据库字段”,这会激活“数据库字段”选项卡。在这个选项卡中,右键选择“获取字段”,然后需要手动建立工作流字段与数据库表字段的映射关系。因为我们的流字段名和数据库表字段名不完全一致,所以双击每个表字段,在下拉框中选择正确的流字段。全部设置完成后点击“确认”。

步骤三:执行转换流

点击工具栏中的“执行”按钮,在弹出窗口中采用默认配置,点击“启动”。工作流开始运行后,可以在日志页面看到执行进度和详细信息。

执行成功后,查看数据库结果。打开“元数据”选项卡,在“团队私有数据库”连接上右键选择“加载元数据”,进入数据探查页面,展开“团队私有数据库”,双击目标表behavior_events,在右侧选择“查询”选项卡,就可以看到从原始日志解析出来的结构化数据了。

2.3 第三阶段:确定分析方向

现在我们有了一张800多万条记录的明细表,接下来该分析什么?我们要用数据来驱动决策。

步骤一:统计各进程的用户数

首先创建一张统计表。新建一个转换工作流,命名为“创建进程统计表”。拖拽“执行一个SQL脚本”组件,输入建表语句,创建一张名为program_stats的表,包含program_name和user_count两个字段。执行成功后,这张表就创建好了。

然后新建另一个转换流,命名为“统计进程用户规模”。拖拽“表输入”组件,选择“团队私有数据库”连接,从behavior_events表查询数据。拖拽“字段选择”组件,只保留user_id和process_name两个字段,其他全部移除。拖拽“替换NULL值”组件,将process_name为空的值替换为“未知”,避免后续聚合出错。拖拽“排序记录”组件,按照process_name升序排序。拖拽“分组”组件,分组字段选择process_name,聚合字段选择user_id,聚合类型选择“个数”,输出字段命名为user_count。最后拖拽“表输出”组件,将结果写入program_stats表。

步骤二:用BI可视化辅助决策

运行这个转换流后,我们就得到了每个进程的使用人数。为了直观地观察结果,我们使用助睿BI来可视化这些数据。

点击实验平台左边的“助睿BI”菜单,进入BI首页。点击“数据集”菜单,点击“加号”新建数据集,命名为“进程用户数据统计”。

数据源选择团队私有数据库所在的“商业数据分析”。将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字段,可以进一步分析用户的网站访问偏好,挖掘更多价值。

因此,我们确定将浏览器作为核心分析对象。

2.4 第四阶段:数据清洗、聚合与关联加工

确定分析方向后,我们需要对全量数据进行深度加工。注意,前面我们只用了20个TXT文件来学习解析方法,现在要处理的是完整的800万条记录。完整数据已经存放在线上公共数据库中,可以直接使用。

步骤一:创建目标数据表

根据分析需求,我们预先设计了一系列输出表。包括browser_coverage存储每个浏览器的用户数和总使用时长,browser_hourly存储每个浏览器按小时统计的活跃用户数,以及其他用于留存率、迁移矩阵、流失预测的表。本次实验我们先完成前两个表的加工。

创建两个转换流,分别命名为“创建浏览器的用户数总使用时长统计表”和“创建每个浏览器按小时统计活跃用户数统计表”。每个转换流都拖拽一个“执行一个SQL脚本”组件。

第一个转换流的SQL脚本是:CREATE TABLE browser_coverage,包含browser_name、user_count、total_duration_sec三个字段。

第二个转换流的SQL脚本是:CREATE TABLE browser_hourly,包含browser_name、hour、active_user_count三个字段,并设置browser_name和hour为联合主键。

分别执行这两个转换流,完成建表。

步骤二:构建数据清洗加工工作流

新建一个转换流,命名为“互联网用户行为日志数据清洗抽取”。以下是完整的组件配置顺序。

第1步:表输入。 拖拽“表输入”组件,这次要连接的是线上公共数据源,因为完整数据在那里。获取behavior_events表的所有数据。

第2步:字段选择。 拖拽“字段选择”组件,只保留user_id、session_start_time、process_name、url、event_seconds这几个字段,其他都移除。特别注意要保留event_seconds,因为后续需要用它计算停留时长。

第3步:过滤记录。 拖拽“过滤记录”组件,配置过滤条件为process_name IN LIST,列表中填入iexplore.exe、360chrome.exe、360se.exe、chrome.exe、sogouexplorer.exe、QQBrowser.exe。匹配的结果发送给下一步,不匹配的结果丢弃。

第4步:计算停留时长。 这是本阶段最重要的技术点。原始日志只记录了焦点切换的时刻,没有直接给出停留时长。但通过前后两条记录的event_seconds相减,就能算出用户在每个窗口上停留了多久。

这个步骤需要用到三个组件。

首先使用“排序记录”组件,按session_id和event_seconds升序排列,确保同一个会话内的行为按时间顺序处理。

然后拖拽“分析查询”组件,分组字段选择session_id,新增一个字段叫next_event_seconds,要取值的字段选择event_seconds,类型选择“前第N行”,N设为1。这样就能获取同一会话内下一条记录的event_seconds值。

最后拖拽“计算器”组件,新增字段duration_sec,计算公式选择“A减B”,A选择next_event_seconds,B选择event_seconds,值类型为Integer。

第5步:字段选择。 再次使用“字段选择”组件,只保留user_id、process_name、session_start_time、url、duration_sec这五个字段。

第6步:过滤记录。 再次使用“过滤记录”组件,筛选停留时长大于0的数据。因为每条会话的最后一条记录没有下一条,所以next_event_seconds为空,计算出的duration_sec会是负数或空值,这些记录需要忽略。

第7步:提取日期。 session_start_time的格式是“年-月-日 时:分:秒”,通过“剪切字符串”组件可以截取前10个字符,得到日期部分。拖拽“剪切字符串”组件,配置从位置0开始,剪切长度为10,输出到字段date。

第8步:设置日期格式。 目前session_start_time的类型是String,为了后续提取小时,需要将其转换为Date类型。拖拽“字段选择”组件,在“元数据”选项卡中修改session_start_time的类型为Date。

第9步:提取小时。 拖拽“计算器”组件,新增字段hour,计算公式选择“Date part”,参数选择“hour”,字段选择session_start_time,值类型为Integer。这样就得到了0到23之间的小时数。

第10步:生成中间明细。 原始数据是每条窗口切换记录,粒度太细。我们需要压缩到每个用户每天每浏览器每小时的总使用时长和启动次数。

先使用“排序记录”组件,按user_id、date、process_name、hour排序。

然后拖拽“分组”组件,分组字段选择user_id、date、process_name、hour,聚合字段有两个:第一个是对duration_sec求和,命名为total_duration_sec;第二个是对任意字段计数,命名为session_count。

这样我们就得到了一张高质量的中间明细表,后续所有分析指标都基于这张表生成。

第11步:分支A——生成市场格局表。

从上面的中间明细出发,拖拽第二个“分组”组件。这次只按process_name分组,聚合字段有两个:第一个是对user_id去重计数,命名为user_count;第二个是对total_duration_sec求和,命名为total_duration。

然后拖拽“表输出”组件,将结果写入browser_coverage表。

第12步:分支B——生成时段统计表。

从中间明细拖拽一个“排序记录”组件,按process_name和hour排序。

然后拖拽“分组”组件,按process_name和hour分组,聚合字段是对user_id计数,命名为active_user_count。

最后拖拽“表输出”组件,将结果写入browser_hourly表。

步骤三:执行并验证

点击运行按钮,执行这个转换流。

运行成功后,打开“元数据”选项卡,右键“团队私有数据库”,选择“加载元数据”,进入数据探查。双击browser_coverage表,可以看到每个浏览器的用户数和总使用时长。双击browser_hourly表,可以看到每个浏览器在每个小时的活跃用户数。这些数据可以直接用于后续的可视化分析。

三、实验结果

完成上述所有步骤后,我们在数据库中成功创建并填充了以下核心数据表。

第一张表:behavior_events。 这是结构化后的用户行为明细表,包含user_id、session_start_time、process_name、url、event_seconds等字段,每条记录代表一次窗口焦点切换。

第二张表:program_stats。 这是各进程的使用用户数统计表,包含program_name和user_count,帮助我们快速了解哪些软件覆盖面最广。

第三张表:browser_coverage。 这是浏览器的用户数与总使用时长统计表,包含browser_name、user_count、total_duration_sec三个字段。它直接回答两个问题:哪个浏览器用户最多?哪个浏览器使用时长最长?

第四张表:browser_hourly。 这是浏览器按小时的活跃用户数统计表,包含browser_name、hour、active_user_count三个字段。它用于分析用户的时间段偏好,比如什么时段哪个浏览器最活跃。

这些表格不再是难以理解的半结构化日志,而是规整的二维表,可以直接导入BI工具生成各种业务图表。从原始日志到分析就绪的数据,我们完成了数据加工最核心的一步。

四、问题与解决

在本次实验过程中,我也遇到了一些小波折,记录在这里供大家参考。

4.1问题一:Java代码组件运行成功,但数据库表里没有数据。

我按照指导书配置好Java代码组件后,点击执行,任务状态显示成功,但去数据库里查询behavior_events表,发现是空的,一条数据都没有。

反复检查了几遍,最后发现是输出字段的类型配置出了问题。不知道什么原因,之前配置好的字段类型全部被重置成了数字“0”。虽然任务能跑通,但因为类型不对,数据根本没有被正确输出。

解决办法是:重新打开Java代码组件的配置,把所有输出字段的类型重新设置一遍(比如String、Integer等),保存后再次执行,数据就正常写入数据库了。

4.2问题二:表输出组件一直报字段映射错误。

在执行解析工作流的最后一步时,表输出组件报错,提示无法找到对应的数据库字段。我检查了一下,发现虽然勾选了“指定数据库字段”,但数据库字段和流字段的映射关系是空的。

解决办法是:在表输出组件的“数据库字段”选项卡中,先右键点击“获取字段”,让平台自动读取目标表的所有字段,然后手动逐行匹配。比如数据库字段“user_id”对应流字段“user_id”,“process_name”对应流字段“p”,一一对应设置好后就不再报错了。

五、实验总结

通过这次完整的实验,我们不仅仅是学会了操作一个软件,更重要的是建立了数据加工的工程化思维。

第一,工具是手段,思维是核心。

我们掌握了“获取文件名 → Java代码 → 字段选择 → 表输出”这一经典的数据解析范式。但更关键的是理解了面对任何非标准数据,都应遵循“探查格式 → 定位规律 → 编写解析器 → 结构化输出”的方法论。那个看似复杂的Java代码,本质上就是一套针对特定分隔符的解析逻辑。

第二,分析导向的数据加工。

我们不是盲目地处理所有字段,而是通过“先统计、再观察、后决定”的策略,锁定了浏览器这一核心分析对象。这启示我们:数据加工的每一步都应为最终的商业分析目标服务。先找到最有价值的分析切入点,再集中精力处理相关数据,而不是对全量数据做等量齐观的加工。

第三,分层加工,复用基础。

我们首先构建了“用户-日-浏览器-小时”级别的中间明细层,所有的市场格局、时段统计等指标表都来源于这一张中间表。这种分层建模的思路能极大提升数据复用率和开发效率。当需要新的分析指标时,我们只需要从中间明细层派生新的聚合表,而不需要重复解析原始日志。

第四,数据会说话。

最终产出的browser_coverage和browser_hourly表已经能够初步回答“哪个浏览器统治市场”、“用户何时最活跃”等实际问题。这让我们真切感受到:数据加工是数据产生业务价值的必经之路。没有这一步,那些躺在文件夹里的TXT文件永远只是一堆难以解读的字符。

本次实验完成了数据加工的上半场。接下来,这些规整的数据将进入助睿BI,被制作成动态仪表板,进一步揭示浏览器市场的格局与用户画像的深层秘密。

感谢您的观看!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询