您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何進行ElasticSearch大數(shù)據(jù)聚合統(tǒng)計,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
ElasticSearch相信有不少朋友都了解,即使沒有了解過它那相信對ELK也有所認識E即是ElasticSearch。ElasticSearch最開始更多用于檢索,作為一搜索的集群產(chǎn)品簡單易用絕對是一個非常不錯的選擇,其實本人早在ElasticSearch v0.2的時候就使用,一轉(zhuǎn)眼數(shù)年過去現(xiàn)在都7.X了。
其實ElasticSearch除了提供強大的集群化搜索服務外,它提供一個aggregation功能會再一次讓你受到它的強大,aggregation是一個數(shù)據(jù)統(tǒng)計匯總功能,表面上這功能在關(guān)系數(shù)據(jù)庫上也可以做,但結(jié)合分詞建維度就更能體現(xiàn)出它的靈活之處。
關(guān)系數(shù)據(jù)庫問題
拿產(chǎn)品訂單為例,它有產(chǎn)品分類,不同的規(guī)格,銷售人,客戶和地區(qū)等;然而這些信息在設計上都是歸納到不同的表中,如果要針對這些不同的信息來統(tǒng)計訂單銷售情況那相信是一件非常繁瑣和效率極其低下的工作(先不說數(shù)據(jù)數(shù)千萬了上億或更大規(guī)模,就算幾十上百萬數(shù)據(jù)這個關(guān)系數(shù)據(jù)的SQL查詢也夠受了)。即便可以把數(shù)據(jù)抽取并歸納起來做統(tǒng)計,但隨著新的數(shù)據(jù)維度增加新的維度字段重新調(diào)用。
無維度字段?
在數(shù)據(jù)統(tǒng)計每個維度都對一個信息列來存儲,這樣加入維度必須就需要添加信息列。如果用一個字段存儲所有維度信息呢?顯然這種想法在傳統(tǒng)關(guān)系數(shù)據(jù)庫中也不可能的,因為無法做表的關(guān)聯(lián)和維度區(qū)分,其實不要說傳統(tǒng)數(shù)據(jù)庫很多數(shù)據(jù)庫都無法在一個字符中拆分出不同的維度出來,除非加入程序來切分,但這種法在數(shù)據(jù)規(guī)模大的情況必然是不可取的!
如果用一個字段就能存儲所有維度,那就意味著以后加入新的維度數(shù)據(jù)也無須調(diào)整結(jié)構(gòu)和程序就實現(xiàn)新維護度數(shù)據(jù)的統(tǒng)計處理。這看上去多么美好,似乎也很難實現(xiàn),但ElasticSearch能解決這一問題。
試驗
首先ElasticSearch是一個搜索引擎,它最擅長的工作是對內(nèi)容進行分詞并構(gòu)建索引;在這機制下可以對一個字段的信息進行拆分并存儲到索引上。通過這一特性同樣可以把一個字段的信息切分成N個維度的信息,然后存儲到索引;只要有了單一的維度索引那接下來針對不同維護的匯總統(tǒng)計就簡單了。
在單節(jié)點的ElasticSearch上創(chuàng)建了5千萬條產(chǎn)品銷售數(shù)據(jù);然后Tag字段存儲對應的維度信息,每個維度通過/來區(qū)分,分別有:customer,employee,country和category.有了這些信息,接下來的工作是嘗試使用Aggr功能來完成相應的匯總
var query = db.Index.CreateQuery(); query.Prefix("Tag", "客戶");var aggs = db.Index.CreateAggs("customer_group", Elasticsearch.Search.AggsType.terms, "Tag"); aggs.SubAggs("sum_quantity", Elasticsearch.Search.AggsType.sum, "Quantity"); aggs.SubAggs("sum_total", Elasticsearch.Search.AggsType.sum, "Total"); aggs.Size(5); aggs.Query = query;var items = await aggs.Execute<OrderRecord>();
代碼并不復雜,查詢Tag標簽存在customer的數(shù)據(jù),并對它們進行一個分組,最后再匯總出對應的Quantity和Total信息;最后獲取排在最前面的5條數(shù)據(jù)。
效率
ElasticSearch做這方面的效率怎樣呢?部署在一個節(jié)點上,分別匯總了客戶,國家和員工。
5千萬條(單機單節(jié)點)
這個時間是在不停更新索引下同時做統(tǒng)計的結(jié)果,當在索引不更新的情況其二次處理效率會高上幾倍。
靜態(tài)歷史數(shù)據(jù)
上面紹了ElasticSearch對大數(shù)據(jù)一個聚合效率做了一個測試,那測試是基于動態(tài)數(shù)據(jù)測試,即在聚合測試的過程中同時大量更新索引數(shù)據(jù);接下來做的測試則是針對固定的歷史數(shù)據(jù),在聚合測試過程中不進行數(shù)據(jù)更新。
測試數(shù)據(jù)環(huán)境
5千萬條件產(chǎn)品銷售數(shù)據(jù),分布在2000-2020間,所有數(shù)據(jù)部署在單機雙節(jié)點的服務中。
測試過程
分別匯總每一年的員工,國家和分類數(shù)據(jù),并顯示最前面的3條記錄。
int top = 3;for (int i = 2000; i < 2020; i++) { DateTime start = new DateTime(i, 1, 1); DateTime end = new DateTime(i + 1, 1, 1);var result = await db.AggsTag("國家", top, start, end, null); Console.WriteLine($"| {result.Title} use {result.UseTime:###,###.00}ms"); Console.WriteLine($"|-{"".PadLeft(89, '-')}|");foreach (SummaryItem item in result.Items) { Print(item); } result = await db.AggsTag("分類", top, start, end, null); Console.WriteLine($"| {result.Title} use {result.UseTime:###,###.00}ms"); Console.WriteLine($"|-{"".PadLeft(89, '-')}|");foreach (SummaryItem item in result.Items) { Print(item); } result = await db.AggsTag("員工", top, start, end, null); Console.WriteLine($"| {result.Title} use {result.UseTime:###,###.00}ms"); Console.WriteLine($"|-{"".PadLeft(89, '-')}|");foreach (SummaryItem item in result.Items) { Print(item); } }
測試結(jié)果
從測試結(jié)果來看效率非常出色,每個年分類聚合統(tǒng)計所損耗的時候大概在0.1秒。
上述內(nèi)容就是如何進行ElasticSearch大數(shù)據(jù)聚合統(tǒng)計,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。