新手友好!基于零代码平台浏览器市场与用户画像分析-数据加工(1)全流程演示

新手友好!基于零代码平台浏览器市场与用户画像分析-数据加工(1)全流程演示
一、实验背景1.1实验目的熟悉数据集构成与半结构化日志数据特点掌握文本日志解析、字段拆分的实操方法完成数据规整将零散原始日志转化为标准结构化数据表实现多维度数据聚合、字段衍生与跨表关联搭建适配分析场景的指标体系1.2实验环境零代码在线实验平台本次实验基于助睿数智平台数据集成平台助睿 ETL助睿BI 数据可视化探索平台MySQL数据规模1000 用户800 万 条行为记录约 825MB1.3 实验数据本实验基于首届中国互联网数据挖掘竞赛公开数据集开展是非常典型的计算机用户行为半结构化日志数据专门用于用户行为分析、习惯挖掘、活跃度预测与用户画像研究二、实验步骤2.1 日志数据结构化转换新建项目输入名称 “互联网用户行为日志数据加工”点击确定创建。由于本次实验的数据量过大我们仅使用其中 20 个 TXT 数据来学习如何将半结构化数据转换为结构化数据。首先获取本次的实验数据集打开项目点击 “文件库”右键根目录点击 “新建目录”输入目录名为 “互联网用户行为日志数据集”点击确定。接下来点击 “公共空间”点击 “数据资源”点击属于 “互联网用户行为日志数据集” 下的数据卡片右上角的更多并点击 “导出”在弹出的窗口中选择导出到刚刚创建的目录下点击 “确定”。可以看到在 “互联网用户行为日志数据集” 的目录下新增了数据文件。接下来重复以上导出操作将本次实验用到的 20 个数据都导出到 “互联网用户行为日志数据集”。新建转换并命名为 “互联网用户行为日志数据表”在该工作流中拖拽执行一个 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 代码组件组件到画布中并创建 “获取文件名组件” 到 “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; }在字段空白表格处依次插入将java代码中输出的字段进行配置参考如下字段名类型session_idStringuser_idStringl_startStringtStringpStringiStringuStringaStringbStringvStringwStringnStringcStringsource_fileString配置完成后点击“确认”拖拽 “字段选择” 组件到画布中创建 “Java 代码组件” 到 “字段选择” 组件的连线连接类型选择主输出步骤。双击 “字段选择” 组件点击移除选项并在字段名称下方空白处点击 “获取字段”选中上一步骤中的Java代码输出的字段后右键删除选中的行最后剩下的字段点击确认。拖拽 “表输出” 组件到画布中创建 “字段选择” 组件到 “表输出” 组件的连线连接类型选择主输出步骤。双击 “表输出” 组件进行如下配置在数据库字段中建立表字段与流字段的映射关系后点击确认最后执行转换流打开 “元数据” 页面在 “团队私有数据库” 上右键选择 “加载元数据”点击数据探查选中目标表 behavior_events点击查询查看数据是否符合预期。2.2 数据分析方向确定得到 behavior_events 后我们需要决定分析什么。对 behavior_events 按进程名 process_name 统计使用人数可以快速看出哪些程序覆盖的用户最广。这个统计的价值在于它能帮我们从九百多万条杂乱记录中迅速锁定最值得分析的候选对象。2.3 分析方案设计与数据确定新建转换工作流并命名为“创建进程统计表”在该工作流中拖拽“执行一个SQL脚本”组件通过执行SQL脚本来创建一个标签表配置如下SQL脚本-- 创建程序/软件统计表 CREATE TABLE program_stats ( program_name VARCHAR(255) NOT NULL, -- 程序/软件名称 user_count INT NOT NULL -- 使用用户数 );由于数据量较大为了顺利运行转换流我们点开“元数据”双击“团队私有数据库”勾选“使用结果流”。完成后运行转换流新建转换流“统计进程用户规模”拖拽“表输入”组件到画布中数据库连接选择“团队私有数据库”并获取 behavior_events 得所有SQL查询语句拖拽“字段选择”组件到画布中并创建“表输入”组件到“字段选择”组件得连线双击“字段选择”组件点击tab选项“移除”然后再字段名称下方空白处右键点击“获取字段”选中user_id、process_name 两个字段右键点击“删除选中的行”字段 process_name 可能存在空值为避免后续操作错误需要将空值替换为“未知”。拖拽“替换NULL值”组件到画布中并创建“字段选择”组件到“替换NULL值”组件的连线连接线类型选中“主输出步骤”。 双击“替换NULL值”组件勾选“选择字段”在下方字段表格中插入一行并配置如下拖拽“排序字段”组件到画布中创建“替换NULL值”组件到“排序记录”组件的连线连接线类型选中“主输出步骤” 双击“排序记录”组件将数据按照“process_name”字段升序排序接下来就可以对排序后的数据进行分组聚合统计了拖拽“分组”组件到画布中创建“排序记录”组件到“分组”组件的连线双击分组组件并按如下配置:拖拽 “表输出” 组件创建 “分组” 组件到 “表输出” 组件的连线。双击 “表输出” 组件选择团队私有数据库目标表为 “program_stats”指定数据库字段建立字段映射,最后执行转换即可点击实验平台左边菜单“助睿BI”进入助睿BI首页,由于之前的实验已经创建了团队私有数据库的数据源连接本次实验无需再创建数据源连接可直接创建数据集右上角数据源选择进程统计表 program_stats 所在位置将 program_stats 拖拽至画布中为了方便观察可以将字段备注修改为中文修改完成后保存并发布新建“进程用户数量分析”工作表数据集选择刚刚创建的数据集“进程用户数据统计”图表类型选择“水平条图”将字段“program_name”拖拽至Y轴“user_count”拖拽至X轴并将“user_count”按照降序排序由此我们可以看到浏览器类进程的用户数明显高于其他软件。这表明浏览器是覆盖面最广的应用样本充足同时浏览器记录包含 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: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浏览器用户覆盖率与总时长;创建每个浏览器按小时统计活跃用户数统计表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浏览器按小时活跃用户数;2.4 数据清洗、聚合与关联加工新建转换流“互联网用户行为日志数据清洗抽取” 拖拽 “表输入” 组件到画布中连接线上公共数据源因为团队私有数据库中的数据只有 20 个数据仅作教学全部数据已存放在线上公共数据源中的 behavior_events 表中获取 behavior_events 的所有 SQL 查询语句。拖拽 “字段选择” 组件到画布中创建 “表输入” 组件到 “字段选择” 组件的连线。双击 “字段选择” 组件点击移除 tab 选项在字段名称下方空白处右键点击 “获取字段”选中 session_id, user_id, session_start_time, process_name, url, event_seconds 后删除选中的行保留下来的字段就是要移除的字段点击 “确认”。拖拽 “过滤记录” 组件到画布中创建 “字段选择” 组件到 “过滤记录” 组件的连线连接类型选择主输出步骤。拖拽 “排序记录” 组件到画布中创建 “过滤记录” 组件到 “排序记录” 组件的连线连接类型选择 True 输出步骤。再拖一个 “空操作什么也不做” 组件到画布中创建 “过滤记录” 组件到 “空操作什么也不做” 组件的连线连接类型选择 False 输出步骤。双击 “过滤记录” 组件设置过滤条件点击第一个“field”选择“process_name”表示过滤条件为process_name的值点击中间的函数符号选择“IN LIST”点击“value”类型选择“String”值为主要浏览器的进程名“iexplore.exe;360chrome.exe;360se.exe;chrome.exe;sogouexplorer.exe;QQBrowser.exe”表示process_name的值在其中的记录则为True否则为False原始日志只记录了焦点切换的时刻没有直接给出停留时长。但通过前后两条记录的 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”拖拽 “计算器” 组件到画布中创建 “分析查询” 组件到 “计算器” 组件的连线。双击 “计算器” 组件插入新字段行新字段输入 “duration_sec”计算公式选择 “A - B”字段 A 选择 “next_event_seconds”字段 B 选择 “event_seconds”值类型为 “Integer”。使用 “字段选择”只保留 user_id, process_name, session_start_time, url, duration_sec。使用 “过滤记录” 组件过滤掉 duration_sec 0 的记录配置如下;拖拽 “剪切字符串” 组件到画布中创建过滤记录 1 组件到拖拽剪切字符串组件的连线连接类型选择 True 输出配置如下:目前获取的数据中session_start_time 的类型为String为方便提前提取好小时需要将session_start_time 的类型设置为Date。拖拽字段选择组件到画布中创建剪切字符串组件到字符选择组件的连线连接线类型选择“主输出步骤”字段选择2组件的配置如下通过计算器组件我们可以提取 yyyy-MM-dd HH:mm:ss 中的HH拖拽计算器组件到画布中创建字符选择组件到计算器组件的连线连接线类型选择“主输出步骤”计算器 1组件的配置如下原始数据是每条窗口切换记录粒度太细。我们真正关心的是“每个用户每天每浏览器每小时用了多久、启动了几次”。这一步将数据压缩到合适的粒度同时为后续所有统计表提供统一的基础数据。接下来我们就可以分组聚合组件来统计用户每天使用浏览器的时段数据了但在分组聚合前先使用排序记录组件进行排序避免分组聚合结果出错拖拽排序记录组件到画布中创建“计算器 1”组件到“排序记录 1”组件的连线排序记录 1组件的配置如下接下来拖拽分组组件创建“排序记录 1”组件到分组组件的连线分组组件的配置如下接下来我们先生成市场格局表拖拽分组组件到画布中创建“分组”组件到“分组 1”组件的连线配置如下:拖拽“表输出”组件到画布中创建“分组 1”组件到“表输出 组件的连线”配置如下接着我们生成时段统计表拖拽“排序记录”组件到画布中创建“分组”组件到“排序记录 2”组件的连线数据传输模式选择复制发送排序记录配置如下拖拽分组组件到画布中创建“排序记录 2”组件到“分组 2”组件的连线分组配置如下拖拽“表输出”组件到画布中创建“分组 2”组件到“表输出 1组件的连线”配置如下最后我们的完整转换流如下运行转换流运行完成后加载元数据在数据探查中选中两个表查询数据是否符合预期三、实验结果日志数据结构化转换完成成功将 20 个半结构化 TXT 日志文件解析为标准结构化数据写入behavior_events用户行为事件明细表。字段完整包含会话 ID、用户 ID、会话开始时间、事件秒数、进程名称、URL、浏览器版本、来源文件等数据格式规范、可用于后续分析。进程用户规模统计完成成功生成program_stats进程用户数量统计表按进程名统计去重用户数。统计结果显示浏览器类进程360chrome、chrome、IE、QQ 浏览器等用户数远高于其他软件确定以浏览器为核心分析对象。浏览器核心指标表生成成功创建browser_coverage表统计各浏览器去重用户数与总使用时长清晰呈现市场格局。成功创建browser_hourly表按 0–23 小时统计各浏览器活跃用户数形成用户时段分布特征。数据清洗与加工完成完成浏览器数据筛选、停留时长计算、日期 / 小时提取、空值处理、去重与聚合。输出粒度统一、质量可靠的小时级用户行为明细可直接支撑 BI 可视化与用户画像分析。四、问题与解决4.1 问题问题执行统计用户进程规模转换流和日志数据抽取加工转换流时报错显示无数据4.2 原因原因平台不稳定4.3 解决解决重新运行转化为结构数据转换流接着按序运行统计用户进程规模转换流和日志数据抽取加工转换流五、实验总结本次实验基于助睿数智零代码 ETL 平台完成互联网用户行为日志从半结构化解析、结构化转换、数据清洗聚合到指标输出的全流程数据加工成功实现日志文件批量导入、SQL 建表、日志解析、字段筛选、时长计算、分组统计与表输出等操作生成用户行为明细、进程用户统计、浏览器市场格局与时段活跃等标准数据表明确浏览器为核心分析对象并完成关键指标建模。实验过程中解决了平台不稳定导致的无数据报错问题掌握了零代码数据集成与可视化分析的核心方法达成数据规整、多维度聚合与业务化指标输出的目标为后续用户画像、行为分析与数据可视化奠定了扎实基础。

最新新闻

日新闻

周新闻

月新闻