我希望使用GlobalKTable加入我的一个流,我在这个过程中遇到了问题。我有3个主题,我也在听。更新 - 原始主题,更新主题和会话主题。
我的更新 - 原始主题的流将未序列化的更新请求转换为序列化请求([String,String] - > [String,Update])。这是推送到我的更新主题。
val updateTransformStore = Stores.inMemoryKeyValueStore("updateTransformState")
val updateTransformStoreBuilder = Stores.keyValueStoreBuilder(updateTransformStore,stringSerde,updateSerde)
builder.addStateStore(updateTransformStoreBuilder)
val rawUpdateStream = builder.stream("update-raw", Consumed.`with`(Serdes.String,Serdes.String))
.filter((_,value) => filterUpdateRequest(value))
rawUpdateStream.transform(updateTransformer,"updateTransformState")
.to("update-stream",Produced.`with`(stringSerde,updateSerde))
我的更新主题是GlobalKTable。
val globalMaterialized: Materialized[String,UpdateInfo,KeyValueStore[Bytes, Array[Byte]]] = Materialized.as("global-update-store").withKeySerde(stringSerde).withValueSerde(updateSerde)
val updateTable: GlobalKTable[String,UpdateInfo] = builder.globalTable("update-stream", globalMaterialized)
我的最后一个主题是我的会话主题
val kvMapper = new KeyValueMapper[String, String, String] {
override def apply(key: String, value: String): String = {
val jsonVal = new ObjectMapper().readTree(value).asInstanceOf[ObjectNode]
val session = jsonVal.findValue("session").findValue("id").toString replaceAll( "\"", "")
session
}
}
val vJoiner = new ValueJoiner[String,UpdateInfo,JsonWithUpdateInfo] {
override def apply(value1: String, value2: UpdateInfo): JsonWithUpdateInfo = {
if(value2 == null) {
JsonWithUpdateInfo(value1,0,"default")
}
else {
JsonWithUpdateInfo(value1, value2.info1, value2.info2)
}
}
}
val filteredStream = builder.stream("session", Consumed.`with`(Serdes.String, Serdes.String))
.filter((_, value) => filterRequest(value))
val joinedStream:KStream[String,JsonWithUpdateInfo] = filteredStream.join(updateTable,kvMapper,vJoiner)
joinedStream.print(stringSerde,jsonSerde)
将一个更新和一个会话推送到相应的主题后,我的程序似乎在filteredStream.join
尝试执行后停止执行。我的打印从不起作用,也没有尝试运行更多命令。在我的kvMapper和vJoiner中抛出调试打印也不会产生输出。在尝试加入此表和流时是否有任何遗漏?
谢谢
答案 0 :(得分:0)
(来自上面评论部分的对话)
如果您有任何null
键或值,这些键或值将被删除。
为了跟踪呼叫链,您可能想在KStreamKTableJoinProcessor#process()
上设置一个断点,以查看join
运算符的实际作用。
(OP)似乎是问题所在,我不知道我需要在加入时有一个钥匙。我的映射器使用了部分值来联接表,因此我认为可以使用null键,在联接之前就应用了转换,并且按预期工作。