merge - 将多个查询作为一个结果处理

标签 merge cassandra resultset

假设我有这张 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/

相关文章:

java - 结果集转换为 JSON。如何打印 json 对象?

r - 合并错误: negative length vectors are not allowed

Python同步读取排序文件

java - 从 java 中的结果集中返回 arraylist 的 arraylist

java - 用于存储数据库数据的 ResultSet 替代方案

java - 将数据从文件导入到具有 5 个节点的 Cassandra 集群会导致 BusyConnectionException

python - 基于列插值加入 Pandas

GitFlow : Properly Testing Release Branches & Master

hadoop - Cassandra 与 hadoop 集成以提高读取性能

Java Cassandra 异常 timeuuid