首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >卡桑德拉数据的实时建模

卡桑德拉数据的实时建模
EN

Stack Overflow用户
提问于 2017-10-17 10:59:04
回答 1查看 350关注 0票数 4

我目前有一个应用程序,该应用程序将事件驱动的实时流数据保存到列族中,该列族是这样建模的:

代码语言:javascript
复制
CREATE TABLE current_data (
    account_id text, 
    value text,
    PRIMARY KEY (account_id)
)

每accountId每X秒发送一次数据,所以每次接收事件时我们都会覆盖现有的行。这些数据包含当前的实时信息,我们只关心最近的事件(对旧的数据没有任何用处,这就是为什么我们在一个已经存在的键上插入)。从应用程序用户端-我们查询一个select by account_id语句。

我想知道是否有更好的方法来模拟这种行为,我正在研究Cassandra的最佳实践和类似的问题(如何为时间序列、服务器度量建模Cassandra DB)。

想到这样的事情:

代码语言:javascript
复制
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 )。

的问题是,如果说是第二个数据模型,它比第一个模型更好。据我所知,主要的优势在于读取--因为数据是按时间排序的,我所需要做的只是简单的。

代码语言:javascript
复制
SELECT * FROM metrics WHERE account_id = <id> LIMIT 1

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-24 21:55:15

首先,我鼓励您查看有关阅读路径。的正式文档

数据是按时间排序的

这仅在第二个例子中是正确的,当Cassandra读取单个SSTableMemTable时(查看流程图)。

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

这发生在合并单元格上,在文档中的时间戳步骤中(再次检查流程图)。注意,在每个SSTable中,第一个例子中的行数是一个。

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

但是在第二种情况下,SSTabes要大得多,这会导致更长的SSTable压缩时间。另外,TTL过期执行额外的写入。所以第一种情况比较好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46788521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档