其实你的查询:
SELECT temperature FROM temperature WHERE event_time > ’2013-04-03 07:01:00′ AND event_time < ’2013-04-03 07:04:00′;
将无法运行。 Cassandra 确实必须知道必须在哪个分区中查找您请求的数据,也就是说,您始终必须指定分区键。
为了有效地检索此查询的数据,您还需要围绕该查询对数据进行建模:
CREATE TABLE temperature_by_time (
granularity timestamp,
event_time timestamp,
weatherstation_id text,
temperature text,
PRIMARY KEY (granularity, event_time)
);
在这里我添加了字段granularity。此字段允许您控制分区的宽度。一个好的经验法则是每个分区中最多有大约 10k-100k 行。根据您写入此表的速度,您可以采用不同的方式进行操作。例子:
案例一
在这种情况下,您将编写 10 小节/秒,36k 小节/小时。一个好的粒度值类似于yyyy-mm-dd HH:00:00,即您按小时对数据进行分区:
INSERT INTO temperature_by_time (granularity, event_time, ..) VALUES ('2017-01-11 10:00:00', '2017-01-11 10:05:01', ...);
INSERT INTO temperature_by_time (granularity, event_time, ..) VALUES ('2017-01-11 10:00:00', '2017-01-11 10:19:15', ...);
INSERT INTO temperature_by_time (granularity, event_time, ..) VALUES ('2017-01-11 10:00:00', '2017-01-11 10:39:35', ...);
INSERT INTO temperature_by_time (granularity, event_time, ..) VALUES ('2017-01-11 10:00:00', '2017-01-11 10:59:49', ...);
SELECT * FROM temperature_by_time WHERE granularity='2017-01-11 10:00:00';
SELECT * FROM temperature_by_time WHERE granularity='2017-01-11 10:00:00' AND event_time >= '2017-01-1 10:30:00' AND event_time < '2017-01-1 11:00:00';
也就是说,您将event_time“截断”为整数小时,并且只能获取每小时的记录。
案例 2
在这种情况下,您将编写 100 小节/秒,360k 小节/小时。好的粒度值类似于yyyy-mm-dd HH:00:00、yyyy-mm-dd HH:15:00、yyyy-mm-dd HH:30:00、yyyy-mm-dd HH:45:00,也就是说,您可以按一刻钟对数据进行分区:
INSERT INTO temperature_by_time (granularity, event_time, ..) VALUES ('2017-01-11 10:00:00', '2017-01-11 10:05:01', ...);
INSERT INTO temperature_by_time (granularity, event_time, ..) VALUES ('2017-01-11 10:15:00', '2017-01-11 10:19:15', ...);
INSERT INTO temperature_by_time (granularity, event_time, ..) VALUES ('2017-01-11 10:30:00', '2017-01-11 10:39:35', ...);
INSERT INTO temperature_by_time (granularity, event_time, ..) VALUES ('2017-01-11 10:45:00', '2017-01-11 10:59:49', ...);
SELECT * FROM temperature_by_time WHERE granularity='2017-01-11 10:00:00';
SELECT * FROM temperature_by_time WHERE granularity='2017-01-11 10:00:00' AND event_time >= '2017-01-1 10:30:00' AND event_time < '2017-01-1 10:33:00';
也就是说,您将event_time“截断”到一刻钟,并且只能获取一刻钟的记录。
案例 3
您已经知道如何继续...