【问题标题】:Storing counter inside cassandra collection在 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 不支持集合内的计数器。是否有任何替代方法或解决方案来解决这个问题?感谢您的帮助

【问题讨论】:

  • 你的主键和集群键是什么?
  • @ChrisLohfink 更新了问题,谢谢

标签: cassandra


【解决方案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 的每一对键/计数器,因此您需要有一个将它们合并到映射中的代码...

【讨论】:

  • 实际上是可能的,但这是否意味着我必须将每个键存储为一行?我是第一次使用 cassandra,这种模型不会让工作量大吗?
  • 是的,您需要将每个键存储为单独的行。这是 counter 类型的限制 - 您不能在同一个表中拥有计数器和非计数器值 - 所有非计数器值都应该在主键中。
  • 另外,如果您要计算需要精度的东西,那么计数器类型不是您需要的 - 它们是近似值,并且可能存在差异。
  • 其实我不打算使用 cassandra 聚合函数。我将汇总指标并将其计算在 apache spark 中。这样,spark 将在每个新事件流式传输时更新表。所以,精度不是我的第一个关注点,性能才是。
  • 我知道我不应该在评论中要求更多,但是还有什么比计数器更精确的方法?
猜你喜欢
  • 2018-08-03
  • 1970-01-01
  • 2015-07-18
  • 2017-12-20
  • 1970-01-01
  • 2015-08-29
  • 2018-05-07
  • 1970-01-01
  • 2012-02-09
相关资源
最近更新 更多