Cassandra的ORDER BY无法按预期工作

时间:2017-01-16 06:38:42

标签: database solr cassandra datastax datastax-enterprise

所以,我在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排序。

1 个答案:

答案 0 :(得分:0)

  1. 如果要使用列进行排序,请从分区键中取出。行将在每个分区中按此列排序 - Cassandra使用分区键在节点之间拆分数据,并使用群集密钥在每个分区中对其进行排序:

    PRIMARY KEY((srt),kills)

  2. 编辑: 你需要更多地理解概念,我建议你在DSE网站上学习一些免费课程,它可以帮助你进一步发展。

    无论如何,关于你的问题: 主键是一组使每行唯一的列。 此主键中有两种类型的列 - 分区键列和群集列。 您无法使用分区键进行排序或范围查询 - 这与Cassandra模型相反 - 此类查询将被分割为多个节点,甚至是所有节点和sstables。如果要使用两个列出的列进行排序,可以使用其他列进行分区(例如,从1到100的随机数),然后需要为每个"批次"执行查询,或者只是使用具有足够多的唯一值(至少100)的另一列,数据在这些值之间均匀分布,并且使用所有这些值访问数据,否则您将最终得到热节点/分区。

    主键((another_column),kills,srt)

    您必须了解的是,您只能在分区内订购数据,但不能在分区之间订购数据。

    1. " per kill" amout / value - 你能详细说明吗? Cassandra中每个键只有一行,如果插入多个具有相同键的行,它们将被最后一个插入值覆盖(读取有关upserts的信息)。