rowsBetween和rangeBetween之间有什么区别?

Eva*_*mir 20 sql window-functions apache-spark apache-spark-sql pyspark

来自PySpark文档rangeBetween:

rangeBetween(start, end)

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

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

参数:

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

rowsBetween

rowsBetween(start, end)

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

start和end都是当前行的相对位置.例如,"0"表示"当前行",而"-1"表示当前行之前的行,"5"表示当前行之后的第五行.

参数:

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

例如rangeBetween,"1 off"与"1行"有何不同?

use*_*411 27

很简单:

  • 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|
+---+
Run Code Online (Sandbox Code Playgroud)

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

+---+----------------------------------------------------+
|  x|ORDER BY x ROWS BETWEEN 2  PRECEDING AND CURRENT ROW|
+---+----------------------------------------------------+
| 10|                                               false|
| 20|                                                true|
| 30|                                                true|
| 31|                                                true|
+---+----------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

并且对于后面的第二个(当前的一个,以及前面的所有,其中x> = 31 - 2):

+---+-----------------------------------------------------+
|  x|ORDER BY x RANGE BETWEEN 2  PRECEDING AND CURRENT ROW|
+---+-----------------------------------------------------+
| 10|                                                false|
| 20|                                                false|
| 30|                                                 true|
| 31|                                                 true|
+---+-----------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)


Pet*_*ter 9

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

范围之间

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

行之间

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


小智 8

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
Run Code Online (Sandbox Code Playgroud)

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

rangeBetween 中的框架取决于 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|
Run Code Online (Sandbox Code Playgroud)