修改StreamInsight中的事件时间

时间:2013-06-20 09:12:14

标签: streaminsight

这是my last question的后续行动;设置是我正在使用StreamInsight进行时间序列预测。

根据那里的描述进行扩展,让我用x_n来表示我的输入流,并且为了这个例子,让我们假设在每10次观察之后我预测前面的10个值;我将这些预测称为p_n。系列索引将对应于时间,因此第一个p_n将为p_11

所以我们有

x_1, x_2, ..., x_10 --> p_11, p_12, ..., p_20
x_11, x_12, ..., x_20 --> p_21, p_22, ..., p_30
etc.

我有一个用户定义的流运算符,它从我的输入流中收集x_n,当有足够的事件时,它会为该周期吐出所有p_n; TXPower275证实这是一个合理的策略。

我的下一步是将预测与实际值进行比较;为此,我想join两个流。加入与事件时间戳一起使用,所以我需要时间戳正确排列。

(旁白:虽然我有点事件,但我也可以使用间隔时间短的间隔事件,以便我得到重叠的连接......当我到达时,我会越过那座桥)。

(为了完整性:当我收到一个循环中间的输入事件时,我的UDSO输出一个“虚拟事件”,我使用事件有效负载中的字段来识别。我过滤掉了虚拟事件。为了创建预测事件流。)

为了更清楚,这是我的接收器的一些输出。这些是上面提到的虚拟事件。每行开头的时间戳是StreamInsight事件时间(这些是点事件),每行末尾的时间戳实际上是我有效负载内的一个字段。

12:03:30 PM CEP#NO_OUTPUT Predicted NaN  12:03:30 PM
12:03:40 PM CEP#NO_OUTPUT Predicted NaN  12:03:40 PM
12:03:50 PM CEP#NO_OUTPUT Predicted NaN  12:03:50 PM
12:04:00 PM CEP#NO_OUTPUT Predicted NaN  12:04:00 PM
12:04:10 PM CEP#NO_OUTPUT Predicted NaN  12:04:10 PM
12:04:20 PM CEP#NO_OUTPUT Predicted NaN  12:04:20 PM
12:04:30 PM CEP#NO_OUTPUT Predicted NaN  12:04:30 PM
12:04:40 PM CEP#NO_OUTPUT Predicted NaN  12:04:40 PM
12:04:50 PM CEP#NO_OUTPUT Predicted NaN  12:04:50 PM

实际预测如下:

12:05:00 PM CEP#2#Space99 Predicted 0.57 12:05:10 PM
12:05:00 PM CEP#2#Space99 Predicted 0.66 12:05:20 PM
12:05:00 PM CEP#2#Space99 Predicted 1.54 12:05:30 PM
12:05:00 PM CEP#2#Space99 Predicted 1.34 12:05:40 PM
12:05:00 PM CEP#2#Space99 Predicted 1.31 12:05:50 PM
12:05:00 PM CEP#2#Space99 Predicted 0.93 12:06:00 PM
12:05:00 PM CEP#2#Space99 Predicted 2.19 12:06:10 PM
12:05:00 PM CEP#2#Space99 Predicted 0.86 12:06:20 PM

请注意,所有事件的事件时间都相同。这是因为我的UDSO为所有p_n(一个周期)分配了触发计算的x_n的时间戳。

这与MSDN documentation - “一致”每个输出事件的时间戳基于相应输入事件“的时间戳。

我想做的是使用有效负载字段中的时间创建预测事件。

我认为我应该使用的是

ToPointStreamable(payload => PointEvent<MyPayload>.CreateInsert(payload.eventTime, payload)

,我尝试插入的方式是这样的:

var separated_stream = prediction_query.ToEnumerable(StreamEventOrder.FullyOrdered)
                                                   .ToPointStreamable(payload => PointEvent<MyPayload>.CreateInsert(payload.eventTime, payload),
                                                                      AdvanceTimeSettings.IncreasingStartTime);

我的prediction_query类型为IQStreamable<MyPayload>

这不起作用。事件正在进行,预测正在生成,如上所示,但我的“separated_stream”可能也不存在。

使用与我的其他查询相同的模式打印到控制台 -

var observer = cepApplication_.DefineObserver(() => System.Reactive.Observer.Create<T>(/* print action */));
observer.Deploy(name);
separated_stream.Bind(observer).Run()

所以我认为那里没有任何错误。

我正在使用事件流调试器,但找不到这个查询...但我确实找到了两个进程,我只识别其中一个进程中的流程,所以我想第二个可能与此{{1}有关}。诊断程序告诉我此过程或其任何操作员都没有事件。查询与运算符一样“运行”,调试器中没有任何内容看起来像错误。

我对separated_stream的定义是否不正确,我该如何解决?

感谢。

编辑:事件流调试器中的第二个进程与问题查询相关 - 如果我注释掉查询,则进程不会显示。

1 个答案:

答案 0 :(得分:0)

哇。不确定我是否完全遵循一切建议,但有些建议: 首先,看看科目。请参阅此博文:http://www.devbiker.net/post/Using-Subjects-as-a-e2809cFeedback-Loope2809d.aspx。您的详细信息会略有不同,但概念是相同的。 第二......一个建议。不要将流中的事件视为点或间隔或边。他们不是,不是真的。事件形状是事件的 expresions ,其方式对于入口或出口而言是有意义且方便的。 引擎中的所有事件都有开始和结束时间。您认为“点事件”的结束时间仅为开始时间后的1个刻度。点,间隔和边是事件的不同表达,所有事件可以是点,间隔或边。在LinqPad中尝试它,你会发现你可以通过三种方式转储完全相同的查询!