让我说我有这张桌子
CREATE TABLE device_data_by_year (
year int,
device_id uuid,
sensor_id uuid,
nano_since_epoch bigint,
unit text,
value double,
source text,
username text,
PRIMARY KEY (year, device_id, nano_since_epoch,sensor_id)
) WITH CLUSTERING ORDER BY (device_id desc, nano_since_epoch desc);
我需要在2017年到2018年之间查询特定设备和传感器的数据。在这种情况下,将发出2个查询:
select * from device_data_by_year where year = 2018 AND device_id = ? AND sensor_id = ? AND nano_since_epoch >= ? AND nano_since_epoch <= ?
select * from device_data_by_year where year = 2018 AND device_id = ? AND sensor_id = ? AND nano_since_epoch >= ? AND nano_since_epoch <= ?
目前,我遍历结果集并构建包含所有结果的List。我知道这可能(并且将来)有一天会遇到OOM问题。有没有更好的方法,如何处理/合并查询结果到一组?
由于
答案 0 :(得分:2)
您可以使用IN
指定年份列表,但这不是最佳解决方案 - 因为year
字段是分区键,那么很可能数据将位于不同的计算机上,因此其中一个节点将作为&#34;协调器&#34;,并且需要向另一台机器询问结果和聚合数据。从性能的角度来看,并行发出的2个异步请求可能会更快,然后在客户端进行合并。
P.S。你的数据模型有很严重的问题 - 你按年划分,这意味着:
您可以使用几个月甚至几天作为分区键来减小分区的大小,但它仍然无法解决&#34; hot&#34;分区。
如果我没记错的话,DataStax Academy的Data Modelling course有一个传感器网络数据模型的例子。
答案 1 :(得分:0)
将表格结构更改为:
CREATE TABLE device_data (
week_first_day timestamp,
device_id uuid,
sensor_id uuid,
nano_since_epoch bigint,
unit text,
value double,
source text,
username text,
PRIMARY KEY ((week_first_day, device_id), nano_since_epoch, sensor_id)
) WITH CLUSTERING ORDER BY (nano_since_epoch desc, sensor_id desc);
根据@AlexOtt提议。需要对应用程序逻辑进行一些更改 - 例如,findAllByYear现在需要迭代一周。
回到最初的问题:你宁愿发送52个查询(getDataByYear,每周一个查询),你会在这里使用IN运算符吗?