Esper學習筆記三:EPL語法(1)

1.EPL語法簡介

EPL全稱Event Processing Language,是一種相似SQL的語言,包含了SELECT, FROM, WHERE, GROUP BY, HAVING 和 ORDER BY子句,同時用事件流代替了table做爲數據源,而且能像SQL那樣join,filtering和aggregation。除了select,EPL也有insert into,update,delete,不過含義和SQL並非很接近。另外還有pattern和output子句,這兩個是SQL所沒有的。EPL還定義了一個叫view的東西,相似SQL的table,來決定哪些數據是可用的,Esper提供了十多個view,而且保證這些view能夠被重複使用。並且用戶還能夠擴展view成爲自定義view來知足需求。在view的基礎上,EPL還提供了named window的定義,做用和view相似,可是更加靈活。express

2.語法

大部分EPL語句都遵循如下格式數組

[annotations]
[expression_declarations]
[context context_name]
[insert into insert_into_def]
select select_list
from stream_def [as name] [, stream_def [as name]] [,...]
[where search_conditions]
[group by grouping_expression_list]
[having grouping_search_conditions]
[output output_specification]
[order by order_by_expression_list]
[limit num_rows]

3.時間週期

time-period : [year-part] [month-part] [week-part] [day-part] [hour-part] [minute-part] [seconds-part] [milliseconds-part]

year-part : (number|variable_name) ("years" | "year")
month-part : (number|variable_name) ("months" | "month")
week-part : (number|variable_name) ("weeks" | "week")
day-part : (number|variable_name) ("days" | "day")
hour-part : (number|variable_name) ("hours" | "hour")
minute-part : (number|variable_name) ("minutes" | "minute" | "min")
seconds-part : (number|variable_name) ("seconds" | "second" | "sec")
milliseconds-part : (number|variable_name) ("milliseconds" | "millisecond" | "msec")

時間範圍在EPL中的使用:app

select avg(price) from Fruit.win:time(5 minute 3 sec) //在5分3秒中統計price平均值。
select sum(account) from User output every 1 day //天天輸出一次計算結果

Esper規定每個月的天數都是30天,因此對準確性要求高的業務,以月爲單位進行計算會出現偏差的。函數

4.註解

EPL也能夠寫註解,種類很少,大部分簡單而有效ui

// 不包含參數或者單個參數的註解
@annotation_name [(annotation_parameters)]
 
// 包含多個屬性名-值對的註解
@annotation_name (attribute_name = attribute_value, [name=value, ...])
 
// 多個註解聯合使用
@annotation_name [(annotation_parameters)] [@annotation_name [(annotation_parameters)]] [...]

具體註解spa

1)@Name 指定EPL的名稱,參數只有一個。例如:@Name("MyEPL").net

2)@Description 對EPL進行描述,參數只有一個。例如:@Description("This is MyEPL")日誌

3)@Tag 對EPL進行額外的說明,參數有兩個分別爲Tag的名稱和Tag的值,用逗號分隔。例如:@Tag(name="author",value="luonanqin")code

4)@Priority 指定EPL的優先級,參數只有一個,而且整數(可負可正)。例如:@Priority(10)blog

5)@Drop 指定事件通過此EPL後再也不參與其餘的EPL計算,該註解無參數

6)@Hint 爲EPL加上某些標記,讓引擎對此EPL產生其餘的操做,會改變EPL實例的內存佔用,但一般不會改變輸出。其參數固定,由Esper提供

7)@Audit EPL添加此註解後,能夠額外輸出EPL運行狀況,有點相似日誌的感受(固然沒有日誌的功能全啦),具體使用場景在此先不提。

8)@Hook 與SQL相關,這裏暫且不說

9)@EventRepresentation 這是用來指定EPL產生的計算結果事件包含的數據形式。參數只有一個,即array=true或array=false。false爲默認值,表明數據形式爲Map,若爲true,則數據形式爲數組。

5.表達式

相似自定義函數,一般用Lambda表達式來創建的(也有別的方法創建),而Lambda表達式就一個「 => 」符號,表示「gose to」。符號的左邊表示輸入參數,符號右邊表示計算過程,計算結果就是這個表達式的返回值,即Expression的返回值。

語法:

expression expression_name { expression_body }

expression是關鍵字,expression_name爲expression的名稱(惟一),expression_body是expression的具體內容。

expression_body語法格式:

expression_body: (input_param [,input_param [,...]]) => expression

例如:

expression middle { x => (x.max+x.min)/2 } select middle(apple) from Apple as apple

x表示輸入參數,而x.max和x.min都是x表明的事件流的屬性,若是事件流沒這個屬性,expression的定義就是錯誤的。

express的定義必須在使用它的句子以前完成。使用時直接寫expression的名字和用圓括號包含要計算的參數便可。再次提醒,expression的參數只能是事件流別名,即apple,別名的定義就如上面那樣,事件流以後跟着as,而後再跟別名。

多個expression狀況

expression sumage { (x,y) => x.age+y.age } select sumage(me,you) from Me as me, You as you

全局表達式

對於expression裏用另外一個expression,EPL不容許在一個句子裏創建兩個expression,因此就出現了Global-Expression。普通的expression只做用於定義它的epl,如上面全部的包含select子句的epl就是如此。

create expression expression_name { expression_body }

和普通的expression相比,就是多了個create,不過他不能和別的子句放在一塊兒,即他是單獨執行的。

epService.getEPAdministrator().createEPL("create expression avgPrice { x => (x.fist+x.last)/2 }");

在expression使用全局expression

// 先定義全局的avgPrice
create expression avgPrice { x => (x.fist+x.last)/2 }
 
// bananaPrice Banana事件中包含了first和last屬性,不然將報錯
expression bananaPrice{ x => avgPrice(x) } select bananaPrice(b) from Banana as b

 

轉載:https://blog.csdn.net/luonanqin/article/details/11539221

相關文章
相關標籤/搜索