通过cassandra键空间中的特定查询获取数据

时间:2017-04-28 09:12:23

标签: cassandra request cqlsh

我有一个带有以下方案的cassandra表:

CREATE TABLE keyspace1.records (
    name text,
    sensor_id text,
    record_hour timestamp,
    record_time timestamp,
    raw_value text,
    value text,
    PRIMARY KEY ((name, sensor_id, record_hour), record_time)
)

我想从记录中得到每个传感器每小时记录的记录数。 例如:

sensor_id 145 has 3 records at 2016-10-13 10:00:00+0000
sensor_id 145 has 12 records at 2016-10-13 12:00:00+0000
sensor_id 227 has 4 records at 2016-10-14 20:00:00+0000
sensor_id 227 has 7 records at 2016-10-14 17:00:00+0000
sensor_id 227 has 2 records at 2016-10-14 08:00:00+0000

当我尝试获取一次捕获的所有记录时,我这样做了一个请求:

SELECT * FROM keyspace1.records WHERE sensor_id='145' ;

我收到此错误:

InvalidRequest: Error from server: code=2200 [Invalid query] message="Partition key parts: name must be restricted as other parts are"

当我尝试这个查询时,我得到了一个结果,但不是我正在寻找的东西:

SELECT * FROM keyspace1.records WHERE sensor_id = '145' AND name = 'client_NYC' AND record_hour IN ('2016-07-16 17:00:00+0000',  '2016-07-16 22:00:00+0000') ;

但我的问题是我不想在请求中指定名称和记录时间,我只想知道传感器每小时有多少记录。

怎么做?在这种情况下,什么是正确的查询?

1 个答案:

答案 0 :(得分:0)

查询时必须指定所有分区键。

您已将name, sensor_id, record_hour指定为分区键,因此每次查询时都指定了所有这些字段。

如果您只想要每个sensor_id的每小时记录数,最好创建一个如下所示的计数器表:

CREATE TABLE record_count(
    sensor_id text,
    record_hour timestamp,
    count counter,
    PRIMARY KEY(sensor_id, record_hour)
);

每次将记录插入记录时,都会增加count:

的值
UPDATE record_count SET count = count + 1 WHERE sensor_id = ? AND record_hour = ?

现在,您可以按小时获取每个传感器的记录数

SELECT * FROM record_count WHERE sensor_id = ?

如果您已经拥有记录数据,并且希望这些数据位于计数器表中,那么您可以使用驱动程序分页扫描所有行并递增计数器。

选中此Python Driver Pagination

或使用“复制”命令转储sensor_id和record_hour

COPY records (sensor_id , record_hour ) TO 'records.csv';

现在,只为每行records.csv添加,1在行尾并写入另一个文件record_count.csv。现在你有了csv,你可以直接导入它。< / p>

COPY record_count (sensor_id , record_hour , count) FROM 'record_count.csv';