我正在使用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
具有模式:city
或state
(字符串)+ 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'};
答案 0 :(得分:3)
不,使用您的架构无法实现您的目标。卡桑德拉不支持like query
。 @catpaws的答案是实现目标的解决方案之一。他想说的是,不是使用单个列(对于column2),而是可以拆分为两列(locationType和locationName)并创建locationType as one of the primary key
或secondary 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