在KafkaStreams中使用SessionWindows聚合数据(0.11)

时间:2017-10-10 09:04:16

标签: java aggregate type-mismatch apache-kafka-streams

我试图在Kafka(0.11)的聚合函数中使用SessionWindows,但无法理解,为什么我会出错。

这是我的代码段:

// defining some values:
public static final Integer SESSION_TIMEOUT_MS = 6000000;
public static final String INTOPIC = "input";
public static final String HOST = "host";

// setting up serdes:
final Serializer<JsonNode> jsonSerializer = new JsonSerializer();
final Deserializer<JsonNode> jsonDeserializer = new JsonDeserializer();
final Serde<JsonNode> jsonSerde = Serdes.serdeFrom(jsonSerializer, jsonDeserializer);

// some more code to build up the streams
KStreamBuilder builder = new KStreamBuilder();
KStream<String, JsonNode> dataStream = builder.stream(Serdes.String(), jsonSerde, INTOPIC);

// constructing the initalMessage ObjectNode:
ObjectNode initialMessage = JsonNodeFactory.instance.objectNode();
initialMessage.put("count", 0);
initialMessage.put("endTime", "");

// transforming data to KGroupedStream<String,JsonNode>
KGroupedStream<String, JsonNode> data = dataStream.map((key, value) ->{return new KeyValue<>(value.get(HOST).asText(), value);  }).groupByKey(Serdes.String(), jsonSerde);

// finally aggregate the data usind SessionWindows
KTable<Windowed<String>, JsonNode> aggregatedData = data.aggregate(
            () -> initialMessage,

            (key, incomingMessage, initialMessage) -> countData(incomingMessage, initialMessage),

            SessionWindows.with(SESSION_TIMEOUT_MS),

            jsonSerde, 

            "aggregated-data");

 private static JsonNode countData(JsonNode incomingMessage, JsonNode initialMessage){
 // some dataprocessing
 }

当我改变

 KTable<Windowed<String>,JsonNode>

 KTable<String, JsonNode>

并删除

 SessionWindows.with(SESSION_TIMEOUT_MS)

来自聚合函数,一切正常。

如果我不知道,eclipse告诉我行

 KTable<Windowed<String>, JsonNode> aggregatedData = data.aggregate( [...])
  

KGroupedStream类型中的方法聚合(Initializer,Aggregator,Windows,Serde,String)不适用于参数(() - &gt; {},(key,incomingMessage,initialMessage) - &gt; {},SessionWindows ,Serde,String)

和行

() -> initialMessage
  

类型不匹配:无法从ObjectNode转换为VR

 (key, incomingMessage, initialMessage) -> countData(incomingMessage, initialMessage),
  

DataWindowed类型中的countData(JsonNode,JsonNode)方法不适用于参数(JsonNode,VR)

我真的不知道,这些类型会丢失! 任何提示都会很棒!

Thx:D

1 个答案:

答案 0 :(得分:1)

我真的需要实施合并:

Merger<? super String, JsonNode>tmpMerger = new MergerClass<String, JsonNode>();

并将其添加到聚合函数:

KTable<Windowed<String>, JsonNode> aggregatedData = data.aggregate(
        () -> initialMessage,

        (key, incomingMessage, initialMessage) -> countData(incomingMessage, initialMessage),

        tmpMerger,

        SessionWindows.with(SESSION_TIMEOUT_MS),

        jsonSerde, 

        "aggregated-data");