離線數據分析功能介紹

可能很多用戶還不知道,咱們上個月中旬就已經對外發布了離線數據分析功能。用戶能夠用它來作什麼,它適用於哪些應用場景,有沒有應用實例?若要回答這些問題,首先讓咱們看看部分用戶曾經向咱們提出過的一些痛點或需求。爲了對用戶數據保密,後面提到的應用名字與數據均爲虛構。html

  • 某應用 TestA 發佈幾個月以後,因爲用戶量暴漲,存儲在咱們這裏的數據規模急劇上漲。這就致使了一個不得不忽視的問題:他們在應用剛發佈的那段時間會天天從咱們這裏導出數據,本身寫程序作數據分析。而當數據規模(幾十 GB)愈來愈大,受限於網絡文件下載速度,每日導出數據再本身作分析已經變得愈來愈困難。所以,他們但願咱們能提供數據分析服務,支持 SQL-like 的查詢。
  • 某應用 TestB 天天都會針對應用數據作一些分析報告,主要目的是知曉應用當前的關鍵數據指標。按照最初的方案,他們須要每日導出數據,本身寫腳本程序處理應用數據。實際上,這樣的工做對一個須要快速迭代產品的團隊來講頗爲繁瑣,也比較消耗時間。
  • 咱們的 工單系統 也是構建在 Leancloud 之上,每一條工單數據都是經過咱們的存儲組件寫入咱們的雲端數據庫。工單系統同時也做爲咱們的一個示例公開了源代碼,從源代碼就能夠了解到它和其餘用戶的應用沒有本質區別(從數據存儲這個角度看)。咱們的工程師除了須要很是及時地處理用戶提交的工單,也須要了解工單系統的一些統計指標,例如本身最近回覆了多少工單、不一樣平臺工單的處理速度等等。若是有一個支持 SQL-like 的查詢服務,那麼要統計這些指標就會變得很容易。

相信上面的例子對不少用戶來說都不陌生,它揭示的痛點無非是大量的數據沒法經過便捷的手段進行分析。考慮到用戶的需求,咱們開發了支持 SQL-like 查詢的離線數據分析服務。用戶要作的不過是按照咱們的 離線數據分析使用指南 開啓離線數據分析服務,輸入合法的 SQL 語句便可分析數據。順便說一下,這個服務後端核心組件爲 Spark SQLParquetios

接下來,就以咱們的工單系統爲例子,介紹如何利用離線數據分析服務來解決咱們平常工做中遇到的一些問題。固然,爲了更好地瞭解工單系統內部的結構,你能夠訪問 這裏 的源代碼。git

首先讓咱們看看整個界面:github

bigquery-0.png

接下來就讓咱們針對一些統計指標分析工單系統數據:sql

  • 統計不一樣平臺類型(type)的工單數量,並按大小排序數據庫

    select count(*) as count, type from Ticket where type is not null group by type order by count descapache

結果如圖所示(若是圖中文字不夠清晰,請點擊查看大圖):後端

bigquery-1.png

  • 統計每一個工單(Ticket)各有多少條回覆(Thread),並按回複數大小排序網絡

    select Ticket.objectId, Ticket.title, count(Thread.content) as count from Ticket inner join Thread where Ticket.objectId=Thread.ticket.objectId group by Thread.content, Ticket.objectId, Ticket.title order by count descapp

結果如圖所示:

bigquery-2.png

若想知曉 iOS 平臺的每條工單各有多少條回覆,只需把上面的 SQL 語句作簡單修改:

select Ticket.objectId, Ticket.title, count(Thread.content) as `count` from Ticket inner join Thread where Ticket.objectId=Thread.ticket.objectId and Ticket.type='ios' group by Thread.content, Ticket.objectId, Ticket.title order by `count` desc
  • 統計全部工程師最近一個多月處理了多少條工單(Ticket),並按處理數量排序。Admin、Thread、Ticket 這三張表參與了 join 計算,其中 Admin 存放了工程師的我的信息,它和回覆(Thread)經過 cid 關聯。而回復(Thread)與工單(Ticket)則是經過工單的 objectId 來作關聯。

注:slackName 其實就是這個工程師的用戶名,由於咱們還使用 Slack 來實時接收消息。

select count(distinct Ticket.objectId) as `count`, Admin.slackName from Ticket inner join Thread inner join Admin where Thread.ticket.objectId = Ticket.objectId and Admin.cid = Thread.cid and Admin.slackName is not null and unix_timestamp(Ticket.createdAt) > unix_timestamp('2014-12-01T00:00:00.000Z') group by Admin.slackName order by `count` desc

結果如圖所示:

bigquery-3.png

  • 統計全部工程師總共有多少次回覆(Thread),並按回複數排序。同工單數的查詢相似,這裏也須要三張表作 join。

select count(distinct Thread.objectId) as count, Admin.slackName from Ticket inner join Thread inner join Admin where Thread.ticket.objectId = Ticket.objectId and Admin.cid = Thread.cid and Admin.slackName is not null group by Admin.slackName order by count desc

結果如圖所示:

bigquery-4.png

  • 統計天天各有多少條回覆(Thread)

substr(createdAt, 1, 10) 用來獲取回覆的日期(yyyy-MM-dd)select count(*) as count, substr(createdAt, 1, 10) as date from Thread group by substr(createdAt, 1, 10) order by date desc

結果如圖所示:

bigquery-5.png

考慮到本文篇幅有限,就再也不列舉其餘查詢示例。若是您在使用離線數據分析服務的過程當中遇到各類各樣的問題,均可以經過工單或者郵件向咱們反饋,咱們會及時處理相關問題。

相關文章
相關標籤/搜索