1. 程式人生 > 實用技巧 >網站流量日誌分析(模組開發——資料倉庫設計)

網站流量日誌分析(模組開發——資料倉庫設計)

目錄

數倉設計

維度建模

以維度為標準 開展資料的分析需求
適用於面向分析領域的理論。比如分析型資料庫 資料倉庫 資料集市(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)

    • 首頁跳出率=訪問網站且訪問一個頁面且該頁面是首頁/總的訪問次數