如何使用Spark进行增量数据

Hel*_*oui 5 scala apache-spark spark-streaming

我正在使用 Spark (Scala) 来执行每周发生的批处理过程。每天,我们都会收到具有以下架构的销售数据每日提要:日、产品、销售额

每周,我们都会导入该周的所有每日数据,汇总每日销售额,以找出每种产品每周的平均销售额。然后,我们导出一个包含以下标题的文件:Week、product、sales_average(我们将其与之前的每周聚合合并)

这里的问题是我们可以接收已计算聚合的更新。例如,假设我们处于第一周,并且我们已经计算了该周每种产品的周平均值。在下周(第 2 周),我可以收到每日销售行,其中“日”列指的是前一周(第 1 周)而不是第 2 周。因此,已计算的相应产品的 Week1 值不再准确,我们需要再次获取该周和该产品的所有每日数据并再次进行聚合。

最直接(也是最糟糕)的解决方案是每周导入所有数据并计算所有聚合。这显然会导致性能瓶颈,尤其是我们处理的是 2 年的数据。我想做的是:

  • 计算当前(新一周)的聚合(平均值)
  • 重新计算最近几周有更新的聚合(不是所有数据:我们只会考虑有更新的那一周的每日数据)。

我读过一些有关结构化流编程、时间窗口的内容,但我对 Spark 很陌生,这一切都感觉有点复杂。因此,任何有关如何解决此问题的帮助将不胜感激。谢谢。

小智 0

也许以下针对结构化流\xe2\x80\x99s 窗口策略的流聚合可能会有所帮助:

\n\n

https://databricks.com/blog/2017/05/08/event-time-aggregation-watermarking-apache-sparks-structed-streaming.html

\n