精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

高效大數據開發之 bitmap 思想的應用

企業動態
數據倉庫的數據統計,可以歸納為三類:增量類、累計類、留存類。而累計類又分為歷史至今的累計與最近一段時間內的累計(比如滾動月活躍天,滾動周活躍天,最近 N 天消費情況等),借助 bitmap 思想統計的模型表可以快速統計最近一段時間內的累計類與留存類。

[[341108]]

作者:xmxiong,PCG 運營開發工程師

數據倉庫的數據統計,可以歸納為三類:增量類、累計類、留存類。而累計類又分為歷史至今的累計與最近一段時間內的累計(比如滾動月活躍天,滾動周活躍天,最近 N 天消費情況等),借助 bitmap 思想統計的模型表可以快速統計最近一段時間內的累計類與留存類。

一、背景

數據倉庫的數據統計,可以歸納為三類:增量類、累計類、留存類。而累計類又分為歷史至今的累計與最近一段時間內的累計(比如滾動月活躍天,滾動周活躍天,最近 N 天消費情況等),借助 bitmap 思想統計的模型表可以快速統計最近一段時間內的累計類與留存類。

二、業務場景

我們先來看幾個最近一段時間內的累計類與留存類的具體業務問題,作為做大數據的你建議先不要急著往下閱讀,認真思考一下你的實現方案:

1.統計最近 30 天用戶的累計活躍天(每個用戶在 30 天里有 N 天使用微視 app,N 為 1-30,然后將月活躍用戶的 N 天加總)?

2.統計最近 7 天的用戶累計使用時長?

3.統計最近 30 天有播放的累計用戶數?

4.統計最近 30 天活躍用戶有多少在最近 30 天里有連續 3 天及以上活躍?

5.統計 28 天前活躍用戶的 1、3、7、14、28 天留存率?

三、傳統解決方案

在進入本文真正主題之前,我們先來看看常規的解決思路:1.統計最近 30 天用戶的累計活躍天?

  1. --用dau表(用戶ID唯一),取最近30天分區,sum(活躍日期)。 
  2. select 
  3.     sum(imp_date) active_date 
  4.   from 
  5.     weishi_dau_active_table 
  6.   where 
  7.     imp_date>=20200701 
  8.     and imp_date<=20200730 

2.統計最近 7 天的用戶累計使用時長?

  1. --用dau表(用戶ID唯一),取最近7天分區,sum(使用時長)。 
  2. select 
  3.     sum(log_time) log_time 
  4.   from 
  5.     weishi_dau_active_table 
  6.   where 
  7.     imp_date>=20200701 
  8.     and imp_date<=20200707 

3.統計最近 30 天有播放的累計用戶數?

  1. --用用戶播放表(用戶ID唯一),取最近30天分區,count(distinct if(播放次數>0,用戶ID,null))。 
  2. select 
  3.     count(distinct if(play_vv_begin>0,qimei,null)) play_user 
  4.   from 
  5.     weishi_play_active_table 
  6.   where 
  7.     imp_date>=20200701 
  8.     and imp_date<=20200730 

4.統計最近 30 天活躍用戶有多少在最近 30 天里有連續 3 天及以上活躍?

  1. --用dau表(用戶ID唯一),取最近30天分區,關聯兩次最近30天分區,關聯條件右表分別為imp_date-1,imp_date-2。 
  2. select 
  3.     count(distinct a.qimei) active_num 
  4.   from 
  5.   ( select 
  6.         imp_date 
  7.         ,qimei 
  8.       from 
  9.         weishi_dau_active_table 
  10.       where 
  11.         imp_date>=20200701 
  12.         and imp_date<=20200730 
  13.    )a 
  14.   join --第一次join,先取出連續2天的用戶,因為7月1日用戶與7月2號-1天關聯得上,表示一個用戶在1號和2號都活躍 
  15.   ( select 
  16.         date_sub(imp_date,1) imp_date 
  17.         ,qimei 
  18.       from 
  19.         weishi_dau_active_table 
  20.       where 
  21.         imp_date>=20200701 
  22.         and imp_date<=20200730 
  23.    )b 
  24.    on 
  25.     a.imp_date=b.imp_date 
  26.     and a.qimei=b.qimei 
  27.   join --第二次join,取出連續3天的用戶,因為第一次join已經取出連續兩天活躍的用戶了,再拿這些7月1日用戶關聯7月3日-2天關聯得上,表示一個用戶在1號和3號都活躍,結合第一步join得出用戶至少3天連續活躍了 
  28.   ( select 
  29.         date_sub(imp_date,2) imp_date 
  30.         ,qimei 
  31.       from 
  32.         weishi_dau_active_table 
  33.       where 
  34.         imp_date>=20200701 
  35.         and imp_date<=20200730 
  36.    )c 
  37.    on 
  38.     a.imp_date=c.imp_date 
  39.     and a.qimei=c.qimei 

