Esper文檔-第2章基本概念

2.1。介紹

第J.11節「.NET基本概念」

語句是連續查詢,用於分析事件和時間以及檢測情境。

您經過編譯和部署包含語句的模塊,經過發送事件和提早時間以及經過回調接收輸出或輪詢當前結果來與Esper交互。


運行時包含以下語句:


第4章,
上下文和上下文分區

未隱式分區的語句具備一個分區。
部署未分區語句後,運行時將分配單個分區。
取消部署未分區的語句後,運行時會破壞分區。

分區(或
上下文分區
)是運行時保持狀態的位置。
在上圖中,有三個未分區的語句和一個具備三個分區的分區語句。

接下來的部分將討論各類易於理解的陳述。
這些部分說明了語句的行爲方式,運行時傳遞給回調的信息(輸出)以及運行時爲語句記住的信息(
狀態
,全部狀態都存在於分區中)。
示例語句假定
Withdrawal
具備
account
amount
屬性的
名稱的事件類型

2.3。基本聚合

第10.2節「聚合函數」

此語句選擇全部提款事件的計數和總數。

從提款中選擇計數(*),總和(金額)複製代碼

在新
Withdrawal
事件到達時,運行時會增長計數並將金額添加到運行總計中。
它將新計數和總計傳遞給回調。
以後,運行時會有效地忘記當前事件,而且根本不記得任何事件,但會記住當前計數和總計。


這裏,運行時只記住當前事件數和總量。
count是單個long-type值,total是單個double-type值(假設
amount
是double值,total能夠是
BigDecimal
適用的)。
該語句不是無狀態的,狀態由長類型值和雙類型值組成。

在新
Withdrawal
事件到達時,運行時將計數增長1並將該數量添加到運行總計中。
運行時不會從新計算計數和總數,由於它不記得事件。
一般,運行時不會從新計算聚合(除非另有說明)。
相反,運行時將數據添加(遞增,輸入,累積)到聚合狀態,並從聚合狀態中減去(遞減,移除,減小,減小)。

2.4。基本過濾器

第5.4.1節「基於過濾器的事件流」

此語句選擇
Withdrawal
金額爲200或更高的事件:

select * from Withdrawal(金額> = 200)複製代碼

Withdrawal
到達量爲200或更高
的新
事件時,運行時將到達事件傳遞給回調。


對於此語句,運行時不會記住任何信息,也不記得任何事件。

你可能會問,對於
Withdrawal
數量少於200的事件
會發生什麼
。答案是聲明自己甚至看不到這樣的事件。
這是由於運行時知道當即丟棄此類事件,而且該語句甚至不知道此類事件。
運行時經過語句分析,計劃和適當的數據結構很是快速地丟棄不須要的事件。

2.6。基本數據窗口

數據窗口
,或
窗口
的簡稱,保存用於聚合的目的活動,加入,匹配識別模式,子查詢,經由API和輸出快照迭代。
數據窗口定義要保留的事件子集。
例如,長度窗口保留最後N個事件,時間窗口保持最後N秒事件。
有關
詳細信息

此語句選擇全部
Withdrawal
事件並指示運行時記住最後五個事件。

select * from Withdrawal #length(5)複製代碼

在新
Withdrawal
事件到達時,運行時將事件添加到長度窗口。
它還將相同的事件傳遞給回調。


在事件W
6
到達時
,事件W
1
離開長度窗口。
咱們使用術語
expires
來表示事件離開數據窗口。
咱們使用術語
刪除流
來描述離開數據窗口的事件流。

運行時總共記住最多五個事件(最後五個事件)。
在語句開頭,數據窗口爲空。
保持最後五個事件自己可能聽起來不太有用。
可是,與鏈接,子查詢或匹配識別模式相關聯,例如數據窗口告訴運行時您要查詢哪些事件。

2.7。基本數據窗口和聚合

Withdrawal
事件
的計數和總數

從提款中選擇計數(*),總和(金額)#長度(5)複製代碼

Withdrawal
事件到達時,運行時將事件添加到長度窗口,將計數增長1並將該量添加到當前總量。
Withdrawal
事件離開數據窗口時,運行時將計數減1,並從當前總量中減去其數量。
它將運行計數和總數傳遞給回調。


