当前位置: 首页 > 知识库问答 >
问题:

Cassandra复合聚类键和排序查询

柴兴贤
2023-03-14

我们大量使用cassandra wide rows来存储每个用户的时间序列,因为它们非常适合那个用例。假设我们有一个表:

创建表user_events(user_id text,timestmp timestamp,event text,主键(user_id),timestmp));

如果时间戳上的冲突可能发生(相同的用户可以用相同的时间戳发出两个不同的事件)。假设我们对所有事件都有一个顺序(每个事件都有一个序列int),那么调整这个模式来解决这个问题的最佳方法是什么。

我将无法执行,其中user_id=?按timestmp ASC排序,seq ASC-cassandra不允许这样做。

共有1个答案

杨乐意
2023-03-14

我将无法在WHERE user_id=?按timestmp ASC订购,seq ASC-cassandra不允许。

您可能会看到错误,因为您正在重复ASC。这应该有效:

WHERE user_id = ? ORDER BY timestmp,seq ASC

此外,只要您将主键定义为primary key((user_id),timestmp,seq)),您甚至不需要指定order BY x[,y]asc。它将按该顺序对磁盘上的数据进行聚类,并将其返回给已按该顺序排序的数据。order BY应该只在希望将结果按降序排列(或者与定义结果相反的方式)时才需要。

我认为额外的seq列应该足够了,这取决于您计划如何插入数据。如果您正在从客户端设置timestmp,那么您应该可以。但是,看看当我(使用第二个表)插入行时会发生什么,同时用两种不同的方式创建时间戳。

INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('Mal',dateof(now()),1,'commanding');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('Wash',dateof(now()),1,'piloting');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('River',dateof(now()),1,'freaking out');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('River',dateof(now()),3,'being weird');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('River',dateof(now()),2,'killing reavers');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('River','2015-01-13 13:14-0600',1,'freaking out');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('River','2015-01-13 13:14-0600',3,'being weird');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('River','2015-01-13 13:14-0600',2,'killing reavers');

通过“river”的user_id查询该数据会产生:

aploetz@cqlsh:stackoverflow> SELECT * FROM user_events WHERE user_id='River';
 user_id | timestmp                 | seq | event
---------+--------------------------+-----+-----------------
   River | 2015-01-13 13:14:00-0600 |   1 |    freaking out
   River | 2015-01-13 13:14:00-0600 |   2 | killing reavers
   River | 2015-01-13 13:14:00-0600 |   3 |     being weird
   River | 2015-01-14 12:58:41-0600 |   1 |    freaking out
   River | 2015-01-14 12:58:57-0600 |   3 |     being weird
   River | 2015-01-14 12:58:57-0600 |   2 | killing reavers

(6 rows)

请注意,使用now()函数生成一个timeuuid,然后将其转换为带有dateof()的时间戳,会导致具有timestmp“2015-01-14 12:58:57-0600”的两行看起来是相同的。但是它们并不相同,可以通过seq列看出这一点。

 类似资料:
  • 创建TABLE TABLE(int键、time时间戳、度量浮点、主键(key、time)); 我需要创建一个火花作业,这将读取数据从上一个表,在指定的开始和结束时间戳做一些处理,并刷新结果回Cassandra。 因此,我的spark-cassandra-connector必须对集群cassandra表列进行范围查询。 范围查询的选择性约为1%,不可能在查询中包含分区键。 这两种解决方案哪一种更好?

  • 我有一个具有以下模式的待售项目集合: 我继承了一个聚合查询,它返回匹配类别的项目,按商家分组,组按组中的最大评级排序: 在此之后,代码继续按评级对每组中的项目进行排序,并删除除每组中排名前2位之外的所有项目。 作为聚合函数的一部分,是否可以在组内执行此排序和限制,以便聚合只返回每组中评级最高的两个项目?

  • 我有一个用JPA和Spring Data DynamoDB建立的Spring项目。它工作正常。我可以通过分区键和排序键(称为DynamoDBHashKey和DynamoDBRangeKey)读取DynamoDB表中的项。 我的问题是,我的存储库的设置方式是使用查询和扫描操作来读取表,而不是使用获取项目操作,这应该会更高效。 这是我的实体: 这是我的存储库: 当我的表同时具有分区键和排序键时,如何配

  • 我如何对键上的elasticsearch聚合桶进行排序。我有嵌套的聚合,想对我的第二个聚合桶结果进行排序。 就像我有: 我希望我的< code >事件聚集桶在关键< code >印象或< code >页面视图上按desc/asc排序。我如何实现这样的结果集? 这是我的查询 我试过使用_key,但它在桶内排序。我想通过查看所有桶来排序。就像我有一个键。我希望我的桶结果用这个键排序。不在桶内。 我希望

  • 给java类一些东西 我有一张物品清单 我希望能够对它们进行排序,这样它们就可以按照每个父对象的虚数的累积和排序,然后再按照虚数排序。 所以我最终 我知道用parentKey和sum of noThings映射它是 我想,也许包装我的Something类并获得每个父项的总密钥可能会在某种程度上起作用。 但看起来工作量很大,不太优雅。 如有任何意见/想法,将不胜感激。