在Cassandra集合中存储计数器

时间:2018-06-28 20:00:26

标签: 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不支持集合内的counter。是否有其他替代方法或解决方案来解决此问题?感谢您的帮助

1 个答案:

答案 0 :(得分:1)

这里唯一的替代方法是将地图的“键”移到表的主键中。现在,您正在尝试像这样建模(据我了解):

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的每一对密钥/计数器,因此您需要有一个将它们合并到地图中的代码...