【原创】StreamInsight查询系列(二十)——查询模式之检测间隙事件

上篇文章介绍了查询模式中如何检测异常事件,这篇博文将介绍StreamInsight中如何检测间隙事件。

测试数据准备

为了方便测试查询,我们首先准备一个静态的测试数据源:

// 创建数据源,要注意的是4:16和4:30之间存在的事件间隙
var sourceData = new []
{new { Status = 1, TimeStamp = new DateTime(2009, 10, 23, 4, 12, 0) },new { Status = 0, TimeStamp = new DateTime(2009, 10, 23, 4, 13, 0) },new { Status = 1, TimeStamp = new DateTime(2009, 10, 23, 4, 14, 0) },new { Status = 0, TimeStamp = new DateTime(2009, 10, 23, 4, 15, 0) },new { Status = 0, TimeStamp = new DateTime(2009, 10, 23, 4, 16, 0) },new { Status = 1, TimeStamp = new DateTime(2009, 10, 23, 4, 30, 0) },new { Status = 0, TimeStamp = new DateTime(2009, 10, 23, 4, 35, 0) },
};

接下去将上述数据源转变为点类型复杂事件流:

var source = sourceData.ToPointStream(Application, ev => PointEvent.CreateInsert(ev.TimeStamp.ToLocalTime(), ev),AdvanceTimeSettings.StrictlyIncreasingStartTime);

间隙事件检测

问题:怎样在计算聚合时加入间隙事件?

我们先执行一个基本的计数聚合查询,如“计算过去5分钟内事件的数目?”:

var countQuery = from window in source.TumblingWindow(TimeSpan.FromMinutes(5), HoppingWindowOutputPolicy.ClipToWindowEnd)select new { count = window.Count() };

结果如下:

读者可以发现在计数结果中并没有[4:20:00, 4:30:00)区间的事件,这里我们把这些未出现的事件称为“间隙事件”。

下面要解决的问题是如何在结果中加入并显示这些“间隙事件”。解决该问题的主要思路是采用左反半部联接:

第1步,定义起点在无穷小事件,终点在无穷大时间的参考事件流

var defaultEvent = new[] { new { count = (long)0 } };var defaultStream = defaultEvent.ToIntervalStream(Application, ev =>IntervalEvent.CreateInsert(DateTime.MinValue.ToUniversalTime(), DateTime.MaxValue.ToUniversalTime(), ev),AdvanceTimeSettings.StrictlyIncreasingStartTime);

结果如下:

第2步,使用左反半部联接找出间隙事件:

var gaps = from def in defaultStream where (from right in countQuery where true select right).IsEmpty()select def;

结果如下:

第3步,将countQuery和gaps联接并输出结果。

(from e in countQuery.Union(gaps).ToIntervalEnumerable()where e.EventKind == EventKind.Insertselect new { e.StartTime, e.EndTime, e.Payload.count }).Dump();

结果如下:

下一篇将介绍StreamInsight查询模式中如何使用地理数据。

转载于:https://www.cnblogs.com/StreamInsight/archive/2011/09/13/StreamInsight-Query-Series-Part20-Query-Patterns-Detect-Gaps.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构基础应用】【查找和排序算法】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、顺序查找2、折半查找3、直接插入排序4、选择排序5、冒泡排序6、希尔排序7、快速排序8、堆排序9、排序算法性能比较10、所有算法的code(C语言)前言 本章总结查找和排序算法:顺序查找、折…

爬虫项目(三)---采集最近一日全国各省疫情数据

该内容出自黑马程序员教程 采集最近一日全国各省疫情数据 当然,数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页 url:https://ncov.dxy.cn/ncovh5/view/pneumonia 思路:首先需要先确定全国各省疫情数据的位置 全国各省份的疫情数据…

计算机专业博士后排名,排名丨计算机专业领域TOP10,性价比超高!

原标题:排名丨计算机专业领域TOP10,性价比超高!相信各位家长、同学已经看过太多专业的排名,我问过很多理科生将来想学什么专业,听到频率最高的还是计算机专业。似乎大家都知道,学计算机是比较挣钱的&#x…

js 命名规范

转载于:https://www.cnblogs.com/zjx2011/p/3165043.html

爬虫项目(四)---采集从01月22日以来全国各省疫情数据

采集从03月02日以来全国各省疫情数据 当然,数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页 url:https://ncov.dxy.cn/ncovh5/view/pneumonia 分析 确定01月22日以来全国各省疫情数据的URL 由项目(三)可以获取全国各省疫情数据点击可下载&…

纠错码trick和数据压缩trick

纠错码和压缩算法是同一枚硬币的两面。 两者都来自于对冗余的想法。 纠错码被视为向消息或文件中添加冗余的原则性方法。而压缩算法正好相反,他们会从消息或文件中移除冗余。 压缩和纠错并不是彼此抵消的,相反,好的压缩算法会移除抵消冗余&am…

常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 目录1、穷举法2、贪心算法3、递归与分治算法4、回溯算法5、数值概率算法1、穷举法…

