rowsBetween和rangeBetween之间有什么区别?

时间:2016-10-14 17:32:08

标签: sql apache-spark pyspark apache-spark-sql window-functions

来自PySpark文档rangeBetween

  

rangeBetween(start, end)

     

定义从起点(包括)到结束(包括)的帧边界。

     

start和end都是当前行的相对值。例如,“0”表示“当前行”,而“-1”表示当前行之前的一个关闭,“5”表示当前行之后的五个关闭。

     

参数:

     
      
  • 开始 - 边界开始,包括在内。如果这是-sys.maxsize(或更低),则该框架是无界的。
  •   
  • 结束 - 边界结束,包括端点。如果这是sys.maxsize(或更高),则该框架是无界的。   版本1.4中的新功能。
  •   

rowsBetween

  

rowsBetween(start, end)

     

定义从起点(包括)到结束(包括)的帧边界。

     

开始和结束都是当前行的相对位置。例如,“0”表示“当前行”,而“-1”表示当前行之前的行,“5”表示当前行之后的第5行。

     

参数:

     
      
  • 开始 - 边界开始,包括在内。如果这是-sys.maxsize(或更低),则该框架是无界的。
  •   
  • 结束 - 边界结束,包括端点。如果这是sys.maxsize(或更高),则该框架是无界的。   版本1.4中的新功能。
  •   

rangeBetween如何" 1关闭"与" 1行"不同,例如?

4 个答案:

答案 0 :(得分:19)

很简单:

  • ROWS BETWEEN并不关心确切的值。它只关心行的顺序,并在计算帧时采用固定数量的前后行。
  • RANGE BETWEEN在计算框架时会考虑值。

让我们使用两个窗口定义的示例:

  • ORDER BY x ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
  • ORDER BY x RANGE BETWEEN 2 PRECEDING AND CURRENT ROW

和数据

+---+
|  x|
+---+
| 10|
| 20|
| 30|
| 31|
+---+

假设当前行是第一个窗口的值为31的行,将包含以下行(当前一行,前两行):

+---+----------------------------------------------------+
|  x|ORDER BY x ROWS BETWEEN 2  PRECEDING AND CURRENT ROW|
+---+----------------------------------------------------+
| 10|                                               false|
| 20|                                                true|
| 30|                                                true|
| 31|                                                true|
+---+----------------------------------------------------+

以及后面的第二个(当前的一个,以及前面的所有x> = 31 - 2):

+---+-----------------------------------------------------+
|  x|ORDER BY x RANGE BETWEEN 2  PRECEDING AND CURRENT ROW|
+---+-----------------------------------------------------+
| 10|                                                false|
| 20|                                                false|
| 30|                                                 true|
| 31|                                                 true|
+---+-----------------------------------------------------+

答案 1 :(得分:2)

Java spark文档增加了清晰度:https://spark.apache.org/docs/2.3.0/api/java/org/apache/spark/sql/expressions/WindowSpec.html#rowsBetween-long-long-

rangeBetween

基于范围的边界基于ORDER BY表达式的实际值。偏移量用于更改ORDER BY表达式的值,例如,如果当前order by表达式的值为10,并且下限偏移量为-3,则当前行的结果下界将为10-3 = 7.但是,这对ORDER BY表达式施加了许多约束:只能有一个表达式,并且此表达式必须具有数字数据类型。当偏移量无界时会发生异常,因为不需要修改值,在这种情况下,允许使用多个非数字的ORDER BY表达式。

rowBetween

基于行的边界基于该行在分区中的位置。偏移量指示当前行上方或下方的行数,当前行的帧开始或结束。例如,给定基于行的滑动框,其下限偏移为-1,上限偏移为+2。索引为5的行的框架范围为索引4到索引6。

答案 2 :(得分:0)

rowsBetween:-使用rowsBetween,您可以定义要计算的行的边界框架,该框架是独立计算的。

rowsBetween中的框架不依赖于orderBy子句。

df = spark.read.csv(r'C:\Users\akashSaini\Desktop\TT.csv',inferSchema =True, header=True).na.drop()
w =Window.partitionBy('DEPARTMENT').orderBy('SALARY').rowsBetween(Window.unboundedPreceding,Window.currentRow)
df.withColumn('RowsBetween', F.sum(df.SALARY).over(w)).show()


first_name|Department|Salary|RowsBetween|

 Sofia|     Sales| 20000| 20000|
Gordon|     Sales| 25000| 45000|
Gracie|     Sales| 25000| 70000|
Cellie|     Sales| 25000| 95000|
Jervis|     Sales| 30000|125000|
 Akash|  Analysis| 30000| 30000|
Richard|   Account| 12000| 12000|
 Joelly|   Account| 15000| 27000|
Carmiae|   Account| 15000| 42000|
    Bob|   Account| 20000| 62000|
  Gally|   Account| 28000| 90000

rangeBetween:-使用rangeBetween,您可以定义要计算的行的边界框架,该边界框架可能会发生变化。

rowsBetween中的框架取决于orderBy子句。 rangeBetween将包含orderBy子句中具有相同值的所有行,例如Gordon,Gracie和Cellie具有相同的薪水,因此包含在当前框架中。

要了解更多信息,请参见以下示例:-

df = spark.read.csv(r'C:\Users\asaini28.EAD\Desktop\TT.csv',inferSchema =True, header=True).na.drop()
w =Window.partitionBy('DEPARTMENT').orderBy('SALARY').rangeBetween(Window.unboundedPreceding,Window.currentRow)
df.withColumn('RangeBetween', F.sum(df.SALARY).over(w)).select('first_name','Department','Salary','Test').show()

 first_name|Department|Salary|RangeBetween|
  Sofia|     Sales| 20000| 20000|
 Gordon|     Sales| 25000| 95000|
 Gracie|     Sales| 25000| 95000|
 Cellie|     Sales| 25000| 95000|
 Jervis|     Sales| 30000|125000|
  Akash|  Analysis| 30000| 30000|
Richard|   Account| 12000| 12000|
 Joelly|   Account| 15000| 42000|
Carmiae|   Account| 15000| 42000|
    Bob|   Account| 20000| 62000|
  Gally|   Account| 28000| 90000|

答案 3 :(得分:0)

RANGEbetween查看ORDER BY子句以确定窗口中是否包含行。

ROWSweenween查看行的顺序。

范围之间进行检查,检查ORDER BY是否在某个指定范围内,并将其包含在窗口中。

ROWSbetween将基于当前行周围的行数形成窗口(与这些行的ORDER BY列的值无关)