窗口函数的默认窗口框架是什么

Tom*_*Tom 5 sql window-functions apache-spark apache-spark-sql

运行以下代码:

val sales = Seq(
  (0, 0, 0, 5),
  (1, 0, 1, 3),
  (2, 0, 2, 1),
  (3, 1, 0, 2),
  (4, 2, 0, 8),
  (5, 2, 2, 8))
  .toDF("id", "orderID", "prodID", "orderQty")

val orderedByID = Window.orderBy('id)

val totalQty = sum('orderQty).over(orderedByID).as('running_total)
val salesTotalQty = sales.select('*, totalQty).orderBy('id)
salesTotalQty.show
Run Code Online (Sandbox Code Playgroud)

结果是:

+---+-------+------+--------+-------------+
| id|orderID|prodID|orderQty|running_total|
+---+-------+------+--------+-------------+
|  0|      0|     0|       5|            5|
|  1|      0|     1|       3|            8|
|  2|      0|     2|       1|            9|
|  3|      1|     0|       2|           11|
|  4|      2|     0|       8|           19|
|  5|      2|     2|       8|           27|
+---+-------+------+--------+-------------+
Run Code Online (Sandbox Code Playgroud)

上面的代码中没有定义窗口框架,它看起来是默认的窗口框架 rowsBetween(Window.unboundedPreceding, Window.currentRow)

不确定我对默认窗口框架的理解是否正确

小智 9

来自Spark Gotchas

默认帧规范取决于给定窗口定义的其他方面:

  • 如果指定了ORDER BY子句并且函数接受了帧规范,则帧规范由RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW定义,
  • 否则框架规范由无界预先和无限制下行之间的行进行定义.

  • 总体来说这是真的吗?怎么样“从学生中选择排名()超过(按成绩排序)”。它找不到当前行(包括当前行)的学生排名。它在整个数据集中找到学生的排名,即“BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING”。这违背了你的指导方针。我认为有些函数是您的规则的例外,尽管它通常是正确的。 (2认同)