Query查询
Query定义了Siddhi中的处理逻辑。它使用来自一个或多个流、命名窗口、表和/或命名聚合的事件,以流方式处理事件,并将输出事件生成到流、命名窗或表中。
目的
查询提供了一种方法,可以按照事件到达的顺序处理事件,并使用有状态和无状态的复杂事件处理和流处理操作生成输出。
语法
参数 |
说明 |
|
查询名称 |
|
来源流、命名窗口、表和/或命名聚合定义事件 |
|
使用select、function、aggregation function和group-by操作生成输出事件属性,并在发送之前使用have、limit&offset、order-by和output rate limiting操作过滤生成的输出。这里的是可选的,当它被省略时,所有输入事件都将按原样发送到输出。 |
|
输入到流、命名窗口或表 |
From
所有Siddhi查询必须始终至少有一个流或命名窗口作为输入(某些查询可以使用多个流或指定窗口),只有联接查询可以通过表或命名聚合使用事件作为第二个输入。在查询中使用输入流、命名窗口、表和/或命名聚合之前,应先定义它们。
语法
这里的<handler>表示使用过滤器、窗口和流函数的处理逻辑,join表示联接,->表示模式,和,表示序列。
Insert
允许将事件直接插入流、命名窗口或表中。
Value
Select
Function 函数
函数是预先配置的操作,可以消耗零个或多个参数,并始终产生一个值作为结果。它可以在任何可以使用属性的地方使用。
目的
它封装了预先配置的可重用执行逻辑,允许用户只需调用函数就可以在任何地方执行逻辑。这也使得编写SiddhiApp变得简单易懂。
语法
<namespace>和<function name>一起唯一地标识函数。<functi服务器托管网on
name>用于指定函数提供的操作,<namespace>用于标识函数所在的扩展。内置函数不属于命名空间,因此在定义时会省略<namespace>。<parameter>定义函数接受的输入参数。
以下是一些内置的Siddhi函数。
内置函数 |
说明 |
eventTimestamp |
返回事件的时间戳 |
currentTimeMillis |
返回SiddhiApp运行时的当前时间 |
default |
如果参数为null,则返回默认值 |
ifThenElse |
返回基于条件参数的参数 |
UUID |
生成UUID |
cast |
转换参数类型 |
convert |
转换参数类型 |
coalesce |
返回第一个非null的输入参数 |
maximum |
返回所有参数的最大值 |
minimum |
返回所有参数的最小值。 |
instanceOfBoolean |
检查参数是否为布尔值的实例 |
instanceOfDouble |
检查参数是否为Double的实例 |
instanceOfFloat |
检查参数是否为Float的实例 |
instanceOfInteger |
检查参数是否为Integer的实例 |
instanceOfLong |
检查参数是否为Long的实例 |
instanceOfString |
检查参数是否为String的实例 |
createSet |
使用给定的输入参数创建哈希集 |
sizeOfSet |
返回作为参数传递的HashSet中的项数 |
例子
名为ifThenElse的函数接受三个输入参数,第一个参数是布尔条件price>700,第二个和第三个参数是if case“high”和else case“low”的输出。
Filter 过滤
目的
有助于选择与处理相关的事件,并忽略与处理无关的事件
语法
例子
Stream Function流函数
流函数处理通过输入流(或命名窗口)到达的事件,以生成零个或多个新事件,每个事件具有一个或更多个附加输出属性。与标准函数不同,它们直接在流或(或命名窗口)上操作,并可以通过生成事件的预定义属性添加函数输出。
目的
当一个函数为给定的输入参数产生多个输出时,流函数很有用。在这种情况下,输出被添加到事件中,使用具有预定义属性名称的新引入的属性。
语法
内置流函数
内置流函数 |
描述 |
pol2Cart |
该函数用于把极坐标(柱坐标)转换为笛卡尔坐标(指平面直角坐标或空间直角坐标) |
例子
Window 窗口
Windows从输入流中捕获事件的子集,并根据指定的标准将其保留一段时间。该标准定义了应在何时以及如何从窗口中逐出事件。例如,根据持续时间或窗口中事件的数量,事件被逐出
目的
Windows有助于根据标准保留事件,这样,如果感兴趣的事件在窗口中,则可以聚合、关联或检查这些事件的值。
语法
注:过滤条件和流函数可以在窗口之前和/或之后应用。
内置窗口
内置窗口 |
描述 |
time |
以滑动方式基于时间保留事件 |
timeBatch |
以翻滚/批处理方式基于时间保留事件 |
length |
根据事件数量以滑动方式保留事件 |
lengthBatch |
以翻滚/批处理方式根据事件数保留事件 |
timeLength |
根据时间和事件数量以滑动方式保留事件 |
session |
根据会话密钥保留每个会话的事件 |
batch |
保留上次到达的事件块的事件 |
sort |
基于参数值保留前k个或后k个事件 |
cron |
以翻滚/批处理方式基于cron时间保留事件 |
externalTime |
根据以滑动方式作为参数传递的事件时间值保留事 |
externalTimeBatch |
基于以翻滚/批处理方式作为参数传递的事件时间值保留事件 |
delay |
保留事件并以滑动方式将输出延迟给定时间段 |
例子1
从TempStream流中查询最近10个事件中的最高温度,并将结果插入MaxTempStream流。
例子2
从TempStream流中查询每10个事件中的最高温度,并将结果插入MaxTempStream流。
例子3
从TempStream流中查询最后10分钟内到达的事件的最高温度,并将结果插入MaxTempStream流。
例子4
从TempStream流中查询每10分钟到达一次的事件的最高温度,并将结果插入MaxTempStream流。
例子5
使用唯一扩展中的时间窗口进行查询,以找出在过去1分钟内到达的设备ID的唯一数量,并将结果插入UniqueCountStream流中。
Event Type事件类型
查询输出取决于查询根据其内部处理状态生成的当前和过期事件类型。默认情况下,所有查询都会在事件到达时生成当前事件。当事件从这些窗口过期时,包含窗口的查询还会生成过期事件。
目的
事件类型有助于识别事件是如何产生的,并指定查询应在何时将此类事件输出到输出流,例如仅在新事件到达查询时、在事件从窗口过期时或在这两种情况下输出处理的事件。
语法
事件类型应在insert和into关键字之间定义,用于insert查询,如下所示。
事件类型应定义在用于删除查询的for关键字旁边,如下所示
事件类型应在更新查询的for关键字旁边定义,如下所示
事件类型应定义在for关键字旁边,用于更新或插入查询,如下所示
可以使用以下关键字来定义事件类型以操作查询输出
事件类型 |
描述 |
current events |
仅在新事件到达查询时输出已处理的事件。这是未指定特定事件类型时的默认行为。 |
expired events |
仅在事件到期时从窗口输出已处理的事件 |
all events |
当新事件到达查询时以及当事件从窗口过期时输出已处理的事件 |
例子
查询以仅在事件从1分钟时间窗口到期时将已处理的事件输出到DelayedTempStream流。此查询有助于将事件延迟一分钟。
Aggregate Function 聚合函数
目的
聚合函数封装了预先配置的可重用聚合逻辑,允许用户将多个事件的值聚合在一起。当与批处理/翻滚窗口一起使用时,这也将减少生成的输出事件的数量。
语法
以下是一些内置的聚合函数
内置函数 |
描述 |
sum |
根据一组值计算总和 |
count |
根据一组值计算计数 |
distinctCount |
基于一组值中的参数计算不同计数 |
avg |
平均数 |
max |
最大数 |
min |
最小数 |
maxForever |
从所有事件的整个生命周期中查找最大值,而不考虑窗口 |
minForever |
从所有事件的整个生命周期中查找最小值,而不考虑窗口 |
stdDev |
计算一组值的标准偏差 |
and |
和 |
or |
或 |
unionSet |
通过统一一组值来构造一个集合 |
Group By
目的
Group By有助于按组合键为每个给定组独立执行聚合功能。
语法
例子
查询以滑动方式计算最后10分钟时间窗口内每个房间的平均温度roomNo和deviceID组合,来自TempStream流中的事件。
Having
目的
有助于根据select子句生成的属性选择与输出相关的事件,并省略不相关的事件。
语法
Order By
目的
Order By有助于对查询输出块中的事件进行排序。只有当查询同时输出大量事件时(例如在批处理窗口中),Order By才会有效,而不是在每次只发出一个事件的滑动窗口中。
语法
例子
查询以计算每10分钟批处理的每个roomNo和设备ID组合的平均温度,并按avgTemp升序排列生成的输出事件,然后按roomNo降序排列(如果有更多事件具有相同的avgTemp值),然后将其发送到AvgTempStream流。
Limit & Offset
目的
“限制和偏移”有助于仅输出大型事件批次中选定的一组事件。这对于Order By子句非常有用,在Order By子句中,可以对输出进行排序并提取topK或bottomK事件,甚至可以使用它通过从中间获取一组事件来对数据集进行分页。
语法
例子1
查询以根据到达TempStream流的事件计算每10分钟批次的平均温度(每个房间编号和设备ID组合),并仅发出两个具有最高avgTemp值的事件。
例子2
查询以计算到达TempStream流的事件每10分钟批次的平均温度、每个房间的编号和设备ID组合,并根据其avgTemp值按降序排序时仅发出第三、第四和第五个事件。
Stream Processor 流处理器
流处理器是流函数和窗口的组合。它们直接在输入流(或命名窗口)上工作,生成零个或多个具有零个或更多附加输出属性的新事件,同时能够保留和任意发出事件。它们比流函数更高级,因为它们可以保留和任意发出事件;它们比窗口更高级,原因是它们可以为事件添加额外的属性。
目的
流处理器有助于实现其他结构(如函数、聚合函数、流函数和窗口)无法实现的复杂执行逻辑。
语法
内置流处理器
内置流处理器 |
描述 |
log |
记录日志 |
Join (Stream)
联接根据指定的条件实时组合来自两个流的事件。
目的
Join提供了一种关联两个流的事件的方法,此外还可以根据定义的窗口聚合它们。
两个流不能直接连接,因为它们是无状态的,并且不保留事件。因此,每个流都需要与一个用于加入的窗口相关联,因为它可以保留事件。Join还接受一个条件,将事件与每个事件流窗口相匹配。
在加入过程中,每个流的每个传入事件都基于给定条件与另一个流的窗口中的所有事件相匹配,并且为所有匹配的事件对生成输出事件。
语法
在这里,这两个流都可以有可选的非窗口处理程序(过滤器、流函数和流处理器),然后是与它们相关联的窗口。它们还可以在on关键字旁边有一个可选的<join
condition>,以匹配两个窗口中的事件,从而生成组合输出事件。
支持的联接类型
Inner join (join)
Left outer join
Right outer join
Full outer join
例子1(join)
一个查询,用于在StockStream流上最后10分钟到达的事件和TwitterStream流上最近20分钟到达的活动中存在具有相同符号和companyID组合的匹配事件时生成输出。
例子2(with no join condition)
一个查询,用于从StockStream流的最后5个事件和TwitterStream流上最后1分钟内到达的事件中生成所有可能的事件组合的输出。
例子3(left outer join)
用于为到达StockStream流的所有事件生成输出的查询,而不管在TwitterStr服务器托管网eam流上最后20分钟到达的事件中是否存在符号的匹配companyID,并且仅当在StockStream流上最后10分钟内到达的事件中存在matchine符号和companyID组合时,才为到达StockStream流的事件生成输出。
例子4(full outer join)
一个查询,用于为StockStream流和TwitterStream流中的所有事件生成输出,而不管其他流窗口中是否存在符号的匹配companyID。
例子5(unidirectional join)
只有当事件到达StockStream流时才生成输出的查询才能找到与TwitterStream流上最后20分钟到达的事件具有相同符号和companyID组合的匹配事件。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
这是一篇较为详细的混沌工程调研报告,包含了背景,现状,京东混沌工程实践,希望帮助大家更好的了解到混沌工程技术,通过混沌工程实验,更好的为系统保驾护航。 一、概述 1.1 研究背景 Netflix公司最早系统化地提出了混沌工程的概念。2008年8月,Netfli…