连续分割/选择

时间:2017-04-11 16:09:31

标签: apache-flink

我是Flink的新手,很抱歉,如果这个问题很简单!

问题描述: IoT sensors --> MQTT --> Apache Nifi --> Kafka --> Flink(只有Flink与此相关!

传感器发送心跳和其他事件。 Hearbeats有两种不同的格式(不同的版本)。我的目标是统一流。

这是我的代码:

SplitStream<GatewayEvent<String>> splitedStream = gatewayStream
            .split(new GatewayActionPathSplitter());

// GatewayEvent contains an 'action' (mqqt topic): 'up/hearbeat' action  contains v30 and v31 heartbeats
SplitStream<GatewayEvent<String>> heartBeatStream = splitedStream
            .select("up/heartbeat")
            .split(new HeartBeatVersionSplitter());

// Map heartbeats v31 to HeartBeat objects
DataStream<GatewayEvent<HeartBeat>> hb31Stream = heartBeatStream
        .select("V31")
        .map(new HeartBeat31Mapper());

// Map heartbeats v30 to HeartBeat objects
DataStream<GatewayEvent<HeartBeat>> hb30Stream = heartBeatStream
        .select("V30")
        .map(new HeartBeat30Mapper());

DataStream<GatewayEvent<HeartBeat>> allHBStream = hb31Stream
            .union(hb30Stream);

allHBStream.print();

我认为流会有以下事件(“HB30”是HeartBeatv30,“HB31”是HearBeatv31,“O”是其他事件)

gatewayStream = HB30, O, O, HB30, HB31, HB30, O
splitedStream = HB30, O, O, HB30, HB31, HB30, O
splitedStream.select("up/heartbeat") = HB30, HB30, HB31, HB30
heartBeatStream = HB30, HB30, HB31, HB30
heartBeatStream.select("V30") = HB30, HB30, HB30 //错误:还包含HB31
heartBeatStream.select("V31") = HB31 //错误:还包含HB30s

有人可以解释一下:
1-这段代码有什么问题?
2-是否有其他解决方案来实现此功能? (我已经有一个解决方法:我的GatewayActionPathSplitter类包括听力版本区别)。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

不幸的是,split操作不可堆叠,因为它们只是将路由策略应用于前一个运算符的输出。此问题已经打开JIRA

另一个选择是将差异化逻辑合并到map函数中。有点像:

.filter(event.getType.equals("HB31") || event.getType.equals("HB30")))
.map(event =>
  event.getType match {
    case "HB31" => new HeartBeat31Mapper()
    case "HB30" => new HeartBeat30Mapper()
  })