我有以下数据集要求,需要知道我应该使用哪种数据类型以及如何相应地保存我的数据: -
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>>"
我应该如何在单列中存储此类数据。请建议数据类型和插入命令。 谢谢,
答案 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,这样会更有效,更安全。