在事件W
6
到達以前,
當前計數爲5,而且運行總量爲1000.在事件W
6
到達時,發生
如下狀況:

  1. 運行時肯定事件W
    1
    離開長度窗口。

  2. 爲了考慮新事件W
    6
    ,運行時將計數增長1並將運行總量加300。

  3. 爲了考慮到期事件W
    1
    ,運行時將計數減1並從運行總量中減去500。

  4. 輸出結果爲5,結果總計爲800
    1000 + 300 - 500

運行時添加(遞增,輸入,累積)插入流事件到聚合狀態,並減去(遞減,刪除,減小,減小)從聚合狀態中刪除流事件。
所以,它以遞增的方式維護聚合狀態。

對於此聲明,一旦計數達到5,計數將始終保持爲5。

運行時爲此語句記住的信息是最後五個事件以及當前的長類型計數和雙類型總計。

小費

使用
irstream
關鍵字接收聚合語句的當前聚合值和先前聚合值。

2.9。基本的Where-Clause

....
意味着任何select子句表達式)
,如下兩個語句徹底等效

選擇....從提款(金額> 200)
// 至關於
選擇....從提款金額> 200複製代碼

第5.5節「指定搜索條件:Where子句」

select * from Withdrawal#length(5)其中amount> = 200複製代碼

where子句適用於新事件和到期事件。
只有傳遞where子句的事件纔會傳遞給回調。


2.10。基本時間窗口和聚合

第14.3.3節「時間窗口(時間或獲勝:時間)」

Withdrawal
考慮到事件的最後四秒,
下一個語句選擇
事件
的計數和總量

選擇計數(*),總和(金額)做爲提取的總數#time(4)複製代碼

該圖開始於一個給定的時間
t
,並在顯示時間窗口中的內容
t + 4
t + 5 seconds
等。


活動如圖所示:

  1. t + 4 seconds
    事件
    到達時,輸出計數爲1,總計爲500。
    W1

  2. t + 5 seconds
    事件
    到達時,輸出計數爲2,總計爲600。
    W2

  3. t + 6.5 seconds
    事件
    到達時,輸出爲三個,總計爲800。
    W3

  4. 在時間
    t + 8 seconds
    事件
    到期而且輸出是2的計數和總計300。
    W1

對於此語句,運行時會記住
Withdrawal
事件
的最後四秒
以及長類型計數和雙重類型總計。

小費

時間能夠有毫秒或微秒的分辨率。

2.11。基本分區聲明

第4章「
上下文和上下文分區」

咱們將有一個當即啓動並在四秒後結束的分區:

建立上下文Batch4Seconds在4秒後開始@now結束複製代碼

接下來的語句選擇的數量和總金額
Withdrawal
自上次復位(復位是在那個趕到活動
t
t+4
t+8
如等等),重置每4秒:

context Batch4Seconds從提取中選擇count(*),total(amount)複製代碼

在時間
t + 4 seconds
t + 8 seconds
運行時會破壞當前分區。
這會丟棄當前計數和運行總計。
運行時當即分配一個新分區,計數和總開始時間爲零。

對於此語句,運行時僅記住計數和運行總計,以及分區的生存時間。

2.13。基本分區和輸出率限制聲明

Withdrawal
四秒結束時最後四秒內到達
事件
的計數和總數
,在輸出後重置:

建立上下文Batch4Seconds在4秒後開始@now結束複製代碼
context Batch4Seconds選擇count(*),從終止時的提取輸出中獲取的總數(金額)複製代碼

在時間
t + 4 seconds
t + 8 seconds
運行時將最後的聚合值輸出到回調,並重置當前計數和總計。

對於此語句,運行時僅記住計數和運行總計,以及輸出發生時的事實以及分區的生存時間。

2.14。基本命名的Windows和表

第6章,
EPL參考:命名的Windows和表
能夠經過API以及面向內部的JDBC驅動程序查詢命名窗口和表格,使用「即發即棄」查詢。

2.14.1。命名爲Windows

from
-clause
中具備命名窗口名稱的其餘語句
隱式聚合或分析同一組事件。
這消除了爲不一樣的EPL語句屢次聲明相同學口的須要。


步驟#1
建立一個命名窗口,以下所示:

建立窗口取款窗口#time(10)做爲提款複製代碼

命名窗口的名稱是
WithdrawalWindow
,它將保存最後10秒的
Withdrawal
事件(
#time(10) as Withdrawal
)。

