【翻译】五步快速使用LINQPad尝鲜StreamInsight
StreamInsight 学习地址:http://www.cnblogs.com/StreamInsight/archive/2011/10/26/StreamInsight-Query-Series-Summarizing.html
有的时候我就想快速地试验一个技术想法,而不想因此去构建一个完整的解决方案。StreamInsight作为一个新产品,也有这样的问题。理想情况,我们应当可以试验一个产品,将其运行在某一个场景下并作出快速的评估。现在有了LINQPad,StreamInsight的快速试验变为了可能。这篇博文将一步步介绍如何安装组件和使用各种各样的数据源测试StreamInsight查询。如果你能坚持阅读下来,作为奖励,我会告诉你怎样使用OData数据,并在其上执行LINQ查询。
第一步:安装StreamInsight 1.1
你需要安装StreamInsight的第二个发布版本来使用LINQPad集成功能,从微软下载中心可以下载到StreamInsight 1.1。安装StreamInsight时,你可以选择评估版本,也可以使用SQL Server 2008 R2 许可密钥(可以在SQL Server安装媒介x86\DefaultSetup.ini中找到)来进行激活。
第二步:安装LINQPad 4.0
你可以选择LINQPad的免费版本(从这里下载),也可以选择具有内置智能感知功能的付费版本。
第三步:添加StreamInsight的LINQPad驱动
当运行LINQPad时,你可以看到一个叫做“Add connection”的选项。
之后你会看到一些内置的驱动,包括LINQ-to-SQL和OData等。
选择“View more drivers…”按钮,你会看到由微软创建的最新StreamInsight驱动。
这个驱动安装时间大约200毫秒,然后你就可以在LINQPad驱动列表中看到它了。
第四步:创建与StreamInsight驱动的新连接
如果窗口还处于打开状态选择驱动,否则回到LINQPad,选择“Add connection”,接下去在“Choose Data Context”向导页上点击Next按钮。现在你会看到一个标题为“StreamInsight Context Chooser”的弹出窗口,在其中你可以选择微软提供的数据集,也可以选择新的上下文。这里我选择Default Context。
第五步:编写简单的查询
现在我们连接到了StreamInsight的上下文,在编写查询之前请确保“Language”值选择为“C# Statements”,且“Database”值为“StreamInsight: Default Context”。
由于默认上下文中并没有一个输入数据源,因此我们创建了一个简单的点事件集合,并将其转换为流进行处理。我们的第一个查询获取所有Count大于4的事件。
//define event collection
var source = new[]
{
PointEvent.CreateInsert(new DateTime(2010, 12, 1), new { ID = "ABC", Type="Customer", Count=4 }),
PointEvent.CreateInsert(new DateTime(2010, 12, 2), new { ID = "DEF", Type="Customer", Count=9 }),
PointEvent.CreateInsert(new DateTime(2010, 12, 3), new { ID = "GHI", Type="Partner", Count=5 })
};
//convert to stream
var input = source.ToStream(Application,AdvanceTimeSettings.IncreasingStartTime);
var largeCount = from i in input
where i.Count > 4
select i;
//emit results to LINQPad
largeCount.Dump();
输出结果如下,注意只有两条记录输出。
(译者注:StartTime是GMT时间,不同时区下结果会不一样)
为了更多地展示一些StreamInsight的能力,我创建了另外一个查询,该查询在三个事件(放在同一天以使得所有的点事件在同一个快照中)之上创建一个快照窗口,并对每一个类型计算Count值之和。
var source = new[]
{
PointEvent.CreateInsert(new DateTime(2010, 12, 1), new { ID = "ABC", Type="Customer", Count=4 }),
PointEvent.CreateInsert(new DateTime(2010, 12, 1), new { ID = "DEF", Type="Customer", Count=9 }),
PointEvent.CreateInsert(new DateTime(2010, 12, 1), new { ID = "GHI", Type="Partner", Count=5 })
}; var input = source.ToStream(Application, AdvanceTimeSettings.IncreasingStartTime); var custSum = from i in input
group i by i.Type into TypeGroups
from window in TypeGroups.SnapshotWindow(SnapshotWindowOutputPolicy.Clip)
select new { Type = TypeGroups.Key, TypeSum = window.Sum(e => e.Count) }; custSum.Dump();
这个查询同样得到两个消息,但是请注意新的TypeSum值是所有Type值相同事件的聚合。
通过上面5个步骤(花费大约8分钟的时间),我们安装了本机组件并且成功执行了一对StreamInsight查询。
其实现在我就可以停笔了,但是还是让我们尝试一下更有趣的事情吧。试想如何在一个已有的OData数据源执行一个查询?下面的另外三个步骤将进一步展示LINQPad和StreamInsight。
*第六步:编写Northwind条目的OData连接
点击LINQPad中的“Add connection”按钮,选择“WCF Data Services(OData)”驱动,接下去选择OData作为提供者,并在“URI”文本框中填入OData源
(http://services.odata.org/Northwind/Northwind.svc),点击OK。在LINQPad中你会看到Northwind OData源中包含的所有实体。
现在让我们执行一个非常简单的查询。这个查询遍历所有的员工(Employee)记录,最后输出每一个员工的ID,受雇日期和国家。
var emps = from e in Employees
orderby e.HireDate ascending
select new
{
HireDate = (DateTime)e.HireDate,
EmpId = e.EmployeeID,
Country = e.Country
};
emps.Dump();
输出结果如下:
*第七步:在Northwind数据之上增添StreamInsight查询能力
如果希望在一个特定窗口时间内,按照国家分类来查看员工的雇佣情况该怎么做呢?我们完全可以通过一个直接的LINQ查询做到,但是这样又有什么乐趣呢?言归正传,想想看在员工数据上使用实时分析能做出什么样的有趣事情,当然这个话题并不是这篇博文要谈的重点。
LINQPad仅允许一次使用一个数据上下文,因此想要同时使用OData源和StreamInsight查询,我们需要做一点变通。Mark Simms已经写了一篇颇有深度的文章来解释这个问题,这里我给出一个简短的版本。
右击包含OData查询的LINQPad查询选项卡,选择“Query Properties”,添加StreamInsight dll的引用。点击“Additional Reference”选项卡中的“Add”按钮,查找并选择Microsoft.ComplexEventProcessing.dll和Microsoft.ComplexEventProcessing.Observable.dll(如果看不到这两个dll的话,记得选中Show GAC Assemblies选项)。
切换到“Additional Namespace Imports”选项卡,手工输入查询所需要的命名空间。
现在我们准备在OData源上使用StreamInsight LINQ查询了。
*第八步:在Northwind数据之上增添StreamInsight查询能力
我把先前写好的查询拷贝过来,在此基础上进行后续工作。
查询下方,我实例化了一个StreamInsight “server”用来托管查询,并定义了一个StreamInsight 应用来包含查询。接下去,我将OData结果转换为了CEP流,并创建了一个使用Tumbling窗口的StreamInsight查询,用以输出每60天窗口中的每个国家的雇用人数,最后将结果输出到LINQPad中。
var emps = from e in Employees
orderby e.HireDate ascending
select new
{
HireDate = (DateTime)e.HireDate,
EmpId = e.EmployeeID,
Country = e.Country
}; //define StreamInsight server
using (Server siServer = Server.Create("RSEROTERv2"))
{
//create StreamInsight app
Application empApp = siServer.CreateApplication("demo"); //map odata query to the StreamInsight input stream
var empStream = emps.ToPointStream(empApp, s => PointEvent.CreateInsert(s.HireDate, s), AdvanceTimeSettings.IncreasingStartTime); var counts = from f in empStream
group f by f.Country into CountryGroup
from win in CountryGroup.TumblingWindow(TimeSpan.FromDays(60), HoppingWindowOutputPolicy.ClipToWindowEnd)
select new { EmpCountry = CountryGroup.Key, Count = win.Count() }; //turn results into enumerable
var sink = from g in counts.ToPointEnumerable()
where g.EventKind == EventKind.Insert
select new { WinStart = g.StartTime, Country = g.Payload.EmpCountry, Count = g.Payload.Count }; sink.Dump();
}
查询的结果如下图:
小结
现在你应该有所了解了!前面5个步骤大概可以在10分钟内完成,而剩下的星号步骤可以在另外5分钟内完成。
这是一个相当快速,低投资的方法来尝鲜一个强大产品。
【翻译】五步快速使用LINQPad尝鲜StreamInsight的更多相关文章
- 【转】使用sinopia五步快速完成本地npm搭建
使用sinopia五步快速完成本地npm搭建 时间 2016-03-01 14:55:30 繁星UED 原文 http://ued.fanxing.com/shi-yong-sinopiawu-b ...
- PC-飞起来!我的Windows XP——五步快速优化Windows XP
虽然Microsoft的 Vista已经发售了快一年,但国内大部分系统用户仍使用着目前堪称完美的Windows XP.与以往的Windows操作系统一样,新安装的Windows XP可能还不在最佳状态 ...
- HTML5离线Web应用实战:五步创建成功
[IT168 技术]HTML5近十年来发展得如火如荼,在HTML 5平台上,视频,音频,图象,动画,以及同电脑的交互都被标准化.HTML功能越来越丰富,支持图片上传拖拽.支持localstorage. ...
- Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例
前言:由于之前没有接触过Hibernate框架,但是最近看一些博客深深被它的"效率"所吸引,所以这就来跟大家一起就着一个简单的例子来尝尝Spring全家桶里自带的JPA的鲜 Spr ...
- 尝鲜刚发布的 SpringFox 3.0.0,以前造的轮子可以不用了...
最近 SpringFox 3.0.0 发布了,距离上一次大版本2.9.2足足有2年多时间了.可能看到这个名字,很多读者会有点陌生.但是,只要给大家看一下这两个依赖,你就知道了! <depende ...
- DOCKER 学习笔记6 WINDOWS版尝鲜
前言 经过前两节的学习,我们已经可以在Dokcer 环境下部署基本的主流环境有: Springboot 后端 MYSQL 持久化数据 以及Nginx 作为反向代理 虽说服务器上面的也没啥不好,但是毕竟 ...
- C语言程序设计入门学习五步曲(转发)
笔者在从事教学的过程中,听到同学抱怨最多的一句话是:老师,上课我也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手.发生这种现象的原因有三个: 一.所谓的看懂听明白,只是很肤浅的 ...
- Windows 10 周年版尝鲜
早在今年的 Build 大会上,微软就开始宣传最新的 Windows 10 周年版更新,炫了不少特技,直到昨天(2016/8/2 PST)才正式放出,相关新闻可以参考这里,正式的版本为 Version ...
- 小程序新能力-个人开发者尝鲜微信小程序
个人开发者的福利 微信小程序,刚听到这个新名词的时候,我就兴冲冲的去找入口,看看自己能不能搞个微信小程序的HelloWorld,毕竟能在微信上把自己写的一些小工具跑起来还是满炫酷的. 没想,网上一查, ...
随机推荐
- Robotium API -- 判断测试结果的方法assert、is、search
下面的这些方法都主要用来判断测试结果是否与预期结果相符,一般把is和search方法放在assert里面判断.assert最常用的还是assertThat方法,是Junit的判断,这里就不多说了. 断 ...
- Xcode7 国际化
1.第一步 HaiTing_xcodeproj.png 2.第二不 HaiTing_xcodeproj 2.png 3.第三步 Localizable_strings.png 5第五步 ZLBMeVi ...
- .Net程序猿玩转Android开发---(3)登陆页面布局
这一节我们来看看登陆页面如何布局.对于刚接触到Android开发的童鞋来说.Android的布局感觉比較棘手.须要结合各种属性进行设置,接下来我们由点入面来 了解安卓中页面如何布局,登陆页面非常eas ...
- Servlet的PrintWriter out = response.getWriter()使用
一直以来,只知道out可以向客户端浏览器页面输入数据(html.txt等类型),今天在和php程序联调时发现自己的理解出现了偏差. out是输出字符流,即servlet接受到request请求后,se ...
- 使用Intent实现Activity的隐式跳转
相比于显式Intent,隐式Intent 则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action 和category 等信息,然后交由系统去分析这个Intent,并 ...
- LINQ Enumerable 续 II
Enumerable.TakeWhile和Enumerable.SkpWhile Enumerable.TakeWhile和Enumerable.SkpWhile将通过判断条件,来获取和跳过序列. T ...
- 启动android程序报错
提示错误如下: The connection to adb is down, and a severe error has occured. [2010-03-11 09:36:56 - HelloO ...
- Js打开新窗口拦截问题整理
一.js打开新窗口,经常被拦截 //js打开新窗口,经常被拦截 //指定本窗口打开,可以使用 window.open('http://www.tianma3798.cn', '_self'); //不 ...
- (转)关于c#中的事件
原文链接http://blog.csdn.net/joyhen/article/details/8500211 如有不明白的地方欢迎加QQ群14670545 探讨 最近在看委托,然后看到事件,以前一直 ...
- 给控制器添加工具栏(Swift语言)
//懒加载工具条 private lazy var toolBar: UIToolbar = UIToolbar() //设置底部的工具条 private func setToolBar() { // ...