我想在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,而每个指标的价值会有很大差异。
我已阅读this和this,但我的查询看起来更像是以下内容,这些内容似乎不适合计数器:
将数据非规范化为计数器是否可能(并且明智)?或者有更好的方法来建模数据吗?
谢谢!
答案 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来计算其他指标的历史值。