Cassandra:将动态列与固定列相结合

时间:2014-06-03 16:16:04

标签: cassandra key schema cluster-computing cql

我是Cassandra的新手,我想知道如何解决这个传感器数据问题:

每个传感器都有一个名称和描述,以及多个时间戳,每个时间戳都有一个值。 在JSON中它看起来像这样:

[{
  "sensor"      : "Sensor1",
  "description" : "first sensor",
  "timeseries"  : {
      1200001 : 2,
      1200002 : 5,
      1200006 : 1,
      1200009 : 3,
      1200011 : 7,
      1200012 : 9 }
}]

如何使用CQL保存? 我试过这样的事情:

CREATE TABLE sensordata (
    sensor text,
    description text,   
    time int,           
    value int,          
    PRIMARY KEY (sensor, time)
);

但是这会保存每个时间戳的描述。如果我将描述添加为群集密钥,我总是必须在编写时提供它。 我的写作应该是这样的:

INSERT INTO sensordata (sensor, description) VALUES ('Sensor1', 'first sensor');
INSERT INTO sensordata (sensor, time, value) VALUES ('Sensor1', 1200001, 2);
INSERT INTO sensordata (sensor, time, value) VALUES ('Sensor1', 1200002, 5);
INSERT INTO sensordata (sensor, time, value) VALUES ('Sensor1', 1200006, 1);

可能我应该只使用两张桌子?

CREATE TABLE sensormetadata (
    sensor text,
    description text,
    PRIMARY KEY (sensor)
);
CREATE TABLE sensordata (
    sensor text,
    time int,           
    value int,          
    PRIMARY KEY (sensor, time)
);

最后,我想查询一个特定的传感器(在规定的时间范围内)。 另一个查询将是过去120秒内的所有传感器数据。

SELECT description, time, value from sensordata WHERE sensor='Sensor1';
SELECT description, time, value from sensordata WHERE sensor='Sensor1' AND time > 1200000 AND time < 1250000;
SELECT sensor, description, time, value from sensordata WHERE time > 1200000;

谢谢!

最佳, 马尔特

1 个答案:

答案 0 :(得分:2)

您可以使用第一个架构,但将description列设为静态:

CREATE TABLE sensordata (
    sensor text,
    description text static,
    time int,           
    value int,          
    PRIMARY KEY (sensor, time)
);

这实质上意味着描述将按每个分区存储一次(或每个传感器ID一次),但会出现在每一行中。静态列已添加到2.0.6中,您可以在此处阅读有关它们的更多信息:http://www.datastax.com/dev/blog/cql-in-2-0-6