Kafka Streams - 与旧州

时间:2018-04-25 11:54:27

标签: apache-kafka apache-kafka-streams

我有 KStream ,主题到1 的数据如下:

T1-KEY -> {T1}
T2-KEY -> {T2}

KTable ,构造如下:

我正在使用 org.apache.kafka.streams.StreamsBuilder 从某些主题 to2 创建 KTable ,如下所示:< / p>

A1-KEY -> { "A1", "Set": [
                          {"B1", "Rel": "T1"},
                          {"B2", "Rel": "T1"}
                         ]
          } 

..

然后将流平面映射并按Key s.t进行分组。生成的 KTable 如下所示:

T1 -> { ["B1", "B2"] }

稍后,主题 to2

中出现以下消息
A1-KEY -> { "A1", "Set": [
                          {"B2", "Rel": "T1"}
                         ]
          } 

现在我希望我的 KTable 能够反映这些变化,如下所示:

T1 -> { ["B2"] }

但它看起来像这样:

T1 -> { ["B1", "B2"] }

我注意到,在我的Aggregator<Tx-KEY, Bx, Set<Bx>>中,给出的最后一个参数是集["B1", "B2"],即使我在聚合之前查看我只得到一个匹配"B2"

我是否理解汇总错误或此处发生了什么?

修改

我认为我缩小了范围:显然聚合的Initializer仅在第一次被非常调用 - 之后聚合总是收到last aggregate作为最后一个论点,例如

@Override
public Set<Bx> apply(Tx-KEY, Bx value, Set<Bx> aggregate) {

}

第一次调用时Set<Bx> aggregate[](通过初始化程序创建),第二次调用时为["B1", "B2"]

有什么想法吗?

编辑2

public class MyAggregator implements Aggregator<Tx-KEY, Bx, Set<Bx>> {

    @Override
    public Set<Bx> apply(Tx-KEY key, Bx value, Set<Bx> aggregate) {
        aggregate.add(value);
        return aggregate;
    }
}

编辑3

我不能只使用平面地图,因为我必须组合多个Axe元素,例如

A1-KEY -> { "A1", "Set": [
                      {"B1", "Rel": "T1"}
                     ]
          },
A2-KEY -> { "A2", "Set": [
                      {"B2", "Rel": "T1"}
                     ]
          },
...

然后我希望某些小组喜欢

T1 -> { ["B1", "B2"] }

并在下一次迭代中,当消息

A1-KEY -> { "A1", "Set": [
                      {"B1", "Rel": "T1"}
                     ]
          }

到达我预期

T1 -> { ["B1"] }

...

1 个答案:

答案 0 :(得分:1)

请注意,在聚合器中,您只是将元素添加到聚合集中。有了这个逻辑,你的集合(对于给定的密钥)永远不会缩小。在这种情况下,我认为你已经过多地压扁了流。我建议您不要将其展平为(Tx-KEY key, Bx value)形式的信息,而是保持其设置形式:(Tx-KEY key, Set<Bx> value)。那你根本不需要聚合。 为实现这一点,我建议你转换输入集

"Set": [
     {"B1", "Rel": "T1"},
     {"B2", "Rel": "T1"}
]

进入

T1 -> { ["B1", "B2"] }

通过&#34; Rel&#34;进行分组在KStream flatmap方法调用中使用标准java代码(Collections或Streams api)的字段,这样您就只能在KStream上发送带有Set<Bx>类型值的消息,而不是Bx - 单独输入的值。< / p>

如果您提供当前flatmap实现的代码,请尽快详细说明。