Scala 了解Spark WindowSpec的范围
Spark为Scala 了解Spark WindowSpec的范围,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,Spark为WindowSpec类的rangeBetween方法提供了以下示例作为方法文档: import org.apache.spark.sql.expressions.Window import spark.implicits._ val df = Seq((1, "a"), (1, "a"), (2, "a"), (1, "b"), (2, "b"), (3, "b")).toDF("id", "category") val byCategoryOrderedById = Window
WindowSpec
类的rangeBetween
方法提供了以下示例作为方法文档:
import org.apache.spark.sql.expressions.Window
import spark.implicits._
val df = Seq((1, "a"), (1, "a"), (2, "a"), (1, "b"), (2, "b"), (3, "b")).toDF("id", "category")
val byCategoryOrderedById = Window.partitionBy('category).orderBy('id).rangeBetween(Window.currentRow, 1)
df.withColumn("sum", sum('id) over byCategoryOrderedById).show()
结果是:
+---+--------+---+
| id|category|sum|
+---+--------+---+
| 1| b| 3|
| 2| b| 5|
| 3| b| 3|
| 1| a| 4|
| 1| a| 4|
| 2| a| 2|
+---+--------+---+
对于值为b
的类别
,我能够理解sum
列中的值:
row#1(1-b-3), 3=1+2 //2 is next id for this row
row#2(2-b-5), 5=2+3 //3 is next id for this row
row#3(3-b-3), 3=3 //there is no next row since this is the last row for b
但是对于值为a的
类别
,我无法理解4 2是如何计算的我猜,对于同一类别中的同一id,这些相同id(此处id为1,类别为a)一起计算…,即:
对于同一类别中的两个相同ID:
不确定我的理解是否正确
介于
之间的范围考虑了列中的实际值。它将检查哪些值“在范围内”(包括起始值和结束值)。在您的示例中,当前行是起始值,下一行是结束值。由于范围是包含的,因此所有重复的值也将被计数
例如,如果开始值和结束值分别为1和3。此范围(1,2,3)内的所有值将用于总和
这与之间的
行形成对比。对于此函数,仅统计指定的行。也就是说,<代码> RoSsEnter(Windows .CurrnRun,1)只考虑当前和下一行,是否存在重复。如果您不喜欢这种行为,也可以使用<代码> >(0,1)