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 minmax, primary key (dummy, id))。不过要小心……所有的行都将在同一个分区中,所以如果它增长,您将需要创建新的分片,并查询两个分片以获取值。另外,为什么需要返回 7K 行?那有用吗?能否以不同的方式解决(这是企业实际需要的吗?)?我推荐使用分片方法,因为查询会很快(命中一个分区)。查询所有节点对于性能来说会很糟糕,并且可能会超时。

以上是关于cassandra 中的数据建模和查询的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 中的数据建模,列可以是文本或数字

Cassandra中的数据建模简单表不起作用

带有排序查询建模的Cassandra过滤器

Cassandra 数据建模分区键

「时序数据库」Cassandra时间序列大规模数据建模

具有非规范化的 cassandra 数据建模