做爲步驟#1的結果,運行時分配一個命名窗口來保存10秒的
Withdrawal
事件。
在圖形中,命名窗口充滿了一些事件。
一般,一個命名窗口以一個空窗口開始,但它看起來更好,內部已有一些盒子。

步驟#2
建立一個EPL語句以插入到命名窗口中:

on Withdrawal merge WithdrawalWindow insert select *複製代碼

這告訴運行時,在
Withdrawal
事件
到達時
它必須
WithdrawalWindow
與插入事件
合併
運行時如今等待
Withdrawal
事件到達。

步驟#3
建立一個EPL語句,該語句計算由命名窗口控制的事件子集的平均提取量:

從WithdrawalWindow中選擇avg(amount)做爲avgAmount複製代碼

做爲步驟#3的結果,運行時分配狀態以保持當前平均值。
狀態由
count
字段和
sum
字段
組成,
用於計算運行平均值。
它肯定命名窗口當前爲空並將其設置
count
爲零而且設置
sum
爲null(若是命名窗口已經填充,則它將肯定
count
sum
經過迭代)。
在內部,它還使用命名窗口註冊消費者回調,以接收插入和刪除的事件(插入和刪除流)。
回調在圖中顯示爲虛線。

在步驟#4中,
假設
Withdrawal
到達具備賬號
0001
和金額的事件
5000
運行時執行
on Withdrawal merge WithdrawalWindow insert select *
並所以將事件添加到時間窗口。
運行時爲全部使用者調用插入流回調(虛線,內部管理的回調)。
計算平均金額的消費者接收回調和新插入的事件。
它將
count
字段
增長
1並增長
sum
字段
5000
聲明的輸出
avgAmount
5000

在步驟#5中
,在步驟#4以後10秒
Withdrawal
發生,賬戶
0001
和金額
事件
5000
離開時間窗口。
運行時爲全部使用者調用刪除流回調(虛線,內部管理的回調)。
計算平均金額的消費者會收到回調和新刪除的事件。
它減小了
count
一個字段並將
sum
null
count
是零。
聲明的輸出
avgAmount
null

2.14.2。表

window
sorted
聚合)或count-min-sketch(存儲近似值的一組哈希表)。
您的應用程序能夠輕鬆擴展並提供本身的聚合。


步驟#1
建立一個以下表格:

create table AccountAverages(賬戶字符串主鍵,avgAmount avg(double))複製代碼

已經表
string
-typed帳戶號碼做爲主鍵。
該表還有一個包含平均值
double
類型
的列
注意如何
create table
不須要知道平均值如何更新,它只須要知道平均值是平均值
double
類型。

做爲步驟#1的結果,運行時分配表。
在圖紙中,表格填充了兩行,用於兩個不一樣的賬號
0001
0002
一般,表以空表開始,但咱們假設表已經有了行。

爲了存儲平均值的雙精度值,運行時必須保持計數和總和。
所以,在
avgAmount
該表的列有字段的
count
sum
對於帳戶
0001
假設目前尚未值,而且
count
是零和
sum
IS
null

步驟#2
建立一個EPL語句,聚合提取事件的最後10秒:

進入表AccountAverages
選擇avg(amount)做爲avgAmount
來自退出#time(10)
按賬戶分組複製代碼

into table
本地沒有告訴編譯器來存儲聚合做爲語句的一部分,但到
AccountAverages
表代替。
as avgAmount
告訴編譯器使用的列
avgAmount
在表中。
編譯器檢查聚合類型和值類型是否與表列匹配,而且
group by
-clause與表主鍵匹配。

運行時查找
Withdrawal
事件並保持10秒的時間窗口。
一般,時間窗口以空時間窗口開始,但圖形顯示時間窗口中的一些事件。

在步驟#3中,
假設
Withdrawal
事件到達,其賬號
0001
和金額爲
5000
運行時將事件添加到時間窗口。
運行時更新
avgAmount
列,特別是兩個字段
count
sum
它將
count
字段
增長
1並增長
sum
字段
5000
在賬號的行不存在的狀況下,運行時分配錶行及其列和聚合字段。

在步驟#3
以後10秒發生的步驟#4中,
Withdrawal
賬戶
0001
和金額
事件
5000
離開時間窗口。
運行時更新
avgAmount
列。
它減小了
count
一個字段並將
sum
null
做爲
count
爲零。

