从地图中选择特定值

时间:2013-04-15 21:17:03

标签: cassandra cql cql3

我正在尝试创建一个WIDE列表,20,000多列

最初我以为我会用:

CREATE TABLE details (
   key TEXT,
   detail map<TEXT, TEXT>
   PRIMARY KEY (KEY)
  );

插入此表可以正常工作

UPDATE details SET detail = detail + { 'col1': '12'} where key='123' ;
UPDATE details SET detail = detail + { 'col20000': 'ABCD'} where key='123' ;

但是,我想阅读一个单独的细节:

   select detail[col1] where key='123'

执行此查询时出现以下错误:

 no viable alternative at input '['

这会起作用吗,还是我需要一种不同的方法?

3 个答案:

答案 0 :(得分:14)

集合是您可以一次获取所有数据的小型数组。

如果你想更精细地访问元组,并且仍然能够询问“给定密钥的所有数据对是什么”,你应该使用这样的表:

CREATE TABLE details (
  key TEXT,
  detail_key text,
  detail_value text,
  PRIMARY KEY (key, detail_key)
);

这将允许SELECT * FROM details WHERE key = ?以及SELECT * FROM detail WHERE key = ? AND detail_key = ?

答案 1 :(得分:7)

cassandra基本上不支持此功能。

请参阅此cql3 collections

答案 2 :(得分:0)

您可以使用user-define type代替map type。 尝试以这种方式定义表:

CREATE TYPE detailtype (
    col1 TEXT,
    col2 TEXT
);

CREATE TABLE details (
   key TEXT,
   detail frozen<detailtype>,
   PRIMARY KEY (KEY)
);

然后您可以通过以下方式查询:

select detail.col1 where key='123';