通过 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,那么您可以使用驱动程序分页来扫描所有行并递增计数器。
或者使用 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';
我有一个 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,那么您可以使用驱动程序分页来扫描所有行并递增计数器。
或者使用 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';