其餘EPL語句能夠經過將表放入
from
-clause,或經過table-access-expression,on-action語句或fire-and-forget查詢
來訪問表列

2.15。基本聚合語句類型

第5.6.4節「爲每一個聚合函數指定分組」
該文檔提供了
附錄A,
輸出參考和樣本中
語句類型的
輸出示例
,接下來的部分概述了每種語句類型。

如下示例假定
BankInformationWindow
是在其餘地方定義的命名窗口。
這些示例使用鏈接來講明。
第5.12節「加入事件流」
中進一步描述了
鏈接

2.15.2。徹底聚合和未分組

選擇金額(金額) 
來自提取單向,BankInformationWindow複製代碼

Withdrawal
事件進入時,輸出行的數量始終爲零或一。

第A.3節「徹底聚合和未分組語句的輸出」中的

group_by
例如
sum(amount, group_by:account)
若是任何聚合函數指定
參數和維度
,則該語句將做爲聚合和分組語句執行。

2.15.4。徹底聚合和分組

select
子句中的
全部非聚合屬性
都列在
group by
子句中,那麼您的語句可能相似於此示例:

選擇賬戶,總和(金額) 
來自提取單向,BankInformationWindow
按賬戶分組複製代碼

Withdrawal
事件進入時,每一個惟一賬號的輸出行數爲一行。

第A.5節「徹底聚合和分組語句的輸出」中的

例如,若是任何聚合函數指定
group_by
參數和維度之外的
group by
維度
sum(amount, group_by:accountCategory)
,則該語句將做爲聚合和分組語句執行。

2.17。基本的EPL模式

每一個StockTickEvent(符號=「IBM」,價格> 80)其中計時器:在(60秒)內複製代碼

每一個計時器:at(5,*,*,*,*)複製代碼

A  - >(B或C)複製代碼

每一個a = EventX  - >每一個b = EventY(objectID = a.objectID)複製代碼

2.18。基本索引

2.18.2。過濾索引

過濾器
過濾條件
來表示選擇謂詞,例如
symbol=「google」 and price > 200 and volume > 111000
語句在
from
-clause和/或EPL模式和/或上下文聲明中
提供過濾條件
請參見
第5.4.1節「基於過濾器的事件流」
第7.4節「模式中的過濾器表達式」
第4.2.7.1節「過濾上下文條件」

Big-O表示法縮放信息能夠在
第23.1.1節「匹配事件到語句和上下文分區的大O複雜性」中找到

當運行時接收到事件時,它會查詢過濾器索引以肯定哪些語句(若是有)必須處理該事件。

過濾索引的目的是啓用:

  • 事件的有效匹配僅適用於那些須要它們的語句。

  • 高效丟棄任何聲明不須要的事件。

  • 最佳狀況下的有效評估大約爲O(1)到O(log n),即在最佳狀況下,在大體相同的時間內執行,而無論輸入數據集的大小是有效濾波器的數量。

過濾器索引構建是編譯器分析
from
-clause和EPL模式中
的過濾條件的結果
它由運行時自動完成。

當在
from
-clause或pattern中
發生此類事件類型時,運行時爲每一個事件類型構建和維護單獨的過濾器索引集
篩選索引在同一事件類型篩選器中是可共享的。
所以
from
,引用相同事件類型的
各類
-clauses和模式能夠貢獻於同一組過濾器索引。

運行時以嵌套方式構建過濾器索引:過濾器索引可能包含更多過濾器索引,造成樹狀結構,過濾器索引樹。
索引的嵌套超出了此處提供的介紹性討論。

2.18.2.1。篩選索引多語句示例

from
聲明中
-clause,在特殊狀況下,
where
-clause
提供編譯器分析的篩選條件,併爲其構建篩選索引。

WithdrawalEvent
有一個
account
字段。
您能夠建立三個語句,以下所示:

@name('A')select * from WithdrawalEvent(account = 1)複製代碼
@name('B')從WithdrawalEvent(account = 1)中選擇*複製代碼
@name('C')從WithdrawalEvent(account = 2)中選擇*複製代碼

WithdrawalEvent
的是有一個事件
account
的聲明1. I2C寄存器中的感興趣的值
WithdrawalEvent
具備一個事件
account
的2值。


