使用Cassandra获取时间序列数据

问题描述 投票:3回答:1

我正在研究将日志存储到Cassandra。 日志的架构将是这样的。

编辑:我已经改变了架构,以便做出一些澄清。

CREATE TABLE log_date (
  userid bigint,
  time timeuuid,
  reason text,
  item text,
  price int,
  count int,
  PRIMARY KEY ((userid), time) - #1
  PRIMARY KEY ((userid), time, reason, item, price, count) - #2
);

每天都会创建一个新表。因此,表只包含一天的日志。

我的查询条件如下。 查询特定用户在特定日期(日期而非时间)的所有日志。 因此,原因,项目,价格,计数将不会被用作查询的提示或条件。

我的问题是哪种PRIMARY KEY设计更适合。 编辑:这里的关键是我想以原理图的方式存储日志。

如果我选择#1,那么每个日志会创建很多列。并且每个日志具有更多值的可能性非常高。上面的架构只是一个例子。日志可以包含subreason,friendid等值。

如果我选择#2,则每个日志将创建一个(非常)复合列,到目前为止,我找不到有关复合列开销的任何有价值的信息。

我应该选择哪一个?请帮忙。

cassandra time-series composite-key
1个回答
19
投票

我的建议是,你的两个选项似乎都不适合你的时间序列,你每天创建一个表,这似乎也不是最优的。

相反,我建议按用户ID和日期创建一个表和分区,并使用时间uuids作为事件的聚集列,这样的示例如下所示:

CREATE TABLE log_per_day (
   userid bigint,
   date text, 
   time timeuuid, 
   value text,
      PRIMARY KEY ((userid, date), time)
)

这将允许您将一天中的所有事件放在一行中,并允许您按用户每天进行查询。

通过声明time聚簇列允许有一个宽行,您可以在一天中根据需要插入许多事件。

因此,行键是用户ID的composite key,加上文本中的日期,例如

insert into log_per_day (userid, date, time, value) values (1000,'2015-05-06',aTimeUUID1,'my value')

insert into log_per_day (userid, date, time, value) values (1000,'2015-05-06',aTimeUUID2,'my value2')

上面的两个插入将位于同一行,因此您将能够读取单个查询。

另外,如果您想了解更多有关时间序列的信息,我强烈建议您查看Getting Started with Time Series Data Modeling

希望能帮助到你,

何塞路易斯

© www.soinside.com 2019 - 2024. All rights reserved.