Nosql 网页信标的数据模型
我想在Cassandra中存储数百万个网页信标,每个信标大致类似于以下JSON:Nosql 网页信标的数据模型,nosql,cassandra,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/53
'{
"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,而每个度量的值将有很大的差异
我已经阅读了和,但我的查询看起来更像以下内容,这似乎不适合计数器:
- 每个(‘ua’、‘plat’、‘state’、‘city’)的“metric1”中位数是多少
- 在《康奈德时报》2011-12-30T13:43:34中,“metric2”的第95个百分位数是多少
谢谢 这取决于指标集和查询维度集是否定义良好(即,您只需要每个“ua”、“状态”的平均值、中位数。这两个集合可能很长,但有限) 加法指示符可能存储在计数器列中(如果您有count&sum,则始终可以计算平均值): 为了计算中位数和百分位数,我建议创建带有计数器子列的超级列。度量值是子列名称,事件计数是子列值:
CF[event.ua].metric1_values[event.metric1]++;
CF[event.state].metric1_values[event.metric1]++;
...
如果不同度量值的数量过高,则可能会在没有严重不一致的情况下对度量值进行取整
其他指标类型可能需要其他优化
尽管如此,我还是建议以非规范化的形式存储单个事件,类似于前面提到的JSON。卡桑德拉写数据非常快。拥有原始数据将允许您通过在完整数据集上运行Map/Reduce来计算其他指标的历史值。这很有意义。如果我理解正确,要计算中位数,数据大致如下:
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是否更好?
CF[event.ua].metric1_values[event.metric1]++;
CF[event.state].metric1_values[event.metric1]++;
...