rowsBetween和rangeBetween的区别是什么?



From PySpark docs rangeBetween:

rangeBetween(start, end)

定义帧边界,从开始(包括)到结束(包括)。

起始行和结束行都是相对于当前行的。例如,"0"表示"当前行","-1"表示当前行之前的1,"5"表示当前行之后的5。

参数:

  • start -包括边界开始。如果这是-sys,那么这个坐标系是无界的。maxsize(或更小).
  • end -边界末端,包括。如果这是sys,那么坐标系是无界的。Maxsize(或更大)。1.4新版功能。

rowsBetween

rowsBetween(start, end)

定义帧边界,从开始(包括)到结束(包括)。

起始和结束都是相对于当前行的位置。例如,"0"表示"当前行","-1"表示当前行之前的行,"5"表示当前行之后的第五行。

参数:

  • start -包括边界开始。如果这是-sys,那么这个坐标系是无界的。maxsize(或更小).
  • end -边界末端,包括。如果这是sys,那么坐标系是无界的。Maxsize(或更大)。1.4新版功能。

对于rangeBetween,"1关"与"1行"如何不同?

很简单:

  • ROWS BETWEEN不关心确切的值。它只关心行的顺序,计算帧时取固定的前后行数。
  • RANGE BETWEEN在计算帧时考虑值。

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

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

和data为

+---+
|  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|
+---+-----------------------------------------------------+

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。

rowsBetween: -使用rowsBetween定义要计算的行的边界帧,该帧是独立计算的

df = spark.read.csv(r'C:UsersakashSainiDesktopTT.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,您定义要计算的行的边界帧,该边界帧可能会更改。

Frame in rangeBetween取决于order子句。rangeBetween将包括所有在order子句中具有相同值的行,例如Gordon, Gracie和Cellie具有相同的薪水,因此包含在当前帧中。

更多的理解参见下面的例子:

df = spark.read.csv(r'C:Usersasaini28.EADDesktopTT.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|

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

ROWSbetween查看行的顺序。

RANGE between检查ORDER BY是否在某个指定的范围内,并将它们包含在一个窗口中。

ROWSbetween将根据当前行周围的行位置(不管这些行的ORDER BY列的值)形成窗口

相关内容

  • 没有找到相关文章

最新更新