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() |
- 该图像是预期输出吗?
-
不,每当时间戳相同的值不相加时,这不是预期的输出
-
好的,您能添加数据框而不是图像吗?这会容易得多。
-
好的,我不确定要理解,但我建议一个解决方案
-
我现在已经了解了更新的数据框,我猜
请注意,您的第一个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 )) |
- 我尝试过这也给出了与预期不同的结果
-
您希望用户在时间戳相同时对noOfJumps求和。对 ?您想在TotalRewards列中有62个示例吗?您需要在此之后删除重复项。
-
我不清楚。因为我看不到所有数据。