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

Get data by a specific query in a cassandra keyspace

我有一个 cassandra table 具有以下方案:

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') ;

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

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

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

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

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

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

每插入一条记录到records中,计数的值递增:

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

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

SELECT * FROM record_count WHERE sensor_id = ?

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

勾选这个Python Driver Pagination

或者使用 Copy 命令转储 sensor_id 和 record_hour

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

现在只需为 records.csv 的每一行在行尾附加 ,1 并写入另一个文件,比如 record_count.csv。现在你有了 csv,你可以直接导入它.

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