当前位置: 首页 > news >正文

手把手教你用ETL平台进行用户行为日志分析:从半结构化数据到流失预测数据集

1实验目标本实验旨在通过实操达成以下核心学习成果熟悉数据深入理解数据集的构成与半结构化日志数据的特点掌握文本日志解析与字段拆分的实用方法。数据规整完成从零散、非标准的原始日志到规整、可分析的标准结构化数据表的转换。指标搭建执行多维度数据聚合、衍生新字段并进行跨表关联构建一套适配用户行为分析场景的指标体系。特征工程完成机器学习流程中的特征工程处理最终产出可直接用于预测建模的高质量数据集。2操作环境实验平台操作基于“助睿在线实验平台”https://lab.guilian.cn/。本实验采用的“助睿数智Uniplore”是一个一站式数据科学平台它覆盖了从数据接入、ETL处理、机器学习建模到可视化展示的完整链路且支持零代码操作非常适用于数据分析教学与企业数据加工场景。产品官网为https://www.uniplore.com/。处理工具数据加工环节主要使用助睿ETL数据集成平台。数据规模实验数据涵盖1000名用户产生的超过800万条行为记录数据文件总大小约为825MB。3实验数据说明本实验所使用的数据源于“首届中国互联网数据挖掘竞赛”的公开数据集。这是一类典型的计算机用户行为半结构化日志数据广泛用于用户行为分析、习惯挖掘、活跃度预测及用户画像等研究领域。3.1 数据集构成数据集由以下三部分核心内容组成用户基本信息demographic.csv文件存储了用户的ID、性别、年龄、职业、教育程度、收入等人口属性信息。上网行为记录日志中详细记录了用户访问的URL、域名及访问时间。软件使用记录日志中包含进程名、程序名、软件使用时长以及窗口切换等操作信息。整个数据集解压后约825MB包含800多万条原始行为记录。这些记录追踪了1000名用户在连续4周内的电脑使用行为数据横跨4个月每月抽取一周数据具体时间范围为- 第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文件用户属性表。这两部分数据通过共同的user_id用户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 核心字段含义字段含义T距离开机的秒数即行为发生的相对时间P进程名例如360se.exe、QQ.exeI进程IDU浏览器访问的URLW非浏览器窗口的句柄V程序版本号N程序名称仅在首次出现时记录C开发公司名称仅在首次出现时记录A / B浏览器窗口句柄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脚本如下CREATE 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 用户行为事件明细表;其他参数使用默认选项完成后组件配置如下完成后运行转换流运行过程会定时刷新组件状态并画布下面显示执行日志。由于原始的数据是半结构化的数据无法直接通过文件输入组件获取数据所以需要换一种思路通过 获取文件名 组件批量读取并定位日志文件再交由 Java 代码 组件完成半结构化日志的解析含字段拆分接着通过 字段选择 组件筛选并规整有效字段最终输出为标准结构化数据表实现原始文本日志到可分析数据的标准化转换。4.2.4 获取文件名日志文件批量采集新建转换工作流并命名为行为日志数据转为结构化数据在该工作流中拖拽获取文件名组件双击获取文件名组件在配置窗口中点击文件或目录后后的浏览文件按钮在弹出的窗口中选择我们上面创建的目录互联网用户行为日志数据集再点击确定选择目录后点击增加选择的目录出现在下方的路径中点击确认4.2.5 Java 代码日志解析与结构化转换根据实验数据说明我们可以通过 java 代码来 读取日志文件、解析文件名、提取用户与开机信息、跳过文件头部、按分隔符拆分半结构化行为记录将原始 TXT 日志中的 T、P、I、U、V、W、N、C 等关键字段逐一解析提取最终输出包含会话 ID、用户信息、行为详情的标准结构化数据完成从半结构化数据到结构化数据的转换。拖拽一个Java 代码 组件到画布中并创建获取文件名组件到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继续插入行依次将java代码中输出的字段进行配置参考如下字段名类型session_idStringuser_idStringl_startStringtStringpStringiStringuStringaStringbStringvStringwStringnStringcStringsource_fileString配置完成后点击确认4.2.6 字段选择有效字段筛选与规整右键java 代码组件点击预览输出字段可以看到有很多字段是我们不需要也不属于原始数据字段的需要移除拖拽字段选择组件到画布中并创建Java 代码组件到字段选择组件的连线连接线类型选择主输出步骤双击字段选择组件点击tab选项移除并在字段名称下方空白处右键点击获取字段选中上一步骤中的Java代码输出的字段后(即我们插入的i,u,w,v,a等字段右键点击删除选中的行最后剩下多余的字段即可点击确认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脚本如下-- 创建程序/软件统计表CREATE TABLE program_stats ( program_name VARCHAR(255) NOT NULL, -- 程序/软件名称 user_count INT NOT NULL -- 使用用户数 );其他参数使用默认选项完成后组件配置如下由于数据量较大为了顺利运行转换流我们点开元数据双击团队私有数据库勾选使用结果流完成后运行转换流运行过程会定时刷新组件状态并画布下面显示执行日志。4.3.2 统计进程用户规模每个进程得用户规模即用户数量 每个进程名称得用户ID计数新建转换流统计进程用户规模拖拽表输入组件到画布中数据库连接选择团队私有数据库并获取 behavior_events 得所有SQL查询语句拖拽字段选择组件到画布中并创建表输入组件到字段选择组件得连线双击字段选择组件点击tab选项移除然后再字段名称下方空白处右键点击获取字段统计每个进程得用户数量只需用到 user_id、process_name 两个字段所以需要移除其他字段选中user_id、process_name 两个字段右键点击删除选中的行删除后点击确认字段 process_name 可能存在空值为避免后续操作错误需要将空值替换为未知。拖拽替换NULL值组件到画布中并创建字段选择组件到替换NULL值组件的连线连接线类型选中主输出步骤双击替换NULL值组件勾选选择字段在下方字段表格中插入一行并输入字段process_name 值替换为未知 是否为空否分组聚合之前需要对数据进行排序否则分组计算结果可能出错。拖拽排序字段组件到画布中创建替换NULL值组件到排序记录组件的连线连接线类型选中主输出步骤双击替换NULL值组件将数据按照process_name字段升序排序接下来就可以对排序后的数据进行分组聚合统计了拖拽分组组件到画布中创建排序记录组件到分组组件的连线双击分组组件在分组字段空白处获取字段后仅保留process_name在聚合表格空白处右键点击插入双击插入的空白行名称输入user_countsubject选择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脚本组件配置如下SQLCREATE 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浏览器用户覆盖率与总时长;创建每个浏览器按小时统计活跃用户数统计表的执行一个SQL脚本组件配置如下SQLCREATE 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浏览器按小时活跃用户数;最后分别执行两个转换流即可4.5 数据清洗、聚合与关联加工在4.1章节完成数据结构化转换后我们得到了一张行为明细表。这张表中的每一条记录仅对应一次具体的电脑操作行为粒度较细还无法直接反映用户在整体层面的使用习惯。因此我们需要进一步执行数据清洗、聚合和关联加工等操作从中提炼出核心的统计指标并与用户的基础属性信息相结合最终形成一个具备分析价值的整合数据集。我们将以已经解析完成的behavior_events行为明细表为基础同时引入demographic.csv用户人口属性数据表通过用户唯一编号user_id将两份数据进行联动处理。注包含全部数据的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字段进行差值计算从而得出用户在每个窗口上的实际停留时间。这个停留时长将成为后续聚合统计例如计算浏览器的总使用时长的基础数据。实现这一计算需要依次使用以下三个组件排序记录按照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值类型为Integer4.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格式yyyy-MM-dd HH:mm:ss拖拽字段选择组件到画布中创建剪切字符串组件到字符选择组件的连线连接线类型选择主输出步骤字段选择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 实验总结本次实验基于800余万条用户行为日志完成了从半结构化原始数据到结构化分析数据集的全流程加工。通过解析日志文件、计算停留时长、筛选浏览器行为、聚合统计指标等步骤成功构建了浏览器覆盖率、按小时活跃度等核心数据表并确定了浏览器市场格局、用户画像、使用习惯、竞争迁移、流失预测及个性化推荐六大分析方向。实验掌握了ETL工具的关键组件操作解决了日期格式匹配等技术问题为后续的用户行为分析与流失预测建模奠定了坚实的数据基础。
http://www.rkmt.cn/news/1395219.html

