Apache Spark 中窗口函数中的过滤器和条件

Posted

技术标签:

【中文标题】Apache Spark 中窗口函数中的过滤器和条件【英文标题】:Filters and conditions in window functions in Apache Spark 【发布时间】:2020-01-15 12:52:39 【问题描述】:

我有一个如下示例数据集

 Name   date        Category    transactionamount
Adam    1/1/2020    Mobile      100
Adam    1/1/2020    Tab         200
Bob     1/1/2020    Mobile      200
Adam    2/1/2020    Tab         200
Bob     2/1/2020    Mobile      200
Adam    3/1/2020    Tab         200
Bob     4/1/2020    Mobile      200

我想在当前和前一天的滚动期间对 transactionamount 列求和,所以我的窗口框架代码如下所示

val windowspec = Window.partitionBy($"name").orderBy($"date".asc)

val range = windowspec.rangeBetween(-1, 0)

val aasum2 = sum('transactionAmount).over(range)

df.select('date,'name,aasum2 as 'aasum).orderBy('date,'name).show(100,false)

这适用于无条件的一般求和。

但我想要如下表所示的输出,其中包含基于类别列值的两个新列。

每个输出行都应包含不同日期和名称的总和值。

我们如何在对列执行窗口函数时应用条件(基于其他列的值)

date        Name    Mobile_sum  Tab_sum
1/1/2020    Adam    100         200
1/1/2020    Bob     200         0
2/1/2020    Adam    0           400
2/1/2020    Bob     400         0
3/1/2020    Adam    0           600
3/1/2020    Bob     0           0
4/1/2020    Adam    0           0
4/1/2020    Bob     200         0

【问题讨论】:

【参考方案1】:

在您的WindowSpec 中将您的附加列添加到您的partitionBy()

【讨论】:

以上是关于Apache Spark 中窗口函数中的过滤器和条件的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache Spark SQL 中将中值作为窗口函数 (UDAF) 移动

Spark 找不到窗口函数

Spark窗口函数过滤不符合要求的行

Apache spark - 窗口函数,FIRST_VALUE 不起作用

SparkStreaming---窗口函数

sparksql系列 sparksql列操作窗口函数join