来自PySpark文档rangeBetween
:
rangeBetween(start, end)
定义从起点(包括)到结束(包括)的帧边界。
start和end都是当前行的相对值。例如,“0”表示“当前行”,而“-1”表示当前行之前的一个关闭,“5”表示当前行之后的五个关闭。
参数:
- 开始 - 边界开始,包括在内。如果这是-sys.maxsize(或更低),则该框架是无界的。
- 结束 - 边界结束,包括端点。如果这是sys.maxsize(或更高),则该框架是无界的。 版本1.4中的新功能。
rowsBetween(start, end)
定义从起点(包括)到结束(包括)的帧边界。
开始和结束都是当前行的相对位置。例如,“0”表示“当前行”,而“-1”表示当前行之前的行,“5”表示当前行之后的第5行。
参数:
- 开始 - 边界开始,包括在内。如果这是-sys.maxsize(或更低),则该框架是无界的。
- 结束 - 边界结束,包括端点。如果这是sys.maxsize(或更高),则该框架是无界的。 版本1.4中的新功能。
rangeBetween
如何" 1关闭"与" 1行"不同,例如?
答案 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列的值无关)