作为一个结果处理多个查询

时间:2018-05-29 05:44:26

标签: merge cassandra resultset

让我说我有这张桌子

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问题。有没有更好的方法,如何处理/合并查询结果到一组?

由于

2 个答案:

答案 0 :(得分:2)

您可以使用IN指定年份列表,但这不是最佳解决方案 - 因为year字段是分区键,那么很可能数据将位于不同的计算机上,因此其中一个节点将作为&#34;协调器&#34;,并且需要向另一台机器询问结果和聚合数据。从性能的角度来看,并行发出的2个异步请求可能会更快,然后在客户端进行合并。

P.S。你的数据模型有很严重的问题 - 你按年划分,这意味着:

  • 数据在整个群集中分布非常好 - 只有N = RF机器才能保存数据;
  • 即使您只获得数百台设备,每分钟报告一次测量,这些分区也会非常庞大​​;
  • 只有一个分区是&#34; hot&#34; - 它将在一年内收到所有数据,并且其他分区不会经常使用。

您可以使用几个月甚至几天作为分区键来减小分区的大小,但它仍然无法解决&#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运算符吗?