scala - 使用跳过或跨步在范围内触发聚合函数

标签 scala apache-spark window-functions

我正在尝试在具有范围的窗口函数上计算像 sum() 这样的聚合函数,但我只想包括每第 N 行。并且它跳过的内容应该相对于窗口的前面(始终包括窗口中的第一行)

//val df = some Dataframe {symbol,datetime,metric}
val baseWin = Window.partitionBy("symbol").orderBy("datetime")

//This is a plain sum over the window
val plain = sum(col("metric")).over(baseWin.rowsBetween(-12,0))

//This is ALMOST what I want (every 3rd) BUT isn't relative to the window
val almost = sum(when(col("datetime")/lit(DAY) %3 === 0, col("metric")).over(baseWin.rowsBetween(-12,0))

最佳答案

您可以使用 lag .范围定义为:

scala> (0 to 12 by 3)
res1: scala.collection.immutable.Range = Range(0, 3, 6, 9, 12)

您可以总结所有滞后(默认为 0):
val almost = (0 to 12 by 3).map(lag($"metric", _, 0).over(baseWindow)).reduce(_ + _)

例子:
val df = spark.range(24).toDF("metric").withColumn("group", $"metric" > 12)

val baseWindow = Window.partitionBy("group").orderBy("metric")

df.withColumn("almost", almost).show
// +------+-----+------+
// |metric|group|almost|
// +------+-----+------+
// |    13| true|    13| 13
// |    14| true|    14| 14
// |    15| true|    15| 15 
// |    16| true|    29| 16 + 13
// |    17| true|    31| 17 + 14
// |    18| true|    33| 18 + 14
// |    19| true|    48| 19 + 16 + 13
// |    20| true|    51| 20 + 17 + 14
// |    21| true|    54| 21 + 18 + 15
// |    22| true|    70| 22 + 19 + 16 + 13
// |    23| true|    74| 23 + 20 + 17 + 14
// |     0|false|     0| ...
// |     1|false|     1| 1
// |     2|false|     2| 2
// |     3|false|     3| 3
// |     4|false|     5| 4 + 1
// |     5|false|     7| 5 + 2
// |     6|false|     9| 6 + 3
// |     7|false|    12| 7 + 4 + 1
// |     8|false|    15| 8 + 5 + 2
// +------+-----+------+

关于scala - 使用跳过或跨步在范围内触发聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48426617/

相关文章:

sql - 哪一个更快/优化 - 内部连接或分区 - 以获得聚合数据?

scala - 如何在运行时枚举无形的记录和访问字段键?

list - 如何在Scala中通过相同元素合并元组

multithreading - 如何指定SBT在任何命令期间使用的线程数?

apache-spark - 如何使用pyspark对数据框中的两列进行数学运算

sql - ROW_NUMBER 查询

使用两列(不区分大小写)在数据帧上使用 Scala LEFT JOIN

scala - 生成用于查找的单行数据框

linux - 目录中的子目录数量?

sql - 如何在 SQL Server 中使用带有框架的窗口函数执行 COUNT(DISTINCT)