Database design cassandra中的数据建模和查询
我在卡桑德拉有这张桌子。从这个表中,我需要提取两个表,一个包含对应于ID的第一个事件,另一个包含对应于ID的最后一个事件。因此,我应该得到两个表作为我的输出:Database design cassandra中的数据建模和查询,database-design,cql,cassandra-2.0,nosql,Database Design,Cql,Cassandra 2.0,Nosql,我在卡桑德拉有这张桌子。从这个表中,我需要提取两个表,一个包含对应于ID的第一个事件,另一个包含对应于ID的最后一个事件。因此,我应该得到两个表作为我的输出: |ID| Events Timestamp ---------------------------------------------- |1 | InProgress 2010-03-31 15:59:42 |1 | Awaiting 201
|ID| Events Timestamp
----------------------------------------------
|1 | InProgress 2010-03-31 15:59:42
|1 | Awaiting 2010-04-31 15:59:42
|1 | Resolved 2010-05-31 15:59:42
|1 | Closed 2010-06-31 15:59:42
|2 | Awaiting 2010-07-31 15:59:42
|2 | InProgress 2010-08-31 15:59:42
|2 | Wait 2010-09-31 15:59:42
|2 | Closed 2010-10-31 15:59:42
我需要知道如何仅在cqlcassandra查询语言中实现这一点,或者是否有一种方法可以对我的数据进行建模,从而能够获得所需的结果。您可以使用如下模式:
initial
-----------------------------
InProgress
Awaiting
final
-----------------------------
Closed
这将允许您按id提取,按时间戳asc或desc排序,并限制为1
但是,请检查每个id的预期事件数。如果对于超过100MB的id来说,所有事件都足够了,那么您需要开始考虑bucketing或其他方法
另一种方法是使用Spark进行分析查询,并将结果存储在一个表中,该表以您想要的格式保存结果。这确实意味着定期运行外部作业或spark streaming应用程序,这将比实时数据晚几秒到几分钟,但它会工作。@ashic我的问题是我总共有7554个id。那么,每次我需要在cql shell中手动获取第一个和最后一个事件时,我是否必须给出id的值,或者是否有一种方法可以让我编写一个查询并获取一个包含每个id对应的第一个事件的表和一个包含每个id对应的最后一个事件的表,而不在7400 id的WHERE子句中指定id,您可以创建一个像create table statshard int、id int、map minmax、primary key dummy、id这样的表。但是要小心……所有的行都将在同一个分区中,因此如果这一情况增加,您将需要创建新的分片,并查询两个分片以获得值。另一方面,为什么需要返回7K行?这有用吗?是否可以用另一种方式来解决业务实际需要的是什么??我建议使用shard方法,因为查询将快速命中一个分区。查询所有节点会对性能造成影响&可能会超时。
create table event(
id int,
ts timestamp,
desc text,
primary key (id, ts)
);