我想将Flink用于远程患者监测案例场景,其中包括各种传感器,如陀螺仪,加速度计,ECG流,HR率流,RR率等。因此,在这种情况下,我们不可能拥有相同的数据类型或输入率等,但我仍然想检测心律失常或其他涉及在这些多个传感器上进行CEP的医疗状况
我所知道的是,如果我想对这些传感器执行一些复杂的事件处理,那么我有两个选项需要在CEP之前完成
- 加入差异流
- 合并差异流
醇>
之前我基于传感器的时间戳执行连接,但它不会导致连接所有事件,因为差异流可以具有差异速率和不同的时间戳(以微秒为单位),因此这是一种罕见的情况,因此时间戳是完全相同。
所以我想选择#2选项,即在进行CEP之前执行合并。为了做到这一点,我在Flink文档中发现,我可以merge the two streams 但它们应该具有相同的数据类型,我试图做同样的事情,但是因为我遇到了错误而导致我失败
Exception in thread "main" java.lang.IllegalArgumentException: Cannot union streams of different types: GenericType<org.carleton.cep.monitoring.latest.Events.RRIntervalStreamEvent> and GenericType<org.carleton.cep.monitoring.latest.Events.qrsIntervalStreamEvent>
at org.apache.flink.streaming.api.datastream.DataStream.union(DataStream.java:217)
现在让我们看看我是如何尝试执行合并的。所以基本上我有两个流类,它们的属性如下
RRIntervalStreamEvent Stream
public Integer Sensor_id;
public Long time;
public Integer RRInterval;
qrsIntervalStreamEvent Stream
public Integer Sensor_id;
public Long time;
public Integer qrsInterval;
这两个流都有生成器类,它们也以指定的速率以相同的数据类型发送事件。下面是我尝试合并它们的代码。
// getting qrs interval stream
DataStream<qrsIntervalStreamEvent> qrs_stream_raw = envrionment.
addSource(new Qrs_interval_Gen(input_rate_qrs_S,Total_Number_Of_Events_in_qrs)).name("qrs stream");
// getting RR interval stream
DataStream<RRIntervalStreamEvent> rr_stream_raw = envrionment.
addSource(new RR_interval_Gen(input_rate_rr_S,Total_Number_Of_Events_in_RR)).name("RR stream");
//merging both streams
DataStream<Tuple3<Integer,Long,Integer>> mergedStream;
mergedStream = rr_stream_raw.union(new DataStream[]{qrs_stream_raw});
我必须使用new DataStream[]
,因为只使用qrs_stream_raw
导致错误,如下所示。
有人可以给我一个关于
的想法答案 0 :(得分:2)
正如Alex所指出的,我们可以使用两个流的相同数据类型并可以在Flink中加入它们,另一个选择是使用Siddhi或Flink-Siddhi扩展。但我想在Flink中做所有事情
所以这里有一些我在程序中做的改变,以使其工作
步骤1:使我的两个生成器类都返回公共类型
public class RR_interval_Gen extends RichParallelSourceFunction<Tuple3<Integer,Long, Integer>>
步骤2:使两个流生成器都具有Tuple类型,然后合并了两个流。
// getting qrs interval stream
DataStream<Tuple3<Integer,Long,Integer>> qrs_stream_raw = envrionment.
addSource(new Qrs_interval_Gen(input_rate_qrs_S,Total_Number_Of_Events_in_qrs)).name("qrs stream");
// getting RR interval stream
DataStream<Tuple3<Integer,Long,Integer>> rr_stream_raw = envrionment.
addSource(new RR_interval_Gen(input_rate_rr_S,Total_Number_Of_Events_in_RR)).name("RR stream");
//merging both streams
DataStream<Tuple3<Integer,Long,Integer>> mergedStream = rr_stream_raw.union(qrs_stream_raw);