Sky 是一個用於靈活、高性能的分析行爲數據的開源數據庫。 包括一些點擊流和日誌數據,使用 Sky 分析比傳統方法 好比 SQL 數據庫或者是 Hadoop 速度要快幾個數量級。Sky 經過優化數據的組織、更快的查詢執行。在通常的硬件上每一個CPU核每秒鐘可處理幾百萬的事件。html
sky 是一個用於跟蹤隨着時間變化的局部瞬時的哈希狀態的數據庫,這些哈希之因此是部分瞬態的,是由於哈希的個別屬性能夠將其持久化,或者只保存這些值一段世間。用這些數據結構來追蹤用戶行爲特別有用。python
舉個栗子,你想知道哪些用戶在用你的網站。首先,你想監測一些用戶的屬性,好比他們的性別,地址等等。這些屬性叫作永久屬性。這些屬性將在第一次就被持久化,直到屬性發生變化。 接下來你想記錄一些關於用戶動做的屬性,好比訪問你的主頁,往購物車裏添加商品,結帳等等。這些屬性叫瞬時屬性,它們的值只會在某一時刻存在。sql
每一次當你更新一個或多個屬性的值的時候叫作一次事件(event)。這事件將做爲一個相關聯的時間戳,它們都將爲每個hash組合成一個時間軸。 在sky裏也能夠把hash當成一個對象。由於這些事件都將爲每個用戶組織成一個單一的時間軸。sky將在這些數據上查詢的很是快。數據庫
sky 是由表組成的,這些表裏只有對象的集合。而這些對象將遵循一個用屬性限定的特設的模式。 這些屬性能夠被設置成永久的或者是瞬時的,並且有個數據類型與之聯繫。。如今支持五個數據類型string, integer, float, boolean, & factor
express
factor的工做方式和string差很少,除了當屬性的可能值爲有限個的時候(枚舉?),他表現的更有效率。分類的數據好比性別,狀態,活動名稱的時候,它的效率很高。json
The Query Systemapi
由於sky存儲的是非關係數據,因此sql是沒有用的。因而sky有一種簡單的查詢語言,由一些基本的原語組成。好比:queries, selections & conditions 。sky經過http api 用RESTful JSON架構,因此咱們將用json格式展現查詢出來的數據session
Query: query原語是全部查詢的根。他包括一系列的steps(不管是conditions仍是selections)。查詢引擎經過像數據庫的光標順序迭代每個對象的每個事件來工做。在每個事件中,全部在query的steps都將被執行。 若是你想打破一個timelines爲sessions。你能夠用 sessionIdleTime
指定兩個臨近的事件的秒數,來勾畫出一個session。數據結構
Selections:架構
Selections是一個簡單的樣本,能夠來描述query引擎怎麼執行的,selection能夠指定一個可選的名字,可選的域,和一個或多個fields。fields將會被命名(name),並且會有一個expression,使用如下函數之一count(), sum(field), min(field), max(field).
舉個栗子,查詢出表中全部事件的數量
<!-- lang: sql --> { "steps":[ { "type":"selection", "fields":[ {"name":"count", "expression":"count()"} ] } ] }
運行會得出一下(若是有381293個事件): {"count":381293}
。。待續
多緯度查詢: 更加複雜的查詢包括每一個不一樣對象的一個緯度。好比設想你想看看由性別(gender)和國家(country)來劃分的事件(event)的數目。咱們能夠寫一個selection:「mystats」
<!-- lang: python --> { "steps":[ {"type":"selection", "name":"myStats", "dimensions":["gender","country"], "fields":[ {"name":"count", "expression":"count()"} ]} ] }
查出來的結果將是
<!-- lang: python --> { "myStats":{ "gender":{ "male":{ "country":{ "US":{ "count":19382 }, "Mexico":{ "count":10302 } } }, "female":{ "country":{ "US":{ "count":20183 }, "England":{ "count":3023 } } } } } }
Conditions 基本的彙集沒有什麼意思,因此咱們有了條件查詢(conditions),條件查詢就像一個迷你的查詢,只有在你給的表達式的結果爲true的時候纔會執行。條件查詢也是一種將查詢系統的光標前移的方法,只需使用 within
屬性。另外一個很是有用的特性是條件查詢能夠相互嵌套。 舉個栗子,輸出行爲(action)爲結帳(checkout)的行爲總數。並累加全部結帳的總價格
<!-- lang: python --> { "steps":[ {"type":"condition", "expression":"action == 'checkout'", "steps":[ {"type":"selection", "fields":[ {"name":"count", "expression":"count()"}, {"name":"total", "expression":"sum(purchaseAmount)"} ]} ]} ] }
輸出結果將是: {"count":128712, "total":2910232.23}
漏斗分析
sky查詢的真正厲害的是在你聯合嵌套各個原語的時候。栗子,咱們將使用 within 屬性,它能夠指定一個範圍。再這些範圍的step內的condition必須爲true纔會執行。好比將一個within定爲[0,1]意思是這個條件必須爲true在當前事件(event)或者下一個事件(event)。[1,1]的意思就是條件必須是true在下一個事件(event)。 使用嵌套的條件查詢時,只有父條件查詢執行了,嵌套在其中的子條件查詢纔會有機會執行,咱們就能夠用聯合嵌套查詢來執行一個漏斗分析。繼續舉栗子。咱們想跟蹤分析那些首先訪問網站主頁,而後訪問訂價頁面,最後訪問登陸頁面的用戶的人數。並且須要計算出每一步的用戶人數。 咱們將列出(「0」,「1」,「2」)每一步的人數,最後,咱們想劃分一下用戶登陸後首先的行動(action)是什麼,因此寫了最後的那個查詢。
<!-- lang: python --> { "sessionIdleTime":7200, "steps":[ {"type":"condition", "expression":"action == '/index.html'", "steps":[ {"type":"selection","name":"0","fields":[{"name":"count","expression":"count()"}]}, {"type":"condition", "expression":"action == '/pricing.html'", "within":[1,1], "steps":[ {"type":"selection","name":"1","fields":[{"name":"count","expression":"count()"}]}, {"type":"condition", "expression":"action == '/signup.html'", "within":[1,1], "steps":[ {"type":"selection","name":"2","fields":[{"name":"count","expression":"count()"}]}, {"type":"condition", "expression":"true", "within":[1,1], "steps":[ {"type":"selection","name":"3","dimensions":["action"],"fields":[{"name":"count","expression":"count()"}]} ]} ]} ]} ]} ] }
查詢結果的格式很好,能夠清楚的知悉咱們的漏斗分析結果。
<!-- lang: python --> { "0":{"count":10292}, "1":{"count":7382}, "2":{"count":2731}, "3":{ "/welcome.html":{"count":726}, "/contact_us.html":{"count":529}, "/index.html":{"count":128} } }
上面結果的意思是: