是否可以将不完整的事件合并到KTable中?

时间:2018-07-14 15:25:59

标签: apache-kafka apache-kafka-streams

我想知道KTable是否可以满足我们的需求。

假设我在Kafka中有一个主题myTopic,其中包含事件,并且我为此主题插入了一个KafkaStreams应用。

我们假设在t0时间myTopic包含3个事件:

"key_1": { "col_1": "val_k1_c1_@t0", "col_2": "val_k1_c2_@t0"}
"key_2": { "col_1": "val_k2_c1_@t0", "col_2": "val_k2_c2_@t0"}
"key_3": { "col_1": "val_k3_c1_@t0", "col_3": "val_k3_c3_@t0"}

在时间t1,与key_1相关的新事件被推送到myTopic

"key_1": {"col_1": "NEWVAL_k1_c1_@t1", "col_2": "NEWVAL_k1_c2_@t1"}

因此在时间t1,KTable可以这样表示:

KEY         COL_1               COL_2               COL_3

key_1       NEWVAL_k1_c1_@t1    NEWVAL_k1_c2_@t1
key_2       val_k2_c1_@t0       val_k2_c2_@t0
key_3       val_k3_c1_@t0                           val_k3_c3_@t0

这是KTable的关键概念:保留给定键的最新值。

现在,我们假设在t2时间到来了一个新事件,以便丰富到key_1

"key_1": { "col_3": "val_k1_c3_@t2" }

如果我的理解还可以,那么KTable将丢失col_1col_2的值,并且该表将如下所示:

KEY         COL_1               COL_2               COL_3

key_1                                               val_k1_c3_@t2
key_2       val_k2_c1_@t0       val_k2_c2_@t0
key_3       val_k3_c1_@t0                           val_k3_c3_@t0

我了解这个概念吗?

是否存在一种原生方法来合并值以使KTable看起来像这样?

KEY         COL_1               COL_2               COL_3

key_1       NEWVAL_k1_c1_@t1    NEWVAL_k1_c2_@t1    val_k1_c3_@t2
key_2       val_k2_c1_@t0       val_k2_c2_@t0
key_3       val_k3_c1_@t0                           val_k3_c3_@t0

1 个答案:

答案 0 :(得分:1)

您的理解是正确的。请注意,KTable将每个记录视为更新整个行的“完整”记录。因此,从概念上讲,"key_1": { "col_3": "val_k1_c3_@t2" }解释为col_1: nullcol_2: null

但是,您可以将其作为KStream阅读并执行aggregation(),而不是直接作为KTable读取主题。这使您可以相应地更新结果KTable