参考
场景
场景一
教师节快到了,你特别想知道18至25岁单身文艺女神的购物习惯:她喜欢什么样的礼物?最近想买什么礼物又暂时还没有购买(就是把商品放入了购物车,却没有下单)?你乐了,作为某知名电商大数据平台的资深架狗师,这种小问题简直就是一块蛋糕啊!
场景二
“用户画像”,“用户图像” 等高大上词语愕然并发出现在大数据开发工程师的招聘技能条列上。话说Snail 最近准备找工作,深厚的spark技术功底(瞎说的),苦于没有真实的大数据项目经验,想自我构造一下。于是乎,昨晚在IMF技术群里问了一个问题:
“standalone 部署模式、12台 8核16G的spark集群, 能轻松的处理业务复杂度类似 ‘用户访问sesion分析 模块类型的作业,’活跃用户量在10万级别,日均数据量在100万级别的电商网站吗?”
一哥们,立马回应了:“给你出个.你们公司的用户图像怎么做的“,”现在来我们公司面试一定问的问题” “能用大数据的角度,谈电商的用户图像,这个是我们公司对大数据架构师的基本要求”。
IT行业有个奇妙的现象?不少猿友喜欢搬出一些像“用户画像”之类的所谓的专业术语,,,越写越多,此处省略800字。用户画像无非就是从多个角度,不同层次来分析考察用户的行为(把用户看作一头大象,从不同的角度来分析描述了解ta,进而从ta身上挖宝)。对于电商平台来说,了解用户最好的手段莫过于分析ta的会话信息(session)了!
好的,废话不多说了,用户session分析模块的需求是什么呢?
需求分析
0、按条件筛选session
含义:比如统计:‘昨天’内 ‘18至25岁’ ‘单身’ ‘文艺’ ‘女神’ ,这里的每个词语都是筛选条件。我们计是针对特定人群,而不非泛泛地瞎统计。
意义:获取特定人群的session数据,为后续各种分析做准备。1、统计筛选session的访问时长占比
含义:统计出符合条件的session中,访问时长在1s~3s、4s~6s、7s~9s、10s~30s、30s~60s、1m~3m、3m~10m、10m~30m、30m以上各个范围内的session占比;访问步长在1~3、4~6、7~9、10~30、30~60、60以上各个范围内的session占比。
访问时长:一个用户从登录网站到退出网站历时多长,也就是session的开始与结束时间。
访问步长:用户在一个session执行期间内,依次点击过多少个页面(通过计算发生了多少搜索、点击、下单与支付行为来计算)。
意义:让决策人员从全局的角度看到,符合条件的用户群体使用公司产品的一些习惯。比如大多数人,到底是会在产品中停留多长时间,会在一次使用产品的过程中访问多少个页面。2、按时间比例随机抽取1000个session
含义:符合条件的session数据量一般很大,假设有100万条,你不可能对这100万条记录都进行分析吧。好,从其中抓取一小部分来分析即可,怎么抓取(采样)?为了保证取样的公平性,这里采用 按时间比例随机抽取,且以小时为基本统计单位 - 什么意思呢?看一个场景:
总体session个数 :100万
统计日期:1天内-昨天
昨天20:00至21:00的session数量为20万
按时间比例,在于保证样本公平的分布在每天的每个时间段,访问量多的时间段抽取的样本数量也多。上述场景中在 20:00至21:00之间应该随机抽取多少样本呢?
samples(20-21) = (20万/100万)* 1000 = 200条
意义:为后续详细分析样本session的点击流行为提供数据:用户依次点击了哪些商品,搜索了哪些关键字,把哪些商品加入了购物车等等。3、获取点击、下单和支付数量排名前10的品类
含义:”知己“,分析出女神最想要的10类商品,知道公司目前最受她欢迎的产品是什么。所谓的最想要就是她最关注的商品:点击次数、下单次数与支付次数最多的商品。
意义:Of great importance ! 让公司清晰地了解到不同层次、不同类型的用户的心理和喜好。4、对于排名前10的品类,分别获取其点击次数排名前10的session
意义:”知彼”,获取最关注公司最受欢迎产品的10个session信息。
含义:让公司清晰地了解到,最受欢迎的各个品类最感兴趣最典型的用户的session的行为。
数据设计
数据设计,往往包含两个环节。
第一、数据调研环节看到的项目基于的基础数据,是否要针对其开发一些Hive ETL,对数据进行进一步的处理和转换,从而让我们能够更加方便的和快速的去计算和执行spark作业;
第二个,就是要设计spark作业要保存结果数据的业务表的结构,从而让J2EE平台可以使用业务表中的数据,来为使用者展示任务执行结果。
hive相关表
user_visit_action表 存放网站或app每天的点击流的数据。用户对网站/app每点击一下,就会代表在这个表里面的一条数据。
date:日期,代表这个用户点击行为是在哪一天发生的
user_id:代表这个点击行为是哪一个用户执行的
session_id :唯一标识了某个用户的一个访问session
page_id :页面的id
action_time :这个点击行为发生的时间点
search_keyword :用户执行的某个搜索行为所搜索的关键词
click_category_id :用户点击的商品品类id:吉他、钢琴等
click_product_id :用户点击的具体商品id
order_category_ids :用户下单的商品品类-对应购物车中的商品种类
order_product_ids :某次下单,具体对哪些商品下的订单
pay_category_ids :对某个订单,或者某几个订单,进行了一次支付的行为,对应了哪些品类
pay_product_ids:支付行为下,对应的哪些具体的商品
city:用户所在的城市
user_info表 存储用户的基础信息
user_id:其实就是每一个用户的唯一标识,通常是自增长的Long类型,BigInt类型
username:是每个用户的登录名
name:每个用户自己的昵称、或者是真实姓名
age:用户的年龄
professional:用户的职业
city:用户所在的城市
mysql相关表
task表 用来存储J2EE平台插入的任务信息。公司业务人员通过J2EE前台输入请求参数后,提交了一个spark查询作业。J2EE后台接受请求参数并将其保存到数据库,然后通过Runtime等Java API调用包含spark-submit的shell脚本执行相关spark应用程序。
CREATE TABLE `task` (
`task_id` int(11) NOT NULL AUTO_INCREMENT,
`task_name` varchar(255) DEFAULT NULL,
`create_time` varchar(255) DEFAULT NULL,
`start_time` varchar(255) DEFAULT NULL,
`finish_time` varchar(255) DEFAULT NULL,
`task_type` varchar(255) DEFAULT NULL,
`task_status` varchar(255) DEFAULT NULL,
`task_param` text,
PRIMARY KEY (`task_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8
session_agg_statistic表 存储第一个功能点session聚合统计的结果
存储各个长度的session访问时间段占总session数的比例。
CREATE TABLE `session_aggr_stat` (
`task_id` int(11) NOT NULL,
`session_count` int(11) DEFAULT NULL,
`1s_3s` double DEFAULT NULL,
`4s_6s` double DEFAULT NULL,
`7s_9s` double DEFAULT NULL,
`10s_30s` double DEFAULT NULL,
`30s_60s` double DEFAULT NULL,
`1m_3m` double DEFAULT NULL,
`3m_10m` double DEFAULT NULL,
`10m_30m` double DEFAULT NULL,
`30m` double DEFAULT NULL,
`1_3` double DEFAULT NULL,
`4_6` double DEFAULT NULL,
`7_9` double DEFAULT NULL,
`10_30` double DEFAULT NULL,
`30_60` double DEFAULT NULL,
`60` double DEFAULT NULL,
PRIMARY KEY (`task_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
session_random_extract表 存储第二个功能点:按时间比例随机抽取功能抽取出来的1000个session
CREATE TABLE `session_random_extract` (
`task_id` int(11) NOT NULL,
`session_id` varchar(255) DEFAULT NULL,
`start_time` varchar(50) DEFAULT NULL,
`end_time` varchar(50) DEFAULT NULL,
`search_keywords` varchar(255) DEFAULT NULL,
PRIMARY KEY (`task_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
top10_category表 存储按点击、下单和支付排序出来的top10品类数据
CREATE TABLE `top10_category` (
`task_id` int(11) NOT NULL,
`category_id` int(11) DEFAULT NULL,
`click_count` int(11) DEFAULT NULL,
`order_count` int(11) DEFAULT NULL,
`pay_count` int(11) DEFAULT NULL,
PRIMARY KEY (`task_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
top10_category_session表 存储top10每个品类的点击top10的session
CREATE TABLE `top10_category_session` (
`task_id` int(11) NO NULL,
`category_id` int(11) DEFAULT NULL,
`session_id` varchar(255) DEFAULT NULL,
`click_count` int(11) DEFAULT NULL,
PRIMARY KEY (`task_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
session_detail表 存储随机抽取出来的1000个session的明细数据、top10品类的session的明细数据
CREATE TABLE `session_detail` (
`task_id` int(11) NOT NULL,
`user_id` int(11) DEFAULT NULL,
`session_id` varchar(255) DEFAULT NULL,
`page_id` int(11) DEFAULT NULL,
`action_time` varchar(255) DEFAULT NULL,
`search_keyword` varchar(255) DEFAULT NULL,
`click_category_id` int(11) DEFAULT NULL,
`click_product_id` int(11) DEFAULT NULL,
`order_category_ids` varchar(255) DEFAULT NULL,
`order_product_ids` varchar(255) DEFAULT NULL,
`pay_category_ids` varchar(255) DEFAULT NULL,
`pay_product_ids` varchar(255) DEFAULT NULL,
PRIMARY KEY (`task_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
总结
666,碎觉的节奏