浏览器市场与用户画像分析-数据加工(2)


浏览器市场与用户画像分析-数据加工(2)

引言

本实验基于约 1000 名用户、累计 800 万条以上的浏览器使用行为日志,构建从明细数据到聚合统计表的完整 ETL 加工链路。原始数据存储于底层行为表中,无法直接用于大屏可视化——明细表数据量大、查询延迟高,且大屏各图表需要的是聚合指标而非明细行。因此,需要在数据接入大屏之前,完成多张目标统计表的加工。

整体加工策略为:以明细表 daily_browser_detail 为核心数据源,通过排序、分组、聚合、字段映射与 JavaScript 计算等组件,按业务维度逐层汇总,最终产出 7 张目标表,覆盖市场格局、使用行为、时段偏好与用户画像四大分析主题。

实验环境为助睿数智(Uniplore)平台的数据集成模块(助睿 ETL),后端数据库采用 MySQL,全程以可视化转换流方式完成零代码数据加工。

一、明细数据基座构建

所有聚合运算均依赖明细表 daily_browser_detail,其字段结构为 user_id、usage_date、browser_name、hour、total_duration_sec、active_count。

1.1 创建明细表

在团队私有数据库中执行 DDL 语句,创建目标表。由于数据规模达到 800 万行以上,存储引擎选择 InnoDB,字符集设置为 utf8mb4 以避免中文字段乱码。

