我在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将有一个不同的主键
答案 0 :(得分: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)
其中
选择“查询”以获取任何时间的最后一小时:使用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`