2012-02-10 48 views
2

我想存储数百万网页的信标Cassandra中,每个大致如下以下JSON:为网页信标数据模型

'{ 
    "uri": "http://foo.com/bar/index.html", 
    "metric1": 74, 
    "metric2": 123, 
    "conntime": "2011-12-30T13:43:34", 
    "city": "CAMBRIDGE", 
    "state": "MA", 
    "ua": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2", 
    "plat": "Win32" 
}' 

凡字符串包含的URI,一些的指标,其次是地理/浏览器/平台数据。正如您可以想象的那样,URI/UA/Plats/Cities/States的数量将会更少,而每个指标的数值将会有很大的不同。

我读过thisthis,但我的查询将看起来更像以下,这似乎不是一个非常适合柜台:

  • 什么是中位数“metric1”每个( 'UA', '高原', '国家', '城市')?
  • “conntime”“2011-12-30T13:43:34”中的'metric2'的第95个百分位是多少?

是否有可能(和明智的)非规范化我的数据是计数器?或者有更好的方法来模拟数据?

谢谢!

回答

1

这取决于指标集合和查询维度是否定义良好(即,您只需要平均值,每个'ua'的'中值','状态',这两个集合可能相当长,但有限)

添加剂指标可能存储在计数器列(如果你有算&总之,你可以随时计算平均值):

CF[event.ua].metric1_sum += event.metric1; 
CF[event.ua].metric1_count++; 
CF[event.state].metric1_sum += event.metric1; 
CF[event.state].metric1_count++; 
.... 

要计算中位数和百分,我建议创建具有超柱计数器子列。度量值子栏目的名称,以及事件计有子栏目值:

CF[event.ua].metric1_values[event.metric1]++; 
CF[event.state].metric1_values[event.metric1]++; 
... 

在情况下,如果不同的度量值的量会过高,这将是很可能达到围捕度量值无严重infelicity 。

其他指标种类可能需要其他的优化。

而且,我仍然建议以非规范化的形式存储单个事件,类似于提到的JSON。 Cassandra在写数据方面速度非常快。使用原始数据将允许您通过在完整数据集上运行Map/Reduce来计算其他指标的历史值。

+0

这是有道理的。如果我理解正确,计算中位数,数据看起来大致如下:'CF [“http://foo.com/bar/index.html”。“Mozilla/5.0(Windows NT 6.1)AppleWebKit/535.2 (KHTML,像Gecko)Chrome/15.0.874.121 Safari/535.2“] .metric1_74 [”http://foo.com/bar/index.html“.metric1] ++;'或者,由于大部分数据分析将离线完成(比如每小时一次),最好只存储原始的JSON和*只做* Map/Reduce? – septagram 2012-02-13 16:01:35