當然這里也可以用窗口函數 lead 來實現,通過求每個用戶后 1 條日期與后 2 條日期,再拿這兩個日期分布 datediff 當前日期是否為日期相差 1 且相差 2 來判斷是否 3 天以上活躍,但是這個方法也還是避免不了拿 30 天分區統計,統計更多天連續活躍時的擴展性不好的情況 5.統計 28 天前活躍用戶的 1、3、7、14、28 天留存率?

  1. --用dau表(用戶ID唯一),取統計天的活躍用戶 left join 1、3、7、14、28天后的活躍用戶,關聯得上則說明對應天有留存。 
  2. select 
  3.     '20200701' imp_date 
  4.     ,count(distinct if(date_sub=1,b.qimei,null))/count(distinct a.qimei) 1d_retain_rate 
  5.     ,count(distinct if(date_sub=3,b.qimei,null))/count(distinct a.qimei) 3d_retain_rate 
  6.     ,count(distinct if(date_sub=7,b.qimei,null))/count(distinct a.qimei) 7d_retain_rate 
  7.     ,count(distinct if(date_sub=14,b.qimei,null))/count(distinct a.qimei) 14d_retain_rate 
  8.     ,count(distinct if(date_sub=28,b.qimei,null))/count(distinct a.qimei) 28d_retain_rate 
  9.   from 
  10.     weishi_dau_active_table partition (p_20200701)a 
  11.   left join 
  12.   ( select 
  13.         datediff(imp_date,'20200701') date_sub 
  14.         ,qimei 
  15.       from 
  16.         weishi_dau_active_table 
  17.       where 
  18.         datediff(imp_date,'20200701'in (1,3,7,14,28) 
  19.    )b 
  20.    on 
  21.     a.qimeib=b.qimei 

四、傳統解決方案存在的問題

1.每天大量中間數據重復計算,比如昨天最近 30 天是 8 月 1 日~ 8 月 30 日,今天最近 30 天為 8 月 2 日~ 8 月 31 日,中間 8 月 2 日~ 8 月 30 日就重復計算了。

2.統計邏輯復雜,類似業務場景 4,困難點在于統計每一天活躍的用戶第二天是否還繼續活躍。

3.耗費集群資源大,場景 4 和場景 5 都用到了 join 操作,場景 4 還不止一個 join,join 操作涉及 shuffle 操作,shuffle 操作需要大量的網絡 IO 操作,因此在集群中是比較耗性能的,我們應該盡量避免執行這樣的操作。

4.以上統計邏輯可擴展性差,由于數據分析經常進行探索性分析,上面傳統方案能解決上面幾個問題,但是數據分析稍微改變一下需求,就得重新開發,例如增加一個 15 天留存,或者統計最近 2 周的活躍天等。

五、bitmap 原理

上面的業務場景能否在一個模型表很簡單就能統計出,且不需要數據重復計算,也不需要 join 操作,還能滿足數據分析更多指標探索分析呢?答案是肯定的,可以借助 bitmap 思想。

何為 bitmap?bitmap 就是用一個 bit 位來標記某個元素,而數組下標是該元素,該元素是否存在時用 bit 位的 1,0 表示。比如 10 億個 int 類型的數,如果用 int 數組存儲的話,那么需要大約 4G 內存,當我們用 int 類型來模擬 bitmap 時,一個 int 4 個字節共 4*8 = 32 位,可以表示 32 個數,原來 10 億個 int 類型的數用 bitmap 只需要 4GB / 32 = 128 MB 的內存。

 

六、具體實現過程

大數據開發參考 bitmap 思想,就是參考其通過數組下標表示該元素的思想,將最近 31 天活躍用戶是否活躍用逗號分隔的 0 1 串存儲下來,將最近 31 天的播放 vv、贊轉評等消費數也用逗號分隔的具體數值存儲下來,形成一個字符數組,數組每一個下標表示距離最新一天數據的天數差值,第一位下標為 0,表示距離今天最新一天數據間隔為 0 天,如下所示:

 

active_date_set 表示 31 天活躍集,0 表示對應下標(距離今天的 N 天前)不活躍,1 表示活躍;這個數據是 8 月 23 日統計的,1,0,0,1,…… 即用戶在 8 月 23 日,8 月 20 日有活躍,8 月 22 日,8 月 21 日并沒有活躍。play_vv_begin_set 表示 31 天播放 vv 集,0 表示對應下標(距離今天的 N 天前)沒有播放視頻,正整數表示當天的播放視頻次數;這里用戶雖然在 8 月 23 日,8 月 20 日有活躍,但是該用戶一天只播放了一次視頻就離開微視了。這樣做的好處一方面也是大大壓縮了存儲,極端狀態下用戶 31 天都來,那么就可以將 31 行記錄壓縮在一行存儲。

假如 1 天活躍用戶 1 億,且這些用戶 31 天都活躍,那么就可以將 31 億行記錄壓縮在 1 億行里,當然實際不會出現這樣的情況,因為會有一部分老用戶流失,一部分新用戶加入,按照目前微視的統計可以節省 80%多的存儲;另一方面可以更簡單快捷地統計每個用戶最近一個月在微視的活躍與播放、消費(贊轉評)等情況。

該模型表的詳細實現過程如下:

1.該模型表的前 31 天需要初始化一個集合,將第一天的數據寫到該表,然后一天一天滾動壘起來,累計 31 天之后就得到這個可用的集合表了,也就可以例行化跑下去。

2.最新一天需要統計時,需要拿前一天的集合表,剔除掉相對今天來說第 31 天前的數據,然后每個集合字段將最后一位刪除掉 。

3.拿最新一天的增量數據(下面用 A 表替代) full join 第 2 步處理后的前一天表(下面用 B 表替代)關聯。

這里有三種情況需要處理:

a.既出現在 A 表,也出現在 B 表,這種情況,只需直接拼接 A 表的最新值與 B 表的數組集即可(在微視里就是最近 30 天用戶有活躍,且在最新一天有留存);

b.只出現在 B 表(在微視里是最近 30 天活躍的用戶在最新一天沒留存),這時需要拿 “0,” 拼接一個 B 表的數組集,“0,” 放在第一位;

c.只出現在 A 表(在微視里是新用戶或者 31 天前活躍的回流用戶),這時需要拿 “1,”拼接一個 30 位長的默認數組集 “0,0,0,…,0,0” ,“1,” 放在第一位。經過如此幾步,就可以生成最新一天的集合表了,具體脫敏代碼如下:

  1. select 
  2.     20200823 imp_date 
  3.     ,nvl(a.qimei,b.qimei) qimei 
  4.     ,case 
  5.        when a.qimei=b.qimei then concat(b.active_date_set,',',a.active_date_set) 
  6.        when b.qimei is null then concat('0,',a.active_date_set) 
  7.        when a.qimei is null then concat(b.active_date_set,',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'
  8.       end active_date_set 
  9.     ,case 
  10.        when a.qimei=b.qimei then concat(b.log_num_set,',',a.log_num_set) 
  11.        when b.qimei is null then concat('0,',a.log_num_set) 
  12.        when a.qimei is null then concat(b.log_num_set,',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'
  13.       end log_num_set 
  14.     ,case 
  15.        when a.qimei=b.qimei then concat(b.log_time_set,',',a.log_time_set) 
  16.        when b.qimei is null then concat('0,',a.log_time_set) 
  17.        when a.qimei is null then concat(b.log_time_set,',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'
  18.       end log_time_set 
  19.     ,case 
  20.        when a.qimei=b.qimei then concat(b.play_vv_begin_set,',',a.play_vv_begin_set) 
  21.        when b.qimei is null then concat('0,',a.play_vv_begin_set) 
  22.        when a.qimei is null then concat(b.play_vv_begin_set,',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'
  23.       end play_vv_begin_set 
  24.   from 
  25.   ( select 
  26.         qimei 
  27.         ,substr(active_date_set,1,instr(active_date_set,',',1,30)-1) active_date_set 
  28.         ,substr(log_num_set,1,instr(log_num_set,',',1,30)-1) log_num_set 
  29.         ,substr(log_time_set,1,instr(log_time_set,',',1,30)-1) log_time_set 
  30.         ,substr(play_vv_begin_set,1,instr(play_vv_begin_set,',',1,30)-1) play_vv_begin_set 
  31.       from 
  32.         weishi_31d_active_set_table partition(p_20200822)a 
  33.       where 
  34.         last_time>=20200723 
  35.    )a 
  36.   full join 
  37.   ( select 
  38.         qimei 
  39.         ,'1' active_date_set 
  40.         ,cast(log_num as string) log_num_set 
  41.         ,cast(log_time as string) log_time_set 
  42.         ,cast(play_vv_begin as string) play_vv_begin_set 
  43.       from 
  44.         weishi_dau_active_table partition(p_20200823)a 
  45.    )b 
  46.    on 
  47.     a.qimei=b.qimei 

初始化集合代碼相對簡單,只需保留第一位為實際數值,然后拼接一個 30 位的默認值 0 串,初始化脫敏代碼如下:

  1. select 
  2.     20200823 imp_date 
  3.     ,qimei 
  4.     ,'1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0' active_date_set 
  5.     ,concat(cast(log_num as string),',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0') log_num_set 
  6.     ,concat(cast(log_time as string),',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0') log_time_set 
  7.     ,concat(cast(play_vv_begin as string),',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0') play_vv_begin_set 
  8.   from 
  9.     weishi_dau_active_table partition(p_20200823)a 

七、具體使用案例

在 hive 里對這些 0 1 集合串的使用是比較困難的,為了讓這個模型表的可用性更高,因此寫了幾個 UDF 函數來直接對數組集合進行簡單地運算,目前寫了如下幾個:str_sum()、str_count()、str_min()、str_max(),其中 str_sum、str_min、str_max 這幾個函數的參數一樣,第一個傳入一個數組集合字符串,第二位傳入一個整數,代表要計算最近 N 天的結果,第三個參數是傳入一個分隔符,在本模型里分隔符均為逗號“,”。

這幾個函數都是返回一個 int 值,str_sum 返回來的是最近 N 天的數值加總,str_min 返回該數組集合元素里最小的值,str_max 返回該數組集合元素里最大的值;str_count 前 3 個參數與前面三個函數一樣,第 4 個參數是傳入要統計的值,返回來的也是 int 值,返回傳入的統計值在數組集合出現的次數,具體使用方法如下,由于是自定義函數,在 tdw 集群跑的 sql 前面需加@pyspark:

 

以上函數的具體使用案例脫敏代碼如下:

  1. @pysparkselect 
  2.     qimei 
  3.     ,str_sum(active_date_set,30,',') active_date_num  --每個用戶最近30天活躍天數 
  4.     ,str_sum(play_vv_begin_set,30,',') play_vv_begin  --每個用戶最近30天播放視頻次數 
  5.     ,30 - str_count(interact_num_set,30,',','0') interact_date_num  --每個用戶最近30天有互動的天數,通過 30 - 互動天數為0 統計得到 
  6.   from 
  7.     weishi_31d_active_set_table partition(p_20200823)a 
  8.   where 
  9.     last_time>20200724 

當然除了上面幾種 udf 統計所需指標之外,也可以通過正則表達式進行使用,比如統計活躍天可以這樣統計:

  1. --將數組集合里的'0'和','用正則表達式匹配去掉再來看剩下1的個數即可。 
  2. select 
  3.     count(qimei) --月活 
  4.     ,sum(length(regexp_replace(substr(active_date_set,1,60),'0|,',''))) active_date_num  --月活躍天 
  5.   from 
  6.     weishi_31d_active_set_table partition(p_20200823)a 
  7.   where 
  8.     last_time>20200724 

開篇前的幾個業務場景,也可以通過該表快速統計:1.統計最近 30 天用戶的累計活躍天?

  1. @pyspark 
  2. select 
  3.     sum(active_date_num) active_date_num  --滾動月活躍天 
  4.     ,count(1) uv  --滾動月活 
  5.   from 
  6.   ( select 
  7.         qimei 
  8.         ,str_sum(active_date_set,30,',') active_date_num 
  9.       from 
  10.         weishi_31d_active_set_table partition(p_20200823)a 
  11.       where 
  12.         last_time>20200724 
  13.    )a 

2.統計最近 7 天的用戶累計使用時長?

  1. @pyspark 
  2. select 
  3.     sum(log_time) log_time  --滾動周活躍天 
  4.     ,count(1) uv  --滾動周活 
  5.   from 
  6.   ( select 
  7.         qimei 
  8.         ,str_sum(log_time_set,7,',') log_time 
  9.       from 
  10.         weishi_31d_active_set_table partition(p_20200823)a 
  11.       where 
  12.         last_time>20200817 
  13.    )a 

3.統計最近 30 天有播放的累計用戶數?

  1. @pyspark 
  2. select 
  3.     count(1) uv  --播放次數>0 
  4.   from 
  5.   ( select 
  6.         qimei 
  7.         ,str_sum(play_vv_begin_set,30,',','0') play_vv_begin 
  8.       from 
  9.         weishi_31d_active_set_table partition(p_20200823)a 
  10.       where 
  11.         last_time>20200724 
  12.    )a 
  13.   where 
  14.     play_vv_begin>0 

4.統計最近 30 天活躍用戶有多少在最近 30 天里有連續 3 天及以上活躍?

  1. --只是判斷活躍集合里面有連續3位 1,1,1, 即可select 
  2.     count(if(substr(active_date_set,1,60) like '%1,1,1,%',qimei,null)) active_date_num 
  3.   from 
  4.     weishi_31d_active_set_table partition(p_20200823)a 
  5.   where 
  6.     last_time>20200724 

5.統計 28 天前活躍用戶的 1、3、7、14、28 天留存率?

  1. --不需要join操作,只需找到活躍日期集對應位是否1即可select 
  2.     '20200723' imp_date 
  3.     ,count(if(split(active_date_set,',')['29']='1',qimei,null))/count(1) 1d_retain_rate 
  4.     ,count(if(split(active_date_set,',')['27']='1',qimei,null))/count(1) 3d_retain_rate 
  5.     ,count(if(split(active_date_set,',')['23']='1',qimei,null))/count(1) 7d_retain_rate 
  6.     ,count(if(split(active_date_set,',')['16']='1',qimei,null))/count(1) 14d_retain_rate 
  7.     ,count(if(split(active_date_set,',')['2']='1',qimei,null))/count(1) 28d_retain_rate 
  8.   from 
  9.     weishi_31d_active_set_table partition(p_20200823)a 
  10.   where 
  11.     last_time>20200723 
  12.     and split(active_date_set,',')['30']='1' 

八、總結

從上面 5 個業務場景可以看出來,只要有這樣一個借助 bitmap 思想統計的模型表,不管統計最近一段時間的累計(月活躍天、月播放用戶等)與統計 1 個月內的留存,都可以一條簡單語句即可統計,不需要 join 操作,每天例行化跑時不需要重復跑接近一個月的分區,1 個月內可以支持任意統計,比如只需最近 2 周的活躍天等,因此這樣的模型相對通用,另外如果業務需要用到 2 個月的數據,也可以將模型從 31 位擴展到 61 位。

 

當然任何事情不可能只有優點,而不存在缺點的情況,這里這個優化的模型只是參考了 bitmap 思想,并不是 bitmap 方案實現,雖然可以將 31 天活躍用戶壓縮 80%多存儲,但是每天都存儲 31 天活躍用戶的壓縮數據,因此相比之前只保留天增量表來說,還是增加了實際存儲空間,但是這個以存儲換計算的方案是符合數倉設計原則的,因為計算是用成本昂貴的 cpu 和內存資源,存儲是用成本低廉的磁盤資源,因此有涉及最近 N 天累計或者留存計算需求的朋友可以借鑒這樣的思路。

【本文為51CTO專欄作者“騰訊技術工程”原創稿件,轉載請聯系原作者(微信號:Tencent_TEG)】

戳這里,看該作者更多好文

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2014-08-26 09:34:33

大數據彈性應用

2024-07-04 11:15:06

大數據工具框架

2022-08-14 14:52:45

數據存儲實踐

2012-09-17 11:19:49

IBMdw

2014-04-04 10:53:04

2012-12-24 09:42:11

大數據應用開發輔助開發工具大數據

2013-05-21 10:42:48

Android游戲開發Bitmap位圖旋轉

2013-09-16 16:56:09

AndroidBitmap內存優化

2017-12-21 14:36:10

大數據健身智慧

2014-07-18 08:47:26

KJFrameAndroidBitmap

2022-07-11 10:45:37

插樁性能優化打包

2017-05-12 14:00:07

大數據前端模塊化開發

2021-03-12 18:56:26

大數據數據開發SQL

2020-12-31 14:14:35

大數據大數據應用

2014-11-24 11:10:44

大數據新浪

2016-12-04 16:46:51

大數據架構機器學習

2013-05-07 14:56:27

大數據應用工具數據中心網絡

2017-03-28 18:25:59

華為

2016-10-18 09:46:56

大數據城市高科技

2014-08-25 09:08:23

大數據應用開發
點贊
收藏

51CTO技術棧公眾號

黑森林av导航| 一区二区三区久久网| www.日本精品| 欧美日韩性在线观看| 欧美日韩视频在线观看一区二区三区 | 久久本道综合色狠狠五月| 天天干天天操天天操| 国产精品久久观看| 日韩精品极品在线观看播放免费视频 | 美国黄色片视频| 老司机aⅴ在线精品导航| 欧美性xxxxxx少妇| 欧美一级欧美一级| 免费在线毛片网站| 9色porny自拍视频一区二区| 国产精品免费久久久久影院| 久草视频手机在线观看| 欧美一级本道电影免费专区| 精品欧美一区二区三区精品久久| 国内自拍视频一区| a级片免费在线观看| 日本一区二区三区在线观看| 国产精品久久久久久久久久直播| 日韩不卡在线播放| 欧美日韩国产探花| 搡老女人一区二区三区视频tv| www.日本久久| 99热播精品免费| 欧美视频中文字幕在线| 日韩精品一区二区三区电影| yourporn在线观看视频| 91欧美一区二区| 国产超碰91| 99国产精品久久久久99打野战| 日韩电影网1区2区| 欧美一级视频一区二区| 国产在线一区视频| 亚洲影视一区| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 中文字幕在线免费看线人| 日韩成人在线观看视频| 欧美精品在线观看播放| 色播五月综合网| 日本一区免费网站| 91福利视频在线| 黄色片久久久久| 亚洲女同志freevdieo| 亚洲国产成人av网| 人人妻人人澡人人爽欧美一区双| av在线影院| 亚洲人精品一区| 成年人免费观看的视频| 免费黄色在线| 国产精品国产精品国产专区不蜜 | 超碰在线观看97| www.国产欧美| 粉嫩蜜臀av国产精品网站| 亚洲综合成人婷婷小说| av免费在线不卡| 国产精品一级片在线观看| 亚洲影院在线看| 亚洲av无码乱码在线观看性色| 韩国三级电影一区二区| 亚洲资源在线看| 亚洲国产精品久久久久爰性色| 国产精品一区二区三区网站| 国产精品9999久久久久仙踪林| 亚洲av少妇一区二区在线观看| 国产99久久久久| 国产区二精品视| 欧美偷拍视频| 日本一区二区三区dvd视频在线| 视频在线一区二区三区| 看女生喷水的网站在线观看| 亚洲乱码一区二区三区在线观看| 国产精品igao激情视频| 123区在线| 在线免费视频一区二区| 奇米影视四色在线| 亚洲小说春色综合另类电影| 日韩电影免费观看在线观看| av手机在线播放| 亚洲美女尤物影院| 外国成人毛片| 亚洲精品va在线观看| 亚洲色成人www永久在线观看| 国产在线美女| 欧美午夜视频网站| 日本黄色www| 免费看成人哺乳视频网站| 日日狠狠久久偷偷四色综合免费| 国产免费无码一区二区视频| 国产日韩高清一区二区三区在线| 国产精品久久久久77777| 国产美女免费视频| 91香蕉视频mp4| 中文字幕制服丝袜在线| 九色porny自拍视频在线播放| 欧美伊人久久久久久久久影院 | 亚洲人永久免费| 777777国产7777777| 亚洲激情亚洲| 国产一区二中文字幕在线看| 天堂在线视频观看| 中文字幕综合网| 久久久精品在线视频| 国产视频网站一区二区三区| 亚洲欧洲在线看| 欧美日韩免费一区二区| 日产国产欧美视频一区精品| 91视频婷婷| 91在线播放网站| 婷婷久久综合九色综合绿巨人| 天堂网在线免费观看| 加勒比色老久久爱综合网| 色老头一区二区三区在线观看| 国产一级视频在线观看| 狠狠色丁香久久婷婷综合_中 | 日韩在线免费看| 亚洲六月丁香色婷婷综合久久| www.国产区| 久久99精品国产自在现线| 久久久www成人免费精品| 亚洲av中文无码乱人伦在线视色| 丁香婷婷综合色啪| 国产91av视频在线观看| 日韩毛片在线| 日韩经典中文字幕| 日本a在线观看| 国产成人av一区二区三区在线| 亚洲欧洲久久| 97人人做人人爽香蕉精品| 日韩毛片中文字幕| 日韩和一区二区| 国产成人无遮挡在线视频| 中文网丁香综合网| 激情欧美一区二区三区黑长吊| 亚洲欧洲在线播放| 日本高清不卡码| 99视频国产精品| 欧美视频在线观看网站| 一区二区精彩视频| 欧美国产视频日韩| 超碰在线观看av| 一二三四社区欧美黄| 91香蕉国产线在线观看| 一区二区三区四区日韩| 91久久久久久| 成年视频在线观看| 日韩三级中文字幕| 久久综合色综合| 成人中文字幕合集| 国精产品一区一区三区视频| 岛国av一区| 97国产成人精品视频| 午夜小视频免费| 黑人巨大精品欧美一区二区三区 | 亚洲综合欧美在线| 久久久影院免费| 91视频免费网站| 制服丝袜中文字幕在线| 精品国产一区二区三区忘忧草 | 草草在线观看| 日韩av在线网址| 久久久久久久久久成人| 国产乱码精品一区二区| 免费日韩精品中文字幕视频在线| 久久精品国产精品国产精品污| 成人线上视频| 日韩有码在线播放| 亚洲成人黄色片| 粉嫩老牛aⅴ一区二区三区| 美女爆乳18禁www久久久久久| 日本成人中文字幕| 日本黄网站色大片免费观看| 成人福利免费在线观看| 奇米四色中文综合久久| 岛国大片在线观看| 欧美一区二区在线不卡| 久久久久无码精品国产sm果冻 | 中文字幕第六页| 在线精品亚洲| 水蜜桃一区二区| 日韩精品视频一区二区三区| 7777精品视频| 午夜视频在线看| 欧美变态tickle挠乳网站| 免费看日韩毛片| 国产精品女上位| 中文视频在线观看| 蜜桃传媒麻豆第一区在线观看| 国产精品一区在线免费观看| 久久婷婷国产| 成人黄色av播放免费| 123区在线| 久久精品久久久久| 四虎影视在线播放| 91精品国产综合久久小美女| 在线观看免费国产视频| 国产精品久久综合| 亚洲一区二区三区无码久久| 精品一区二区免费看| 成年人网站国产| 91亚洲国产成人久久精品| 韩国成人动漫在线观看| av日韩一区| 国产成人在线播放| 丁香花在线电影| 久久国产精品电影| 第一福利在线| 日韩毛片在线观看| 超碰在线播放97| 欧美乱妇23p| 超碰在线观看91| 亚洲成av人**亚洲成av**| 五月天色婷婷丁香| 中文字幕免费不卡| 在线观看国产网站| 国产成人亚洲精品狼色在线| jizzzz日本| 日韩电影一区二区三区| 99精品视频在线看| 日韩午夜免费| 亚洲人成无码网站久久99热国产| 91精品福利| 亚洲欧美日韩在线综合 | 亚洲精品www久久久久久| 亚洲色图都市小说| 亚洲黄色网址大全| 国产欧美综合在线| 无码少妇精品一区二区免费动态| 9l国产精品久久久久麻豆| 国产精品91av| 国产激情一区二区三区桃花岛亚洲| 一本色道久久亚洲综合精品蜜桃| 丝袜美腿成人在线| 国产成人精品无码播放| 亚洲专区一区二区三区| 俄罗斯av网站| 亚洲一区亚洲| 国产精品免费观看久久| 午夜在线精品偷拍| 欧美 日韩精品| 老牛国产精品一区的观看方式| 久久久久久久久久久视频| 亚洲久色影视| 欧美日韩二三区| 老鸭窝毛片一区二区三区| 日本精品免费在线观看| 国产精品夜夜夜| 超碰97人人射妻| 日韩av中文字幕一区二区三区| 久草综合在线观看| 日本伊人色综合网| 日本在线播放一区二区| 国内精品久久久久影院薰衣草| www.51色.com| 国产成人午夜精品5599| 秘密基地免费观看完整版中文 | 久久精品人成| 久久不见久久见国语| 日韩videos| 99久久99久久精品国产片桃花| 日韩成人午夜影院| 亚洲深夜激情| 国产一二三区av| 国产美女一区二区| 精品人妻在线视频| 久久你懂得1024| 北条麻妃在线观看视频| 亚洲精品第1页| 久久夜靖品2区| 欧美系列在线观看| 精品人妻无码一区二区色欲产成人 | 一区二区三区视频网| 国产麻豆成人精品| 一区二区视频观看| 国产精品国产三级国产普通话蜜臀| 欧美日韩国产精品一区二区三区| 午夜精品久久一牛影视| 成人一二三四区| 日韩欧美第一区| 国产在线视频网| 欧美成人午夜激情| 澳门成人av网| 91最新在线免费观看| 日韩有码中文字幕在线| 五月天久久综合网| 亚洲电影av| 黄大色黄女片18第一次| www.成人在线| 91n在线视频| 欧美日韩免费看| 国产精品欧美久久久久天天影视| 亚洲精品在线免费观看视频| 岛国在线视频| 91精品国产色综合| 91麻豆精品国产综合久久久| 精品视频一区二区| 亚洲精品一区二区在线看| 欧美 日韩 国产在线观看| 国产综合色视频| 波多野吉衣中文字幕| 亚洲黄色录像片| 亚洲中文无码av在线| 亚洲精品动漫100p| 成人黄视频在线观看| 国产成人精品一区| 秋霞综合在线视频| 777久久精品一区二区三区无码| 视频一区国产视频| 国产精品九九视频| 一区二区三区欧美久久| 中文字幕视频二区| 亚洲美女激情视频| 999福利在线视频| 91精品入口蜜桃| 国产精品99在线观看| 欧洲熟妇精品视频| 91麻豆精品一区二区三区| 91aaa在线观看| 制服.丝袜.亚洲.中文.综合| 精品视频二区| 亲子乱一区二区三区电影 | 欧美成a人片在线观看久| 国产91亚洲精品一区二区三区| 91免费精品| 九九热免费在线观看| 欧美激情中文不卡| 亚洲天堂一区在线| 亚洲精品久久久久久久久久久久久 | 国产97色在线 | 日韩| 99在线精品观看| 国内免费精品视频| 亚洲精品狠狠操| av漫画网站在线观看| 国产乱码精品一区二区三区日韩精品| 午夜精品久久| 日本一级大毛片a一| 亚洲精品午夜久久久| 国产女18毛片多18精品| 久久精品99无色码中文字幕 | 日韩国产欧美在线播放| 日韩人妻一区二区三区| 日韩欧美亚洲成人| 蜜桃成人在线视频| 国产精品第3页| 第一会所亚洲原创| www.国产视频.com| 亚洲蜜臀av乱码久久精品蜜桃| 国产手机视频在线| 欧美黑人国产人伦爽爽爽| 亚洲开心激情| 国产美女主播在线播放| 91在线视频播放地址| 国产成人亚洲精品自产在线| 亚洲精品在线不卡| 日韩av中字| 一区二区三区久久网| 国产在线视频一区二区三区| 欧美日韩大片在线观看| 日韩不卡在线观看| 日本成人片在线| 亚洲一区二区三区在线观看视频| 久久精品国产99| 九九久久免费视频| 亚洲成**性毛茸茸| 国产伦精品一区二区三区视频金莲| 热re99久久精品国99热蜜月| 美国十次了思思久久精品导航| 四虎永久免费在线| 亚洲精品国产精品久久清纯直播| 欧洲av不卡| 国产精品一二三在线观看| 不卡在线观看av| 国产一级片一区二区| 理论片在线不卡免费观看| 精品福利一区| 嫩草av久久伊人妇女超级a| 亚洲色图欧美激情| 日本福利片高清在线观看| 国产欧美日韩中文字幕| 黄色亚洲在线| 欧美激情久久久久久久| 欧美一级片在线看| 亚洲第一av| 特级西西444| 国产拍欧美日韩视频二区| 亚洲av无码乱码国产麻豆| 国产大片精品免费永久看nba| 一区二区三区四区在线观看国产日韩| 丰满大乳奶做爰ⅹxx视频| 欧美美女直播网站| 一二三四视频在线中文| 在线成人av电影| 91美女片黄在线观看91美女| 国产美女永久免费| 国产精品久久久久久久久久新婚 | 91精品国产91久久久久| 色婷婷一区二区三区|