Apache spark spark RangeBetween如何按降序工作?

Apache spark spark RangeBetween如何按降序工作?,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,我认为rangeBetween(start,end)会查看范围的值(cur_value-start,cur_value+end) 但是,我看到了一个示例,其中他们在时间戳上使用descending orderBy(),然后将(unboundedReceeding,0)与rangeBetween一起使用。这让我探究了以下示例: dd = spark.createDataFrame( [(1, "a"), (3, "a"), (3, "a"), (1, "b"), (2, "b"), (3,

我认为rangeBetween(start,end)会查看范围的值(cur_value-start,cur_value+end)

但是,我看到了一个示例,其中他们在时间戳上使用descending orderBy(),然后将(unboundedReceeding,0)与rangeBetween一起使用。这让我探究了以下示例:

dd = spark.createDataFrame(
    [(1, "a"), (3, "a"), (3, "a"), (1, "b"), (2, "b"), (3, "b")],
    ['id', 'category']
)
dd.show()

# output
+---+--------+
| id|category|
+---+--------+
|  1|       a|
|  3|       a|
|  3|       a|
|  1|       b|
|  2|       b|
|  3|       b|
+---+--------+
它似乎包含值高出1的前一行

byCategoryOrderedById = Window.partitionBy('category')\
                              .orderBy(desc('id'))\
                              .rangeBetween(-1, Window.currentRow)
dd.withColumn("sum", Fsum('id').over(byCategoryOrderedById)).show()

# output
+---+--------+---+
| id|category|sum|
+---+--------+---+
|  3|       b|  3|
|  2|       b|  5|
|  1|       b|  3|
|  3|       a|  6|
|  3|       a|  6|
|  1|       a|  1|
+---+--------+---+
当start设置为-2时,它包含大于2的值,但在前面的行中

byCategoryOrderedById = Window.partitionBy('category')\
                        .orderBy(desc('id'))\
                        .rangeBetween(-2,Window.currentRow)
dd.withColumn("sum", Fsum('id').over(byCategoryOrderedById)).show()

# output
+---+--------+---+
| id|category|sum|
+---+--------+---+
|  3|       b|  3|
|  2|       b|  5|
|  1|       b|  6|
|  3|       a|  6|
|  3|       a|  6|
|  1|       a|  7|
+---+--------+---+

那么,使用desc orderBy的rangeBetween的确切行为是什么

没有很好的文档记录,但是当使用范围(或基于值的)帧时,升序和降序会影响帧中包含的值的确定

让我们以您提供的示例为例:

RANGE BETWEEN 1 PRECEDING AND CURRENT ROW
根据方向顺序,前面的
1表示:

  • 当前\u行\u值-如果为ASC,则为1
  • 如果描述,当前行值+1
考虑分区
b
中值为1的行

  • 按降序排列,框架包括:

    (当前值和所有之前的值,其中x=当前值+1)=(1,2)

  • 按升序排列,框架包括:

    (当前值和所有之前的值,其中x=当前值-1)=(1)

PS:使用
rangeBetween(-1,Window.currentRow)
进行desc排序与使用
rangeBetween(Window.currentRow,1)
进行asc排序相当