首页 > 解决方案 > 在 cassandra 集合内存储计数器

问题描述

我想存储来自传感器的聚合数据,这是我的 cassandra 表架构计划

更新

CREATE TABLE every_second_aggregate_signature(
    device_id text,
    year int,
    month int,
    day int,
    hour int,
    minute int,
    second int,
    signature map<text,counter>,
    PRIMARY KEY ((device_id, year, month, day, hour, minute, second))
)WITH CLUSTERING ORDER BY (year DESC, month DESC, day DESC, hour DESC, minute DESC, second DESC);

签名数据采用增量值和动态值的形式,例如。

ts1 - {"4123sad" : 80, "djas10" : 99}
ts2 - {"4123sad" : 83, "djas10" : 103}
ts3 - {"4123sad" : 87, "djas10" : 198, "asfac9" : 281}
ts4 - {"4123sad" : 89, "djas10" : 201, "asfac9" : 540, "asd81" : 12}

问题是我知道 cassandra 不支持集合内的计数器。是否有任何替代方法或解决方案来解决这个问题?谢谢你的帮助

标签: cassandra

解决方案


这里唯一的替代方法是将映射的“键”移动到表的主键中。现在你正在尝试像这样建模(据我所知):

create table counters (
  ts timestamp primary key,
  counters map<text, counter>
);

然后,您需要将其更改为以下内容:

create table counters (
  ts timestamp,
  key text,
  counter counter,
  primary key (ts, key)
);

并选择应该进入地图的所有值,你只需做

select ts, key, counter from counters where ts = 'some value';

它会为您返回在单独的行中给定的每一对键/计数器ts,因此您需要有一个将它们合并到映射中的代码...


推荐阅读