DLF产品(数据湖构建)提供元数据抽取和数据探索的功能,本文介绍如何通过DLF完成对淘宝用户行为样例的分析。
前提条件
已创建OSS Bucket。如未创建,请参见创建存储空间。
操作流程
服务开通:开通阿里云账号及DLF和OSS相关服务。
样例数据集下载和导入:下载样例数据(CSV文件),并上传至OSS。
DLF数据抽取:使用DLF数据抽取,自动识别文件Schema并创建元数据表。
DLF数据探索:使用DLF数据探索,对用户行为进行分析,包括用户活跃度、漏斗模型等。
数据说明
本次测试的数据集来自阿里云天池比赛中使用的淘宝用户行为数据集,为了提高性能,我们做了一定的裁剪。数据集中以CSV的格式存储了用户行为及商品样例数据。
淘宝用户行为数据集介绍:https://tianchi.aliyun.com/dataset/dataDetail?dataId=46
数据范围:2014年12月1日 - 2014年12月7日
数据格式:
user表
字段 | 字段说明 | 提取说明 |
user_id | 用户标识 | 抽样&字段脱敏(非真实ID) |
item_id | 商品标识 | 字段脱敏(非真实ID) |
behavior_type | 用户对商品的行为类型 | 包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4。 |
user_geohash | 用户位置的空间标识,可以为空 | 由经纬度通过保密的算法生成 |
item_category | 商品分类标识 | 字段脱敏 (非真实ID) |
time | 行为时间 | 精确到小时级别 |
item表
字段 | 字段说明 | 提取说明 |
item_id | 商品标识 | 抽样&字段脱敏(非真实ID) |
item_ geohash | 商品位置的空间标识,可以为空 | 由经纬度通过保密的算法生成 |
item_category | 商品分类标识 | 字段脱敏 (非真实ID) |
详细流程
第一步:开通DLF和OSS服务
第二步:将需要分析的数据文件上传至OSS
第三步:在DLF上抽取元数据
登录数据湖构建控制台。
创建数据库。
在左侧菜单栏,选择
。单击数据库页签,选择目标数据目录,单击新建数据库。
配置以下数据库信息,单击确定。
所属数据目录:选择所属数据目录。
数据库名称:输入数据库名称。
数据库描述:可选,输入数据库描述。
选择路径:选择上一步中存有用户行为分析数据user_behavior_data的OSS路径。
如下图所示,数据库创建成功。
进行DLF数据抽取。
在左侧导航栏,单击
。在元数据抽取页面,单击新建抽取任务。参数配置详情请参见元数据抽取。
填写抽取源相关配置,单击下一步。
选择要使用的目标数据库,单击下一步。
设置抽取任务信息。
RAM角色:默认为开通阶段已经授权的“AliyunDLFWorkFlowDefaultRole”。
执行策略:选择手动执行。
抽取策略:选择全量抽取。扫描全量数据文件,在数据规模比较大时,作业消耗时间长,抽取结果更准确。
核对信息后,单击保存并立即执行。
系统会跳转到元数据抽取列表页面,新建的任务开始创建并自动运行。在数据规模比较大时,作业消耗时间长。
待任务运行成功后,鼠标移到状态栏的问号图标,可看到已经成功创建了两张元数据表。
查询数据表信息。
单击浮层中的数据库,单击表列表页签,可查看该库中相关的表信息。
单击表名,查看并确认抽取出来的表结构是否符合预期。
第四步:用户行为数据分析
数据分析的过程主要分为三步:
预览并检查数据信息。
简单的数据清洗。
进行用户活跃度、漏斗模型和商品热度分析。
预览并检查数据
在左侧菜单栏,单击数据探索,在SQL查询框中输入以下语句,查看文件中的数据信息。
SET spark.sql.legacy.timeParserPolicy=LEGACY;
-- 预览数据
SELECT * FROM `demo_db`.`user` limit 10;
SELECT * FROM `demo_db`.`item` limit 10;
-- 用户数
SELECT COUNT(DISTINCT user_id) FROM `demo_db`.`user`;
-- 商品数
SELECT COUNT(DISTINCT item_id) FROM `demo_db`.`item`;
-- 行为记录数
SELECT COUNT(*) FROM `demo_db`.`user`;
结果如下:
数据预处理
我们对原始数据进行一定的处理,以提高数据的可读性,并提升分析的性能。
创建新表user_log,表格式为Parquet,按日期分区。
将behavior_type转换成更易理解的字符串信息:1-click; 2-collect; 3-cart; 4-pay。
将日志+时间的格式拆分为日期和小时两列,再加上周信息,便于分别做日期和小时级别的分析。
过滤掉不必要的字段,并将数据存入新表user_log。
后续我们会基于新表做用户行为分析。
CREATE TABLE `demo_db`.`user_log`
USING PARQUET
PARTITIONED BY (date)
AS SELECT
user_id,
item_id,
CASE
WHEN behavior_type = 1 THEN 'click'
WHEN behavior_type = 2 THEN 'collect'
WHEN behavior_type = 3 THEN 'cart'
WHEN behavior_type = 4 THEN 'pay'
END AS behavior,
item_category,
time,
date_format(time, 'yyyy-MM-dd') AS date,
date_format(time, 'H') AS hour,
date_format(time, 'u') AS day_of_week
FROM `dlf_demo`.`user`;
-- 查看运行后的数据
SELECT * FROM `demo_db`.`user_log` limit 10;
结果如下:
用户行为分析
首先,我们基于漏斗模型,对所有用户从点击到加购、收藏、购买的转化情况进行分析。
-- 漏斗分析耗时13秒 SELECT behavior, COUNT(*) AS total FROM `demo_db`.`user_log` GROUP BY behavior ORDER BY total DESC
结果如下:
然后对一周内每天的用户行为做统计分析。
-- 用户行为分析耗时14秒 SELECT date, day_of_week, COUNT(DISTINCT(user_id)) as uv, SUM(CASE WHEN behavior = 'click' THEN 1 ELSE 0 END) AS click, SUM(CASE WHEN behavior = 'cart' THEN 1 ELSE 0 END) AS cart, SUM(CASE WHEN behavior = 'collect' THEN 1 ELSE 0 END) AS collect, SUM(CASE WHEN behavior = 'pay' THEN 1 ELSE 0 END) AS pay FROM `demo_db`.`user_log` GROUP BY date, day_of_week ORDER BY date
结果如下(由于数据集经过裁剪,对于工作日和非工作日的结果有失真)。
最后,我们结合商品表,分析出数据集中最受欢迎的是个商品品类
-- 销售最多的品类耗时1分10秒 SELECT item.item_category, COUNT(*) AS times FROM `demo_db`.`item` item JOIN `demo_db`.`user_log` log ON item.item_id = log.item_id WHERE log.behavior='pay' GROUP BY item.item_category ORDER BY times DESC LIMIT 10;
结果如下:
(可选)下载分析结果。
DLF提供将分析结果以CSV文件的形式下载的功能,启用该功能需要提前设置分析结果的保存路径(OSS路径)。设置后,查询结果会被保存到该路径下。
单击数据探索页面右上方的路径设置,设置结果存储路径,可以选择已有文件夹或者新建文件夹。
设置完成后,运行SQL查询,在运行历史页签的下载结果直接下载,也可以直接通过OSS路径访问和下载该文件。
(可选)保存SQL。
通过单击保存,可以将本次分析用到的SQL进行保存,后续可直接在已存查询中打开,做进一步的调用及修改。
问题解答
如果您有任何问题或希望深入探讨数据湖技术,欢迎在微信中搜索并关注“数据湖技术圈”公众号。