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

深入了解Apache Spark窗口功能

大數(shù)據(jù) Spark
在此博客文章中,我們將深入探討Apache Spark窗口函數(shù)。 您可能也對我之前有關(guān)Apache Spark的帖子感興趣。

窗口函數(shù)對數(shù)據(jù)組進(jìn)行操作,并為每個記錄或組返回值

 

[[331416]]
> Photo by Tom Blackout on Unsplash

在此博客文章中,我們將深入探討Apache Spark窗口函數(shù)。 您可能也對我之前有關(guān)Apache Spark的帖子感興趣。

  • 使用Apache Spark開始您的旅程-第1部分
  • 使用Apache Spark開始您的旅程-第2部分
  • Apache Spark開始您的旅程-第3部分
  • 深入研究Apache Spark DateTime函數(shù)
  • 在Apache Spark中使用JSON

首先,讓我們看看什么是窗口函數(shù)以及何時使用它們。 我們在Apache Spark中使用了各種功能,例如月份(從日期返回月份),四舍五入(舍入值)和地板(為給定的輸入提供底值)等,這些功能將在每條記錄上執(zhí)行并返回一個值 每條記錄。 然后,我們將對一組數(shù)據(jù)執(zhí)行各種聚合函數(shù),并為每個組返回一個值,例如sum,avg,min,max和count。 但是,如果我們想對一組數(shù)據(jù)執(zhí)行該操作,并且希望對每個記錄有一個單一的值/結(jié)果怎么辦? 在這種情況下,我們可以使用窗口函數(shù)。 他們可以定義記錄的排名,累積分布,移動平均值,或標(biāo)識當(dāng)前記錄之前或之后的記錄。

讓我們使用一些Scala API示例來了解以下窗口函數(shù):

  • 匯總:min, max, avg, count, 和 sum.
  • 排名:rank,dense_rank,percent_rank,row_num和ntile
  • 分析性:cume_dist,lag和lead
  • 自定義邊界:rangeBetween和rowsBetween

為便于參考,GitHub上提供了一個以JSON文件格式導(dǎo)出的Zeppelin筆記本和一個Scala文件。

創(chuàng)建Spark DataFrame

現(xiàn)在,我們創(chuàng)建一個示例Spark DataFrame,我們將在整個博客中使用它。 首先,讓我們加載所需的庫。

  1. import org.apache.spark.sql.expressions.Window 
  2. import org.apache.spark.sql.functions._ 

現(xiàn)在,我們將使用一些虛擬數(shù)據(jù)創(chuàng)建DataFrame,這些虛擬數(shù)據(jù)將用于討論各種窗口函數(shù)。

  1. case class Salary(depName: String, empNo: Long, salary: Long) 
  2.  
  3. val empsalary = Seq( 
  4.   Salary("sales", 1, 5000), 
  5.   Salary("personnel", 2, 3900), 
  6.   Salary("sales", 3, 4800), 
  7.   Salary("sales", 4, 4800), 
  8.   Salary("personnel", 5, 3500), 
  9.   Salary("develop", 7, 4200), 
  10.   Salary("develop", 8, 6000), 
  11.   Salary("develop", 9, 4500), 
  12.   Salary("develop", 10, 5200), 
  13.   Salary("develop", 11, 5200)).toDF() 

這是我們的DataFrame的樣子:

 

深入了解Apache Spark窗口功能

 

窗口集合函數(shù)

讓我們看一些聚合的窗口函數(shù),看看它們?nèi)绾喂ぷ鳌?/p>

首先,我們需要定義窗口的規(guī)范。 假設(shè)我們要根據(jù)部門獲取匯總數(shù)據(jù)。 因此,在此示例中,我們將基于部門名稱(列:depname)定義窗口。

