CQL选择一列复合键

时间:2014-11-12 03:36:50

标签: cassandra cql

我正在使用Cassandra数据库,并希望使用cqlsh以复合键格式查看存储在其中的数据的某些特定信息。数据模型如下:

rowkey(username)  column1(id)  column2(city:<city>)  value

Alice             12           city:Boston           100
Tom               13           city:New York         200
Bill              22           state:CA              111

如您所见,数据使用复合键存储,column2具有模式:citystate(字符串)+ another String(此可能会有所不同)。然后在cqlsh我可以做些什么来查看value根据column2的模式:city + : + cityname?例如,它列出了所有&#39;值&#39;在city:中使用column2模式?

ps:架构

CREATE TABLE info (
key text,
column1 bigint,
column2 text,
value bigint,
PRIMARY KEY (key, column1, column2)
) WITH COMPACT STORAGE AND
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=864000 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'SnappyCompressor'};

2 个答案:

答案 0 :(得分:3)

不,使用您的架构无法实现您的目标。卡桑德拉不支持like query。 @catpaws的答案是实现目标的解决方案之一。他想说的是,不是使用单个列(对于column2),而是可以拆分为两列(locationType和locationName)并创建locationType as one of the primary keysecondary indexed column。以下架构描述了as one of the primary key策略

CREATE TABLE info (
key text,
column1 bigint,
locationType text,
locationName text,
value bigint,
PRIMARY KEY (key, column1, locationType)
)

因此可以使用where子句进行查询。例如,

select * from info where key = 'Tom' and column1 = 13 and locationType = 'city'

以下架构描述了secondary indexed column策略

CREATE TABLE info (
key text,
column1 bigint,
locationType text,
locationName text,
value bigint,
PRIMARY KEY (key, column1)
) 

CREATE INDEX info_locationType ON info (locationType);

因此可以使用where子句进行查询。例如,

select * from info where key = 'Tom' and locationType = 'city'

但是,如果您使用以低基数索引的二级索引(这意味着locationType将只有两个值city or state中的任何一个),这将影响您的查询性能。还有一点需要记住,在使用二级索引时,经常更改列值不应该使用二级索引(但在你的情况下,我猜测的是,locationType不会经常更改),所以请尝试在主键中使用locationType。

如果您想要实现like的使用,那么请使用Solandra https://github.com/tjake/Solandra

答案 1 :(得分:1)

在Cassandra 2.1及更高版本中:

create table users (
username text,
id int,
location map,
value int,
PRIMARY KEY (username, id));

insert into users (username, id, location, value) VALUES ('Alice', 12, {'city': 'Boston'}, 100);
insert into users (username, id, location, value) VALUES ('Tom', 13, {'city': 'New York'}, 200);
insert into users (username, id, location, value) VALUES ('Bill', 22, {'state': 'CA'}, 111);
create index mymapvalues on users (location);
select * from users where location CONTAINS 'New York';

 username | id | location             | value
----------+----+----------------------+-------
      Tom | 13 | {'city': 'New York'} |   200

(1 rows)
drop index mymapvalues;
create index mymapvalueindex ON users (KEYS(location));
select * from users where location contains key 'city';

 username | id | location             | value
----------+----+----------------------+-------
      Tom | 13 | {'city': 'New York'} |   200
    Alice | 12 |   {'city': 'Boston'} |   100

(2 rows)

在早期版本中,请使用此过程SELECT Specific Value from map