首页 文章

Cassandra:制作合适的数据模型

提问于
浏览 1724
1

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

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

我的申请要求我总结并检索从最近一周到最后一周的2小时,最后一周的结果 . 我正在尝试迁移到Cassandra,并希望为我的数据 Build 一个合适的模型 . 目前我在Cassandra建了一个表,看起来像这样:

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

这不合逻辑,因为它只创建了一个大表,我不认为这会将数据分发给其他节点 . 我在这里使用固定ID为1 . 我相信在我的情况下,选择的逻辑分区键是"hour"所以例如我可以汇总最后一小时,最后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 回答

  • 1

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

    为您的查询设计 . 在这里,我可以看到除了最多分钟之外的可能查询

    • 获取当天的总和

    • 获取小时数

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

    CREATE TABLE mykeyspace.price (
    day text,
    hour text,
    inserttime timeuuid,
    current float,
    PRIMARY KEY ((day, hour), inserttime)
    ) WITH CLUSTERING ORDER BY (inserttime DESC)
    

    为每个交易制作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

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

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

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

    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`
    

相关问题