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”的选项。

【翻译】五步快速使用LINQPad尝鲜StreamInsight-LMLPHP

之后你会看到一些内置的驱动,包括LINQ-to-SQL和OData等。

【翻译】五步快速使用LINQPad尝鲜StreamInsight-LMLPHP

选择“View more drivers…”按钮,你会看到由微软创建的最新StreamInsight驱动。

【翻译】五步快速使用LINQPad尝鲜StreamInsight-LMLPHP

这个驱动安装时间大约200毫秒,然后你就可以在LINQPad驱动列表中看到它了。

【翻译】五步快速使用LINQPad尝鲜StreamInsight-LMLPHP

第四步:创建与StreamInsight驱动的新连接

如果窗口还处于打开状态选择驱动,否则回到LINQPad,选择“Add connection”,接下去在“Choose Data Context”向导页上点击Next按钮。现在你会看到一个标题为“StreamInsight Context Chooser”的弹出窗口,在其中你可以选择微软提供的数据集,也可以选择新的上下文。这里我选择Default Context

【翻译】五步快速使用LINQPad尝鲜StreamInsight-LMLPHP

第五步:编写简单的查询

现在我们连接到了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();

输出结果如下,注意只有两条记录输出。

【翻译】五步快速使用LINQPad尝鲜StreamInsight-LMLPHP

(译者注: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值相同事件的聚合。

【翻译】五步快速使用LINQPad尝鲜StreamInsight-LMLPHP

通过上面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源中包含的所有实体。

【翻译】五步快速使用LINQPad尝鲜StreamInsight-LMLPHP

现在让我们执行一个非常简单的查询。这个查询遍历所有的员工(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();

输出结果如下:

【翻译】五步快速使用LINQPad尝鲜StreamInsight-LMLPHP

*第七步:在Northwind数据之上增添StreamInsight查询能力

如果希望在一个特定窗口时间内,按照国家分类来查看员工的雇佣情况该怎么做呢?我们完全可以通过一个直接的LINQ查询做到,但是这样又有什么乐趣呢?言归正传,想想看在员工数据上使用实时分析能做出什么样的有趣事情,当然这个话题并不是这篇博文要谈的重点。

LINQPad仅允许一次使用一个数据上下文,因此想要同时使用OData源和StreamInsight查询,我们需要做一点变通。Mark Simms已经写了一篇颇有深度的文章来解释这个问题,这里我给出一个简短的版本。

右击包含OData查询的LINQPad查询选项卡,选择“Query Properties”,添加StreamInsight dll的引用。点击“Additional Reference”选项卡中的“Add”按钮,查找并选择Microsoft.ComplexEventProcessing.dllMicrosoft.ComplexEventProcessing.Observable.dll(如果看不到这两个dll的话,记得选中Show GAC Assemblies选项)。

【翻译】五步快速使用LINQPad尝鲜StreamInsight-LMLPHP

切换到“Additional Namespace Imports”选项卡,手工输入查询所需要的命名空间。

【翻译】五步快速使用LINQPad尝鲜StreamInsight-LMLPHP

现在我们准备在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();
}

查询的结果如下图:

【翻译】五步快速使用LINQPad尝鲜StreamInsight-LMLPHP

小结

现在你应该有所了解了!前面5个步骤大概可以在10分钟内完成,而剩下的星号步骤可以在另外5分钟内完成。

这是一个相当快速,低投资的方法来尝鲜一个强大产品。

05-04 08:00