Apache flink 将对象节点转换为json节点

Apache flink 将对象节点转换为json节点,apache-flink,Apache Flink,这里DataStream返回keyvalue对作为一个对象,我直接需要key-value,而不是作为一个对象,因为我需要根据key对值进行分组 DataStream<ObjectNode> stream = env .addSource(new FlinkKafkaConsumer<>("test5", new JSONKeyValueDeserializationSchema (false), properties)); // stream.keyBy("re

这里DataStream返回keyvalue对作为一个对象,我直接需要key-value,而不是作为一个对象,因为我需要根据key对值进行分组

DataStream<ObjectNode> stream = env
    .addSource(new FlinkKafkaConsumer<>("test5", new JSONKeyValueDeserializationSchema (false), properties));

// stream.keyBy("record1").print();

DataStream-stream=env
.addSource(新的FlinkKafkaConsumer(“test5”,新的JSONKeyValueDeserializationSchema(false),属性));
//stream.keyBy(“record1”).print();
当我给出stream.keyby(“record1”).print()时; 它表明

Exception in thread "main" org.apache.flink.api.common.InvalidProgramException: This type (GenericType<org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.node.ObjectNode>) cannot be used as key.
    at org.apache.flink.api.common.operators.Keys$ExpressionKeys.<init>(Keys.java:330)
    at org.apache.flink.streaming.api.datastream.DataStream.keyBy(DataStream.java:337)
    at ReadFromKafka.main(ReadFromKafka.java:27)
线程“main”org.apache.flink.api.common.invalidProgrameException中的异常:此类型(GenericType)不能用作键。 位于org.apache.flink.api.common.operators.Keys$ExpressionKeys.(Keys.java:330) 位于org.apache.flink.streaming.api.datastream.datastream.keyBy(datastream.java:337) 位于ReadFromKafka.main(ReadFromKafka.java:27)
在Flink keyBy中指定键选择器有几种方法。例如,如果在名为“id”的字段中有一个带有字符串键的Event类型的POJO,则以下任何一项都可以工作:

stream.keyBy("id")
stream.keyBy(
新的键选择器(){
@凌驾
公共字符串getKey(事件)引发异常{
返回event.id;
}
}
)

只要你能以确定的方式从对象中计算出密钥,你就能做到这一点。

David Anderson的回答是正确的,作为补充,我可以补充一点,你可以简单地创建
KeySelector
,它将密钥提取为
字符串。它可能是这样的:

public class JsonKeySelector implements KeySelector<ObjectNode, String> {
    @Override
    public String getKey(ObjectNode jsonNodes) throws Exception {
        return jsonNodes.get("key").asText();
    }
}
public类JsonKeySelector实现KeySelector{
@凌驾
公共字符串getKey(ObjectNode jsonNodes)引发异常{
返回jsonNodes.get(“key”).asText();
}
}

这显然假设键应该是
String

我的卡夫卡制作人代码是这样的``KafkaProducer记录=新的卡夫卡制作人(“主题”,“记录类型”,索引)```记录类型表示记录1、记录2、记录3。在flink中,我需要基于记录的组(比如记录1、记录2、记录3)。感谢添加此澄清!
stream.keyBy(
    new KeySelector<Event, String>() {
        @Override
        public String getKey(Event event) throws Exception {
            return event.id;
        }
    }
)
public class JsonKeySelector implements KeySelector<ObjectNode, String> {
    @Override
    public String getKey(ObjectNode jsonNodes) throws Exception {
        return jsonNodes.get("key").asText();
    }
}