所以,我在cassandra中存储了一些统计信息。
我希望根据特定专栏获得十大最佳主题。在这种情况下,列是kills
。
由于mysql中没有ORDER BY
命令,我必须创建一个PARTITION KEY
。
我创建了下表:
CREATE TABLE IF NOT EXISTS stats ( uuid uuid, kills int, deaths int, playedGames int, wins int, srt int, PRIMARY KEY (srt, kills) ) WITH CLUSTERING ORDER BY (kills DESC);
我遇到的问题如下所示,我正在使用列srt
进行排序,因为当我打算使用列uuid
进行排序时,结果来自我的选择查询是完全随机的,没有按预期排序。
所以我尝试为PARTITION KEY
添加一个总值相同的列。排序现在有效,但不是很好。当我现在尝试SELECT * FROM stats;
时,结果如下:
srt | kills | deaths | playedgames | uuid | wins
-----+-------+--------+-------------+--------------------------------------+------
0 | 49 | 35 | 48 | 6f284e6f-bd9a-491f-9f52-690ea2375fef | 2
0 | 48 | 21 | 30 | 4842ad78-50e4-470c-8ee9-71c5a731c935 | 4
0 | 47 | 48 | 14 | 91f41144-ef5a-4071-8c79-228a7e192f34 | 42
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
0 | 2 | 32 | 20 | 387448a7-a08e-46d4-81a2-33d8a893fdb6 | 31
0 | 1 | 16 | 17 | fe4efbcd-34c3-419a-a52e-f9ae8866f2bf | 12
0 | 0 | 31 | 25 | 82b13d11-7eeb-411c-a521-c2c2f9b8a764 | 10
关于结果的问题是,“per kill”amout / value,只有一行 - 但应该肯定更多。
那么,是否有任何关于在Cassandra中使用排序而不删除数据的想法?
我也听说过Datastax Enterprise(DSE)在查询中支持solr但DSE只是非生产性免费(也只有6个月),付费版本至少是我所听到的,相当昂贵(每个节点大约4000美元)。那么,有没有像Datastax Enterprise Community Edtion那样的替代方案?没有意义,但我只想问。我没有从谷歌搜索中找到任何东西,我也可以使用solr和“普通”cassandra吗?
感谢您的帮助!
PS:请不要将此标记为order by caluse not working in Cassandra query的副本,因为它对我没有帮助。我已用谷歌搜索了一个半小时的解决方案。
修改:
由于我的主键是PRIMARY KEY(srt, kills)
,(srt, kills)
的组合必须是唯一的。这基本上意味着具有相同的kills
的行被相互覆盖。我会使用PRIMARY KEY(uuid, kills)
来解决覆盖行的问题,但当我SELECT * FROM stats LIMIT 10
时,结果是完全随机的,不按kills
排序。
答案 0 :(得分:0)
如果要使用列进行排序,请从分区键中取出。行将在每个分区中按此列排序 - Cassandra使用分区键在节点之间拆分数据,并使用群集密钥在每个分区中对其进行排序:
PRIMARY KEY((srt),kills)
编辑: 你需要更多地理解概念,我建议你在DSE网站上学习一些免费课程,它可以帮助你进一步发展。
无论如何,关于你的问题: 主键是一组使每行唯一的列。 此主键中有两种类型的列 - 分区键列和群集列。 您无法使用分区键进行排序或范围查询 - 这与Cassandra模型相反 - 此类查询将被分割为多个节点,甚至是所有节点和sstables。如果要使用两个列出的列进行排序,可以使用其他列进行分区(例如,从1到100的随机数),然后需要为每个"批次"执行查询,或者只是使用具有足够多的唯一值(至少100)的另一列,数据在这些值之间均匀分布,并且使用所有这些值访问数据,否则您将最终得到热节点/分区。
主键((another_column),kills,srt)
您必须了解的是,您只能在分区内订购数据,但不能在分区之间订购数据。