為聚合函數(shù)創(chuàng)建窗口規(guī)范

  1. val byDepName = Window.partitionBy("depName"

在窗口上應(yīng)用聚合函數(shù)

現(xiàn)在,在部門內(nèi)(列:depname),我們可以應(yīng)用各種聚合函數(shù)。 因此,讓我們嘗試查找每個部門的最高和最低工資。 在這里,我們僅選擇了所需的列(depName,max_salary和min_salary),并刪除了重復(fù)的記錄。

  1. val agg_sal = empsalary 
  2.            .withColumn("max_salary"max("salary").over(byDepName)) 
  3.            .withColumn("min_salary"min("salary").over(byDepName)) 
  4.                  
  5.  
  6. agg_sal.select("depname""max_salary""min_salary"
  7.         .dropDuplicates() 
  8.         .show() 

輸出:

  1. +---------+----------+----------+ 
  2. |  depname|max_salary|min_salary| 
  3. +---------+----------+----------+ 
  4. |  develop|      6000|      4200| 
  5. |    sales|      5000|      4800| 
  6. |personnel|      3900|      3500| 
  7. +---------+----------+----------+ 

現(xiàn)在讓我們看看它是如何工作的。 我們已經(jīng)按部門名稱對數(shù)據(jù)進(jìn)行了分區(qū):

 

深入了解Apache Spark窗口功能

現(xiàn)在,當(dāng)我們執(zhí)行合計(jì)函數(shù)時,它將應(yīng)用于每個分區(qū)并返回合計(jì)值(在本例中為min和max)。

 

深入了解Apache Spark窗口功能

注意:可用的匯總函數(shù)為最大,最小,總和,平均和計(jì)數(shù)。

窗口排名功能

在本節(jié)中,我們將討論幾種類型的排名函數(shù)。

創(chuàng)建用于排序功能的窗口規(guī)范

現(xiàn)在,我們要根據(jù)員工在部門內(nèi)的薪水進(jìn)行排名。 薪水最高的員工將排名第一,薪水最低的員工將排名最后。 在這里,我們將基于部門(列:depname)對數(shù)據(jù)進(jìn)行分區(qū),并且在部門內(nèi),我們將根據(jù)薪水以降序?qū)?shù)據(jù)進(jìn)行排序。

  1. val winSpec = Window.partitionBy("depName").orderBy("salary".desc

對于每個部門,記錄將根據(jù)薪水以降序排序。

 

深入了解Apache Spark窗口功能

1.等級功能:等級

此函數(shù)將返回分區(qū)中每個記錄的等級,并跳過任何重復(fù)等級之后的后續(xù)等級:

  1. val rank_df = empsalary.withColumn("rank", rank().over(winSpec)) 
  2. rank_df.show() 

輸出:

  1. +---------+-----+------+----+ 
  2. |  depName|empNo|salary|rank| 
  3. +---------+-----+------+----+ 
  4. |  develop|    8|  6000|   1| 
  5. |  develop|   11|  5200|   2| 
  6. |  develop|   10|  5200|   2| 
  7. |  develop|    9|  4500|   4| 
  8. |  develop|    7|  4200|   5| 
  9. |    sales|    1|  5000|   1| 
  10. |    sales|    4|  4800|   2| 
  11. |    sales|    3|  4800|   2| 
  12. |personnel|    2|  3900|   1| 
  13. |personnel|    5|  3500|   2| 
  14. +---------+-----+------+----+ 

在這里我們可以看到某些等級重復(fù),而有些等級丟失。 例如,在開發(fā)部門中,我們有2名等級= 2的員工,而沒有等級= 3的員工,因?yàn)榈燃壓瘮?shù)將為相同的值保留相同的等級,并相應(yīng)地跳過下一個等級。

2.密集等級:densed_rank

此函數(shù)將返回分區(qū)中每個記錄的等級,但不會跳過任何等級。

  1. val dense_rank_df = empsalary.withColumn("dense_rank", dense_rank().over(winSpec)) 
  2.  
  3. dense_rank_df.show() 

輸出:

  1. +---------+-----+------+-----------+ 
  2. |  depName|empNo|salary|desnse_rank| 
  3. +---------+-----+------+-----------+ 
  4. |  develop|    8|  6000|          1| 
  5. |  develop|   10|  5200|          2| 
  6. |  develop|   11|  5200|          2| 
  7. |  develop|    9|  4500|          3| 
  8. |  develop|    7|  4200|          4| 
  9. |    sales|    1|  5000|          1| 
  10. |    sales|    3|  4800|          2| 
  11. |    sales|    4|  4800|          2| 
  12. |personnel|    2|  3900|          1| 
  13. |personnel|    5|  3500|          2| 
  14. +---------+-----+------+-----------+ 

在這里,我們可以看到某些等級是重復(fù)的,但是排名并沒有像我們使用等級功能時那樣丟失。 例如,在開發(fā)部門中,我們有2名員工,等級=2。density_rank函數(shù)將為相同的值保留相同的等級,但不會跳過下一個等級。

3.行號函數(shù):row_number

此功能將在窗口內(nèi)分配行號。 如果2行的排序列值相同,則不確定將哪個行號分配給具有相同值的每一行。

  1. val row_num_df = empsalary.withColumn("row_number", row_number().over(winSpec)) 
  2.  
  3. row_num_df.show() 

輸出:

  1. +---------+-----+------+----------+ 
  2. |  depName|empNo|salary|row_number| 
  3. +---------+-----+------+----------+ 
  4. |  develop|    8|  6000|         1| 
  5. |  develop|   10|  5200|         2| 
  6. |  develop|   11|  5200|         3| 
  7. |  develop|    9|  4500|         4| 
  8. |  develop|    7|  4200|         5| 
  9. |    sales|    1|  5000|         1| 
  10. |    sales|    3|  4800|         2| 
  11. |    sales|    4|  4800|         3| 
  12. |personnel|    2|  3900|         1| 
  13. |personnel|    5|  3500|         2| 
  14. +---------+-----+------+----------+ 

