【问题标题】:Cassandra : Making an appropriate Data ModelCassandra:制作合适的数据模型
【发布时间】:2015-08-18 15:27:57
【问题描述】:

我在 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)
);

这不合逻辑,因为它只是创建了一个大表,我认为这不会将数据分发到其他节点。我在这里使用 1 的固定 ID。我相信在我的情况下,要选择的逻辑分区键是“小时”,所以例如我可以总结上一小时、过去 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 中,我的查询会是什么样子会有不同的主键

【问题讨论】:

  • 我们在谈论多少价值观? 100/小时? 10k? 100m?

标签: cassandra


【解决方案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)
    

为每个事务插入 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');

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

【讨论】:

    【解决方案2】:

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

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

    我认为解决方案应该是这样的

    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`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-14
      • 2013-01-31
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 2012-11-18
      • 2018-06-26
      相关资源
      最近更新 更多