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} } }
上面结果的意思是: