国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

用戶行為分析模型實(shí)踐(一)—— 路徑分析模型

共 12453字,需瀏覽 25分鐘

 ·

2021-03-14 10:10



一、需求背景


在互聯(lián)網(wǎng)數(shù)據(jù)化運(yùn)營(yíng)實(shí)踐中,有一類(lèi)數(shù)據(jù)分析應(yīng)用是互聯(lián)網(wǎng)行業(yè)所獨(dú)有的——路徑分析。路徑分析應(yīng)用是對(duì)特定頁(yè)面的上下游進(jìn)行可視化展示并分析用戶在使用產(chǎn)品時(shí)的路徑分布情況。比如:當(dāng)用戶使用某APP時(shí),是怎樣從【首頁(yè)】進(jìn)入【詳情頁(yè)】的,用戶從【首頁(yè)】分別進(jìn)入【詳情頁(yè)】、【播放頁(yè)】、【下載頁(yè)】的比例是怎樣的,以及可以幫助我們分析用戶離開(kāi)的節(jié)點(diǎn)是什么。


在場(chǎng)景對(duì)應(yīng)到具體的技術(shù)方案設(shè)計(jì)上,我們將訪問(wèn)數(shù)據(jù)根據(jù)session劃分,挖掘出用戶頻繁訪問(wèn)的路徑;功能上允許用戶即時(shí)查看所選節(jié)點(diǎn)相關(guān)路徑,支持用戶自定義設(shè)置路徑的起點(diǎn)或終點(diǎn),并支持按照業(yè)務(wù)新增用戶/活躍用戶查看不同目標(biāo)人群在同一條行為路徑上的轉(zhuǎn)化結(jié)果分析,滿足精細(xì)化分析的需求。


1.1 應(yīng)用場(chǎng)景


通常用戶在需要進(jìn)行路徑分析的場(chǎng)景時(shí)關(guān)注的主要問(wèn)題:

  • 按轉(zhuǎn)換率從高至低排列在APP內(nèi)用戶的主要路徑是什么;

  • 用戶在離開(kāi)預(yù)想的路徑后,實(shí)際走向是什么?

  • 不同特征的用戶行為路徑有什么差異?


通過(guò)一個(gè)實(shí)際的業(yè)務(wù)場(chǎng)景我們可以看下路徑分析模型是如何解決此類(lèi)問(wèn)題的;


【業(yè)務(wù)場(chǎng)景】

分析“活躍用戶”到達(dá)目標(biāo)落地頁(yè)[小視頻頁(yè)]的主要行為路徑(日數(shù)據(jù)量為十億級(jí),要求計(jì)算結(jié)果產(chǎn)出時(shí)間1s左右)


【用戶操作】

  1. 選擇起始/結(jié)束頁(yè)面,添加篩選條件“用戶”;

  2. 選擇類(lèi)型“訪問(wèn)次數(shù)”/“會(huì)話次數(shù)”;

  3. 點(diǎn)擊查詢,即時(shí)產(chǎn)出結(jié)果。



二、基本概念


在進(jìn)行具體的數(shù)據(jù)模型和工程架構(gòu)設(shè)計(jì)前,先介紹一些基礎(chǔ)概念,幫助大家更好的理解本文。


2.1 路徑分析


路徑分析是常用的數(shù)據(jù)挖據(jù)方法之一, 主要用于分析用戶在使用產(chǎn)品時(shí)的路徑分布情況,挖掘出用戶的頻繁訪問(wèn)路徑。與漏斗功能一樣,路徑分析會(huì)探索用戶在您的網(wǎng)站或應(yīng)用上逗留的過(guò)程中采取的各項(xiàng)步驟,但路徑分析可隨機(jī)對(duì)多條路徑進(jìn)行研究,而不僅僅是分析一條預(yù)先設(shè)定的路徑。


2.2 Session和Session Time


不同于WEB應(yīng)用中的Session,在數(shù)據(jù)分析中的Session會(huì)話,是指在指定的時(shí)間段內(nèi)在網(wǎng)站上發(fā)生的一系列互動(dòng)。本模型中的Session Time的含義是,當(dāng)兩個(gè)行為間隔時(shí)間超過(guò)Session Time,我們便認(rèn)為這兩個(gè)行為不屬于同一條路徑。


2.3 ?;鶊D


?;鶊D(Sankey diagram),即?;芰糠至鲌D,也叫?;芰科胶鈭D。它是一種特定類(lèi)型的流程圖,圖中延伸的分支的寬度對(duì)應(yīng)數(shù)據(jù)流量的大小。如圖4.1-1所示,每條邊表示上一節(jié)點(diǎn)到該節(jié)點(diǎn)的流量。一個(gè)完整的?;鶊D包括以下幾個(gè)內(nèi)容:節(jié)點(diǎn)數(shù)據(jù)及節(jié)點(diǎn)轉(zhuǎn)化率(下圖紅框部分)、邊數(shù)據(jù)及邊轉(zhuǎn)化率(下圖黑框部分)。轉(zhuǎn)化率的計(jì)算詳見(jiàn)【3.5. 轉(zhuǎn)化率計(jì)算】。



2.4 鄰接表


構(gòu)造?;鶊D可以簡(jiǎn)化為一個(gè)圖的壓縮存儲(chǔ)問(wèn)題。圖通常由幾個(gè)部分組成:


  • 邊(edge)

  • 點(diǎn)(vertex)

  • 權(quán)重(weight)

  • 度(degree)


本模型中,我們采用鄰接表進(jìn)行存儲(chǔ)。鄰接表是一種常用的圖壓縮存儲(chǔ)結(jié)構(gòu),借助鏈表來(lái)保存圖中的節(jié)點(diǎn)和邊而忽略各節(jié)點(diǎn)之間不存在的邊,從而對(duì)矩陣進(jìn)行壓縮。鄰接表的構(gòu)造如下:



(a)中,左側(cè)為頂點(diǎn)節(jié)點(diǎn),包含頂點(diǎn)數(shù)據(jù)及指向第一條邊的指針;右側(cè)為邊節(jié)點(diǎn),包含該邊的權(quán)重、出入度等邊信息以及指向下一條邊的指針。一個(gè)完整的鄰接表類(lèi)似于Hashmap的結(jié)構(gòu),如圖(b),左側(cè)是一個(gè)順序表,保存的是(a)中的邊節(jié)點(diǎn);每個(gè)邊節(jié)點(diǎn)對(duì)應(yīng)一個(gè)鏈表存儲(chǔ)與該節(jié)點(diǎn)相連接的邊。頁(yè)面路徑模型中,為了適應(yīng)模型的需要,我們對(duì)頂點(diǎn)節(jié)點(diǎn)和邊節(jié)點(diǎn)結(jié)構(gòu)做了改造,詳情請(qǐng)見(jiàn)【4.1】節(jié)。


2.5  樹(shù)的剪枝


剪枝是樹(shù)的構(gòu)造中一個(gè)重要的步驟,指刪去一些不重要的節(jié)點(diǎn)來(lái)降低計(jì)算或搜索的復(fù)雜度。頁(yè)面路徑模型中,我們?cè)诩糁Νh(huán)節(jié)對(duì)原始數(shù)據(jù)構(gòu)造的樹(shù)進(jìn)行修整,去掉不符合條件的分支,來(lái)保證樹(shù)中每條根節(jié)點(diǎn)到葉節(jié)點(diǎn)路徑的完整性。


2.6 PV和SV


PV即Page View,訪問(wèn)次數(shù),本模型中指的是一段時(shí)間內(nèi)訪問(wèn)的次數(shù);SV即Session View,會(huì)話次數(shù),本模型中指出現(xiàn)過(guò)該訪問(wèn)路徑的會(huì)話數(shù)。如,有路徑一:A → B → C → D → A → B和路徑二:A → B → D,那么,A → B的PV為2+1=3,SV為1+1=2。



 三、 數(shù)據(jù)模型設(shè)計(jì)


本節(jié)將介紹數(shù)據(jù)模型的設(shè)計(jì),包括數(shù)據(jù)流向、路徑劃分、ps/sv計(jì)算以及最終得到的?;鶊D中路徑的轉(zhuǎn)化率計(jì)算。


3.1 整體數(shù)據(jù)流向


數(shù)據(jù)來(lái)源于統(tǒng)一的數(shù)據(jù)倉(cāng)庫(kù),通過(guò)Spark計(jì)算后寫(xiě)入Clickhouse,并用Hive進(jìn)行冷備份。數(shù)據(jù)流向圖見(jiàn)圖3.1-1。


圖3.1-1


3.2  技術(shù)選型


Clickhouse不是本文的重點(diǎn),在此不詳細(xì)描述,僅簡(jiǎn)要說(shuō)明選擇Clickhouse的原因。


選擇的原因是在于,Clickhouse是列式存儲(chǔ),速度極快??聪聰?shù)據(jù)量級(jí)和查詢速度(截止到本文撰寫(xiě)的日期):


圖3.2-1


最后得到的千億數(shù)據(jù)查詢速度是這樣,


圖3.2-2


3.3 數(shù)據(jù)建模


3.3.1 獲取頁(yè)面信息,劃分session


頁(yè)面路徑模型基于各種事件id切割獲取到對(duì)應(yīng)的頁(yè)面id,來(lái)進(jìn)行頁(yè)面路徑分析。Session的概念可見(jiàn)第2.2節(jié),這里不再贅述。目前我們使用更加靈活的Session劃分,使得用戶可以查詢到在各種時(shí)間粒度(5,10,15,30,60分鐘)的Session會(huì)話下,用戶的頁(yè)面轉(zhuǎn)化信息。


假設(shè)有用戶a和用戶b,a用戶當(dāng)天發(fā)生的行為事件分別為 E1, E2, E3... , 對(duì)應(yīng)的頁(yè)面分別為P1, P2, P3... ,事件發(fā)生的時(shí)間分別為T(mén)1, T2, T3... ,選定的session間隔為tg。如圖所示T4-T3>tg,所以P1,P2,P3被劃分到了第一個(gè)Session,P4,P5被劃分到了第二個(gè)Session,同理P6及后面的頁(yè)面也被劃分到了新的Session。



偽代碼實(shí)現(xiàn)如下:

def splitPageSessions(timeSeq: Seq[Long], events: Seq[String], interval: Int)                     (implicit separator: String): Array[Array[Array[String]]] = {  // 參數(shù)中的events是事件集合,timeSeq是相應(yīng)的事件發(fā)生時(shí)間的集合  if (events.contains(separator))    throw new IllegalArgumentException("Separator should't be in events.")  if (events.length != timeSeq.length)    throw new Exception("Events and timeSeq not in equal length.")  val timeBuf = ArrayBuffer[String](timeSeq.head.toString) // 存儲(chǔ)含有session分隔標(biāo)識(shí)的時(shí)間集合  val eventBuf = ArrayBuffer[String](events.head) // 存儲(chǔ)含有session分隔標(biāo)識(shí)的事件集合  if (timeSeq.length >= 2) {    events.indices.tail.foreach { i =>      if (timeSeq(i) - timeSeq(i - 1) > interval * 60000) { // 如果兩個(gè)事件的發(fā)生時(shí)間間隔超過(guò)設(shè)置的時(shí)間間隔,則添加分隔符作為后面劃分session的標(biāo)識(shí)        timeBuf += separator;        eventBuf += separator      }      timeBuf += timeSeq(i).toString;      eventBuf += events(i)    }  }  val tb = timeBuf.mkString(",").split(s",\\$separator,").map(_.split(",")) // 把集合通過(guò)標(biāo)識(shí)符劃分成為各個(gè)session下的時(shí)間集合  val eb = eventBuf.mkString(",").split(s",\\$separator,").map(_.split(",")) // 把集合通過(guò)標(biāo)識(shí)符劃分成為各個(gè)session下的事件集合  tb.zip(eb).map(t => Array(t._1, t._2)) // 把session中的事件和發(fā)生時(shí)間對(duì)應(yīng)zip到一起,并把元組修改成數(shù)組類(lèi)型,方便后續(xù)處理}


3.3.2 相鄰頁(yè)面去重


不同的事件可能對(duì)應(yīng)同一頁(yè)面,臨近的相同頁(yè)面需要被過(guò)濾掉,所以劃分session之后需要做的就是相鄰頁(yè)面去重。


圖3.3-2


相鄰頁(yè)面去重后得到的結(jié)果是這樣


圖3.3-3


3.3.3 獲取每個(gè)頁(yè)面的前/后四級(jí)頁(yè)面


然后對(duì)上述數(shù)據(jù)進(jìn)行窗口函數(shù)分析,獲取每個(gè)session中每個(gè)頁(yè)面的前后四級(jí)頁(yè)面,其中sid是根據(jù)用戶標(biāo)識(shí)ID和session號(hào)拼接而成,比如,針對(duì)上述的用戶a的第一個(gè)session 0會(huì)生成如下的7條記錄,圖中的page列為當(dāng)前頁(yè)面,空頁(yè)面用-1表示


圖3.3-4


計(jì)算剩下的,會(huì)得到一共7+7+6+4+5=29條記錄。得到全部記錄如下



3.3.4 統(tǒng)計(jì)正負(fù)向路徑的pv/sv


取page和page_id_previous1, page_id_previous2, page_id_previous3 ,page_id_previous4得到負(fù)向五級(jí)路徑(path_direction為2),取page和page_id_next1, page_id_next2, page_id_next3, page_id_next4得到正向五級(jí)路徑(path_direction為1),分別計(jì)算路徑的pv和sv(按照sid去重),得到如下數(shù)據(jù)dfSessions,


直接看上面的數(shù)據(jù)可能比較茫然,所以這里拆出兩條數(shù)據(jù)示例,第一條結(jié)果數(shù)據(jù)


圖3.3-4


這是一條正向的(path_direction為1)路徑結(jié)果數(shù)據(jù),在下圖中就是從左到右的路徑,對(duì)應(yīng)的兩個(gè)路徑如下


圖3.3-5


第二條結(jié)果數(shù)據(jù)


圖3.3-6


也是一條正向的路徑結(jié)果數(shù)據(jù),其中pv為2,對(duì)應(yīng)的兩個(gè)路徑如下,sv為1的原因是這兩條路徑的sid一致,都是用戶a在S1會(huì)話中產(chǎn)生的路徑


圖3.3-7


3.3.5 統(tǒng)計(jì)計(jì)算各級(jí)路徑的pv/sv


然后根據(jù)dfSessions數(shù)據(jù),按照page_id_lv1分組計(jì)算pv和sv的和,得到一級(jí)路徑的pv和sv,一級(jí)路徑特殊地會(huì)把path_direction設(shè)置為0



然后類(lèi)似地分別計(jì)算二三四五級(jí)路徑的pv和sv,合并所有結(jié)果得到如下



3.4 數(shù)據(jù)寫(xiě)入


通過(guò)Spark分析計(jì)算的結(jié)果數(shù)據(jù)需要寫(xiě)入Clickhouse來(lái)線上服務(wù),寫(xiě)入Hive來(lái)作為數(shù)據(jù)冷備份,可以進(jìn)行Clickhouse的數(shù)據(jù)恢復(fù)。


Clickhouse表使用的是分布式(Distributed)表結(jié)構(gòu),分布式表本身不存儲(chǔ)任何數(shù)據(jù),而是作為數(shù)據(jù)分片的透明代理,自動(dòng)路由到數(shù)據(jù)到集群中的各個(gè)節(jié)點(diǎn),所以分布式表引擎需要配合其他數(shù)據(jù)表引擎一起使用。用戶路徑分析模型的表數(shù)據(jù)被存儲(chǔ)在集群的各個(gè)分片中,分片方式使用隨機(jī)分片,在這里涉及到了Clickhouse的數(shù)據(jù)寫(xiě)入,我們展開(kāi)講解下。


有關(guān)于這一點(diǎn),在模型初期我們使用的是寫(xiě)分布式表的方式來(lái)寫(xiě)入數(shù)據(jù),具體的寫(xiě)入流程如下所示:


  1. 客戶端和集群中的A節(jié)點(diǎn)建立jdbc連接,并通過(guò)HTTP的POST請(qǐng)求寫(xiě)入數(shù)據(jù);


  2. A分片在收到數(shù)據(jù)之后會(huì)做兩件事情,第一,根據(jù)分片規(guī)則劃分?jǐn)?shù)據(jù),第二,將屬于當(dāng)前分片的數(shù)據(jù)寫(xiě)入自己的本地表;


  3. A分片將屬于遠(yuǎn)端分片的數(shù)據(jù)以分區(qū)為單位,寫(xiě)入目錄下臨時(shí)bin文件,命名規(guī)則如:/database@host:port/[increase_num].bin;


  4. A分片嘗試和遠(yuǎn)端分片建立連接;


  5. 會(huì)有另一組監(jiān)聽(tīng)任務(wù)監(jiān)聽(tīng)上面產(chǎn)生的臨時(shí)bin文件,并將這些數(shù)據(jù)發(fā)送到遠(yuǎn)端分片,每份數(shù)據(jù)單線程發(fā)送;


  6. 遠(yuǎn)端分片接收數(shù)據(jù)并且寫(xiě)入本地表;


  7. A分片確認(rèn)完成寫(xiě)入。


通過(guò)以上過(guò)程可以看出,Distributed表負(fù)責(zé)所有分片的數(shù)據(jù)寫(xiě)入工作,所以建立jdbc連接的節(jié)點(diǎn)的出入流量會(huì)峰值極高,會(huì)產(chǎn)生以下幾個(gè)問(wèn)題:


  1. 單臺(tái)節(jié)點(diǎn)的負(fù)載過(guò)高,主要體現(xiàn)在內(nèi)存、網(wǎng)卡出入流量和TCP連接等待數(shù)量等,機(jī)器健康程度很差;


  2. 當(dāng)業(yè)務(wù)增長(zhǎng)后更多的模型會(huì)接入Clickhouse做OLAP,意味著更大的數(shù)據(jù)量,以當(dāng)前的方式來(lái)繼續(xù)寫(xiě)入的必然會(huì)造成單臺(tái)機(jī)器宕機(jī),在當(dāng)前沒(méi)有做高可用的狀況下,單臺(tái)機(jī)器的宕機(jī)會(huì)造成整個(gè)集群的不可用;


  3. 后續(xù)一定會(huì)做ck集群的高可用,使用可靠性更高的ReplicatedMergeTree,使用這種引擎在寫(xiě)入數(shù)據(jù)的時(shí)候,也會(huì)因?yàn)閷?xiě)分布式表而出現(xiàn)數(shù)據(jù)不一致的情況。


針對(duì)于此數(shù)據(jù)端做了DNS輪詢寫(xiě)本地表的改造,經(jīng)過(guò)改造之后:


  • 用于JDBC連接的機(jī)器的TCP連接等待數(shù)由90下降到25,降低了72%以上;

  • 用于JDBC連接的機(jī)器的入流量峰值由645M/s降低到76M/s,降低了88%以上;

  • 用于JDBC連接的機(jī)器因分發(fā)數(shù)據(jù)而造成的出流量約為92M/s,改造后這部分出流量清零。


另外,在Distributed表負(fù)責(zé)向遠(yuǎn)端分片寫(xiě)入數(shù)據(jù)的時(shí)候,有異步寫(xiě)和同步寫(xiě)兩種方式,異步寫(xiě)的話會(huì)在Distributed表寫(xiě)完本地分片之后就會(huì)返回寫(xiě)入成功信息,如果是同步寫(xiě),會(huì)在所有分片都寫(xiě)入完成才返回成功信息,默認(rèn)的情況是異步寫(xiě),我們可以通過(guò)修改參數(shù)來(lái)控制同步寫(xiě)的等待超時(shí)時(shí)間。

def splitPageSessions(timeSeq: Seq[Long], events: Seq[String], interval: Int)                     (implicit separator: String): Array[Array[Array[String]]] = {  // 參數(shù)中的events是事件集合,timeSeq是相應(yīng)的事件發(fā)生時(shí)間的集合  if (events.contains(separator))    throw new IllegalArgumentException("Separator should't be in events.")  if (events.length != timeSeq.length)    throw new Exception("Events and timeSeq not in equal length.")  val timeBuf = ArrayBuffer[String](timeSeq.head.toString) // 存儲(chǔ)含有session分隔標(biāo)識(shí)的時(shí)間集合  val eventBuf = ArrayBuffer[String](events.head) // 存儲(chǔ)含有session分隔標(biāo)識(shí)的事件集合  if (timeSeq.length >= 2) {    events.indices.tail.foreach { i =>      if (timeSeq(i) - timeSeq(i - 1) > interval * 60000) { // 如果兩個(gè)事件的發(fā)生時(shí)間間隔超過(guò)設(shè)置的時(shí)間間隔,則添加分隔符作為后面劃分session的標(biāo)識(shí)        timeBuf += separator;        eventBuf += separator      }      timeBuf += timeSeq(i).toString;      eventBuf += events(i)    }  }  val tb = timeBuf.mkString(",").split(s",\\$separator,").map(_.split(",")) // 把集合通過(guò)標(biāo)識(shí)符劃分成為各個(gè)session下的時(shí)間集合  val eb = eventBuf.mkString(",").split(s",\\$separator,").map(_.split(",")) // 把集合通過(guò)標(biāo)識(shí)符劃分成為各個(gè)session下的事件集合  tb.zip(eb).map(t => Array(t._1, t._2)) // 把session中的事件和發(fā)生時(shí)間對(duì)應(yīng)zip到一起,并把元組修改成數(shù)組類(lèi)型,方便后續(xù)處理}


3.5 轉(zhuǎn)化率計(jì)算


在前端頁(yè)面選擇相應(yīng)的維度,選中起始頁(yè)面:


后端會(huì)在Clickhouse中查詢,

  • 選定節(jié)點(diǎn)深度(node_depth)為1和一級(jí)頁(yè)面(page_id_lv1)是選定頁(yè)面的數(shù)據(jù),得到一級(jí)頁(yè)面及其sv/pv,

  • 選定節(jié)點(diǎn)深度(node_depth)為2和一級(jí)頁(yè)面(page_id_lv1)是選定頁(yè)面的數(shù)據(jù),按照sv/pv倒序取前10,得到二級(jí)頁(yè)面及其sv/pv,

  • 選定節(jié)點(diǎn)深度(node_depth)為2和一級(jí)頁(yè)面(page_id_lv1)是選定頁(yè)面的數(shù)據(jù),按照sv/pv倒序取前20,得到三級(jí)頁(yè)面及其sv/pv,

  • 選定節(jié)點(diǎn)深度(node_depth)為2和一級(jí)頁(yè)面(page_id_lv1)是選定頁(yè)面的數(shù)據(jù),按照sv/pv倒序取前30,得到四級(jí)頁(yè)面及其sv/pv,

  • 選定節(jié)點(diǎn)深度(node_depth)為2和一級(jí)頁(yè)面(page_id_lv1)是選定頁(yè)面的數(shù)據(jù),按照sv/pv倒序取前50,得到五級(jí)頁(yè)面及其sv/pv,


轉(zhuǎn)化率計(jì)算規(guī)則:


頁(yè)面轉(zhuǎn)化率:

假設(shè)有路徑 A-B-C,A-D-C,A-B-D-C,其中ABCD分別是四個(gè)不同頁(yè)面


計(jì)算三級(jí)頁(yè)面C的轉(zhuǎn)化率:

(所有節(jié)點(diǎn)深度為3的路徑中三級(jí)頁(yè)面是C的路徑的pv/sv和)÷(一級(jí)頁(yè)面的pv/sv) 


路徑轉(zhuǎn)化率

假設(shè)有A-B-C,A-D-C,A-B-D-C,其中ABCD分別是四個(gè)不同頁(yè)面


計(jì)算A-B-C路徑中B-C的轉(zhuǎn)化率:

(A-B-C這條路徑的pv/sv)÷(所有節(jié)點(diǎn)深度為3的路徑中二級(jí)頁(yè)面是B的路徑的pv/sv和)




 四、工程端架構(gòu)設(shè)計(jì)


本節(jié)將講解工程端的處理架構(gòu),包括幾個(gè)方面:桑基圖的構(gòu)造、路徑合并以及轉(zhuǎn)化率計(jì)算、剪枝。


4.1 ?;鶊D的構(gòu)造



從上述原型圖可以看到,我們需要構(gòu)造?;鶊D,對(duì)于工程端而言就是需要構(gòu)造帶權(quán)路徑樹(shù)。


簡(jiǎn)化一下上圖,就可以將需求轉(zhuǎn)化為構(gòu)造帶權(quán)樹(shù)的鄰接表。如下左圖就是我們的鄰接表設(shè)計(jì)。左側(cè)順序列表存儲(chǔ)的是各個(gè)節(jié)點(diǎn)(Vertex),包含節(jié)點(diǎn)名稱(name)、節(jié)點(diǎn)代碼(code)等節(jié)點(diǎn)信息和一個(gè)指向邊(Edge)列表的指針;每個(gè)節(jié)點(diǎn)(Vertex)指向一個(gè)邊(Edge)鏈表,每條邊保存的是當(dāng)前邊的權(quán)重、端點(diǎn)信息以及指向同節(jié)點(diǎn)下一條邊的指針。


?圖4.1-2?


圖4.1-3 


圖4.1-2就是我們?cè)谀P椭惺褂玫降泥徑颖?。這里在2.4中描述的鄰接表上做了一些改動(dòng)。在我們的?;鶊D中,不同層級(jí)會(huì)出現(xiàn)相同名稱不同轉(zhuǎn)化率的節(jié)點(diǎn),這些節(jié)點(diǎn)作為路徑的一環(huán),并不能按照名稱被看作重復(fù)節(jié)點(diǎn),不構(gòu)成環(huán)路。如果整個(gè)桑基圖用一個(gè)鄰接表表示,那么這類(lèi)節(jié)點(diǎn)將被當(dāng)作相同節(jié)點(diǎn),使得圖像當(dāng)中出現(xiàn)環(huán)路。因此,我們將?;鶊D按照層級(jí)劃分,每?jī)杉?jí)用一個(gè)鄰接表表示,如圖4.1-2,Level 1表示層級(jí)1的節(jié)點(diǎn)和指向?qū)蛹?jí)2的邊、Level 2表示層級(jí)2的節(jié)點(diǎn)指向?qū)蛹?jí)3的邊,以此類(lèi)推。


4.2 路徑的定義


首先,我們先回顧一下桑基圖:


圖4.2-1


觀察上圖可以發(fā)現(xiàn),我們需要計(jì)算四個(gè)數(shù)據(jù):每個(gè)節(jié)點(diǎn)的pv/sv、每個(gè)節(jié)點(diǎn)的轉(zhuǎn)化率、節(jié)點(diǎn)間的pv/sv、節(jié)點(diǎn)間的轉(zhuǎn)化率。那么下面我們給出這幾個(gè)數(shù)據(jù)的定義:

  • 節(jié)點(diǎn)pv/sv = 當(dāng)前節(jié)點(diǎn)在當(dāng)前層次中的pv/sv總和

  • 節(jié)點(diǎn)轉(zhuǎn)化率 = ( 節(jié)點(diǎn)pv/sv ) / ( 路徑起始節(jié)點(diǎn)pv/sv )

  • 節(jié)點(diǎn)間pv/sv = 上一級(jí)節(jié)點(diǎn)流向當(dāng)前節(jié)點(diǎn)的pv/sv

  • 節(jié)點(diǎn)間轉(zhuǎn)化率 = ( 節(jié)點(diǎn)間pv/sv ) / ( 上一級(jí)節(jié)點(diǎn)pv/sv )


再來(lái)看下存儲(chǔ)在Clickhouse中的路徑數(shù)據(jù)。先來(lái)看看表結(jié)構(gòu):

(  `node_depth` Int8 COMMENT '節(jié)點(diǎn)深度,共5個(gè)層級(jí)深度,枚舉值1-2-3-4-5' CODEC(T64, LZ4HC(0)),  `page_id_lv1` String COMMENT '一級(jí)頁(yè)面,起始頁(yè)面' CODEC(LZ4HC(0)),  `page_id_lv2` String COMMENT '二級(jí)頁(yè)面' CODEC(LZ4HC(0)),  `page_id_lv3` String COMMENT '三級(jí)頁(yè)面' CODEC(LZ4HC(0)),  `page_id_lv4` String COMMENT '四級(jí)頁(yè)面' CODEC(LZ4HC(0)),  `page_id_lv5` String COMMENT '五級(jí)頁(yè)面' CODEC(LZ4HC(0)))


上述為路徑表中比較重要的幾個(gè)字段,分別表示節(jié)點(diǎn)深度和各級(jí)節(jié)點(diǎn)。表中的數(shù)據(jù)包含了完整路徑和中間路徑。完整路徑指的是:路徑從起點(diǎn)到退出、從起點(diǎn)到達(dá)指定終點(diǎn),超出5層的路徑當(dāng)作5層路徑來(lái)處理。中間路徑是指數(shù)據(jù)計(jì)算過(guò)程中產(chǎn)生的中間數(shù)據(jù),并不能作為一條完整的路徑。


路徑數(shù)據(jù):

(1)完整路徑


(2)不完整路徑


那么我們需要從數(shù)據(jù)中篩選出完整路徑,并將路徑數(shù)據(jù)組織成樹(shù)狀結(jié)構(gòu)。


4.3 設(shè)計(jì)實(shí)現(xiàn)


4.3.1 整體框架


圖4.3-1


后端整體實(shí)現(xiàn)思路很明確,主要步驟就是讀取數(shù)據(jù)、構(gòu)造鄰接表和剪枝。那么要怎么實(shí)現(xiàn)完整/非完整路徑的篩選呢?我們通過(guò)service層剪枝來(lái)過(guò)濾掉不完整的路徑。以下是描述整個(gè)流程的偽代碼:

// 1-1: 分層讀取原始數(shù)據(jù)// 1-1-1: 分層構(gòu)造Clickhouse Sql    for( int depth = 1; depth <= MAX_DEPTH; depth ++){        sql.append(select records where node_depth = depth)    }// 1-1-2: 讀取數(shù)據(jù)    clickPool.getClient();    records = clickPool.getResponse(sql);// 2-1: 獲取節(jié)點(diǎn)之間的父子、子父關(guān)系(雙向edge構(gòu)造)    findFatherAndSonRelation(records);    findSonAndFathRelation(records);// 3-1: 剪枝// 3-1-1: 清除孤立節(jié)點(diǎn)    for(int depth = 2; depth <= MAX_DEPTH; depth ++){        while(hasNode()){            node = getNode();            if node does not have father in level depth-1:                cut out node;        }    }// 3-1-2: 過(guò)濾不完整路徑    for(int depth = MAX_DEPTH - 1; depth >= 1; depth --){        cut out this path;    }// 3-2: 構(gòu)造鄰接表    while(node.hasNext()){        sumVal = calculate the sum of pv/sv of this node until this level;        edgeDetails = get the details of edges connected to this node and the end point connected to the edges;        sortEdgesByEndPoint(edgeDetails);        path = new Path(sumVal, edgeDetails);    }


4.3.2 Clickhouse連接池


頁(yè)面路徑中我們引入了ClickHouse,其特點(diǎn)在這里不再贅述。我們使用一個(gè)簡(jiǎn)單的Http連接池連接ClickHouse Server。連接池結(jié)構(gòu)如下:


圖4.3-2


4.3.3 數(shù)據(jù)讀取


如2中描述的,我們需要讀取數(shù)據(jù)中的完整路徑。

(  `node_depth` Int8 COMMENT '節(jié)點(diǎn)深度,枚舉值',  `page_id_lv1` String COMMENT '一級(jí)頁(yè)面,起始頁(yè)面',  `page_id_lv2` String COMMENT '二級(jí)頁(yè)面',  `page_id_lv3` String COMMENT '三級(jí)頁(yè)面',  `page_id_lv4` String COMMENT '四級(jí)頁(yè)面',  `page_id_lv5` String COMMENT '五級(jí)頁(yè)面',  `val` Int64 COMMENT '全量數(shù)據(jù)value')


在上述表結(jié)構(gòu)中可以看到,寫(xiě)入數(shù)據(jù)庫(kù)的路徑已經(jīng)是經(jīng)過(guò)一級(jí)篩選,深度≤5的路徑。我們需要在此基礎(chǔ)上再將完整路徑和不完整路徑區(qū)分開(kāi),根據(jù)需要根據(jù)node_depth和page_id_lvn來(lái)判斷是否為完整路徑并計(jì)算每個(gè)節(jié)點(diǎn)的value。


完整路徑判斷條件:

  • node_depth=n, page_id_lvn=pageId (n < MAX_DEPTH)

  • node_depth=n, page_id_lvn=pageId || page_id_lvn=EXIT_NODE (n = MAX_DEPTH)


完整路徑的條件我們已經(jīng)知道了,那么讀取路徑時(shí)有兩種方案。方案一:直接根據(jù)上述條件進(jìn)行篩選來(lái)獲取完整路徑,由于Clickhouse及后端性能的限制,取數(shù)時(shí)必須limit;方案二:逐層讀取,可以計(jì)算全量數(shù)據(jù),但是無(wú)法保證取出準(zhǔn)確數(shù)量的路徑。


通過(guò)觀察發(fā)現(xiàn),數(shù)據(jù)中會(huì)存在重復(fù)路徑,并且假設(shè)有兩條路徑:

A → B → C → D → EXIT_NODE

A → B → E → D → EXIT_NODE


當(dāng)有以上兩條路徑時(shí),需要計(jì)算每個(gè)節(jié)點(diǎn)的value。而在實(shí)際數(shù)據(jù)中,我們只能通過(guò)不完整路徑來(lái)獲取當(dāng)前節(jié)點(diǎn)的value。因此,方案一不適用。


那么方案二就可以通過(guò)以下偽代碼逐層讀取:

for(depth = 1; depth <= MAX_DEPTH; depth++){    select        node_depth as nodeDepth,        ...,        sum(sv) as val    from        table_name    where        ...        AND (toInt16OrNull(pageId1) = 45)        AND (node_depth = depth)        ...    group by        node_depth,        pageId1,        pageId2,        ...    ORDER BY        ...    LIMIT        ...}


讀取出的數(shù)據(jù)如下:


那么,node1_A_val = 10+20,node2_B_val = 9+15 以此類(lèi)推。


4.3.4 剪枝


根據(jù)4.3.3,在取數(shù)階段我們會(huì)分層取出所有原始數(shù)據(jù),而原始數(shù)據(jù)中包含了完整和非完整路徑。如下圖是直接根據(jù)原始數(shù)據(jù)構(gòu)造的樹(shù)(原始樹(shù))。按照我們對(duì)完整路徑的定義:路徑深度達(dá)到5且結(jié)束節(jié)點(diǎn)為退出或其它節(jié)點(diǎn);路徑深度未達(dá)到5且結(jié)束節(jié)點(diǎn)為退出??梢?jiàn),圖中標(biāo)紅的部分(node4_lv1 → node3_lv2)是一條不完整路徑。


另外,原始樹(shù)中還會(huì)出現(xiàn)孤立節(jié)點(diǎn)(綠色節(jié)點(diǎn)node4_lv2)。這是由于在取數(shù)階段,我們會(huì)對(duì)數(shù)據(jù)進(jìn)行分層排序再取出,這樣一來(lái)無(wú)法保證每層數(shù)據(jù)的關(guān)聯(lián)性。因此,node4_lv2節(jié)點(diǎn)在lv2層排序靠前,而其前驅(qū)、后繼節(jié)點(diǎn)排序靠后無(wú)法選中,從而導(dǎo)致孤立節(jié)點(diǎn)產(chǎn)生。


圖4.3-3


因此,在我們?nèi)〕鲈紨?shù)據(jù)集后,還需要進(jìn)行過(guò)濾才能獲取我們真正需要的路徑。


在模型中,我們通過(guò)剪枝來(lái)實(shí)現(xiàn)這一過(guò)濾操作。

// 清除孤立節(jié)點(diǎn)    for(int depth = 2; depth <= MAX_DEPTH; depth ++){        while(hasNode()){            node = getNode();            if node does not have any father and son: // [1]                cut out node;        }    }// 過(guò)濾不完整路徑    for(int depth = MAX_DEPTH - 1; depth >= 1; depth --){        cut out this path; // [2]    }


在前述的步驟中,我們已經(jīng)獲取了雙向edge列表(父子關(guān)系和子父關(guān)系列表)。因此在上述偽代碼[1]中,借助edge列表即可快速查找當(dāng)前節(jié)點(diǎn)的前驅(qū)和后繼,從而判斷當(dāng)前節(jié)點(diǎn)是否為孤立節(jié)點(diǎn)。


同樣,我們利用edge列表對(duì)不完整路徑進(jìn)行裁剪。對(duì)于不完整路徑,剪枝時(shí)只需要關(guān)心深度不足MAX_DEPTH且最后節(jié)點(diǎn)不為EXIT_NODE的路徑。那么在上述偽代碼[2]中,我們只需要判斷當(dāng)前層的節(jié)點(diǎn)是否存在順序邊(父子關(guān)系)即可,若不存在,則清除當(dāng)前節(jié)點(diǎn)。



 五、寫(xiě)在最后


基于平臺(tái)化查詢中查詢時(shí)間短、需要可視化的要求,并結(jié)合現(xiàn)有的存儲(chǔ)計(jì)算資源以及具體需求,我們?cè)趯?shí)現(xiàn)中將路徑數(shù)據(jù)進(jìn)行枚舉后分為兩次進(jìn)行合并,第一次是同一天內(nèi)對(duì)相同路徑進(jìn)行合并,第二次是在日期區(qū)間內(nèi)對(duì)路徑進(jìn)行匯總。本文希望能為路徑分析提供參考,在使用時(shí)還需結(jié)合各業(yè)務(wù)自身的特性進(jìn)行合理設(shè)計(jì),更好地服務(wù)于業(yè)務(wù)。


方案中涉及到的Clickhouse在這里不詳細(xì)介紹,感興趣的同學(xué)可以去深入了解,歡迎和筆者一起探討學(xué)習(xí)。

