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
大部分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]
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天,因此對準確性要求高的業務,以月爲單位進行計算會出現偏差的。函數
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,則數據形式爲數組。
相似自定義函數,一般用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