网页信标的数据模型

时间:2012-02-10 17:06:28

标签: nosql cassandra

我想在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 / UAs / Plats / Cities / States,而每个指标的价值会有很大差异。

我已阅读thisthis,但我的查询看起来更像是以下内容,这些内容似乎不适合计数器:

  • 每个('ua','plat','state','city')的中位数'metric1'是多少?
  • 'conntime'“2011-12-30T13:43:34”中“metric2”的第95个百分点是多少?

将数据非规范化为计数器是否可能(并且明智)?或者有更好的方法来建模数据吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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]++;
...

如果不同度量标准值的数量过高,则可能会在没有严重不合理的情况下对指标值进行舍入。

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

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