工程师英语和计算机证书查询,点击进入国家硬件维修工程师证书查询网站

工程师证书查询网站人力资源社会保障部指定查询国家职业资格证书的唯一官方网站。涵盖全国各省市、各行业、各央企颁发的证书。电脑硬件维修工程师网上能查看国家工信部硬件维修工程师证书查询网址:http://www.ceiaec.org/index.htm工程师证书编号在网上怎么查询如果…

敏捷开发“松结对编程”系列之七:问题集之一

本文是“松结对编程”系列的第七篇。(之一,之二,之三,之四,之五,之六,之七,之八)刚刚参加完MPD 2011深圳站,在演讲中间及后来媒体采访,被问到了一…

C++中的sort函数对二维数组排序是按照什么准则?

遇到的一个疑惑&#xff0c;现记录如下&#xff1a; int main() {vector<vector<int>> envelopes { {5, 8},{6, 7},{6, 4},{2, 3},{8,9} };sort(envelopes.begin(), envelopes.end());for (int i 0;i < envelopes.size();i)cout << envelopes[i][0]<…

数学专业学计算机哪一行,计算数学

计算数学(一个理科专业)语音编辑锁定讨论上传视频计算数学是由数学、物理学、计算机科学、运筹学与控制科学等学科交叉渗透而形成的一个理科专业。中文名计算数学外文名Computational Mathematics所 属数学计算数学专业定义编辑语音计算数学也叫做数值计算方法或数值分析。主…

图片透视变换操作

由于照相机硬件设备本身的误差&#xff0c;可能会导致镜头畸变&#xff0c;从而导致照相机拍摄到的照片产生失真现象&#xff0c;此时可以通过透视变换去适当的校正。 大概的思路&#xff1a;在原图像上确定四个点&#xff0c;然后再新图像上也确定四个点&#xff0c;通过warp…

dp笔记:关于DP算法和滚动数组优化的思考

从网上总结了一些dp的套路以及对滚动数组的一些思考&#xff0c;现记录如下&#xff0c;希望以后回顾此类算法时会有所帮助。 目录1、DP算法经验1、DP算法核心&#xff1a;2、DP算法类别以及例题例1&#xff1a;三步问题例2&#xff1a;最小路径和例3&#xff1a;乘积最大子数组…

【C++ grammar】引用

1、引用就是另一个变量的别名 2、通过引用所做的读写操作实际上是作用与原变量上 引用方式&#xff1a; int x; int & rxx; or int x, &rxx;在C中&是取地址&#xff0c;在C中&放在一个变量的定义前&#xff0c;那就是引用 注意&#xff1a; 这种引用是错误的…

flash安全策略的理解

flash安全策略的理解 2011-06-25 01:48 11人阅读 评论(0) 收藏 举报 一直以来对flash的安全策略是一头雾水&#xff0c;什么安全沙箱&#xff0c;跨域策略文件一堆东西乱七八糟&#xff0c;搞不清楚。不过纠结到现在已经基本上理解了。 flash的安全问题在官方手册上有足够的解…

【C++ grammar】nullptr and Dynamic Memory Allocation (空指针和动态内存分配)

空指针 1.1. 0带来的二义性问题 C03中&#xff0c;空指针使用“0”来表示。0既是一个常量整数&#xff0c;也是一个常量空指针。C语言中&#xff0c;空指针使用(void *)0来表示有时候&#xff0c;用“NULL”来表示空指针(一种可能的实现方式是#define NULL 0) 1.2. C标准化委…

No module named ‘skimage.metrics‘在Anaconda3中的解决方法

1&#xff0c;进入Anaconda Prompt 2&#xff0c;进行安装&#xff1a; pip install scikit-image 3&#xff0c;若还是报错&#xff0c;尝试进行更新一下 pip install scikit-image --upgrade

【C++ grammar】数据类型转换、列表初始化

布尔类型 C语言在其标准化过程中引入了bool、true和false关键字&#xff0c;增加了原生数据类型来支持布尔数据。 布尔类型的大小&#xff08;所占的存储空间&#xff09;依赖于具体的编译器实现。也可以用 sizeof运算符得到其占用的空间 Conversion between bool and int 0…

Python对自定义离散点进行指定多项式函数拟合

自定义离散点进行指定多项式函数拟合 用户自己自己输入坐标点&#xff0c;拟合函数可根据用户输入的多项式的最高次方进行自动拟合函数&#xff0c;拟合方法采用最小二乘法进行函数拟合。 (1,2),(2,5),(3,10),(4,17),(5,26),(6,37)(7,50),(8,65),(9,82) 很显然是函数为二次函…

【C++ grammar】C++简化内存模型

1、stack&#xff08;栈&#xff09; 编译器自动分配内存&#xff08;函数内部定义得局部变量、形参&#xff09; 2、堆&#xff08;Heap&#xff09; 一般由程序员分配释放&#xff0c;若程序员不释放&#xff0c;程序结束时可能由OS回收&#xff08;new和delete&#xff09; …