cassandra 中的数据建模和查询
Posted
技术标签:
【中文标题】cassandra 中的数据建模和查询【英文标题】:data modelling and queries in cassandra 【发布时间】:2014-12-02 10:42:51 【问题描述】: |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
我在 Cassandra 中有这张桌子。从这个表中我需要提取两个表 - 一个包含对应于 ID 的第一个事件,另一个包含对应于 id 的最后一个事件。因此,我应该得到两个表作为我的输出:
initial
-----------------------------
InProgress
Awaiting
final
-----------------------------
Closed
我需要知道如何仅在 cql(cassandra 查询语言) 中完成此操作,或者是否有一种方式 我可以按照我的方式对数据进行建模能够获得想要的结果。
【问题讨论】:
【参考方案1】:您可以使用如下架构:
create table event(
id int,
ts timestamp,
desc text,
primary key (id, ts)
);
这将允许您按 id 获取并按时间戳(asc 或 desc)排序并限制为 1。
但是,请检查您期望的每个 id 有多少事件。如果对于超过 100MB 的 id 处理所有事件就足够了,您将需要开始考虑分桶或其他方法。
另一种选择是使用 Spark 进行分析查询并将结果存储在一个表中,该表以您想要的格式保存它。这确实意味着定期运行外部作业(或火花流应用程序,这将比实时数据晚几秒到几分钟),但它会起作用。
【讨论】:
@ashic-我的问题是我总共有 7554 个 id。因此,每次我需要在 cql shell 手动获取第一个和最后一个事件时,我是否必须提供 id 的值,或者是否有办法编写单个查询并获取包含对应于每个 id 的第一个事件的表和一个表,其中包含与每个 id 对应的最后一个事件,而没有在 WHERE 子句中指定 id 对于 7400 个 id,您可以创建一个表,如 create table stats(shard int, id int, map以上是关于cassandra 中的数据建模和查询的主要内容,如果未能解决你的问题,请参考以下文章