Spark Scala中的累积功能

Cumulative function in spark scala

我已经尝试过计算累计值,但是如果date字段相同,那么将这些值添加到累计字段中,有人可以建议解决方案吗?类似于此问题

1
2
3
4
val windowval = (Window.partitionBy($"userID").orderBy($"lastModified")
             .rangeBetween(Window.unboundedPreceding, 0))
val df_w_cumsum = ms1_userlogRewards.withColumn("totalRewards", sum($"noOfJumps").over(windowval)).orderBy($"lastModified".asc)
df_w_cumsum.filter($"batchType".isNull).filter($"userID"==="355163").select($"userID", $"noOfJumps", $"totalRewards",$"lastModified").show()

enter


请注意,您的第一个totalRewards=147是先前值49时间戳为" 2019-08-07 18:25:06"的所有值的总和:49 + (36 + 0 + 60 + 2)= 147。 >

第一个选项是使用相同的时间戳拳来汇总所有值,例如groupBy($"userId", $"lastModified").agg(sum($"noOfJumps").as("noOfJumps"))(或类似的东西),然后运行总计。这将完全删除重复的时间戳。

第二个选项是使用row_number定义具有相同lastModified字段的行之间的顺序,然后使用.orderBy($"lastModified, $"row_number")(或类似的东西)运行总计。这应该保留所有记录,并为您提供部分汇总:totalRewards = 49 -> 85 -> 85 -> 145 -> 147(或类似的内容,具体取决于row_number定义的顺序)


我想您想按用户ID和时间戳求和。
因此,您需要按用户ID和日期进行分区,并使用window函数来表示符号,如下所示:

1
2
3
4
5
import org.apache.spark.sql.functions.sum
import org.apache.spark.sql.expressions.Window

val window = Window.partitionBy("userID","lastModified")
df.withColumn("cumulativeSum", sum(col("noOfJumps").over(window))