1. 程式人生 > >elasticsearch xpack sql group by 如何對時間按年月日進行分組查詢

elasticsearch xpack sql group by 如何對時間按年月日進行分組查詢

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的同學能有所幫助!