我想知道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_1
和col_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
答案 0 :(得分:1)
您的理解是正确的。请注意,KTable
将每个记录视为更新整个行的“完整”记录。因此,从概念上讲,"key_1": { "col_3": "val_k1_c3_@t2" }
解释为col_1: null
和col_2: null
。
但是,您可以将其作为KStream
阅读并执行aggregation()
,而不是直接作为KTable读取主题。这使您可以相应地更新结果KTable
。