cassandra数据建模中的嵌套映射

时间:2018-06-13 09:40:08

标签: cassandra datastax cassandra-2.0 cassandra-3.0

我有以下数据集要求,需要知道我应该使用哪种数据类型以及如何相应地保存我的数据: -

CREATE TABLE events (
id text,
evntoverlap map<text, map<timestamp,int>>,
PRIMARY KEY (id)
) 

evntoverlap = {
               'Dig1': {{'2017-10-09 04:10:05', 0}}, 
               'Dig2': {{'2017-10-09 04:11:05', 0},{'2017-10-09 04:15:05', 0}},
               'Dig3': {{'2017-10-09 04:11:05', 0},{'2017-10-09 04:15:05', 0},{'2017-10-09 04:11:05', 0}}
              }

这会出错: -

Error from server: code=2200 [Invalid query] message="Non-frozen collections are not allowed inside collections: map<text, map<timestamp, int>>"

我应该如何在单列中存储此类数据。请建议数据类型和插入命令。 谢谢,

2 个答案:

答案 0 :(得分:1)

Cassandra有限制 - 你不能在集合中嵌套集合(或UDT)而不冻结它。所以你需要“冻结”其中一个集合 - 嵌套:

CREATE TABLE events (
id text,
evntoverlap map<text, frozen<map<timestamp,int>>>,
PRIMARY KEY (id)
);

或顶级:

CREATE TABLE events (
id text,
evntoverlap frozen<map<text, map<timestamp,int>>>,
PRIMARY KEY (id)
);

有关详细信息,请参阅documentation

答案 1 :(得分:1)

CQL集合限制为64kb,如果在地图中放置地图等内容可能会推动该限制。特别是对于冻结地图,您要反序列化整个地图,修改它并重新插入。

可能会更好
CREATE TABLE events (
  id text,
  evnt_key, text
  value map<timestamp, int>,
  PRIMARY KEY ((id), evnt_key)
  ) 

甚至是

CREATE TABLE events (
  id text,
  evnt_key, text
  evnt_time timestamp
  value int,
  PRIMARY KEY ((id), evnt_key, evnt_time)
  )

提供额外的好处,例如能够按升序或降序订购event_time,这样会更有效,更安全。