Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 了解Spark WindowSpec的范围_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 了解Spark WindowSpec的范围

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

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.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:

  • 把所有相同的ID加起来,这里是1+1

  • 对于这些相同的id,它们的下一个id与它们不同,这里是2,那么和是1+1+2


  • 不确定我的理解是否正确

    介于
    之间的范围考虑了列中的实际值。它将检查哪些值“在范围内”(包括起始值和结束值)。在您的示例中,当前行是起始值,下一行是结束值。由于范围是包含的,因此所有重复的值也将被计数

    例如,如果开始值和结束值分别为1和3。此范围(1,2,3)内的所有值将用于总和



    这与之间的
    行形成对比。对于此函数,仅统计指定的行。也就是说,<代码> RoSsEnter(Windows .CurrnRun,1)只考虑当前和下一行,是否存在重复。

    如果您不喜欢这种行为,也可以使用<代码> >(0,1)