【问题标题】:Correcting aggregated view in streaming data更正流数据中的聚合视图
【发布时间】:2019-03-19 19:32:40
【问题描述】:

这个问题与 KSQL 或流处理技术的聚合视图有关。当我们接收到事件时,我们会应用 group by 子句来聚合它们。现在发生了一个事件,它是对某个先前事件的更正。这将使我的聚合视图处于不一致的状态。这不是乱序事件到达案例。例如。我有一个事件 (e),它由实体 id (t)、类别 (c) 和数量 (q) 属性组成。 关注事件

1) e1 —> t1, c1, q1
2) e2 -> t2, c2, q2
3) e3 -> t3, c1, q3
4) e4 -> t1, c1, q4 correction to e1
5) e5 -> t5, c2, q5

我的聚合视图将按类别汇总数量组

c1 -> q1 + q3 + q4

c2 -> q2 + q5.

c1 现在处于不一致状态。 c1 应该只是 q3 + q4。

有没有办法解决这些问题。我知道我可以将所有事件保存在某个缓存中,然后创建一个聚合视图,但这是实时数据,因此我的所有视图每次都需要刷新。

【问题讨论】:

  • 那么,您如何区分 q4 是对 q1 还是 q3 的修正?有没有你比较的特定属性?
  • e1 和 e4 的底层实体 id 相同。所以 e4 是该实体 id 的最新且更正的更新

标签: stream streaming apache-kafka-streams ksqldb


【解决方案1】:

在 Kafka Streams 中,您也许可以使用KStream#groupBy()#aggregate()#mapValue()。 aggregate() 不会计算聚合,而是返回一个 id->value 的 Map。在 mapValue() 中,您计算​​ Map 的所有值的聚合。这样,当更新到达时, if 会将 Map 中的旧值替换为新值,并且 mapValue() 将正确地重新计算聚合结果。

【讨论】:

  • 您能否详细说明一下。您是否指的是流 DSL 的减法器示例,其中 Alice 类别从 E 变为 A。在我的要求中,数量会发生变化。我对此比较陌生,您能否指出一些我可以查看的示例代码。谢谢
  • 和你提到的情况有点不同,因为这里我们使用了一个KStream作为输入,而Alice的例子是基于一个输入的KTable。也许,您可以使用输入 KTable(不确定)。我不知道有任何示例代码。 :(
  • 我将我的数据作为 keyValue (t1, (c1,q1)), (t2, (c2,q2)) 加载到 KTable 中。创建了键值为 (c1,q1),(c2,q2) 的新流。在类别上按键应用分组,然后使用聚合函数。但是聚合函数会在基本 KTable 上有更新时发出类别上的聚合值。我的流程 KTable#KStream#groupby()#aggregate()。它返回我一个键作为类别和所有数量的总和作为值。当您说它不会计算聚合时,我是否遗漏了什么。
  • 你的关键和价值是什么?键=t1?在你的基表中?此外,您可以在不先将其转换为流的情况下执行KTable#groupBy(如果您先与流一致,则会失去更新行为)。
猜你喜欢
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多