Cassandra:制作合适的数据模型

时间:2015-08-12 15:42:32

标签: cassandra

我在MYSQL中有一个名为Price的表,如下所示:

+---------+-------------+------+-----+-------------------+-----------------------------+
| Field   | Type        | Null | Key | Default           | Extra                       |
+---------+-------------+------+-----+-------------------+-----------------------------+
| Current | float(20,3) | YES  |     | NULL              |                             |
| Time    | timestamp   | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+---------+-------------+------+-----+-------------------+-----------------------------+

我的申请要求我汇总并检索从最近一周开始的最后1小时2小时的结果。我正试图搬到Cassandra,想为我的数据制作一个合适的模型。目前我在Cassandra建了一个表,看起来像这样:

CREATE TABLE IF NOT EXISTS HAS.Price (
    ID INT,
    Current float,
    Time timestamp,
    Time_uuid timeuuid,
    PRIMARY KEY (ID, Time_uuid)
);

这不符合逻辑,因为它只创建了一个大表,我不认为这会将数据分发给其他节点。我在这里使用固定id为1。我相信在我的情况下,选择的逻辑分区键是“小时”,所以例如我可以汇总去年,最后2小时的所有当前值,依此类推。在这种情况下,我指的是post。如果我创建小时作为分区键,例如所有数据,让我们说一天中的第15个小时将进入此行

2015-08-06 15:00:00

,下一个小时的数据将转到2015-08-06 16:00:00。不过请说当前时间是2015-08-06 16:12:43而且我想从最后一小时选择记录我的查询会是什么样子,因为部分数据是在2015-08-06 15:00:00将有一个不同的主键

2 个答案:

答案 0 :(得分:1)

尝试以下选项。 (我的答案是正确的)

设计您的查询。在这里,我可以看到除了最多分钟之外的其他查询

  1. 获得一天的总和

  2. 获取小时数

  3. 获取最后一小时的总和(小时的任何时间)

    CREATE TABLE mykeyspace.price (
    day text,
    hour text,
    inserttime timeuuid,
    current float,
    PRIMARY KEY ((day, hour), inserttime)
    ) WITH CLUSTERING ORDER BY (inserttime DESC)
    
  4. 为每个交易设置2个插入,如下所示

        insert into price (day, hour  , inserttime , current ) VALUES    ('20150813','',now(),2.00)
        insert into price (day, hour  , inserttime , current ) VALUES         ('',’ 2015081317',now(),2.00)
    

    其中

    • 日是YYYYMMDD
    • 小时YYYYMMDDhhmmss(2015081317)

    选择“查询”以获取任何时间的最后一小时:使用minTimeuuid和maxTimeuuid

        select day,hour,dateOf(inserttime) from price where day = 0 and hour IN ( 2015081317, 2015081316) and inserttime > maxTimeuuid('2015-08-13 16:20:00-0500') and inserttime < minTimeuuid('2015-08-13 17:20:00-0500');
    

    注意:分区键上不允许范围查询,尽管文档说您可以使用令牌功能但结果不可预测。

答案 1 :(得分:1)

  

这不符合逻辑,因为它只创建了一个大表,我不认为这会将数据分发给其他节点。

是的,这不会在您的节点之间分发数据。

这里我认为解决方案应该是

CREATE TABLE IF NOT EXISTS HAS.Price (
    Time_uuid timeuuid,
    Current float,
    PRIMARY KEY (Time_uuid)
);

然后只需找到开始时间time_uuid和结束时间time_uuid并编写类似

的查询
`SELECT * FROM HAS.Price WHERE  time_uuid>=cdb36860-4444-11e5-8080-808080808080 AND time_uuid<=f784b8ef-450d-11e5-7f7f-7f7f7f7f7f7f`