假设我有这张 table
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 <= ?
目前,我迭代结果集并构建包含所有结果的列表。我知道有一天这可能(并且将会)遇到 OOM 问题。有没有更好的方法,如何处理/合并查询结果到一组?
谢谢
最佳答案
您可以使用 IN
指定年份列表,但这不是非常理想的解决方案 - 因为 year
字段是分区键,那么数据很可能会由于位于不同的机器上,因此其中一个节点将充当“协调器”,并且需要向另一台机器询问结果并聚合数据。从性能角度来看,并行发出2个异步请求可能会更快,然后在客户端进行合并。
附注你的数据模型有相当严重的问题 - 你按年份分区,这意味着:
- 数据在集群中的分布不是很好 - 只有 N=RF 机器才能保存数据;
- 即使您只有数百台设备,每分钟报告一次测量结果,这些分区也会非常巨大;
- 只有一个分区会是“热”的 - 它将接收一年中的所有数据,其他分区不会经常使用。
你可以使用月,甚至天作为分区键来减小分区的大小,但这仍然不能解决“热”分区的问题。
如果我没记错的话,Data Modelling course DataStax Academy 有一个传感器网络数据模型的示例。
关于merge - 将多个查询作为一个结果处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50577069/