瀏覽 83
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 久草在线| 成人做爰黄AAA片免费直播岛国| 日韩毛片在线观看| 在线观看欧美黄片| 中文字幕成人视频| 大香蕉啪啪啪| 天堂国产一区二区三区| 日韩在线精品视频| 漂亮人妻吃鸡啪啪哥哥真的好| 欧美亚韩| 波多野结衣视频在线| 国产中文人人国际| 中文字幕人妻在线中文乱码怎么解决| 国内精品久久久| 在线免费小黄片| 国产丝袜人妖TS系列| 欧美黄片在线| jizz国产视频| 亚洲成人综合在线| 加勒比日韩无码| 国产乱码一区二区三区的区别| 久在线| 天天日综合网| 久久久久久久久国产精品| 日韩欧美一区二区三区不卡| 日韩无码链接| 无码v| 九九成人精品| 国产一级片在线播放| 最新日韩在线| 精品美女视频在线观看免费软件| 大香蕉综合网| 影音先锋男人资源网| 国产AA| 骚骚肥肥一区二区三区| 黄色成人视频在线免费观看| 免费福利在线视频| 啪啪啪免费| 日韩性爱一区二区| 亚洲在线网站| 国产无套在线观看| 一级无码在线观看| 小日本91在线观看| 日韩一级毛| 日韩v| 伊人久久无码| 青青草国产| 亚洲毛片网站| 操东北老女人| 亚洲免费一级片| 青娱乐国产| 4438黄色| 一夲道无码专区av无码A片| 天天天日天天天天天天天日歌词| 欧美性爱自拍| 亚洲视频www| 欧美成人毛片AAAAAA| 无码二区三区| 日韩无码人妻久久一区二区三区| 成人视频18+在线观看| 精品第一页| 国产精品久久久久久久久久久久久久久 | av无码免费观看| 国产无码AV大片| 安微妇搡BBBB搡BBBB| 最新久欠一区二区免费看| 日韩在线视频91| 91丨露脸丨熟女精品| 91ThePorn国产在线观看| 97黄色| 北条麻妃一区二区三区在线播放| 欧美日韩激情| 日本一级黃色大片看免费| 四川少妇搡BBBB搡BBB视频网 | 99电影网手机在线观看| 蜜桃传媒视频| 在线观看免费黄片| 丁香五月亚洲综合| 午夜福利成人网站| 一区高清无码| 91蝌蚪网| 欧美久色| 性爱福利社| 波多野结衣无码高清| 水多多成人网站A片| 午夜成人视频在线观看| 加勒比久久久| 国产无遮挡| 国产成人无码区免费视频| 精品乱伦视频| 欧美日韩高清一区| 在线无码av| 人人弄| 91丨露脸丨熟女| 久久蜜桃视频| 国内一级A片| 大香蕉久久久久| 爱爱亚洲| 中文字幕在线观看亚洲| 高清无码免费不卡| 老女人操逼网| 成人特级毛片全部免费播放| www.jiujiujiu| 91无码视频在线观看| 欧美日韩小电影| 欧美成人精品| 免费看成人A片无码照片88hⅤ | 欧美成人视频。| 日本V片| 人妻被午夜福利AV| 日韩视频播放在线综合| 国产欧美一区在线看| 天天日天天拍| 中文字幕一区二区三区四区五区六区| 性无码一区二区三区无码免费| 久久久久亚洲AV成人网人人软件| 一区二区三区无码在线| 9118禁| 天天操夜夜骑| 美妇肥臀一区二区三区-久久99精品国 | 综合网伊人| 欧美一级黄色片| 青草影视久久| 在线A∨视频| 久亚洲| 99热99re6国产线播放| 国产成人精品无码片子的价格| 1插菊花网| 毛片在线免费| 欧美亚洲三级| 蜜桃视频成人app| 亚洲午夜福利电影| 午夜AV在线| 伊人色女操穴综合网| 成人免费无码毛片| 日韩最新高清无码| av亚洲波多野结衣白嫩水多波| 猛男大粗猛爽H男人味| 国产农村妇女精品一二区| 亚洲欧美网站| 国产精品av在线| 伊人狠狠| 国内精品一区二区| 国产欧美日韩综合| 欧美日韩一区二区三区视频| 午夜激情国产| 天天干天天射天天爽| 国产在线免费视频| 人妻丰满熟妇av无码区| 伊人狠狠| 翔田千里无码| 欧洲黄色片| 日韩欧美高清无码| 亚洲在线第一页| 桃色五月天| 日韩午夜福利视频| 久草社区| 成人激情片| 超碰观看| 蜜臀久久99精品久久久| 国产无套内射视频| 69国产精品成人无码| 亚洲日韩视频在线观看| 99精品六月婷婷综合在线| 人妻在线无码| av性爱在线| AA丁香综合激情| 国产一级女婬乱免费看| 免费视频a| 海滩AV黑人| 亚洲色图一区二区| 大地影视官网第三页入口| 91丨PORNY丨对白| 91麻豆精品91久久久ios版| 尤物无码| 操操操影院| 亚洲免费中文字幕| 性无码专区| 狠狠穞A片一區二區三區| 伊人亚洲综合| 国产清纯可爱美女自卫裸贷偷情| 天天插综合| 懂色一区二区三区免费| 日韩激情视频在线观看| 美日韩无码视频| 无码不卡在线| 久久伊| 91大神免费观看| 精品吃奶一区二区三区视频| AV高清无码在线| 成人黄色av| 2025中文字幕| 欧美一级黄色性爱视频| 波多野结衣无码网站| 成人性爱视频网站| A级片在线观看| 久久在线视频| 成人精品影视| 午夜av在线| 国产主播精品| 午夜国产在线视频| 91色区| 午夜福利久久| 99在线观看免费视频| 91免费在线视频| 一区二区精品视频| 一区二区三区无码专区| 熟女人妻视频| 一级黄色电影免费看| 婷婷五月丁香六月| www91久久| 黄色片视频免费| 欧美一级a视频免费放| 久久无码一区二区| 男人天堂2024| 黄色福利视频| 日韩超清无码| 超碰2023| 国产日韩欧美一区二区| 超碰日本| 少妇无码中文| 91亚洲影院| 精品国产午夜福利在线观看| 国产精品国产精品国产专区不卡| 欧美一级二级三级| 黄色片在线视频| 一本加勒比HEZYO东京热无码| 久久不卡视频| 免费在线观看黄色视频| 在线成人小视频| 国产在线拍揄自揄拍无码男男| 日韩性爱在线观看| av三级片在线观看| 丁月婷婷五香天日五月天| 丁香花免费高清视频小说完整| 大香蕉免费网| 无码国产视频| 超碰中文字幕| 五月天婷婷在线播放视频免费观看 | 中文字幕一区二区三区四区50岁| 国产91白浆四溢| 18禁网站在线播放| 亚洲中文字幕不卡| 91天堂| 性欧美成人播放77777| 一级无码免费| 肏逼视频网站| 西西4444WWW大胆无视频| 久久午夜无码鲁丝午夜精品| 国产精品毛片视频| 夜色福利视频| 永井玛丽亚av无码中出流出| 2017天天干天天射| 久草手机视频在线观看| 強姧伦一区二区三区在线播放| 精品AV无码一区二区三区| 大地中文资源5页的更新内容| 男女啪啪免费视频| 国产骚妇| 婷婷爱五月天| 2021天天操| 久久综合电影| 国产毛片欧美毛片高潮| 日韩理论在线| 三级片网站大全| 91成人情欲影视网| 人妻毛片| 大香蕉伊人在线网| AV天堂手机| 五月停亭六月,六月停亭的英语 | 操B网站| 免费的黄色视频网站| 三级无码电影| 波多野结衣黄色视频| 国产一区二区免费在线观看| 97人人人人人人| 在线观看日本vs欧洲vs美洲| 综合激情五月婷婷| 99热这里只有精品7| 国产精品久久久久久久久久两年半| 黄色网址av| 国产口爆视频| 中文字幕有码在线视频| 狠狠91| 蜜桃网站在线观看| 伊人在线视频| 亚洲AV一级| 国产成人精品123区免费视频| 男女日皮视频| 亚洲一级a片| 男人天堂色男人| 少妇爆射| 久草视频在线免费看| 国产成人无码永久免费| 久久久久久三级电影| 亚洲天堂在线观看免费视频| 日韩中文字幕久久| 一本久久A精品一合区久久久| 黄色午夜| 欧美日韩国产一区| 国产欧美第一页| 91无码人妻一区二区成人AⅤ| 91热| 免费色色视频| 日本A在线| 粉嫩一区二区三区四区| 成人aV无码精品国产一区二区 | 91AV| 欧美成人电影| AV福利在线| 亚洲电影在线观看| 嫩BBB槡BBBB槡BBBB二一| 国产又爽又黄在线看视频| 特黄AAAAAAAA片视频| 无码H| 欧美大香蕉网| 国产精品白浆| 东京热小视频| 日本成人午夜福利| 欧美精品一卡二卡| 久久综合九九| 99精品99| 国产精品女| 日韩中文字幕永久| 激情人妻AV| 无码三级| 国产成人精品免费看视频| 九九成人网站| 久久青青草在线视频| 免费在线A| 亚洲国产精品一区二区三区| 在线免费看黄网站| 波多野结衣无码高清| 黑人亚洲娇小videos∞| 中文字幕第83页| 操逼爆奶网站| 99无码国产成人精品| 色老板免费精品无码免费视频| AV黄页| 在线看A片| 伊人免费成人视频| 天天射日日干| 人人操狠狠操| 亚洲专区视频| 一级婬片A片AAAAA毛片| 亚洲永久视频| 五月天堂婷婷| 国产精品1区2区| 久久黄色视| 国产视频第一页| 三级片AAA成人免费| 天天爽天天爽夜夜爽毛片| 日日夜夜干| 久久婷婷网站| 精品无码一区二区三| 中国操逼毛片| www.97色色| 精品国产AV无码一区二区三区| 91久久国产性奴调教| 在线观看黄色小电影| 男人天堂2024| 欧美激情中文字幕| 亚洲成人免费在线观看| 成人毛片一区二区三区| 中文字幕精品无码一区二区| 激情乱伦网站| 久久99久久99精品免视看婷婷| 欧美综合视频在线观看| 2025AV天堂网| 中国人妻HDbute熟睡| 亚洲无码在线免费| 中文原创麻豆传媒md0052| 五月丁香免费视频| 四虎av在线播放| av片在线免费观看| 日本一区二区精品| 久久国产成人| 看免费操逼视频| 国产三级片在线视频| 围内精品久久久久久久久白丝制服| 草比视频| 亚洲Av秘无码一区二区| 久久久福利| 狼友视频免费在线观看| 成人免费无遮挡无码黄漫视频| 国内视频一区| 午夜精东影业果冻传媒| 大香蕉综合久久| 狠狠综合| 久久国产精品一区二区三区| 国产久久免费视频| 久久久噜噜噜| 亚洲色男人天堂| 欧美成人三区性价比| 韩国无码中文| 亚洲资源在线观看| 黄色视频A| av资源在线| 国产36页| 国产一级操逼| 日韩中文字幕在线观看视频| 无码人妻精品一区二区三区温州| 久久国产精品久久| 99久久久精品久久久久久| 日本精品视频在线观看| 亚洲秘无码一区二区三区| 日韩一级黄色电影| 久久私人影院| 日本伊人网| 国产精品一区二区性色AV| 五月天色婷婷丁香| 水蜜桃网址| 色噜噜人妻av中文字幕| 神马午夜精品95| 日皮在线观看| 成人国产精品秘欧美高清| 中文字幕人妻一区| 五月天无码免费视频| 人人妻人人干| 迷情校园综合| 小泽玛利亚一区二区免费| 安徽妇搡BBBB搡BBBB| 四色五月婷婷| 伊人99热| 国产免费福利| 一区二区在线不卡| 亚洲专区在线| 久久影院av| 日本久久网| 精品国产天线2024| 色婷婷视频一区二区| 欧美特黄AAAAAAAAA片| 最近中文字幕av| 亚洲精品黄色| 99久久夜色精品国产亚洲| 欧美成人性爱网址| 国产一级a毛一级a做免费高清视频| 波多野吉衣av| 91在线精品视频| 特级婬片A片AAA毛片AA做头 | 国产精品久久久久久久久久二区三区 | 人成视频在线观看| 国产毛片777777| 国产精品爽爽久久久| 国产成人在线免费视频| eeuss久久| 亚洲口味重一级黄片| 成人国产AV精| 国产乱子伦真实精品!| 香蕉久久国产AV一区二区| 亚洲网站免费| 在线看毛片网站| 1024在线视频| 久久99国产乱子伦...| av天天av无码av天天爽| 成人无码区免费AV片| 成年视频网站| 免费看A级片| 今天成全在线观看高清| 欧美日韩亚洲一区二区| 波多野结衣成人网站| 欧美亚洲天堂网| 天天拍天天射| 人妻丝袜蕾丝高跟双飞| 无码中文字幕网站| 男女无套在线观看免费| 中字无码av| 一级A片亲子乱| 欧美二区三区| 1024手机在线视频| 人人操人| 四川少妇BBBB| 另类老妇奶性生BBwBBw偷拍 | 豆花视频一区| 嫩BBB槡BBBB槡BBB3i| 97香蕉网| 黄色视频在线观看| 日韩免费在线视频| 欧美亚洲日韩中文字幕| 另类老妇极品BBWBBw| 美女视频一区二区三区| 天天添天天干| 欧美三级理论片| 午夜亚洲AV永久无码精品麻豆| 日韩电影无码| 欧美色图综合| 爱爱日韩| 炮友露脸青楼传媒刘颖儿| 撸一撸在线| 91麻豆精品国产91久久久久久| 人人人操人人| 日韩黄色网址| 婷婷精品国产一区二区三区日韩| 双腿张开被9个男人调教| 国产激情无码| 日本性爱无码| 麻豆精品传媒2021md| 人人草人人看人人摸| 日韩乱伦视频| 青草视频在线免费观看| 亚洲无码乱码av| 二区AV| av电影在线观看| 国产老女人操逼| 日本白嫩的BBw| 美女网站黄| 黄色A视频| 亚洲AV无码成人专区| 七区九区一区在线| 日韩无码高清视频| 日韩精品一二三区| 69成人视频| aⅴ免费观看| 动图综合亚洲综合欧美男男| 国产传媒在线| 国产无遮挡又黄又爽又色| 波多野结衣无码AV专区| 无码人妻日韩精品一区二区三| 国产精品A片守望| 伦理被部长侵犯HD中字| 久久精品视频免费看| 精品无码一区二区三区四区久久久软件| 操啊操| 欧美日韩成人一区二区三区| 青娱乐一级无码| 久久日韩操| 黄片免费看| 91秦先生在线播放| 豆花成人视频在线观看| 国产无码乱伦内射| 狠狠久久| BBW老熟女BBw| 亚洲日韩欧美在线观看| 仓井空一区二区三区| 亚洲av无码精品| 91日逼| 黄网站免费在线观看| 久久久久久久久久成人永久免费视频 | 我要操影院| 欧美激情一区二区A片成人牛牛| 欧美亚洲色色网视频| 大香蕉视频网| 亚洲激情四射| 国产成人av在线观看| 大鸡巴伊人| 国产換妻4P视频| 黄片视频免费在线观看| 黑人大荫蒂女同互磨| 久久国产一区二区三区| 国产精品777777| 欧美亚洲系列| 日韩一区二区三区四区| 毛多水多丰满女人A片| 国产中文在线视频| 91亚洲国产精品| 婷婷五月天丁香成人社区| 四虎永久在线精品无码| 一区二区三区四区无码视频| 蜜桃久久久亚洲精品| 国产精品永久久久久久久久久 | 91一区二区在线观看| 亚洲无码天堂| 2025中文字幕| 人妻熟妇乱子伦精品无码专区毛片| 俺也来www俺也色com| 国产伦精品一区二区三区妓女下载 | 一本到无码| 97超碰成人| 欧美日韩色视频| 久久久久久亚洲精品| 日本黄色电影网站| 五月天黄色小说| 色老板亚洲| 精品伊人| 欧美A级成人婬片免费看| 人妻少妇精品视频一区二区三区| 激情日逼| 一区二区三区久久久| 天天日天天干天天日| 97人妻精品一区二区三区视频| 亚洲AV无码精品久久一区二区| 天堂va欧美ⅴa亚洲va一夜| 大鸡巴操小逼视频| 欧美日韩在线观看一区| 成人国产精品秘久久久网站| 麻豆av无码| 免费操逼网| 国产精品午夜福利视频| 日本理论片一道本| 中字AV| 日本黄色视频。| 亚洲精品无码人妻| 国产三级片网站| 亚洲综合中文| 蜜臀导航| 亚洲av男人天堂| 国产精品成人无码专区| 伊人综合影院| 风间由美大荫蒂无码AV| 婷婷五月亚洲精品AAA片在| 日韩网站在线| 精品乱码一区| 精品无码国产一区二区三区51安| 国产精品成人无码免费| 婷婷丁香五月激情| 99国产精品免费视频观看8| 国产三级片在线观看视频| 美女免费AV| 俄罗斯老熟妇与子伦| 青青草视频免费观看| 久久99精品久久久久| 国产高清毛片| 肉片无遮挡一区二区三区免费观看视频 | 国产三级电影在线观看| 在线天堂av| 国产一区二区三区四区五区在线 | 成人永久免费视频| 国产视频97| 8090操逼网| 无码精品一区二区三区在线观看 | 狼人综合网| 福利视频一区| 中文字幕久久无码| 久久久久久成人电影| 亚洲三级视频在线观看| 狠狠操狠狠操狠狠操| 中文字幕在线免费看线人| 潮喷在线观看| 日韩十八禁网站| 六月婷婷五月| 小草一区| 日韩毛片一区二区| 欧美熟妇另类久久久久久不卡| 西西444WWW无码视频软件功能介绍| 日韩一及| 青草久在线| 免费中文字幕视频| 日韩人妻无码一区二区三区中文| 大香蕉AV在线| 久久久一区二区三区四区免费听| 丁香五月在线视频| 操碰视频| 广东BBW搡BBBB搡| 无码人妻av黄色一区二区三区| www.亚洲成人| 91在线无码精品秘| 欧美中出| 美日韩中文字幕| 天天干天天色天天日| 亚洲高清无码在线播放| 日韩免费观看视频| 色五月中文字幕| 国产精品欧美一区二区三区苍井空 | 精品精品视频| 亚洲伦理一区二区| 人妻人人妻| 性爱AV| 在线视频三区| 天天干网址| 精品日韩在线视频| 日韩在线高清视频| 久久精品性爱| 欧洲无码一区二区三区| 99性爱网| 色婷婷欧美在线播放内射| 欧美51精品| 爱爱电影无码| 国产婬片一级A片AAA毛片AⅤ | 无码免费毛片一区二区三区古代| 欧美一级爱| 69亚洲精品| 中文字幕第9页| 国产无码AV在线| 日本人妻在线视频| 欧美日韩成人在线观看| 91原创视频| 一级中国毛片| 99久久婷婷国产精品2020| 亚洲天堂在线观看免费| 国产情侣在线视频| 在线成人免费视频| 日本乱伦中文字幕| 操欧美老女人| 在线天堂视频| 操逼天堂| 黄色电影免费在线观看| 日逼网址| 一级调教看片| 一区二区三区国产视频| 激情另类| 亚洲高清视频无码| AV大全在线免费观看| 免费在线无码视频| 欧美日韩性色无码免费| 久久永久免费| 无码成人在线| 一本一本久久a久久精品牛牛影视| 色综合久久久无码中文字幕999| 亚洲成人综合网站| 俺也去在线| 爱爱无码视频| 欧美黑吊大战白妞| 777777视频| 91在线看| 丁香婷婷色五月激情综合三级三级片欧美日韩国 | 九九热精品在线视频| 欧美操逼逼| 一级片在线播放| 三级AV在线免费观看| 在线A∨视频| 久久国产一级片| 亚洲加勒比久久88色综合| 久久久国产一区| 在线观看www视频| 男人的天堂色婷婷| 亚洲日本高清| 影音AV| 免费a片在线观看| 免费看成人747474九号视频在线观看| www.97yy| AAA三级视频| 久久私拍视频| 欧美日韩国产91| 色婷视频| 国产黄色免费电影| 久久久久婷婷| 日韩综合色| 在线观看黄色片| i美女福利视频| 亚洲第一色在线| 吴梦梦无码| 三级片无码在线| 人人cao| 成人精品一区二区三区中文字幕| 欧美精品第一页| 制服丝袜强奸乱伦| 18禁在线播放| 色天使青青草| 一道本无码免费视频| 国产精品无码不卡| 嫩BBB槡BBBB槡BBBB百度| 婷婷俺也去| 日韩高清无码一区二区三区| 一二三四在线视频| 亚洲精品秘一区二区三区蜜桃久| 99久久国内精品成人免费| 中文无码日本高潮喷水| 国产一区二区不卡视频| 久热re| 玖玖资源站中文字幕| 免费的毛片| 成人精品在线视频| 肏亚洲美女| 国产精品系列视频| 欧美老熟妇BBBBB搡BBB| 3D动漫精品一区二区在线播放免费 | 日本无码久久嗯啊流水| 成人色视| 丁香六月婷婷综合激情欧美| 亚洲女人在线| 激情小说激情视频| 亚洲第一在线| 天堂资源地址在线| 9l蝌蚪PORNY中文| 日韩人妻在线播放| 怡春院AV| 草久视频| 成人超碰在线| 夜夜嗨av无码一区二区三区| 人人爱人人干人人操| 西西人体视频| 欧美亚洲一区二区三区| 欧美去干网| 伊人色女操穴综合网| 91大熟女91大腚女人| 国产一级a免一级a免费| 四虎成人免费视频| 一级黄色电影免费看| 中文字幕综合网| 91精品国产闺蜜国产在线闺蜜| 狠狠撸天天操| 精品AV无码| 国产精品偷拍| 亚洲AV无码成人精品| 国产成人无码区免费视频| 精品秘一区性综合三区| 亚洲精品秘一区二区三区在线观看 | 无码欧美成人| 国产熟妇婬乱A片免费看牛牛 | 久久久久久99| 动漫一区二区三区| 人人操人人操人人操人人| 在线观看欧美日韩| 久热久| 96精品久久久久久久久久| 欧美在线视频a| 亚州无码一区| 午夜无码福利| 亚州精品国产精品乱码不99勇敢| 日韩极品在线观看| 超碰成人AV| 丰满少妇在线观看网站| 日韩无码免费| 中文字幕精品久久久久人妻红杏Ⅰ | 亚洲成人视频一区二区| 青青色在线视频| 特级黄色视频| 伊人在线视频| 亚洲av色图| 大香蕉五月丁香| 99无码| 成人777| 麻豆精品在线播放| 伊人免费成人视频| aaa免费视频| 高清无码视频网站| 五月天婷婷在线播放视频免费观看 | 操逼视频网| 亚洲中文字幕无码爆乳av| 日本天堂在线视频| 波多野结衣东京热| 操逼在线观看| 在线中出| 婷婷狠狠爱| 国产一级片免费观看| 天堂在线视频| 一区二区三区国产精品| 成人日皮视频| 天堂网av在线| 国产欧美在线综合| 国产在线性爱视频| 热久久9| 中文字幕不卡+婷婷五月| 亚洲欧美婷婷五月色综合| 久久无码在线观看| 综合夜夜| 狠狠干高清成人二区三区| 免费国产精品视频| 色色热热| 天天拍夜夜操| 人操人人人操| 亚洲aⅤ| 色哟哟一区二区三区| 性做久久久久久久久| 国产午夜精品一区二区三区嫩A| 囯产精品久久久久久久| 伊人网在线观看| 俺去啦俺去也| 午夜福利成人网站| 久久逼逼| 中文无码网站| 亚洲男人的天堂网| 亚洲九九九九| 色综合网址| 日本一级黄色A片| 91香蕉在线观看| 人人看人人搞人人摸| 久久久久999| aaa在线| 天天操免费| 黄色一级片免费| 在线播放JUY-925被丈夫上司侵犯的第7天 | 天堂网中文| 亚洲第一在线| 大香蕉九九| 国产香蕉精品视频| av在线免费播放| 欧美午夜精品久久久久免费视| 熟女人妻视频| 成人免费无遮挡无码黄漫视频| 杨幂操逼视频| 黑人猛躁白人BBBBBBBBB | 男人的天堂av网站| 久久偷看各类wc女厕嘘嘘偷窃| 色色视频网站| 无码不卡视频在线| 久久蜜桃视频| 高h视频在线观看| 极品在线视频| 亚洲激情图| 伊人大香蕉综合| 成人做爰黄级A片免费看土方| 99久久婷婷国产综合精品漫| 77777色| 91丨PORN首页| 日韩无| 亚洲高清无码视频| 婷婷五月天色综合| 99热在线免费| 大香蕉伊人9| 国产中文字幕波多| 欧美日韩性爱视频| 在线免费高清无码| 欧洲成人午夜精品无码区久久| 日韩人妻精品中文字幕免费| 青青草视频免费观看| 最新av| 久久人妻无码中文字幕系列| 西西4444大胆无码视频| 黄片aaa|