当KTable缺少密钥时,处理KStream与KTable的连接

时间:2017-03-31 13:34:39

标签: apache-kafka apache-kafka-streams

我最近开始尝试使用kafka流。我有一个场景,我需要KStreamKTable。可能是KTable不包含某些键的情况。在那种情况下,我得到一个NullPointerException

特别是我得到了

  

stream-thread [StreamThread-1]处理过程中的Streams应用程序错误:   显示java.lang.NullPointerException

我不知道如何处理这个问题。我不能以某种方式过滤掉与表条目不对应的流的记录。

更新

进一步观察我发现我可以通过ReadOnlyKeyValueStore接口查询底层存储以查找密钥是否存在。

在这种情况下,我的问题是,这是最好的方法吗?即根据本地存储中是否存在密钥来过滤要连接的流?

我在这个案例中的第二个问题是,因为我关心在下一阶段利用版本Global State Store中引入的10.2,我是否应该期望我也能以同样的方式查询Global State Store

更新

之前的更新不准确,因为无法从拓扑内部查询状态存储

最终更新

在理解了连接语义后,我能够解决问题只是简化valueJoiner只返回结果,而不是对连接的值执行操作,并在之后添加额外的过滤步骤join以过滤掉空值。

1 个答案:

答案 0 :(得分:2)

我的问题的解决方案来自更好地理解join语义。

就像在数据库连接中一样(尽管我并不是说Kstream连接精确地遵循db连接概念),左连接操作会在缺少右侧键的地方产生具有空值的行。

所以最后我唯一需要做的就是将valueJoiner与后续的计算/操作分离(我需要对连接记录的字段执行一些计算并返回一个新构造的对象)并拥有它仅返回已连接值的数组。然后我可以通过检查那些数组来过滤掉导致null值的记录。

根据Matthias的J. Sax建议,我使用了0.10.2版本而不是与代理版本0.10.1兼容的0.10.1,并将整个leftJoin逻辑替换为内部联接,无需过滤掉null值。