我有一个带有以下方案的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') ;
但我的问题是我不想在请求中指定名称和记录时间,我只想知道传感器每小时有多少记录。
怎么做?在这种情况下,什么是正确的查询?
答案 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 = ?
如果您已经拥有记录数据,并且希望这些数据位于计数器表中,那么您可以使用驱动程序分页扫描所有行并递增计数器。
或使用“复制”命令转储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';