transform()导致KStream / KTable leftjoin导致:StreamsException:序列化器与实际的键或值类型不兼容

时间:2019-07-16 20:38:44

标签: apache-kafka-streams

我写了以下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()仍然有效,而对于转换器,它会失败吗?

1 个答案:

答案 0 :(得分:2)

最后,我只是在Javadoc中错过了leftJoin(),它使用Joined参数来指定要使用的Serdes:

with-out-str