在Kafka流中执行映射操作后,双引号字符串

时间:2018-09-03 12:17:15

标签: apache-kafka apache-kafka-streams

我使用Kafka流DSL并映射将KStream<String, JsonNode>转换为KStream<String, String>

ValueMapper函数中,我简单地返回new ValueMapper("key", "some constant string"),但是在使用KStream.to("some topic")将值发送回Kafka的情况下,得到的结果是添加了双引号。

我的代码是这样的:

KStream<String, JsonNode> views = builder.stream("fromTopic");
views.map(new ValueKMapper()).to("toTopic");

ValueMapper仅实现KeyValueMapper,而apply()的代码是:

public KeyValue<String, String> apply(String key, JsonNode value) 
{
    return new KeyValue<String,String>("a", "hello");
}

然后当我消费toTopic时,我得到了""hello"",并加上了引号。

也许这是Kafka流的错误?

2 个答案:

答案 0 :(得分:0)

我认为您在问题中提供的方法apply()

public KeyValue<String, String> apply(String key, JsonNode value) 
{
    return new KeyValue<String,String>("a", "hello");
}

没有将硬编码的键和值传递给KeyValue的构造函数。我的猜测是问题与JsonNode有关。也许,您方法的实际实现使用了value.get(key),即

public KeyValue<String, String> apply(String key, JsonNode value) 
{
    return new KeyValue<String,String>(key, value.get(key));
}

但是,value.get(key)将返回TextNode,而toString()方法将返回包含引号的TextNode的字符串表示形式。为了正确解析JsonNode,您需要使用textValue()方法,以便您的方法成为

public KeyValue<String, String> apply(String key, JsonNode value) 
{
    return new KeyValue<String,String>(key, value.get(key).textValue());
}

示例: 假设您有一个键a和一个值hello

json.get("a").toString())

将在返回"hello"

json.get("a").textValue();

将返回hello

答案 1 :(得分:0)

您可能会使用Json serde作为默认设置。尝试在写入接收器时添加字符串Serde:

.to("toTopic", Produced.with(Serdes.String(), Serdes.String()));