使用Flink时,当Kafka中的json数据不清楚时,如何反序列化

时间:2018-08-02 08:13:01

标签: java apache-kafka apache-flink flink-streaming

我想通过Flink计算Kafka中的数据,但是问题是Kafka中的JASON数据可能是变异的。

像这样:

{"data":{"template":25,"name":"name"}}

或者这个:

{"data"{"type":"type1","props":"props","strem":"stream1"}

我无法事先知道此JSON中包含多少数据。因此在使用Flink时会有一个探测:

streamExecutionEnvironment.addSource(new FlinkKafkaConsumer010<KafkaEvent>("flink", new KafkaEventSchema(),
            kafkaProps))
            .flatMap(new KafkaEventToRow()).returns(getReturnType());

那么当Json数据这样时,如何定义pojo类型和mapFuncation?

1 个答案:

答案 0 :(得分:1)

您必须定义一个更通用的反序列化架构,例如Map

定义架构

class CustomSchema implements DeserializationSchema {

    private ObjectMapper mapper = new ObjectMapper();

    @Override
    public Map<String,Object> deserialize(byte[] bytes) throws IOException {
        Map<String,Object> t = null;
        t = mapper.readValue(bytes, Map.class);
        return t;
    }

    @Override
    public boolean isEndOfStream(Object o) {
        return false;
    }

    @Override
    public TypeInformation<Map> getProducedType() {
        return TypeInformation.of(new TypeHint<Map>() {
        });
    }
}

现在将其用作架构

streamExecutionEnvironment
.addSource(new FlinkKafkaConsumer010<KafkaEvent>("flink", new CustomSchema(),......

现在您将获得一个通用地图,该地图可以包含任何数据结构