CREATETABLEIFNOTEXISTS `daily_browser_detail` (`user_id` VARCHAR(50NOTNULLCOMMENT‘用户ID’,                `usage_date` DATENOTNULLCOMMENT‘使用日期’,                `browser_name` VARCHAR(50NOTNULLCOMMENT‘浏览器名称’,                `hour` TINYINT NOTNULLCOMMENT‘小时’,                `total_duration_sec` INTNOTNULLCOMMENT‘总使用时长(秒)’,                `active_count` INTNOTNULLCOMMENT‘活跃次数’) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

1.2 复制并改造上游转换流

前序实验已构建”互联网用户行为日志数据清洗抽取”转换流,但其输出为两张中间聚合表。本次需要的是明细数据,因此复制该转换流并进行如下三项修改。

第一项:修正排序逻辑。 原流中的排序组件仅按 process_name 字段升序排列,而分组组件实际使用了 user_id、usage_date、process_name、hour 四个分组字段。排序字段与分组字段不一致会导致分组结果出现重复行,需将排序字段补全为与分组字段一致的四列。

第二项:浏览器名称映射。 日志中记录的浏览器进程名为可执行文件名(如 chrome.exe、iexplore.exe),不具备可读性。在分组组件后新增”值映射”组件,将进程名映射为对应的中文浏览器名称。同时需检查上游过滤条件,确保 EXCEL.EXE、WINWORD.EXE、AlilM.exe 等非浏览器进程已被排除。

第三项:追加表输出。 在值映射组件下游添加”表输出”组件,目标表指定为刚创建的 daily_browser_detail,勾选”裁剪表”选项以覆盖模式写入。

1.3 执行转换流

点击运行按钮,转换流启动全量数据抽取。受数据规模影响,此步骤耗时较长。执行完成后,明细表基座搭建完毕。

二、目标表体系设计

在开始具体的聚合加工之前,首先批量创建全部 7 张目标表。新建一条转换流,使用”执行一个 SQL 脚本”组件,通过 DROP TABLE IF EXISTS + CREATE TABLE 语句一次性完成建表操作。

目标表清单及用途说明:

browser_overview —— 核心指标概览,键值对结构,存储总使用时长、人均使用时长、活跃用户占比、重度用户占比

browser_weekly_active —— 各浏览器周活跃趋势,按周维度统计活跃用户数

browser_frequency_stats —— 浏览器使用频率分布,按轻度/中度/重度三个等级划分

browser_multi_usage —— 用户使用浏览器数量分布,统计 1 种/2 种/3 种及以上的用户分布

browser_weekday_weekend —— 浏览器工作日与周末使用对比

user_profile_stats —— 用户画像统计,按性别、年龄、学历、职业、收入、居住地类型、省份等维度交叉汇总

三、逐表加工流程

3.1 各浏览器周活跃趋势表

加工链路:表输入 → 字段选择 → 值映射 → 排序 → 分组 → 表输出

各步骤要点:

1.表输入:读取 daily_browser_detail 全部字段。

2.字段选择:将 usage_date 元数据类型设置为 Date,格式为 yyyy-MM-dd,为后续日期到周的映射做准备。

3.值映射:将每条记录的 usage_date 映射为对应的周区间标签(如 “5/7-5/13″)。目标字段命名需独立创建(week_range),不应覆盖原日期字段。

4.排序:按 browser_name 与 week_range 升序排列。分组操作前执行排序是保证去重计数正确性的必要条件。

5.分组:分组键为 browser_name 与 week_range,对 user_id 执行去重计数,得到字段 active_user_count。

6.表输出:以裁剪表模式写入 browser_weekly_active

3.2 各浏览器使用频率分布表

本转换流为全部加工链路中组件数量最多的一条,完整链路为:

表输入 → 排序 → 分组 → 增加常量 → 计算器 → JavaScript → 排序 → 分组 → 表输出

加工步骤:

1.读取明细表并排序:按 user_id 与 browser_name 升序排列。

2.第一次分组:按 user_id 与 browser_name 聚合,对 total_duration_sec 求和,计算每位用户在每款浏览器上的累计使用秒数。

3.增加常量:插入字段 hour_m_s,类型为 Integer,固定值为 3600,用于后续秒到小时的转换。

4.计算器:执行 A / B 运算,total_seconds 除以 hour_m_s,得到 total_hours 字段并保留 2 位小数。

5.JavaScript 分级:依据周使用时长将用户划分为三个等级——轻度(< 3 小时)、中度(3-10 小时)、重度(> 10 小时)。

var total_hours = total_hours;var usage_level =;if (total_hours <3) {usage_level =‘轻度’;elseif (total_hours >=3&& total_hours <10) {usage_level =‘中度’;else {usage_level =‘重度’;}

6.第二次排序与分组:按 browser_name 与 usage_level 升序排序后,以相同字段分组,对 user_id 执行去重计数。

7.表输出:写入 browser_frequency_stats

3.3 用户使用浏览器数量分布表

目标:统计使用 1 种、2 种、3 种及以上浏览器的用户数量分布。

1.表输入与排序:读取明细表,按 user_id 升序排序。

2.第一次分组:按 user_id 分组,对 browser_name 执行去重计数,得到字段 browser_cnt,表示该用户使用的浏览器种类数量。

3.JavaScript 分级:将使用种类数量映射为分类标签。

var browser_cnt = browser_cnt;var browser_count =;if (browser_cnt ==1) {browser_count =‘1种’;elseif (browser_cnt ==2) {browser_count =‘2种’;else {browser_count =‘3种及以上’;}

4.第二次排序与分组:按 browser_count 升序排序并分组,统计 user_count。

5.表输出:写入 browser_multi_usage

本节的转换流结构与 3.2 节类似,此处不再重复展示全部截图。

3.4 各浏览器工作日与周末对比表

目标:按浏览器和日期类型(工作日/周末)两个维度,统计人均使用时长与总使用时长。

核心步骤为通过 JavaScript 根据日期获取星期值:0(周日)和 6(周六)判定为周末,1-5 判定为工作日。

var date = usage_date;var dayOfWeek = date.getDay();var day_type =“”;if (dayOfWeek >=1&& dayOfWeek <=5) {day_type =“工作日”;else {day_type =“周末”;}

后续操作流程:按 browser_name 与 day_type 排序后执行分组聚合,计算 avg_seconds(平均使用时长)、total_seconds(总使用时长)、user_count(去重用户数)。通过增加常量组件与计算器组件将总使用秒数转换为小时单位,最后以字段选择组件移除中间计算字段,输出至 browser_weekday_weekend

3.5 核心指标数据抽取

目标:一次性计算四个全局核心指标——总使用时长、人均使用时长、活跃用户占比、重度用户占比。

此处采用一条 SQL 语句直接完成所有指标的计算,相较于分多条转换流分别计算,显著简化了编排复杂度。

SELECTROUND(SUM(total_duration_sec) /36002AS total_hours,ROUND(SUM(total_duration_sec) /3600/COUNT(DISTINCT user_id), 2AS avg_hours,ROUND((SELECTCOUNT(DISTINCT user_id) FROM daily_browser_detail WHERE usage_date BETWEEN‘2012-08-06’AND‘2012-08-12’*100.0/COUNT(DISTINCT user_id), 2AS active_ratio,ROUND((SELECTCOUNT(*FROM (SELECT user_id FROM daily_browser_detail WHERE usage_date BETWEEN‘2012-05-07’AND‘2012-07-08’GROUPBY user_idHAVINGSUM(total_duration_sec) /3600>30) t) *100.0/COUNT(DISTINCT user_id), 2AS heavy_ratioFROM daily_browser_detail

SQL 查询返回单行四列结果。后续通过”行转列”组件将字段名称转换为 metric_name、字段值转换为 metric_value;再以”值映射”组件将英文 key 映射为对应的中文指标名称。最终写入 browser_overview

3.6 用户画像统计表加工

目标:为每款浏览器统计用户群体的画像分布,涵盖性别、年龄、学历、职业、收入、居住地类型、省份七个维度。

此步骤需引入外部人口属性数据 demographic.csv(从平台公共空间导出至项目文件库),通过用户 ID 与明细表进行关联。

加工链路为两条支线并行后合并:CSV文件输入 → 增加常量 → 计算器(年龄) → JavaScript(年龄分段) → 排序 与 表输入(明细表) → 排序,两支线汇入 记录集连接(LEFT OUTER JOIN) 后,再经由 排序 → 分组 → 表输出 完成入库。

读取人口属性数据。 使用”CSV 文件输入”组件加载 demographic.csv,编码选择 UTF-8,通过”获取字段”按钮自动解析字段结构。

年龄计算与分段。 原数据中包含出生年份字段(BIRTHDAY)而无直接年龄字段,数据采集年份为 2012 年,因此 age = 2012 – BIRTHDAY。随后通过 JavaScript 将年龄划分为四段:18 岁以下、18-25 岁、26-35 岁、35 岁以上。

var age_group =;if (age <18) {age_group =‘<18’;elseif (age <=25) {age_group =’18-25′;elseif (age <=35) {age_group =’26-35′;else {age_group =‘>35’;}

读取明细表。 以”表输入”组件读取 daily_browser_detail 的全部字段数据。

双线排序与记录集连接。 两支线数据分别按 user_id 升序排序后,通过”记录集连接”组件执行 LEFT OUTER JOIN。左侧为明细数据(连接字段 user_id),右侧为用户属性数据(连接字段 USERID)。

多维度分组聚合。 按 browser_name、GENDER、EDU、JOB、INCOME、PROVINCE、ISCITY、age_group 共 8 个字段分组,对 user_id 执行去重计数。

表输出。 将分组聚合结果写入 user_profile_stats

结果验证。 在平台元数据模块中加载团队私有数据库,对 user_profile_stats 表执行数据探查,检查各维度分组计数是否符合预期。

四、实践总结

本次 ETL 加工实践形成以下几点认识:

1.明细表是聚合体系的根基。 全部 7 张目标表均源自 daily_browser_detail,该表的数据质量直接决定下游聚合结果的准确性。排序字段与分组字段不一致、过滤条件遗漏非浏览器进程等问题,均可能导致计数翻倍或数据偏差,应在早期环节严格检查。

2.JavaScript 组件提供关键的灵活性。 日期转星期、使用时长分级、年龄分段等业务逻辑,均可通过少量 JavaScript 代码简洁实现,有效降低了多组件串联的维护负担。

3.先建表再开发有利于流程衔接。 在加工开始前批量完成全部目标表的创建,避免各转换流执行时因目标表缺失而反复中断。

4.SQL 集中计算可替代多条转换流。 核心指标抽取案例中,一条 SQL 语句配合行转列与值映射组件,即可完成原本需要多条独立转换流才能实现的指标计算,显著提升编排效率。

完成本阶段 ETL 加工后,下一步工作是将 7 张目标表接入数据大屏可视化工具,进入数据呈现环节。