2

如何在 Cassandra 中创建计数器列表作为复合列。我要解决的问题是存储对特定对象的访问次数。json 表示的模型是这样的:

ColumnFamily:view_counts RowKey:object_id

价值:{总计:10,推荐人:{facebook:2,twitter:5,直接:2,其他:1}国家:{澳大利亚:4,美国:4,其他:2}}

提前致谢

4

2 回答 2

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_referrerview_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 超级列已被弃用,因为您不能只修改超级列的一部分,这会减慢速度。)

于 2012-04-16T11:06:43.427 回答
-3

为什么不只使用一个超级列族,并为引用者和国家/地区设置一个超级列?

于 2012-04-15T07:15:07.707 回答