我的信息流正在生成Tuple2<String,String>
.toString()
输出(usr12345,{"_key":"usr12345","_temperature":46.6})
其中密钥为usr12345
,值为{"_key":"usr12345","_temperature":46.6}
流上的.print()
正确输出值:
(usr12345,{"_key":"usr12345","_temperature":46.6})
但是当我将流写入Kafka时,密钥变为usr12345
(开头有一个空格)和值({"_key":"usr12345","_temperature":46.6}
注意键开头的空格和值开头的左括号。
很奇怪。为什么会这样?
这是序列化代码:
TypeInformation<String> resultType = TypeInformation.of(String.class);
KeyedSerializationSchema<Tuple2<String, String>> schema =
new TypeInformationKeyValueSerializationSchema<>(resultType, resultType, env.getConfig());
FlinkKafkaProducer010.FlinkKafkaProducer010Configuration flinkKafkaProducerConfig = FlinkKafkaProducer010.writeToKafkaWithTimestamps(
stream,
"topic",
schema,
kafkaProducerProperties);
答案 0 :(得分:4)
TypeInformationKeyValueSerializationSchema
使用Flink的自定义序列化程序序列化数据,这意味着必须将结果解释为二进制数据。 Flink的String序列化程序写入String的长度,然后编码所有字符。
我假设您使用普通的String反序列化器反序列化Kafka主题。对于键,序列化长度被解释为空白字符。对于该值,长度被解释为'('
。
尝试使用不同的序列化程序,将序列化密钥和值作为普通字符串或使用兼容的解串器。