我对Cassandra相当陌生,在过去的一个月里读了很多书。
我正在研究一个小用例。
查询:基于在某个时间范围内播放的金额排名前 X 的玩家。
因此,在任何给定的时间范围内,我都希望汇总玩家的总游戏次数,并得出排名前X的玩家。
我遵循了创建UDF(使用C*-2.2.0版本)的方法,用于聚合AmountPlay by a Player。
下面是我为这个用例设计的时间序列数据模型。
CREATE COLUMNFAMILY PlayerRating
(
PlayerNumber int, ===> Unique account number
GameID text, ===> unique machine ID per slot
AmountPlayed double, ===> AmountPlayed by the player
EventTime timestamp, ===> Event generated TimeStamp
PRIMARY KEY ((PlayerNumber, GameID),EventTime)) WITH CLUSTERING ORDER BY(EventTime desc);
请让我知道我的数据模型设计是否适合我的查询。
谢谢!!
我认为将每个游戏的所有玩家放在一个分区中可能会更容易。
这样,您可以用一个查询聚集所有玩家,而不是为每个玩家单独查询。然后,你可以将每个球员的上场时间汇总到一张地图中(参见此处如何定义UDF的示例)。
所以你的桌子看起来像这样:
CREATE TABLE playing_time_by_game (game_id text, event_time int, player_id text, amount_played int, PRIMARY KEY (game_id, event_time));
然后按player_id创建总计的 UDF:
CREATE FUNCTION state_group_and_total( state map<text, int>, type text, amount int )
CALLED ON NULL INPUT
RETURNS map<text, int>
LANGUAGE java AS '
Integer count = (Integer) state.get(type); if (count == null) count = amount; else count = count + amount; state.put(type, count); return state; ' ;
然后创建聚合函数:
CREATE OR REPLACE AGGREGATE group_and_total(text, int)
SFUNC state_group_and_total
STYPE map<text, int>
INITCOND {};
然后插入一些数据:
SELECT * from playing_time_by_game ;
game_id | event_time | amount_played | player_id
---------+------------+---------------+-----------
game1 | 0 | 8 | player1
game1 | 1 | 12 | player2
game1 | 5 | 1 | player2
game1 | 8 | 50 | player1
game2 | 0 | 200 | player1
现在您可以按player_id聚合:
SELECT group_and_total(player_id, amount_played) from playing_time_by_game;
t2.group_and_total(player_id, amount_played)
----------------------------------------------
{'player1': 258, 'player2': 13}
您可以将查询限制在游戏分区和时间范围内:
SELECT group_and_total(player_id, amount_played) from playing_time_by_game where game_id='game1' and event_time >=0 and event_time <=7;
t2.group_and_total(player_id, amount_played)
----------------------------------------------
{'player1': 8, 'player2': 13}
您还可以定义一个FINALFUNC来排序并只保留地图中的前十项。看这个。
我目前在cassandra中有一个名为macrecord的表,类似于以下内容: 在这种情况下,我想不出其他解决方案,只有在macadd值重复的情况下删除整行,然后插入具有更新时间戳的新行。 是否有更好的解决方案在macadd值重复时更新时间戳,或者在我的原始表中只有macadd是主键的范围内查询时间戳值的替代方法。
我使用的是spring数据cassandra,需要使用jpa映射一个字段,在cassandra中,该字段的类型为
我用Spring Data Cassandra 2.2.1开发了一个新的应用程序,想在Cassandra 2.1.9服务器上运行它(旧的,我知道)。但是我们得到了错误 Spring数据卡桑德拉手册声称Spring数据2.2.1至少需要卡桑德拉2.1,所以这应该有效,但它没有。我们包含的唯一特定于卡桑德拉的依赖项是 我怎样才能让这个工作?
我有几个客户,每个客户都由一个“租户”代表 我想知道将这个概念建模的最佳方法是什么,我做了大量的研究,发现了这个课题:http://cassandra-user-incubator-apache-org.3065146.n2.nabble.com/Modeling-multi-tenanted-Cassandra-schema-td7591311.html 我知道有几种可能性 租户提供一个密钥空间
有人可以帮助我了解如何使用POJO类插入卡桑德拉UDT数据吗? 我创建了一个POJO类来映射Cassandra的表,并为Cassandra UDT创建了另一个类,但是当我插入映射Cassandra表的主POJO类时,它无法识别另一个POJO类(映射Cassandra的UDT)。我还在每个类和每个类对象上编写了注释。 这是我的一个POJO类:- 另一个POJO类:-
我正在尝试使用Cassandra 2.1升级到Spring Data Cassandra 1.5. x的Spring Boot 1.5,但出现启动错误: 未能实例化[org.springframework.data.cassandra.mapping.CassandraMappingContext]:工厂方法“cassandraMapping”引发异常;嵌套异常为java.lang.NoClass