4.百分比排名函數(shù):percent_rank

此函數(shù)將返回分區(qū)中的相對(百分?jǐn)?shù))等級。

  1. val percent_rank_df = empsalary.withColumn("percent_rank", percent_rank().over(winSpec)) 
  2.  
  3. percent_rank_df.show() 

輸出:

  1. +---------+-----+------+------------+ 
  2. |  depName|empNo|salary|percent_rank| 
  3. +---------+-----+------+------------+ 
  4. |  develop|    8|  6000|         0.0| 
  5. |  develop|   10|  5200|        0.25| 
  6. |  develop|   11|  5200|        0.25| 
  7. |  develop|    9|  4500|        0.75| 
  8. |  develop|    7|  4200|         1.0| 
  9. |    sales|    1|  5000|         0.0| 
  10. |    sales|    3|  4800|         0.5| 
  11. |    sales|    4|  4800|         0.5| 
  12. |personnel|    2|  3900|         0.0| 
  13. |personnel|    5|  3500|         1.0| 
  14. +---------+-----+------+------------+ 

5. N-tile功能:ntile

此功能可以根據(jù)窗口規(guī)格或分區(qū)將窗口進(jìn)一步細(xì)分為n個組。 例如,如果需要將部門進(jìn)一步劃分為三類,則可以將ntile指定為3。

  1. val ntile_df = empsalary.withColumn("ntile", ntile(3).over(winSpec)) 
  2.  
  3. ntile_df.show() 

輸出:

  1. +---------+-----+------+-----+ 
  2. |  depName|empNo|salary|ntile| 
  3. +---------+-----+------+-----+ 
  4. |  develop|    8|  6000|    1| 
  5. |  develop|   10|  5200|    1| 
  6. |  develop|   11|  5200|    2| 
  7. |  develop|    9|  4500|    2| 
  8. |  develop|    7|  4200|    3| 
  9. |    sales|    1|  5000|    1| 
  10. |    sales|    3|  4800|    2| 
  11. |    sales|    4|  4800|    3| 
  12. |personnel|    2|  3900|    1| 
  13. |personnel|    5|  3500|    2| 
  14. +---------+-----+------+-----+ 

 


窗口分析功能

接下來,我們將討論諸如累積分布,滯后和超前的分析功能。

1.累積分布函數(shù):cume_dist

此函數(shù)提供窗口/分區(qū)的值的累積分布。

  1. val winSpec = Window.partitionBy("depName").orderBy("salary"
  2.  
  3. val cume_dist_df =  
  4.               empsalary.withColumn("cume_dist",cume_dist().over(winSpec)) 
  5.  
  6. cume_dist_df.show() 

定義窗口規(guī)范并應(yīng)用cume_dist函數(shù)以獲取累積分布。

輸出:

  1. +---------+-----+------+------------------+ 
  2. |  depName|empNo|salary|         cume_dist| 
  3. +---------+-----+------+------------------+ 
  4. |  develop|    7|  4200|               0.2| 
  5. |  develop|    9|  4500|               0.4| 
  6. |  develop|   10|  5200|               0.8| 
  7. |  develop|   11|  5200|               0.8| 
  8. |  develop|    8|  6000|               1.0| 
  9. |    sales|    4|  4800|0.6666666666666666| 
  10. |    sales|    3|  4800|0.6666666666666666| 
  11. |    sales|    1|  5000|               1.0| 
  12. |personnel|    5|  3500|               0.5 
  13. |personnel|    2|  3900|               1.0| 
  14. +---------+-----+------+------------------+ 

2.滯后功能:滯后

此函數(shù)將在從DataFrame偏移行之前返回該值。

lag函數(shù)采用3個參數(shù)(lag(col,count = 1,默認(rèn)= None)),col:定義需要在其上應(yīng)用函數(shù)的列。 count:需要回顧多少行。 default:定義默認(rèn)值。

  1. val winSpec = Window.partitionBy("depName").orderBy("salary"
  2.  
  3. val lag_df =  
  4.           empsalary.withColumn("lag", lag("salary", 2).over(winSpec)) 
  5.  
  6. lag_df.show() 

輸出:

  1. +---------+-----+------+----+ 
  2. |  depName|empNo|salary| lag| 
  3. +---------+-----+------+----+ 
  4. |  develop|    7|  4200|null
  5. |  develop|    9|  4500|null
  6. |  develop|   10|  5200|4200| 
  7. |  develop|   11|  5200|4500| 
  8. |  develop|    8|  6000|5200| 
  9. |    sales|    4|  4800|null
  10. |    sales|    3|  4800|null
  11. |    sales|    1|  5000|4800| 
  12. |personnel|    5|  3500|null
  13. |personnel|    2|  3900|null
  14. +---------+-----+------+----+ 

例如,讓我們在當(dāng)前行之前查找薪水2行。

  • 對于depname = develop,salary = 4500。沒有這樣的行,該行在該行之前2行。 因此它將為空。

 

深入了解Apache Spark窗口功能
  • 對于部門名稱=發(fā)展,薪水= 6000(以藍(lán)色突出顯示)。 如果我們提前兩排,我們將獲得5200的薪水(以綠色突出顯示)。

 

深入了解Apache Spark窗口功能

3.導(dǎo)聯(lián)功能:導(dǎo)聯(lián)

此函數(shù)將返回DataFrame的偏移行之后的值。

  1. val winSpec = Window.partitionBy("depName").orderBy("salary"
  2.  
  3. val lead_df =  
  4.           empsalary.withColumn("lead", lead("salary", 2).over(winSpec)) 
  5.  
  6. lead_df.show() 

lead函數(shù)采用3個參數(shù)(lead(col,count = 1,默認(rèn)= None))col:定義需要在其上應(yīng)用函數(shù)的列。 count:對于當(dāng)前行,我們需要向前/向后查找多少行。 default:定義默認(rèn)值。

輸出:

  1. +---------+-----+------+----+ 
  2. |  depName|empNo|salary| lag| 
  3. +---------+-----+------+----+ 
  4. |  develop|    7|  4200|5200| 
  5. |  develop|    9|  4500|5200| 
  6. |  develop|   10|  5200|6000| 
  7. |  develop|   11|  5200|null
  8. |  develop|    8|  6000|null
  9. |    sales|    3|  4800|5000| 
  10. |    sales|    4|  4800|null
  11. |    sales|    1|  5000|null
  12. |personnel|    5|  3500|null
  13. |personnel|    2|  3900|null
  14. +---------+-----+------+----+ 

讓我們嘗試從當(dāng)前行中查找前進(jìn)/后兩行的薪水。

  • 對于depname =開發(fā)人員,薪水= 4500(以藍(lán)色突出顯示)。 如果我們在前進(jìn)/后退兩行,我們將獲得5200的薪水(以綠色突出顯示)。

 

深入了解Apache Spark窗口功能
  • 對于depname =人員,薪水=3500。在此分區(qū)中,沒有此行向前2行/在該行之后。 因此我們將獲得空值。

 

深入了解Apache Spark窗口功能

 

深入了解Apache Spark窗口功能

自定義窗口定義

默認(rèn)情況下,窗口的邊界由分區(qū)列定義,我們可以通過窗口規(guī)范指定順序。 例如,對于開發(fā)部門,窗口的開始是工資的最小值,窗口的結(jié)束是工資的最大值。

但是,如果我們想更改窗口的邊界怎么辦? 以下功能可用于定義每個分區(qū)內(nèi)的窗口。

1. rangeBetween

使用rangeBetween函數(shù),我們可以顯式定義邊界。例如,從當(dāng)前薪水開始,將其定義為100,然后將其定義為300,并查看其含義。 從100開始表示窗口將從100個單位開始,從當(dāng)前值開始以300個值結(jié)束(包括開始值和結(jié)束值)。

  1. val winSpec = Window.partitionBy("depName"
  2.           .orderBy("salary"
  3.           .rangeBetween(100L, 300L) 

定義窗口規(guī)格

起始值和結(jié)束值后的L表示該值是Scala Long類型。

  1. val range_between_df = empsalary.withColumn("max_salary"max("salary").over(winSpec)) 
  2.  
  3. range_between_df.show() 

應(yīng)用自定義窗口規(guī)范

輸出:

  1. +---------+-----+------+----------+ 
  2. |  depName|empNo|salary|max_salary| 
  3. +---------+-----+------+----------+ 
  4. |  develop|    7|  4200|      4500| 
  5. |  develop|    9|  4500|      null
  6. |  develop|   10|  5200|      null
  7. |  develop|   11|  5200|      null
  8. |  develop|    8|  6000|      null
  9. |    sales|    3|  4800|      5000| 
  10. |    sales|    4|  4800|      5000| 
  11. |    sales|    1|  5000|      null
  12. |personnel|    5|  3500|      null
  13. |personnel|    2|  3900|      null
  14. +---------+-----+------+----------+ 

現(xiàn)在,讓我們嘗試了解輸出。

  • 對于depname = developer,salary = 4200,窗口的開始將是(當(dāng)前值+開始),即4200 + 100 =4300。窗口的結(jié)束將是(當(dāng)前值+結(jié)束),即4200 + 300 = 4500。

由于只有一個薪水值在4300到4500之間,包括開發(fā)部門的4500,所以我們將4500作為max_salary作為4200(上面的檢查輸出)。

 

深入了解Apache Spark窗口功能
  • 同樣,對于depname = develop,salary = 4500,窗口將為(開始:4500 + 100 = 4600,結(jié)束:4500 + 300 = 4800)。 但是開發(fā)部門沒有薪水值在4600到4800之間,因此最大值不會為空(上面的檢查輸出)。

 

深入了解Apache Spark窗口功能

這里有一些特殊的邊界值可以使用。

  • Window.currentRow:指定一行中的當(dāng)前值。
  • Window.unboundedPreceding:這可以用于使窗口無限制地開始。
  • Window.unbounded以下:此方法可用于使窗口具有無限的末端。

例如,我們需要從員工工資中找到最高工資,該最高工資大于300。 因此,我們將起始值定義為300L,將結(jié)束值定義為Window.unboundedFollowing:

  1. val winSpec = Window.partitionBy("depName").orderBy("salary"
  2.              .rangeBetween(300L, Window.unboundedFollowing) 
  3.  
  4. val range_unbounded_df = empsalary.withColumn("max_salary"max("salary").over(winSpec)) 
  5.  
  6. range_unbounded_df.show() 

輸出:

  1. +---------+-----+------+----------+ 
  2. |  depName|empNo|salary|max_salary| 
  3. +---------+-----+------+----------+ 
  4. |  develop|    7|  4200|      6000| 
  5. |  develop|    9|  4500|      6000| 
  6. |  develop|   10|  5200|      6000| 
  7. |  develop|   11|  5200|      6000| 
  8. |  develop|    8|  6000|      null
  9. |    sales|    3|  4800|      null
  10. |    sales|    4|  4800|      null
  11. |    sales|    1|  5000|      null
  12. |personnel|    5|  3500|      3900| 
  13. |personnel|    2|  3900|      null
  14. +---------+-----+------+----------+ 

因此,對于depname =人員,薪水=3500。窗口將是(開始:3500 + 300 = 3800,結(jié)束:無邊界)。 因此,此范圍內(nèi)的最大值為3900(檢查上面的輸出)。

同樣,對于depname = sales,salary = 4800,窗口將為(開始:4800 + 300、5100,結(jié)束:無邊界)。 由于銷售部門的值不大于5100,因此結(jié)果為空。

2.rowsBetween

通過rangeBetween,我們使用排序列的值定義了窗口的開始和結(jié)束。 但是,我們也可以使用相對行位置定義窗口的開始和結(jié)束。

例如,我們要創(chuàng)建一個窗口,其中窗口的開始是當(dāng)前行之前的一行,結(jié)束是當(dāng)前行之后的一行。

定義自定義窗口規(guī)范

  1. val winSpec = Window.partitionBy("depName"
  2.             .orderBy("salary").rowsBetween(-1, 1) 

應(yīng)用自定義窗口規(guī)范

  1. val rows_between_df = empsalary.withColumn("max_salary"max("salary").over(winSpec)) 
  2.  
  3. rows_between_df.show() 

輸出:

  1. +---------+-----+------+----------+ 
  2. |  depName|empNo|salary|max_salary| 
  3. +---------+-----+------+----------+ 
  4. |  develop|    7|  4200|      4500| 
  5. |  develop|    9|  4500|      5200| 
  6. |  develop|   10|  5200|      5200| 
  7. |  develop|   11|  5200|      6000| 
  8. |  develop|    8|  6000|      6000| 
  9. |    sales|    3|  4800|      4800| 
  10. |    sales|    4|  4800|      5000| 
  11. |    sales|    1|  5000|      5000| 
  12. |personnel|    5|  3500|      3900| 
  13. |personnel|    2|  3900|      3900| 
  14. +---------+-----+------+----------+ 

現(xiàn)在,讓我們嘗試了解輸出。

  • 對于depname =開發(fā),salary = 4500,將定義一個窗口,該窗口在當(dāng)前行之前和之后一行(以綠色突出顯示)。 因此窗口內(nèi)的薪水為(4200、4500、5200),最高為5200(上面的檢查輸出)。

 

深入了解Apache Spark窗口功能
  • 同樣,對于depname = sales,salary = 5000,將在當(dāng)前行的前后定義一個窗口。 由于此行之后沒有行,因此該窗口將只有2行(以綠色突出顯示),其薪水分別為(4800,5000)和max為5000(上面的檢查輸出)。

 

深入了解Apache Spark窗口功能

我們還可以像以前使用rangeBetween一樣使用特殊邊界Window.unboundedPreceding,Window.unboundedFollowing和Window.currentRow。

注意:rowsBetween不需要排序,但是我使用它來使每次運(yùn)行的結(jié)果保持一致。

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2023-10-06 00:04:02

2019-06-28 14:31:03

網(wǎng)絡(luò)協(xié)議棧Flink數(shù)據(jù)

2010-06-23 20:31:54

2009-08-25 16:27:10

Mscomm控件

2010-11-19 16:22:14

Oracle事務(wù)

2022-08-26 13:48:40

EPUBLinux

2010-07-13 09:36:25

2020-09-21 09:53:04

FlexCSS開發(fā)

2020-07-20 06:35:55

BashLinux

2018-09-26 11:12:35

iOS蘋果功能

2010-02-03 17:08:48

千兆交換機(jī)

2010-02-22 10:08:33

MySQL 5.5分區(qū)

2010-01-11 09:46:56

智能交換機(jī)

2010-11-15 11:40:44

Oracle表空間

2011-07-18 15:08:34

2022-06-03 10:09:32

威脅檢測軟件

2010-11-08 13:54:49

Sqlserver運(yùn)行

2018-06-22 13:05:02

前端JavaScript引擎

2013-04-16 10:20:21

云存儲服務(wù)云存儲SLA服務(wù)水平協(xié)議

2010-09-27 09:31:42

JVM內(nèi)存結(jié)構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

在线观看国产网站| 国产精品高潮呻吟久久av无限| 亚洲免费999| 污污的视频在线观看| 成人永久aaa| 国产激情综合五月久久| 亚洲综合久久av一区二区三区| 四虎在线精品| 五月激情六月综合| 日韩欧美亚洲区| 成人免费视频国产| 石原莉奈在线亚洲三区| 欧美大片在线看免费观看| 亚洲av无码一区二区三区人| 国产午夜亚洲精品一级在线| 色综合欧美在线| 69精品丰满人妻无码视频a片| 亚洲精品视频网| 美日韩一级片在线观看| 久久久久久网址| 蜜桃av.com| 亚洲高清极品| 日韩精品一区二区三区视频 | 欧美日韩18| 亚洲美女久久久| 日本人妻一区二区三区| 久久精品97| 色噜噜偷拍精品综合在线| 亚洲爆乳无码精品aaa片蜜桃| 91这里只有精品| 91在线播放网址| 国产精品青青草| 国产孕妇孕交大片孕| 亚洲欧美成人| 孩xxxx性bbbb欧美| 劲爆欧美第一页| 国产精品videosex性欧美| 亚洲天堂久久av| 精品无码在线视频| 国产精品成人自拍| 日韩精品一区二| 手机在线视频一区| 怡红院成人在线| 精品福利一区二区| 成人免费毛片在线观看| 欧美伦理免费在线| 亚洲一区二区高清| 男同互操gay射视频在线看| eeuss影院www在线观看| 国产午夜久久久久| 日本不卡免费新一二三区| 外国精品视频在线观看| 97超碰欧美中文字幕| 精品免费一区二区三区蜜桃| 国精产品一品二品国精品69xx| 国产精品538一区二区在线| 91在线播放国产| 99国产精品久久久久99打野战| 精品人妻一区二区三区香蕉| 高清在线一区| 欧美美女一区二区在线观看| 亚洲欧美国产日韩综合| 成人国产一区| 91麻豆精品国产91久久久久久| 日本在线播放一区二区| 亚洲一区有码| 欧美一区二区在线不卡| 99riav国产精品视频| 成人偷拍自拍| 亚洲免费电影在线观看| 性猛交ⅹxxx富婆video| 欧美成人milf| 欧美巨猛xxxx猛交黑人97人| 国产真实夫妇交换视频| 亚洲中字在线| 国产综合福利在线| 午夜精品久久久久久久第一页按摩| 国产99精品在线观看| 国产一区二区在线网站 | 亚洲校园激情春色| 欧美午夜性色大片在线观看| 美女黄色片视频| 中文字幕综合| 精品免费视频.| 亚洲第一香蕉网| 999久久久精品国产| 欧美成人亚洲成人日韩成人| 免费在线不卡视频| 欧美96一区二区免费视频| 96pao国产成视频永久免费| 欧美一区二不卡视频| 国产色综合久久| 51xx午夜影福利| 在线观看特色大片免费视频| 欧美疯狂做受xxxx富婆| 国产伦精品一区二区三区精品| 欧美禁忌电影| 欧美人交a欧美精品| 蜜臀精品一区二区三区| 国产黑丝在线一区二区三区| 欧美日韩亚洲在线| aaa大片在线观看| 黑人巨大精品欧美一区二区免费| 午夜精品久久久久久久99热影院| 成人春色在线观看免费网站| 在线性视频日韩欧美| 麻豆疯狂做受xxxx高潮视频| 日韩1区2区日韩1区2区| 国产精品日韩欧美一区二区| 3p视频在线观看| 午夜精品久久久久久久久| 9久久婷婷国产综合精品性色| 亚洲网址在线观看| 在线日韩日本国产亚洲| 日本熟女一区二区| 国内一区二区在线| 欧洲精品久久| 蜜桃av在线| 精品少妇一区二区三区视频免付费 | 久久免费视频6| 麻豆精品一区二区综合av| 精品视频一区二区| 国产精品69xx| 欧美一区二区三区免费在线看| 在线免费观看麻豆| 亚洲美女少妇无套啪啪呻吟| 97se亚洲综合| 国产素人视频在线观看| 欧美综合视频在线观看| 免费在线观看成年人视频| 激情综合中文娱乐网| 92福利视频午夜1000合集在线观看| 久久视频www| 日韩欧美成人免费视频| 中文字幕一区二区久久人妻网站| 午夜精品久久99蜜桃的功能介绍| 国产日韩在线精品av| 国产一级片在线| 欧美天天综合色影久久精品| 欧美xxxxx精品| 亚洲二区精品| 国产麻豆一区二区三区在线观看| av激情在线| 日韩精品一区二区三区swag | 国产剧情在线观看| 日本韩国一区二区| 免费看黄色的视频| 天堂va蜜桃一区二区三区漫画版| 狠狠色狠狠色综合人人| 成a人片在线观看| 欧美日韩在线播放三区四区| 天天操天天舔天天射| 日本午夜精品一区二区三区电影| 日韩精品欧美在线| 亚洲国产尤物| 一区二区三区无码高清视频| 中文字幕在线视频第一页| 中文字幕乱码久久午夜不卡 | 激情亚洲小说| 国产亚洲精品久久久久久777| 国产成人一级片| 久久久久亚洲蜜桃| 国产精品久久a| 久久久久久美女精品| 成人三级视频在线观看一区二区| 91破解版在线观看| 亚洲精选在线观看| 中文字幕在线观看1| 亚洲精品日产精品乱码不卡| 亚洲视频 中文字幕| a91a精品视频在线观看| 欧美精品久久| 欧美激情啪啪| 欧美精品中文字幕一区| 天天操天天干天天操| 日韩欧美国产一区二区| av资源在线免费观看| 国产大陆a不卡| 亚洲乱码中文字幕久久孕妇黑人| 大片网站久久| 亚洲专区在线视频| 欧美freesex黑人又粗又大| 在线观看久久av| 国产免费高清视频| 午夜不卡av在线| 永久免费毛片在线观看| 国产毛片精品视频| 日本三级免费网站| 天天插综合网| 久久手机视频| 91精品在线免费视频| 91高清视频在线免费观看| av福利精品| 亚洲第一区第二区| 一区二区日韩在线观看| 亚洲国产精品欧美一二99| 久久久国产一级片| 成人97人人超碰人人99| 一区二区三区入口| 激情欧美日韩一区| 亚洲啪啪av| 日韩在线影视| 超碰在线97av| 久久人人视频| 日韩免费精品视频| 日本一级理论片在线大全| 中文字幕欧美日韩va免费视频| 高清乱码毛片入口| 欧美美女喷水视频| 在线观看日本视频| 亚洲国产精品一区二区www在线| 青青青视频在线免费观看| 成人免费毛片高清视频| 成人日韩在线视频| 日韩和欧美的一区| 浮妇高潮喷白浆视频| 国产精品99一区二区| 亚洲一区二区三区精品在线观看| 全国精品免费看| 国产精品永久入口久久久| а天堂中文最新一区二区三区| 国产成人aa精品一区在线播放| 精品捆绑调教一区二区三区| 欧美成人免费小视频| 日韩免费网站| 中文字幕日韩精品在线观看| 国产91免费在线观看| 91精品国产欧美一区二区| 免费看污视频的网站| 欧美日韩在线免费观看| 国产精品成人免费一区二区视频| 亚洲天堂福利av| 秋霞欧美一区二区三区视频免费| 国产亚洲精久久久久久| 中文字幕成人动漫| 久久五月婷婷丁香社区| 草草影院第一页| 91亚洲国产成人精品一区二区三 | 国产又爽又黄免费软件| 欧美日韩黄色一区二区| 精品一区二三区| 色噜噜久久综合| 成人毛片一区二区三区| 色域天天综合网| 国产三级精品三级在线观看| 高跟丝袜欧美一区| 天堂在线免费观看视频| 欧美午夜宅男影院在线观看| 4438国产精品一区二区| 色婷婷久久一区二区三区麻豆| 亚洲欧美日韩激情| 色婷婷av一区| 在线观看中文字幕码| 精品视频免费在线| 国产又粗又黄又爽| 日韩视频中午一区| 风流老熟女一区二区三区| 黄色欧美在线| 中文字幕在线精品| jizz在线观看中文| 中文字幕日韩av电影| av一本在线| 久久精品国产一区二区三区| 巨大荫蒂视频欧美大片| 久久精品99国产精品酒店日本| 国产秀色在线www免费观看| 欧美精品性视频| 91美女主播在线视频| 日韩美女免费视频| 国产精品黄色片| 99re视频| 最近国产精品视频| 亚洲三区四区| 亚洲五月综合| 欧美精品一区免费| 毛片基地黄久久久久久天堂| 一级做a爱视频| www.日韩精品| 国产伦精品一区二区三区视频女| 中文字幕av一区二区三区免费看| 91制片厂在线| 午夜精品福利一区二区三区av| 免费黄色av片| 日韩欧美国产不卡| 日本一区二区三区在线观看视频| 一区二区在线免费视频| caopeng在线| 欧美最猛性xxxxx免费| 日本精品久久| 精品久久久久久亚洲| 日韩电影一区| 精品视频免费在线播放| 美女在线视频一区| 999精品免费视频| 中文字幕一区二区三中文字幕| 日本少妇激情视频| 欧美日韩免费视频| 无码精品黑人一区二区三区| zzijzzij亚洲日本成熟少妇| 韩日毛片在线观看| 成人一区二区电影| 欧美**字幕| 久久综合久久久久| 蜜臀久久99精品久久久久宅男| av网页在线观看| 亚洲欧美另类在线| 亚洲av人无码激艳猛片服务器| 亚洲精品在线三区| 黄色一级片在线观看| 青青久久av北条麻妃海外网| 91久久精品无嫩草影院| 亚洲狠狠婷婷综合久久久| 一区二区动漫| 国产在线观看免费播放| 中文字幕在线视频一区| 无码人妻丰满熟妇区bbbbxxxx| 亚洲成人在线视频播放| 黄色网页在线播放| 国产精品十八以下禁看| 午夜a一级毛片亚洲欧洲| 九九热只有这里有精品| 韩国v欧美v日本v亚洲v| 欧美a在线播放| 色婷婷一区二区三区四区| 神马久久久久久久久久| 精品少妇v888av| 成人污污视频| 亚洲在线观看一区| 日韩av一区二| 精品日韩一区二区三区| 老牛影视av牛牛影视av| 久久视频精品在线| 成人国产一区| 神马影院午夜我不卡| 丝袜美腿成人在线| 国产偷人妻精品一区| 午夜精品久久久久久久99水蜜桃 | 日韩av中文字幕在线免费观看| 在线看一级片| 99视频网站| 欧美午夜在线| 久久久久久婷婷| 亚洲国产综合视频在线观看| 午夜精品小视频| 高清在线视频日韩欧美| 51社区在线成人免费视频| 欧美a级免费视频| 国产aⅴ综合色| 成人免费区一区二区三区| 亚洲国产精品一区二区三区| 蜜臀久久精品| 欧美人xxxxx| 免费在线观看视频一区| 男人天堂资源网| 欧美久久一区二区| 91国内在线| 国产综合欧美在线看| 久久精品毛片| 久久精品国产亚洲AV成人婷婷| 欧美日韩夫妻久久| 99在线视频观看| 久久国产精品-国产精品| 亚洲欧美日韩专区| 久久精彩免费视频| 日韩不卡在线视频| 僵尸世界大战2 在线播放| 99re这里只有精品首页| 久久夜色精品国产噜噜亚洲av| 一区二区av在线| 国产色99精品9i| 97视频久久久| 国产人久久人人人人爽| 国产精品呻吟久久| 久久久久久尹人网香蕉| 女人av一区| 91精品国产三级| 天天av天天翘天天综合网色鬼国产| 美女毛片在线看| 成人久久精品视频| 99亚洲一区二区| 人与嘼交av免费| 精品电影一区二区| 亚洲成人短视频| japanese在线播放| 91色视频在线| 国产精品自拍电影| 久久久久久欧美| 水蜜桃精品av一区二区| 亚洲精品成人无码毛片| 欧美日韩在线一区| 黄av在线播放| 欧美福利一区二区三区| 韩国一区二区在线观看| 麻豆成人免费视频| 久久国产精品首页| 在线亚洲a色| 国产一级二级av| 欧美亚洲国产一卡| caoporn视频在线观看| 亚洲一二区在线|