訪客路徑分析-Druid實踐

一怎棱、背景

訪客論分析是常見數(shù)據(jù)分析的一種,通過如上圖(Google Analytics)以比較直觀的方式展現(xiàn)用戶達(dá)到網(wǎng)站后各條訪問路徑的流失情況,幫助網(wǎng)站優(yōu)化減少流失率脱拼。

訪客路徑分析有如下幾個關(guān)鍵點:

  • 用戶訪問的路徑通常有多級文虏,默認(rèn)展開包含著陸頁在內(nèi)的5級路徑侣诺,支持往后每點擊一次展開一級路徑(最高支持到10級殖演,再往后意義不大)。
  • 每級只展示top 5訪問數(shù)的網(wǎng)頁年鸳,每級路徑網(wǎng)頁之間連接線表示跳轉(zhuǎn)情況趴久。
  • 指標(biāo)包含top 5網(wǎng)頁的會話數(shù)、流失數(shù)和剩余網(wǎng)頁的會話數(shù)搔确。

通過上述分析彼棍,要實現(xiàn)訪客路徑分析需要完成如下幾項工作:

  1. 計算每一級所有網(wǎng)頁的會話總數(shù)。
  2. 計算每一級會話數(shù)top 5的網(wǎng)頁膳算。
  3. 計算每一級兩兩網(wǎng)頁之間的跳轉(zhuǎn)訪問數(shù)座硕。

本文提出一種基于druid的實現(xiàn)方案,將上述3個查詢轉(zhuǎn)化為druid中的Timeseries(求總數(shù))涕蜂、TopN(求前5)坎吻、GroupBy(求兩兩關(guān)聯(lián))查詢。

二宇葱、技術(shù)方案

數(shù)據(jù)清洗(ETL)
將用戶pv流水根據(jù)瘦真,聚合成一個session會話。session會話內(nèi)用戶的訪問流水按時間排序黍瞧,取前11個分別放于維度landing_page ~ path10诸尽,ETL處理后的數(shù)據(jù)表格示例如下:

host landing_page path1 path2 ... path10
www.xxx.com /index.html /a /b ... /e
www.xxx.com /product.html /c /d ... null

數(shù)據(jù)入Druid供查詢,schema設(shè)計如下

{
  "type" : "index_hadoop",
  "spec" : {
    "ioConfig" : {
      "type" : "hadoop",
      "inputSpec" : {
        "type" : "static",
        "paths" : ""
      }
    },
    "dataSchema" : {
      "dataSource" : "",
      "granularitySpec" : {
        "type" : "uniform",
        "segmentGranularity" : {"type":"period","period":"P1D","timeZone":"Asia/Shanghai"},
        "queryGranularity" : {"type":"period","period":"P1D","timeZone":"Asia/Shanghai"},
        "intervals" : []
      },
      "parser" : {
        "type" : "string",
        "parseSpec" : {
          "format" : "json",
          "dimensionsSpec" : {
            "dimensions": [
              "host",
              "landing_page",
              "path1",
               ...
              "path10"
            ]
          },
          "timestampSpec" : {
            "format" : "auto",
            "column" : "time"
          }
        }
      },
      "metricsSpec": [
        {
          "name": "count",
          "type": "count"
        }
      ]
    },
    "tuningConfig" : {
      "type" : "hadoop",
      "partitionsSpec" : {
        "type" : "hashed",
        "targetPartitionSize" : 5000000
      },
      "indexSpec" : {
        "bitmap" : { "type" : "roaring"},
        "dimensionCompression":"LZ4",
        "metricCompression" : "LZ4",
        "longEncoding" : "auto"
      }
    }
  }
}

三印颤、具體實踐

查詢語句示例

