我最近开始尝试使用kafka流。我有一个场景,我需要KStream
加KTable
。可能是KTable
不包含某些键的情况。在那种情况下,我得到一个NullPointerException
。
特别是我得到了
stream-thread [StreamThread-1]处理过程中的Streams应用程序错误: 显示java.lang.NullPointerException
我不知道如何处理这个问题。我不能以某种方式过滤掉与表条目不对应的流的记录。
更新
进一步观察我发现我可以通过ReadOnlyKeyValueStore
接口查询底层存储以查找密钥是否存在。
在这种情况下,我的问题是,这是最好的方法吗?即根据本地存储中是否存在密钥来过滤要连接的流?
我在这个案例中的第二个问题是,因为我关心在下一阶段利用版本Global State Store
中引入的10.2
,我是否应该期望我也能以同样的方式查询Global State Store
?
更新
之前的更新不准确,因为无法从拓扑内部查询状态存储
最终更新
在理解了连接语义后,我能够解决问题只是简化valueJoiner
只返回结果,而不是对连接的值执行操作,并在之后添加额外的过滤步骤join以过滤掉空值。
答案 0 :(得分:2)
我的问题的解决方案来自更好地理解join
语义。
就像在数据库连接中一样(尽管我并不是说Kstream
连接精确地遵循db连接概念),左连接操作会在缺少右侧键的地方产生具有空值的行。
所以最后我唯一需要做的就是将valueJoiner
与后续的计算/操作分离(我需要对连接记录的字段执行一些计算并返回一个新构造的对象)并拥有它仅返回已连接值的数组。然后我可以通过检查那些数组来过滤掉导致null
值的记录。
根据Matthias的J. Sax建议,我使用了0.10.2
版本而不是与代理版本0.10.1
兼容的0.10.1
,并将整个leftJoin
逻辑替换为内部联接,无需过滤掉null
值。