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

实时数据的Cassandra数据建模

丁德义
2023-03-14

我目前有一个应用程序,它将事件驱动的实时流数据持久化到一个列系列,该系列建模为:

CREATE TABLE current_data (
    account_id text, 
    value text,
    PRIMARY KEY (account_id)
)

每个帐户ID每X秒发送一次数据,因此我们每次收到事件时都会覆盖现有行。此数据包含当前实时信息,我们只关心最近的事件(不使用旧数据,这就是我们插入已经存在的键的原因)。从应用程序用户端-我们通过account_id语句查询选择。

我想知道是否有更好的方法来模拟这种行为,并查看了Cassandra的最佳实践和类似的问题(如何为时间序列、服务器指标模拟Cassandra DB)。

想过这样的事情:

CREATE TABLE current_data_2 (
        account_id text, 
        time timeuuid,      
        value text,
        PRIMARY KEY (account_id, time) WITH CLUSTERING ORDER BY (time DESC)
)

不会发生覆盖,每次插入也将使用TTL(可以是几分钟的TTL)完成。

问题是,第二个数据模型比第一个数据模型有多好,如果有的话。据我了解,主要优势将在于 READS - 由于数据是按时间排序的,我需要做的就是一个简单的

SELECT * FROM metrics WHERE account_id = <id> LIMIT 1

而在第一个数据模型中,Cassandra实际上读取了覆盖同一个键的所有行,然后根据其写入时间戳选择最后一行(如果我错了,请纠正我)。

谢谢你。

共有1个答案

叶光华
2023-03-14

首先,我鼓励您查看有关阅读路径的官方留档。

数据按时间排序

只有在第二种情况下,当Cassandra读取单个SSTable和MemTable时,这种情况才成立(查看流程图)。

Cassandra 实际上读取覆盖相同键的所有行,然后通过其写入时间戳选择最后一行

这发生在留档中的按时间戳合并单元格步骤(再次检查流程图)。请注意,在每个SSTable中,第一种情况下的行数将是一个。

在这两种情况下,主要的驱动因素是在读取过程中需要检查多少个SSTable。它在某种程度上独立于每个SSTable包含多少记录。

但是在第二种情况下,您有更大的SSTabes,这会导致更长的SSTable压缩。TTL过期还会执行额外的写入。所以第一种情况更可取。

 类似资料:
  • 任何一个都可以,要求数据是一个字符串化的JSON对象。我的查询将返回用户在给定时间范围内的所有数据。哪种模式更有意义,或者有更好的方法来解决这个问题?

  • 我是Cassandra的新手,正在寻找一个关于如何为具有以下一般结构的数据建模的最佳实践: 对于不同的用户,附加的数据字段不一定相同(字段的名称或这些字段的类型) 示例(csv格式:) 我考虑过的几个选择: null 每个User_id创建Keyspace 每个关键字空间创建表“data” 备注: null null 创建多个keyspaces(例如“x”个keyspaces),每个keyspac

  • 表1: 表1的键和数据大小: 我的分区密钥为enterprise_id+campaign_id。每个企业可以有几个活动。datastore可能有几百个活动的数据。每个活动可以有多达200万-300万的记录。因此,在100个企业中可能有3000个分区,每个分区有2-3个miilion记录。 Cassandra查询:查询始终使用分区键+主键直到日期时间。订阅id包含在主键中,以保持每个记录的唯一性,因

  • 过去几天,我一直在浏览在线文章、视频,甚至是堆叠帖子,以了解如何在cassandra中建模数据。我理解需要根据查询模式对数据进行建模,但我不理解的是cassandra中的列族和列关系,如果这适用于它们,我想查询数据。 我有一个关系数据库表,其中包含以下内容 本质上,它是一个包含客户 ID 及其账户 ID 的表,因此唯一键将cust_id acct_id。每个客户可以有多个 1 个或多个帐户。有一些

  • 我从一个用spark-kafka-cassandra(在kubernetes上)重写猛犸象spark-kafka-hbase应用程序的初步想法开始。 我有以下数据模型,一个支持全时插入,另一个支持upserts 办法1: 创建表test.inv_positions( location_id int, item bigint, time_id timestamp, sales_floor_qty i

  • 我阅读了cassandra数据建模,除了非规范化数据可能会发生变化之外,一切都很清楚。我如何同步它?当用户电子邮件更改时,更新的方法是什么: < code>groupname是组的一部分,数据模型中的用户可能不知道任何组,因此在用户更改后无法更新电子邮件。 下面描述的解决方案是否合适? 向用户模型中添加一列(类型