创建"运行总计"在斯卡拉

时间:2017-10-03 13:34:14

标签: scala running-total

我的历史@Entity public class User { public String getLastname() { ...} @ElementCollection @CollectionTable(name="Nicknames", joinColumns=@JoinColumn(name="user_id")) @Column(name="nickname") public Set<String> getNicknames() { ... } } 具有以下结构

DataFrame

我希望有一个与日期相关的累积金额,以便将得到的金额计算为具有相同ID的所有早期日期的总和。假设它们位于开始日期和结束日期之间,即使对于源数据框架中没有条目的日期,也应生成结果。示例输入的预期输出可以在下面看到。

id      amount  date

12345   150     1/1/2016

12345   50      1/4/2016

12345   250     1/4/2016

12345   950     1/9/2016

有谁知道如何计算这种跑步总数?

1 个答案:

答案 0 :(得分:1)

基本上,你首先会找到每个日期的小计(并不是真的必须作为一个单独的步骤发生,但这会使事情更加通用 - 我将在下面解释原因):

[my, mx, mc] = size(imageRGB);  % rows, columns, colors (3) % 
imageRGB = reshape(imageRGB,my*mx,mc); 
correctedRGB = imageRGB*ccm;  
correctedRGB = min(correctedRGB,1);  correctedRGB = max(correctedRGB,0);  % Place limits on output.

correctedRGB = reshape(correctedRGB, my, mx, mc); 
correctedRGB = uint8(correctedRGB*255);

现在,您可以浏览日期范围,并总结如下:

val subtotals = data
  .groupBy(_.date)
  .mapValues(_.map(_.amount).sum)
  .withDefault(_ => 0)

这就是你在&#34;普通scala&#34;中执行此操作的方法。现在,因为你已经提到了#34;数据框&#34;,在你的问题中,我怀疑,你实际上是在使用spark。这使得它更复杂一些,因为数据可能是分布式的。好消息是,虽然您可能有大量的交易,但在世界历史上还有足够的月份使您无法将聚合数据作为单个任务处理。 因此,您只需要使用分布式等效项替换上面的第一步:

(0 to numberOfMonths)
  .map(startDate.plusMonths)
  .scanLeft(null -> 0) { case ((_, sum), date) => 
     date -> (subtotals(date) + sum)
  }.drop(1)

现在你可以按照我上面展示的方式完成第二步。