kafka外键表联接,右表不会触发联接

时间:2020-09-09 18:47:22

标签: java apache-kafka

我正在用kafka连接KT-KT外键表。

我只想在一定条件下加入。 为此,我在连接表之前添加了一个过滤器。 它的基本意思是,仅当左表的ID /键大于X时才进行连接。

当我从filter = 0开始并将数据放入主题/表中时,它工作得很好。 它会执行所有数据的连接,并由左表或右表的更新触发。

当我将过滤器增加到2,则仅对左侧表的ID> 2进行连接。 到目前为止,一切正常。

当我有意外的事情发生

  1. 将过滤器设置为filter = 2
  2. 然后添加ID小于过滤器(例如Id = 1)的数据。
  3. 将过滤器设置回filter = 0
  4. 从现在开始,对于所有在插入期间具有较低ID的数据,仅左侧表上的更新会触发联接,右侧表上的更新将不再触发联接。

有人可以解释为什么会发生这种情况以及我可以采取哪些措施来解决此问题? 就我的理解而言,联接应始终占据完整的2个表。 先前的联接(使用过滤器以排除某些数据)和数据的插入/更新的影响应为零。 但是不知何故...

具有预期结果的矩阵 将表A上的表A的外键联接起来 enter image description here

code:
    // build right KTable
            final KTable<String, CMDB> cmdbKTable = builder.table(
                    this.getCmdbTopic(),
                    Consumed.with(Serdes.String(), cmdbSerde));
    
            // build left Ktable
            final KTable<String, ServerData> sdKTable = builder.table(
                    this.getServerDataTopic(),
                    Consumed.with(Serdes.String(), serverDataSerde));
    
            final ServerEnrichedJoiner serverEnrichedJoiner = new ServerEnrichedJoiner();
    
            // join based on left ServerData::getServerName = right key (servername)
            final KTable<String, ServerEnriched> joinedKTable =
                    sdKTable
                            .filter((k,v) ->
                            {
                                System.out.println("k:" + k + ", v.getTime:" + v.getTime());
                                return Integer.parseInt(v.getTime())> this.getJoinTimeFilter();
                            })
                            .leftJoin(cmdbKTable, ServerData::getServerName, serverEnrichedJoiner);
    
            joinedKTable.toStream().to(this.getOutputTopic(), Produced.with(Serdes.String(),serverEnrichedSerde));

0 个答案:

没有答案