計算每一級所有網(wǎng)頁的會話總數(shù)(默認(rèn)展示前5級)您机,過濾掉為null的情況(用戶只訪問到上一級就跳出)。
{
  "queryType": "timeseries",
  "dataSource": "visit_path_analysis",
  "granularity": "all",
  "filter": {
    "type": "and",
    "fields": [{"type": "selector", "dimension": "host", "value": "www.xxx.com"}]
  },
  "aggregations": [
    { 
      "type": "filtered",
      "filter": { 
        "type": "not", 
        "field": { "type": "selector", "dimension": "landing_page", "value": null }
      },
      "aggregator": { "type": "longSum", "name": "count0", "fieldName": "count" }
    },
    { 
      "type": "filtered",
      "filter": {
        "type": "not", 
        "field": { "type": "selector", "dimension": "path1", "value": null }
      },
      "aggregator": { "type": "longSum", "name": "count1", "fieldName": "count" }
    },
    {
      "type": "filtered",
      "filter": {
        "type": "not", 
        "field": { "type": "selector", "dimension": "path2", "value": null }
      },
      "aggregator": { "type": "longSum", "name": "count2", "fieldName": "count" }
    },
    { 
      "type": "filtered",
      "filter": { 
        "type": "not", 
        "field": { "type": "selector", "dimension": "path3", "value": null }
      },
      "aggregator": { "type": "longSum", "name": "count3", "fieldName": "count" }
    },
    { 
      "type": "filtered",
      "filter": { 
        "type": "not", 
        "field": { "type": "selector", "dimension": "path4", "value": null }
      },
      "aggregator": { "type": "longSum", "name": "count4", "fieldName": "count" }
    }
  ],
  "intervals": []
}
計算每一級會話數(shù)top5的網(wǎng)頁年局,過濾掉為null的情況(用戶只訪問到上一級就跳出)际看。
{
  "queryType": "topN",
  "dataSource": "visit_path_analysis",
  "granularity": "all",
  "dimension": "landing_page",
  "filter": {
    "type": "and",
    "fields": [
      {"type": "selector", "dimension": "host", "value": "www.xxx.com"},
      {
        "type": "not", 
        "field": { "type": "selector", "dimension": "landing_page", "value": null }
      }
    ]
  },
  "threshold": 5,
  "metric": {
    "type": "numeric",
    "metric": "count"
  },
  "aggregations": [{ "type": "longSum", "name": "count", "fieldName": "count" }],
  "intervals": []
}
計算每一級兩兩網(wǎng)頁之間的跳轉(zhuǎn)訪問數(shù),后一級的null用來計算流水?dāng)?shù)矢否。
{
  "queryType": "groupBy",
  "dataSource": "visit_path_analysis",
  "granularity": "all",
  "dimensions": ["landing_page", "path1"],
  "filter": {
    "type": "and",
    "fields": [
      {"type": "selector", "dimension": "host", "value": "www.xxx.com"},
      {
        "type": "in",
        "dimension": "landing_page",
        "values": ["/a", "/b", "/c", "/d", "e"]
      },
      {
        "type": "in",
        "dimension": "path1",
        "values": ["/f", "/g", "/h", "/i", "/j", null]
      }
    ]
  },
  "aggregations": [{ "type": "longSum", "name": "count", "fieldName": "count" }],
  "intervals": []
}

四仲闽、總結(jié)分析

本文提出基于Druid來做訪客路徑分析的方案需由多個請求來完成。

  • 計算每一級所有網(wǎng)頁的會話總數(shù)和計算每一級會話數(shù)top5的網(wǎng)頁僵朗,在默認(rèn)展示的時候可以先并行向druid發(fā)起請求赖欣。獲取每級總會話數(shù)后再減去top5的會話數(shù)就是剩余其他網(wǎng)頁的會話數(shù)。

  • 當(dāng)?shù)玫矫恳患塼op5的路徑后验庙,只需要相鄰兩級路徑做GroupBy查詢即可獲得轉(zhuǎn)化數(shù)與流水?dāng)?shù)顶吮。

  • 當(dāng)需要展示往后一級路徑流轉(zhuǎn)時,只需要基于當(dāng)前最后一級的top5與下一級別top5做GroupBy計算即可粪薛。

  • 從數(shù)據(jù)分布來看悴了,大部分流水集中在前幾步,往后有數(shù)據(jù)級的差距。

  • 該方案最大挑戰(zhàn)來著對Druid的并發(fā)請求湃交,一個頁面展示會擴(kuò)大為多個Druid并發(fā)語句請求熟空。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市巡揍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌菌瘪,老刑警劉巖腮敌,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俏扩,居然都是意外死亡糜工,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進(jìn)店門录淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捌木,“玉大人,你說我怎么就攤上這事嫉戚∨亳桑” “怎么了?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵彬檀,是天一觀的道長帆啃。 經(jīng)常有香客問我,道長窍帝,這世上最難降的妖魔是什么努潘? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮坤学,結(jié)果婚禮上疯坤,老公的妹妹穿的比我還像新娘。我一直安慰自己深浮,他們只是感情好压怠,可當(dāng)我...
    茶點故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飞苇,像睡著了一般刑峡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玄柠,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天突梦,我揣著相機(jī)與錄音,去河邊找鬼羽利。 笑死宫患,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的这弧。 我是一名探鬼主播娃闲,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼虚汛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了皇帮?” 一聲冷哼從身側(cè)響起卷哩,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎属拾,沒想到半個月后将谊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡渐白,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年尊浓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纯衍。...
    茶點故事閱讀 38,637評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡栋齿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出襟诸,到底是詐尸還是另有隱情瓦堵,我是刑警寧澤,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布歌亲,位于F島的核電站谷丸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏应结。R本人自食惡果不足惜刨疼,卻給世界環(huán)境...
    茶點故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹅龄。 院中可真熱鬧揩慕,春花似錦、人聲如沸扮休。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玷坠。三九已至蜗搔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間八堡,已是汗流浹背樟凄。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留兄渺,地道東北人缝龄。 一個月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叔壤。 傳聞我的和親對象是個殘疾皇子瞎饲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,500評論 2 348

推薦閱讀更多精彩內(nèi)容