網站流量日誌分析(模組開發——資料倉庫設計)
阿新 • • 發佈:2020-08-10
目錄
數倉設計
維度建模
以維度為標準 開展資料的分析需求
適用於面向分析領域的理論。比如分析型資料庫 資料倉庫 資料集市(OLAP)
-
事實表
分析主題的客觀事件度量 是分析主題的資料聚集 事實表中一條記錄往往對應著客觀的一個事件 往往是一堆主鍵的聚集
-
維度表
所謂的維度就是指看待問題的角度 可以通過不同的維度去分析同一個事實表 得出不同的分析結果 維度表可以跟事實表進行關聯查詢
本專案中資料倉庫的設計
本專案中採用星型模型,事實表就是網站流量日誌維度取決於業務。
事實表設計
原始資料表: ods_weblog_origin =>對應mr清洗完之後的資料
欄位 | 資料型別 | 註解 |
---|---|---|
valid | string | 是否有效 |
remote_ip | string | 訪客ip |
remote_user | string | 訪客使用者資訊 |
time_local | string | 請求時間 |
request | string | 請求url |
status | string | 響應碼 |
body_bytes_sent | string | 響應位元組數 |
http_referer | string | 來源url |
http_user_agent | string | 訪客終端資訊 |
訪問日誌明細寬表:dw_weblog_detail
欄位 | 資料型別 | 註解 |
---|---|---|
valid | string | 是否有效 |
remote_ip | string | 訪客ip |
remote_user | string | 訪客使用者資訊 |
time_local | string | 請求完整時間 |
daystr | string | 訪問日期 |
timestr | string | 訪問時間 |
month | string | 訪問月 |
day | string | 訪問日 |
hour | string | 訪問時 |
request | string | 請求url整串 |
status | string | 響應碼 |
body_bytes_sent | string | 響應位元組數 |
http_referer | string | 來源url |
ref_host | string | 來源的host |
ref_path | string | 來源的路徑 |
ref_query | string | 來源引數query |
ref_query_id | string | 來源引數query值 |
http_user_agent | string | 客戶終端標識 |
維度表設計
多維度資料分析
所謂的多維資料分析就是指通過不同維度的聚集計算出某種度量值。
常見度量值:max min count sum avg topN
舉個栗子:統計來自於北京女性24歲未婚的過去三年購物金額最多的前三個。
維度:地域 性別 年齡 婚姻 時間
度量值:sum(訂單金額)--->top3
維度建模的三種模式
- 星型模式
一個事實表多個維度表 維度表之間沒有關係 維度表跟事實表進行關聯 企業數倉發展初期常見的模型
- 雪花模式
一個事實表多個維度表 維度表可以繼續關聯維度表 不利於後期維護 企業中儘量避免演化成該種模型
- 星座模式
多個事實表 多個維度表 某些維度表可以共用 企業數倉發展中後期常見的模型
本專案模式設計
因為專案中只有一個分析的主題:網站的流量日誌情況 因此對應的事實表只有一個:網站流量日誌
本專案採用星型模式
事實表:對應著資料預處理完之後的原始網站日誌情況
維度表:通常要結合業務決定分析的維度 要和事實表能夠關聯上 要以能夠涵蓋事實表為基本標準
Q:問點選流模型資料算什麼型別的表?
點選流模型資料既不是事實表 也不是維度表 是一個業務模型資料 可以稱之為事實表的業務延伸。
資料入庫ETL
建立ODS層表
- 表名通常以簡短的英文表示,不用使用漢語拼音甚至中文
- 建表的時候表的欄位順序型別要和資料保持一致
- 通常企業中採用分割槽表進行優化,方便後續查詢管理
啟動 hive 連線工具 beeline
service mysqld start
nohup bin/hive --service hiveserver2 > /dev/null 2>&1
bin/beeline
!connect jdbc:hive2://node03:10000
建資料庫和實體表
# 原始資料表
對應mr清洗完之後的資料,而不是原始日誌資料
drop table if exists ods_weblog_origin;
create table ods_weblog_origin(
valid string,
remote_ip string,
remote_user string,
time_local string,
request string,
status string,
body_bytes_sent string,
http_referer string,
http_user_agent string)
partitioned by (datestr string)
row format delimited
fields terminated by '\001';
# 點選流pageview表
drop table if exists ods_click_pageviews;
create table ods_click_pageviews(
session string,
remote_ip string,
remote_user string,
time_local string,
request string,
visit_step string,
page_staylong string,
http_referer string,
http_user_agent string,
body_bytes_sent string,
status string)
partitioned by (datestr string)
row format delimited
fields terminated by '\001';
# 點選流visit表
drop table if exists ods_click_stream_visit;
create table ods_click_stream_visit(
session string,
remote_ip string,
inTime string,
outTime string,
inPage string,
outPage string,
referal string,
pageVisits int)
partitioned by (datestr string)
row format delimited
fields terminated by '\001';
# 時間維度表
drop table if exists t_dim_time;
create table t_dim_time(date_key int,year string,month string,day string,hour string) row format delimited fields terminated by ',';
-
匯入ODS層表資料
-
原始日誌表
load data local inpath '/opt/data/sql/part-m-00000' into table ods_weblog_origin partition(datestr='20181101');
-
點選流模型之pageviews
load data local inpath '/opt/data/sql/part-r-00000' into table ods_click_pageviews partition(datestr='20181101');
-
點選流模型之visit
load data local inpath '/opt/data/sql/part-r-00000' into table ods_click_stream_visit partition(datestr='20181101');
-
時間維度表資料
load data local inpath '/opt/data/sql/dim_time.dat' into table t_dim_time;
-
-
寬表窄表的引入
--需求:統計今天每個小時訪問量有多少? --需要根據小時hour進行分組 group by 分組之後統計每個組內的個數count --當下:group by(substring(time_local,12,2)) --缺點:每一條記錄在分組之前 都需要進行所謂的擷取操作 --原因:表中的某些欄位看似一個欄位 實則糅雜了多個屬性在一起 --解決:把糅合在一起的屬性拆分出來變成單獨獨立的新欄位 hour group by(hour) --結果:因為表的欄位相比較之前變多了 稱之為寬表。原來對應的表稱之為窄表。又因為變寬之後資訊更加詳細具體,所以也可以稱之為明細表。
-
寬表的實現
-
寬表的資料由何而來
由窄表資料得到 所謂窄表就是原始資料表
insert into 寬 + select from 窄
-
寬表需要擴寬哪些欄位
跟業務需求相關,本專案中進行兩個欄位的擴寬 時間欄位:time_local 來訪欄位:http_referer
-
使用什麼技術進行欄位的擴寬
insert into 寬 + select from 窄 至於插入什麼樣的資料完全取決於查詢語句返回的結果。 因此在查詢的時候就需要使用hive的函式進行欄位的擴寬操作。
時間欄位的拓寬:substring(time_local) 來源url欄位拓寬:hive內建的解析url函式 是一個標準的udtf函式 parse_url_tuple
-
分析指標和模型
-
基礎級指標
例子:
張三今天上午來到網站開啟3個頁面 下午來到網站開啟2個頁面 晚上又來到網站開啟5個頁面 問:pv uv vv ip? pv:頁面載入總次數 10 uv:獨立訪客數 1 vv:會話次數 3 ip: 1
-
複合指標
-
平均訪問頻度:一天之內人均會話數
==總的會話次數(session)/總的獨立訪客數
==vv/uv
-
平均訪問深度:一天之內人均瀏覽頁面數
==總的頁面瀏覽數/總的獨立訪客數
==pv/uv
-
平均會話時長:平均每次會話停留的時間
=總的會話停留時間/會話次數(vv)
-
首頁跳出率=訪問網站且訪問一個頁面且該頁面是首頁/總的訪問次數
-