我写了以下DSL:
// Providing a service account object inline
admin.initializeApp({
credential: admin.credential.cert({
projectId: "<PROJECT_ID>",
clientEmail: "foo@<PROJECT_ID>.iam.gserviceaccount.com",
privateKey: "-----BEGIN PRIVATE KEY-----<KEY>-----END PRIVATE KEY-----\n"
})
});
这正常工作,leftjoin()正常,reduce()很好地实现为状态存储,可以在其中执行put()和delete()。
但是,如果我编写了实现 Transformer 接口的 MyTranformer 类并执行以下操作:
myStream
.leftJoin(myKtable, new MyValueJoiner())
.groupByKey(Grouped.with(Serdes.String(),MyObject.serde()))
.reduce((v1, v2) -> v2, Materialized.as("MY_STORE"))
.toStream()
然后我得到以下异常:
myOtherStream.transform(() -> new MyTransformer<>(), MY_STORE)
.leftJoin(myOtherKTable, new MyOtherValueJoiner<>());
在Javadoc中,leftjoin似乎使用了默认的Serdes,并且似乎没有办法强制使用自定义Serdes,但是对于其他操作数也是可能的。
但是,如果在transform()之后我做了除leftjoin()之外的其他事情,例如mapValue()或filter(),它会按预期工作。但是,一旦执行leftjoin(),我就会遇到强制转换异常。
在transform()之后可以使用leftjoin()吗?
为什么在第一种情况下,即使文档说它使用默认的serdes,leftjoin()仍然有效,而对于转换器,它会失败吗?