apache-spark - Spark RangeBetween 如何使用降序排列?

标签 apache-spark pyspark apache-spark-sql

我认为 rangeBetween(start, end) 会查看范围的值(cur_value - start, cur_value + end)。 https://spark.apache.org/docs/2.3.0/api/java/org/apache/spark/sql/expressions/WindowSpec.html

但是,我看到一个示例,他们在时间戳上使用降序 orderBy(),然后将 (unboundedPreceeding, 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|
+---+--------+---+

那么,rangeBetween 与 desc orderBy 的确切行为是什么?

最佳答案

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

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

RANGE BETWEEN 1 PRECEDING AND CURRENT ROW

根据方向的顺序,1 PRECEDING 表示:

  • current_row_value - 如果 ASC 则为 1
  • 如果是 DESC,则当前行值 + 1

考虑分区 b 中值为 1 的行。

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

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

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

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

PS:使用带有 desc 排序的 rangeBetween(-1, Window.currentRow) 等同于 rangeBetween(Window.currentRow, 1) 使用 asc 排序。

关于apache-spark - Spark RangeBetween 如何使用降序排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59571231/

相关文章:

apache-spark - 订购 Pyspark 窗口时缺少数据

apache-spark-sql - Spark sql 数据框 - 导入 sqlContext.implicits._

python - Apache Spark 在 reduceByKey 步骤上速度缓慢

apache-spark - YARN 无法识别增加的 'yarn.scheduler.maximum-allocation-mb' 和 'yarn.nodemanager.resource.memory-mb' 值

python - 如何将我的任务分发到 gcp 中的所有工作节点?我正在使用 pyspark

python - PySpark Dataframe 前向填充所有列

python - 统一码编码错误 : 'ascii' codec can't encode character u'\ufffd' in position 3: ordinal not in range(128)

scala - 如何将自定义日期时间格式转换为时间戳?

java - 将 Spark DataFrame 转换为 Pojo 对象

hadoop - 使用 sqlcontext spark 执行 sql join