Withdrawal
事件到達時,運行時將提取
account
並執行上表中的查找。
若是表中沒有匹配的行,例如當
account
爲3時,運行時知道該事件沒有進一步處理。

2.18.2.2。過濾索引模式示例

WithdrawalEvent
另外一個
示例模式
WithdrawalEvent
account

@name('P')select * from pattern [every w1 = WithdrawalEvent  - > w2 = WithdrawalEvent(account = w.account)]複製代碼

WithdrawalEvent
事件。
目前只有一個有效過濾器:

WithdrawalEvent
W
a
到達。
而後運行時激活一個過濾器,
WithdrawalEvent
爲賬戶1
尋找另外一個過濾器
。此時有兩個活動過濾器:

WithdrawalEvent
W
b
到達。
而後運行時激活一個過濾器,
WithdrawalEvent
爲賬戶1
尋找另外一個過濾器
。此時有三個活動過濾器:

WithdrawalEvent
W
c
到達。
而後運行時激活一個過濾器,
WithdrawalEvent
爲賬戶2
尋找另外一個過濾器
。此時有四個活動過濾器:

a
,W
b
和W
c
事件到達
後模式的示例過濾器索引


Withdrawal
事件到達時,運行時將提取
account
並執行上表中的查找。
若是找到匹配的行,則運行時能夠將事件切換到相關的模式子表達式。

2.18.2.3。過濾索引上下文示例

LoginEvent
有一個
account
字段。
您能夠
LoginEvent
爲用戶
聲明由a啓動的上下文

@name('A')建立由LoginEvent做爲loginEvent啓動的上下文UserSession複製代碼

LoginEvent
,例如:

@name('B')上下文UserSession從WithdrawalEvent中選擇count(*)(account = context.loginEvent.account)複製代碼

LoginEvent
事件。
目前只有一個有效過濾器:

LoginEvent
L
a
到達。
而後運行時激活語句B的上下文分區,所以過濾器查找
WithdrawalEvent
賬戶1.此時有兩個活動過濾器:

LoginEvent
L
b
到達。
而後運行時激活語句B的上下文分區,所以過濾器查找
WithdrawalEvent
賬戶1.此時有三個活動過濾器:

LoginEvent
L
c
到達。
而後運行時激活語句B的上下文分區,所以過濾器查找
WithdrawalEvent
賬戶2.此時有四個活動過濾器:


Withdrawal
事件到達時,運行時將提取
account
並執行上表中的查找。
而後,它能夠將事件直接傳遞給相關的語句上下文分區,或者若是找不到給定賬戶ID的行,則忽略該事件。

2.18.3。事件索引

第23.1.3節「鏈接的Big-O複雜性,子查詢,On-Select,On-Merge,On-Update,On-Delete」中找到

因爲事件索引與數據庫索引相似,所以對於本討論,咱們使用術語
來表示EPL表或命名窗口中的列,而且還表示事件屬性或字段。
咱們使用術語
來表示EPL表或命名窗口中的行,也表示事件。

當運行時執行語句處理時,它可使用事件索引來有效地查找相關行。

事件索引的目的是啓用:

  • 有效評估子查詢。

  • 有效評估鏈接。

  • 有效評估行動聲明。

  • 有效評估即發即棄查詢。

事件索引構建是編譯器分析鏈接的
where-
子句關聯條件(
on-
外鏈接子句),子查詢,on-action和fire-and-forget查詢的結果。
它由編譯器自動完成。
您可使用該
create index
子句顯式索引命名的窗口和表。
您可使用查詢計劃器提示來影響索引構建,使用和共享。

2.19。基本無效

true
false
,表達式的結果也多是未知的。
三值邏輯是支持
null
標記缺失數據的結果。
若是
null
值影響邏輯表達式的結果,則結果既不是也不
true
false
未知。

null
值基本上意味着「能夠是任何東西」。
所以,不可能講的比較是否
null
true
false
這是第三個未知的邏輯值進入的地方。未知意味着「真或假,取決於空值」。

null
(未知):

null = 1複製代碼
null <> 1複製代碼
null> 1複製代碼
null = null複製代碼

等於
null。
甚至不
null
等於
null
由於每一個
null
均可能不一樣。
這就是爲何EPL有
is null
謂詞來測試值是否爲空。
相關文章
相關標籤/搜索