如何在 Cassandra 中创建计数器列表作为复合列。我要解决的问题是存储对特定对象的访问次数。json 表示的模型是这样的:
ColumnFamily:view_counts RowKey:object_id
价值:{总计:10,推荐人:{facebook:2,twitter:5,直接:2,其他:1}国家:{澳大利亚:4,美国:4,其他:2}}
提前致谢
如何在 Cassandra 中创建计数器列表作为复合列。我要解决的问题是存储对特定对象的访问次数。json 表示的模型是这样的:
ColumnFamily:view_counts RowKey:object_id
价值:{总计:10,推荐人:{facebook:2,twitter:5,直接:2,其他:1}国家:{澳大利亚:4,美国:4,其他:2}}
提前致谢
你想要的是这样的(其中 X:Y 是一个复合列):
ColumnFamily: view_counts
Rows:
object_id -> { "total": 10,
"referrer:facebook": 2,
"referrer:twitter": 5,
"referrer:direct": 2,
"referrer:other": 1,
"country:australia": 4,
"country:us": 4,
"country:other": 2 }
然后,当您通过 Twitter 从澳大利亚获得对 Object6 的新访问时,您将执行以下增量:
incr view_counts[Object6]['total']
incr view_counts[Object6]['referrer:twitter']
incr view_counts[Object6]['country:australia']
当然,您可以采用不同的方式来安排这一点 - 您也可以将组合放在行键中:
total:object_id -> { "count": 10 }
referrer:object_id -> { "facebook": 2,
"twitter": 5,
"direct": 2,
"other": 1 }
country:object_id -> { "australia": 4,
"us": 4,
"other": 2 }
或完全放弃复合列,并为 和 使用单独的列view_counts_by_referrer
族view_counts_by_country
。
Acunu Analytics等实时分析系统将为您完成所有这些工作,因此您只需指定一个查询SELECT COUNT_DISTINCT(user_ip_address) FROM view_counts WHERE object = Object6 AND time > '7 days ago' GROUP BY referrer
,它就会在后台计算出所有适当的计数器。
(ps 超级列已被弃用,因为您不能只修改超级列的一部分,这会减慢速度。)
为什么不只使用一个超级列族,并为引用者和国家/地区设置一个超级列?