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(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 ROWORDER 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)
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)
| 归档时间: |
|
| 查看次数: |
7755 次 |
| 最近记录: |