elasticsearch xpack sql group by 如何對時間按年月日進行分組查詢
阿新 • • 發佈:2019-01-11
ES從6.3開始已經支援SQL了,當然還有很多不完善的地方,比如對於巢狀查詢,連表查詢,但是對於單表而言,提供的SQL已經基本夠用了。
這裡只講一下我在實際業務中遇到的一個問題,運營那邊想要對時間進行分組查詢,可以按年或是月或是日進行分組,為了能滿足運營那邊的要求,自己研究了一下在ES中group by的使用方式。
首先當然是網上google了一下,看看有沒有現成的資料可以用一下,找了半天發現還是官網靠譜。
下面是非常好的學習elasticsearch-sql的資料和工具:
官網線上測試工具:
官網示例:
對於分組,官網有一個很好的例子:
POST _xpack/sql { "query":"SELECT COUNT(*), MONTH_OF_YEAR(timestamp) AS month_of_year, AVG(FlightTimeHour) AS Avg_Flight_Time FROM flights GROUP BY month_of_year" }
結果為:
COUNT(1) | month_of_year | Avg_Flight_Time
---------------+---------------+-----------------
1303 |5 |8.628949653846158
8893 |6 |8.520481551839334
2863 |7 |8.463433805045094
這個可以在線上測試工具中直接執行,結果如下:
下面是我對group by 如何按年月日分組的研究
首先檢視支援的函式
找到相應的函式,是不是自己需要的可以手動測試下函式功能
上面途中用紅色框起來的就是我需要的,大家如果有其它的需求,在資料不足的情況下,可以按照這種方式去試,其實花不了多長時間的
下面是我使用上面三個函式進行按日分組的例子,按年和按月是類似的
POST /_xpack/sql?format=txt { "query": "select YEAR(finish_time),MONTH_OF_YEAR(finish_time), DAY_OF_MONTH(finish_time) from vas_pay_order group by YEAR(finish_time),MONTH_OF_YEAR(finish_time),DAY_OF_MONTH(finish_time)" }
結果如下
YEAR(finish_time [UTC])|MONTH_OF_YEAR(finish_time [UTC])|DAY_OF_MONTH(finish_time [UTC])
-----------------------+--------------------------------+-------------------------------
2018 |7 |6
2018 |7 |7
2018 |7 |8
2018 |7 |9
2018 |7 |10
2018 |7 |11
2018 |7 |12
2018 |7 |13
2018 |7 |14
2018 |7 |15
2018 |7 |16
2018 |7 |17
2018 |7 |18
2018 |7 |19
2018 |7 |20
2018 |7 |21
2018 |7 |22
2018 |7 |23
2018 |7 |24
2018 |7 |25
2018 |7 |26
2018 |7 |27
2018 |7 |28
2018 |7 |29
2018 |7 |30
2018 |7 |31
實際需求是計算某業務每天的收入,查詢SQL如下:
結果:
當然像這種收入型別比較固定的SQL可以做成圖表的形式,不論是實時性還是直觀性都會好很多,可以更方便運營人員去檢視和分析。
最近發現elasticsearch-sql好像不支援distinct關鍵字去重,運營那邊查詢時userId肯定是要去重的,提供一種方法是可以通過group by來實現。
雖然ES在SQL支援方面沒有hiveSQL或是MYSQL那麼全,但是我們可以綜合起來使用,取長補短,讓我們的業務能夠更健壯!
希望對使用ES的同學能有所幫助!