項(xiàng)目介紹
電商網(wǎng)站的各種用戶(hù)行為進(jìn)行分析
訪(fǎng)問(wèn)首頁(yè) → 點(diǎn)擊商品 → 添加購(gòu)物車(chē) → 結(jié)算
訪(fǎng)問(wèn)首頁(yè) → 輸入關(guān)鍵詞 → 點(diǎn)擊商品列表 → 點(diǎn)擊商品→ 關(guān)閉網(wǎng)頁(yè)
訪(fǎng)問(wèn)詳情頁(yè) → 查看推薦商品 → 點(diǎn)擊商品列表 → 點(diǎn)擊商品→ 購(gòu)買(mǎi)
廣告頁(yè) → 商品頁(yè) → 購(gòu)物車(chē)
項(xiàng)目目的
為產(chǎn)品部門(mén)稿湿、運(yùn)營(yíng)部門(mén)稚铣、決策部門(mén)
提供決策數(shù)據(jù)支持
提供優(yōu)化指導(dǎo)思路
企業(yè)開(kāi)發(fā)流程
需求分析 → 方案設(shè)計(jì) → 數(shù)據(jù)設(shè)計(jì) → 編碼實(shí)現(xiàn) → 功能測(cè)試 → 解決技術(shù)問(wèn)題(數(shù)據(jù)傾斜等)→ 性能調(diào)優(yōu)
用戶(hù)需求
可以根據(jù)使用者指定的某些條件,篩選出指定的一些用戶(hù)(有特定年齡隘竭、職業(yè)可训、城市)绘梦;
例如:
選擇年齡: 10 到 50周歲
選擇時(shí)間: 開(kāi)始時(shí)間2017-08-20 結(jié)束時(shí)間2017-08-20
選擇性別:女性
查詢(xún)符合條件的所有用戶(hù)
名詞解釋
用戶(hù)訪(fǎng)問(wèn)session
用戶(hù)session指的是:
從用戶(hù)第一次進(jìn)入頁(yè)面開(kāi)始嘀掸,到用戶(hù)關(guān)閉瀏覽器(長(zhǎng)時(shí)間沒(méi)有操作)結(jié)束。
在這段時(shí)間范圍內(nèi)实幕,所有的操作(可能做了幾十次吝镣、甚至上百次操作),都稱(chēng)為是一個(gè)用戶(hù)行為昆庇。
在一個(gè)Session過(guò)程中SessionId是不變的末贾,由多個(gè)id相同的Session組成用戶(hù)的一條操作行為
一個(gè)用戶(hù)一天可以有多個(gè)Session
數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu) user_visit_action(Hive表)
date:日期,代表這個(gè)用戶(hù)點(diǎn)擊行為是在哪一天發(fā)生的
user_id:代表這個(gè)點(diǎn)擊行為是哪一個(gè)用戶(hù)執(zhí)行的
session_id :唯一標(biāo)識(shí)了某個(gè)用戶(hù)的一個(gè)訪(fǎng)問(wèn)session
page_id :點(diǎn)擊了某些商品/品類(lèi)整吆,也可能是搜索了某個(gè)關(guān)鍵詞拱撵,然后進(jìn)入了某個(gè)頁(yè)面,頁(yè)面的id
action_time :這個(gè)點(diǎn)擊行為發(fā)生的時(shí)間點(diǎn)
search_keyword :如果用戶(hù)執(zhí)行的是一個(gè)搜索行為表蝙,比如說(shuō)在網(wǎng)站/app中拴测,搜索了某個(gè)關(guān)鍵詞,然后會(huì)跳轉(zhuǎn)到商品列表頁(yè)面府蛇;搜索的關(guān)鍵詞
click_category_id :可能是在網(wǎng)站首頁(yè)昼扛,點(diǎn)擊了某個(gè)品類(lèi)(美食、電子設(shè)備欲诺、電腦)
click_product_id :可能是在網(wǎng)站首頁(yè),或者是在商品列表頁(yè)渺鹦,點(diǎn)擊了某個(gè)商品(比如呷哺呷哺火鍋XX路店3人套餐扰法、iphone 6s)
order_category_ids :代表了可能將某些商品加入了購(gòu)物車(chē),然后一次性對(duì)購(gòu)物車(chē)中的商品下了一個(gè)訂單毅厚,這就代表了某次下單的行為中塞颁,有哪些
商品品類(lèi),可能有6個(gè)商品,但是就對(duì)應(yīng)了2個(gè)品類(lèi)祠锣,比如有3根火腿腸(食品品類(lèi))酷窥,3個(gè)電池(日用品品類(lèi))
order_product_ids :某次下單,具體對(duì)哪些商品下的訂單
pay_category_ids :代表的是伴网,對(duì)某個(gè)訂單蓬推,或者某幾個(gè)訂單,進(jìn)行了一次支付的行為澡腾,對(duì)應(yīng)了哪些品類(lèi)
pay_product_ids:代表的沸伏,支付行為下,對(duì)應(yīng)的哪些具體的商品
數(shù)據(jù)結(jié)構(gòu) user_info(Hive表)
user_id:其實(shí)就是每一個(gè)用戶(hù)的唯一標(biāo)識(shí)动分,通常是自增長(zhǎng)的Long類(lèi)型毅糟,BigInt類(lèi)型
username:是每個(gè)用戶(hù)的登錄名
name:每個(gè)用戶(hù)自己的昵稱(chēng)、或者是真實(shí)姓名
age:用戶(hù)的年齡
professional:用戶(hù)的職業(yè)
city:用戶(hù)所在的城市
數(shù)據(jù)結(jié)構(gòu) task(MySQL表)
task_id:表的主鍵
task_name:任務(wù)名稱(chēng)
create_time:創(chuàng)建時(shí)間
start_time:開(kāi)始運(yùn)行的時(shí)間
finish_time:結(jié)束運(yùn)行的時(shí)間
task_type:任務(wù)類(lèi)型澜公,就是說(shuō)姆另,在一套大數(shù)據(jù)平臺(tái)中,肯定會(huì)有各種不同類(lèi)型的統(tǒng)計(jì)分析任務(wù)坟乾,比如說(shuō)用戶(hù)訪(fǎng)問(wèn)session分析任務(wù)迹辐,頁(yè)面單跳轉(zhuǎn)化率統(tǒng)計(jì)任務(wù);所以這個(gè)字段就標(biāo)識(shí)了每個(gè)任務(wù)的類(lèi)型
task_status:任務(wù)狀態(tài)糊渊,任務(wù)對(duì)應(yīng)的就是一次Spark作業(yè)的運(yùn)行右核,這里就標(biāo)識(shí)了,Spark作業(yè)是新建渺绒,還沒(méi)運(yùn)行贺喝,還是正在運(yùn)行,還是已經(jīng)運(yùn)行完畢
task_param:最最重要宗兼,用來(lái)使用JSON的格式躏鱼,來(lái)封裝用戶(hù)提交的任務(wù)對(duì)應(yīng)的特殊的篩選參數(shù)
數(shù)據(jù)Session聚合
將多條id相同的記錄聚合成一條記錄:意思是說(shuō)將多個(gè)Action組成一個(gè)動(dòng)作序列
User_visit_action數(shù)據(jù)量龐大
1000萬(wàn)日活用戶(hù),就能產(chǎn)生5到10億條用戶(hù)行為數(shù)據(jù)
如果我們做一次Session的聚合殷绍,數(shù)據(jù)量將大大下降
我們將單個(gè)操作染苛,比如 點(diǎn)擊、搜索等主到,組成一個(gè)行為序列茶行,用時(shí)間順序排序,表明用戶(hù)都做了哪些操作登钥,前后操作順序是什么樣畔师?
下面開(kāi)始搭建開(kāi)發(fā)環(huán)境
項(xiàng)目地址
https://github.com/xy83918/ECLA
開(kāi)發(fā)IDE
https://www.jetbrains.com/idea/download/#section=windows
jdk 下載1.7
http://www.oracle.com/technetwork/java/javase/archive-139210.html
mysql
https://www.mysql.com/downloads/
MySQL windows版
http://sw.bos.baidu.com/sw-search-sp/software/d59738042c504/mysql-5.7.17.msi
mysql腳本
CREATE DATABASE spark_project
USE spark_project
/*
SQLyog Ultimate v12.09 (64 bit)
MySQL - 5.7.17-log
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
create table `task` (
`task_id` int (11),
`task_name` varchar (765),
`create_time` varchar (765),
`start_time` varchar (765),
`finish_time` varchar (765),
`task_type` varchar (765),
`task_status` varchar (765),
`task_param` text
);
insert into `task` (`task_id`, `task_name`, `create_time`, `start_time`, `finish_time`, `task_type`, `task_status`, `task_param`) values('1','測(cè)試任務(wù)',NULL,NULL,NULL,NULL,NULL,'{\"startAge\":[\"10\"],\"endAge\":[\"50\"],\"startDate\":[\"2017-07-26\"],\"endDate\":[\"2017-07-26\"],\"sex\":[\"male\"]}');
注意Task表中最后一個(gè)列task_param中,Json的StartDate和EndDate需要設(shè)置成今天牧牢,因?yàn)閙ock數(shù)據(jù)的時(shí)候看锉,只有今天的數(shù)據(jù)
加載main方法 第 60多行
System.out.println (sessionid2actionRDD.count ());
for (Tuple2<String,Row> tuple: sessionid2actionRDD.take ( 10 )){
System.out.println (tuple._2 ());
}