我对Flink
或Spark
没有经验,我想将其中一个用于我的用例。我想介绍一下我的用例,希望能够深入了解是否可以用这两种方法完成,如果他们都可以做到这一点,哪一种方法效果最好。
我有一堆实体A
存储在数据存储中(Mongo准确但实际上并不重要)。我有一个Java应用程序,可以加载这些实体并运行一些逻辑来生成一些数据类型E
的流(要100%清除我没有{{ 1}}在任何数据集中,我需要在从数据库加载Es
后用Java生成它们。
所以我有类似的东西
As
数据类型A1 -> Stream<E>
A2 -> Stream<E>
...
An -> Stream<E>
有点像Excel中的长行,它有一堆列。我需要收集所有E
并运行某种类型的数据透视聚合,就像在Excel中一样。我可以看到如何在Es
或Spark
中轻松完成这项工作。
现在是我无法弄清楚的部分。
想象一下,实体Flink
中的一个(由用户或进程)发生了更改,这意味着A1
的所有Es
都需要更新。当然我可以重新加载所有A1
,重新计算所有As
,然后重新运行整个聚合。我想知道这里是否可能更聪明一点。
是否可以仅重新计算Es
的{{1}}并执行最少量的处理。
对于Es
,是否可以保留A1
并仅在需要时更新部分内容(此处为Spark
的{{1}})?
对于RDD
,在流媒体的情况下,是否可以更新已经处理的数据点?它能处理那种情况吗?或者我可能为Es
的旧A1
生成否定事件(即将其从结果中删除)然后添加新事件?
这是一个常见的用例吗?这甚至是Flink
或A1
设计的事情吗?我会这么认为,但我再也没用过,所以我的理解非常有限。
答案 0 :(得分:0)
我认为你的问题很广泛,取决于很多条件。在flink中,您可以拥有MapState<A, E>
并仅更新已更改的A's
的值,然后根据您的用例生成更新的E's
下游或生成差异(撤消流)
在Flink中,存在可能激发您灵感的动态表和撤回流的概念,或者Table API已经涵盖您的用例的事件。您可以查看文档here