iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 28
0
Elastic Stack on Cloud

Elastic 30天自我修行系列 第 28

讀同組鐵人賽參賽者文章的心得筆記#2-聚合操作

試用期只剩1天! 意思是表示鐵人賽快要忙完了。
真佩服其他神人的分享精神,我自己覺得我只是每天抽出一點時間來發文而已,但有些神人感覺是在燃燒小宇宙。

https://ithelp.ithome.com.tw/upload/images/20200928/20130033hIedpqTzHC.png

今天閱讀的是這篇鐵人賽,然後用作者的教學資料與自己之前的企鵝資料實作。
Elastic Stack第十一重

首先建議用 Dev Tools (Console) 進行開發,因為它有智慧提示功能。

像是欄位名稱的提示:
https://ithelp.ithome.com.tw/upload/images/20200928/20130033JEw5nwapWy.png

這邊另外要注意:GET/PUT/POST/DELETE 指令與 JSON中間不要留有空白

https://ithelp.ithome.com.tw/upload/images/20200928/201300339NawAevABz.png

如果你像我笨笨的多了一行空白 ↓↓↓↓ ,錯誤示範:

https://ithelp.ithome.com.tw/upload/images/20200928/20130033WiWwmKExie.png

Console 執行時會理解為單純的 "GET /df_penguins/_search" 指令,而不理會後面 JSON 檔案中的聚合查詢。所以我花了不少時間去測試為什麼別人的 bank 資料可以回傳聚合值,我的企鵝資料卻無法回傳聚合值。明明檢查 mapping 的型式也幾乎相同啊。結果是自己笨... /images/emoticon/emoticon02.gif

在 Console 確認程式碼OK後,再讓我們到 R 透過 Elastic 套件進行聚合查詢吧

library(elastic)
library(palmerpenguins) # 企鵝資料集
library(data.table) # 資料整理
library(ggplot2) # 畫圖神器


# Connect OK!

x <- connect(
  host = "111.asia-east1.gcp.elastic-cloud.com",
  path = "",
  user = "elastic",
  pwd = "111",
  port = 9243,
  transport_schema = "https"
)

# 如果還沒有上傳資料記得使用 docs_bulk( ) 進行上傳
# docs_bulk(x, penguins, "df_penguins")

# 銀行的分群計算範例
# 等價 SQL:(select  island count(*) from bank2 group by state )
aggs <- ' 
{ "aggs": {
    "group_by_state": { 
      "terms": {  
        "field": "state.keyword"  
      }
    }
  }
}'

# 回傳 list 資料,回傳為了簡單點可以直接 $ 取值
Search( conn =x , index = "bank2" ,  body = aggs , size = 0)$aggregations$group_by_state$buckets


# 企鵝的分群計數範例
# 等價 SQL:(select  island , count(*) as group_by_island from df_penguins group by island )

aggs2 <- ' 
{
  "aggs": {
    "group_by_island": { 
      "terms": {  
        "field": "island.keyword"  
      }
    }
  }
}
'

island_counts <- Search( conn =x , index = "df_penguins" ,  body = aggs2 , size = 0)$aggregations$group_by_island$buckets 

# list 轉成 data.table 格式
island_counts_dt <- rbindlist(island_counts)

#         key doc_count
# 1:    Biscoe       168
# 2:     Dream       124
# 3: Torgersen        52



# 最後使用 ggplot2進行圖形繪製
ggplot(data =island_counts_dt , aes( x= key , y = doc_count) ) + geom_bar(stat="identity")


最後使用 ggplot2 畫出企鵝在各島上的分布數量。

https://ithelp.ithome.com.tw/upload/images/20200928/20130033t63OuwU7UO.png

也許有人會說,這麼簡單的東西,有需要使用 ElasticSearch 操作嗎? 因為企鵝資料集是結構化的資料啊;如果今天是很複雜的文字尋找過濾後進行計數。雖然在 R 或 Python 中可以透過正規表達式硬幹,但終究不是可以高度處理大資料的架構。

另外,真心建議雖然 ElasticSearch 是處理非結構化資料的利器。但在學習階段,還是先透過小型的結構化資料進行學習哦....否則你的信心會喪失的飛快的。


上一篇
讀同組鐵人賽參賽者文章的心得筆記#1
下一篇
透過 R 轉換 ND JSON 格式上傳至 Elastic Search
系列文
Elastic 30天自我修行31

尚未有邦友留言

立即登入留言