相关文章:

  • Gitee 企业版效能度量升级:当研发数据开始回答“为什么”
  • claude code 的 skill 用法以及skill 的高级特性
  • Mooncake:以 KVCache 为中心的分离式 LLM 服务架构
  • 2026年正规的安徽雕塑定制厂家有哪些厂家推荐榜,3D打印雕塑/玻璃钢雕塑/泡沫雕塑 - 品牌企业推荐师(官方)
  • Java 匿名内部类与方法执行时间计算
  • 怎么样修改论文格式?
  • 当数字孪生陷入“交付即闲置”困境:从重建设到重运营的路径选择
  • jsPsych:浏览器中构建心理学实验的5大核心优势
  • AI图像识别+速度估计+距离测量+轨迹跟踪+计数+代码+教程
  • 饲料颗粒机厂家
  • 最近几年电力设备排行榜sf6气体泄漏报警在线监测设备生产厂家
  • 2026亲测:专业AI智能降重工具选它准没错
  • 零基础自学生信分析指南,含详细步骤,跟着学轻松实现从零到一!
  • 【Lovable功能更新路线图】:2024Q3核心迭代清单与开发者优先适配指南
  • 全球出行一站式专家:圣擎航空助您抢占特价商务舱,畅飞美西三大都会 - 土星买买买
  • Lovable咨询工具开发终极 checklist:含GDPR/CCPA双合规配置、实时会话分析、NPS自动归因(限首批200份技术文档)
  • 给硬件新人的DDR4信号扫盲课:从差分时钟到数据选通,一次搞懂内存怎么‘说话’
  • 2026年企业级Data Agent开发平台推荐:主流企业级Data Agent开发平台
  • 2026年广州GEO优化服务商实力对比,谁更胜一筹? - 智鸥科技
  • atvoss:Vector 算子子程序模板库,让 Ascend C 开发效率提升 5 倍
  • 【Lovable审计系统黄金配置手册】:基于27家头部客户压测数据——CPU占用降低63%、审计延迟<8ms的关键参数调优公式
  • 通过curl命令快速测试Taotoken的API兼容性与模型响应
  • Color-X 卡乐瓷砖网上怎么买?有官方渠道吗?(Color-X 卡乐瓷砖小红书线上渠道介绍) - 寻茫精选
  • 从OpenWrt拨号异常到网络畅通:一次MTU值的精准调优实战
  • 别再手动建模了!用SolidWorks+Simscape Multibody Link插件,5分钟搞定机械臂动力学仿真
  • 打造全屋语音中枢:基于ESP8266的红外遥控器智能化改造实战
  • android-sqlite3:从官方 SQLite 源码自动构建 Android 可用的 sqlite3
  • ChatGPT文件上传失败率高达63.7%?资深工程师曝光3个被忽略的客户端埋点陷阱及修复Checklist
  • 创业团队如何利用Taotoken快速原型验证不同模型的AI能力
  • 【高并发AI网关设计内参】:单节点扛住5000+ QPS的API路由、熔断与审计方案