用戶行爲數據庫SkyDB

Sky 是一個用於靈活、高性能的分析行爲數據的開源數據庫。 包括一些點擊流和日誌數據,使用 Sky 分析比傳統方法 好比 SQL 數據庫或者是 Hadoop 速度要快幾個數量級。Sky 經過優化數據的組織、更快的查詢執行。在通常的硬件上每一個CPU核每秒鐘可處理幾百萬的事件。html

sky 是一個用於跟蹤隨着時間變化的局部瞬時的哈希狀態的數據庫,這些哈希之因此是部分瞬態的,是由於哈希的個別屬性能夠將其持久化,或者只保存這些值一段世間。用這些數據結構來追蹤用戶行爲特別有用。python

舉個栗子,你想知道哪些用戶在用你的網站。首先,你想監測一些用戶的屬性,好比他們的性別,地址等等。這些屬性叫作永久屬性。這些屬性將在第一次就被持久化,直到屬性發生變化。 接下來你想記錄一些關於用戶動做的屬性,好比訪問你的主頁,往購物車裏添加商品,結帳等等。這些屬性叫瞬時屬性,它們的值只會在某一時刻存在。sql

每一次當你更新一個或多個屬性的值的時候叫作一次事件(event)。這事件將做爲一個相關聯的時間戳,它們都將爲每個hash組合成一個時間軸。 在sky裏也能夠把hash當成一個對象。由於這些事件都將爲每個用戶組織成一個單一的時間軸。sky將在這些數據上查詢的很是快。數據庫

sky 是由表組成的,這些表裏只有對象的集合。而這些對象將遵循一個用屬性限定的特設的模式。 這些屬性能夠被設置成永久的或者是瞬時的,並且有個數據類型與之聯繫。。如今支持五個數據類型string, integer, float, boolean, & factorexpress

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}
  }
}

上面結果的意思是:

  1. 10,292名用戶進入了首頁
  2. 其中的7,382名用戶以後經過點擊進入了訂價頁面
  3. 其中的2,731名用戶以後進入了登陸頁面。
  4. 最後只有726名用戶真正的登陸成功,進入歡迎頁面。 而529名用戶去了聯繫咱們頁面,128名用戶返回了主頁。
  5. 咱們還能夠推斷出哪些沒有進行下一步的用戶必定是退出了網站。這意味着1,348名用戶離開了網站(2731-(726+529+128)).
相關文章
相關標籤/搜索