Кассандра, простой запрос - PullRequest
0 голосов
/ 19 июля 2011

Я начинаю с Кассандры, но мне сложно понять, как работают запросы.

У меня есть это

[default@Keyspace1] get Users[jsmith];                    
=> (column=adress, value=London, timestamp=1311087089506000)
=> (column=age, value=*, timestamp=1311086896514000)
=> (column=first, value=John, timestamp=1311086884652000)
=> (column=last, value=Smith, timestamp=1311086891619000)
Returned 4 results.

В SQL я могу сделать: SELECT last FROM Keyspace1 WHERE first="John"

Но на языке кассандры?

Я пытаюсь что-то подобное, но, признаюсь, я совершенно не понимаю синтаксис.

[default@Keyspace1] keyspace1.get("column_family","John","last")
... 

Ответы [ 2 ]

1 голос
/ 19 июля 2011
[default@stackoverflow] set Users['jsmith']['address']=London;
Value inserted.
[default@stackoverflow] set Users['jsmith']['age']=42;
Value inserted.
[default@stackoverflow] set Users['jsmith']['first']=john;
Value inserted.
[default@stackoverflow] set Users['jsmith']['last']=smith;
Value inserted.
[default@stackoverflow] get Users['jsmith']['last'];
=> (column=last, value=smith, timestamp=1311090805707000)

Но для этого вы должны знать ключ строки.Это будет трудно сделать такой поиск; посмотрите на эту ветку, они обсуждают то же самое .


Обновление (спасибо @ jbellis за подсказку)

Кажется, в Cassandra 0.7 и более новых выпусках добавлено немало вещей.Я работал на 0,6.Итак, да, вы можете сделать это.

В Cassandra 0.7 вы можете

[default@unknown] connect localhost/9160;
Connected to: "Test Cluster" on localhost/9160
[default@unknown] use stackoverflow;
[default@stackoverflow] create column family IndexedUsers with 
comparator=UTF8Type and column_metadata=[
{column_name:address, validation_class:UTF8Type}, 
{column_name:age, validation_class:UTF8Type}, 
{column_name:first, validation_class:UTF8Type, index_type:KEYS}, 
{column_name:last, validation_class:UTF8Type}];
79d6ebce-b279-11e0-9ddf-e700f669bcfc
Waiting for schema agreement...
... schemas agree across the cluster
[default@stackoverflow] set IndexedUsers['jsmith']['age']=42;
Value inserted.
[default@stackoverflow] set IndexedUsers['jsmith']['address']='London';
Value inserted.
[default@stackoverflow] set IndexedUsers['jsmith']['first']='John';
Value inserted.
[default@stackoverflow] set IndexedUsers['jsmith']['last']='Smith';
Value inserted.
[default@stackoverflow] get IndexedUsers where first='John';
-------------------
RowKey: jsmith
=> (column=address, value=London, timestamp=1311129646984000)
=> (column=age, value=42, timestamp=1311129627578000)
=> (column=first, value=John, timestamp=1311129676977000)
=> (column=last, value=Smith, timestamp=1311129698125000)

1 Row Returned.

Но не

[default@stackoverflow] get IndexedUsers[last] where first='John';
Syntax error at position 23: missing EOF at 'where'

, потому что:

[default@stackoverflow] help get;
get <cf>['<key>'];
get <cf>['<key>']['<col>'] (as <type>)*;
get <cf>['<key>']['<super>'];
get <cf>['<key>'][<function>];
get <cf>['<key>'][<function>(<super>)][<function>(<col>)];
get <cf> where <column> = <value> [and <column> > <value> and ...] [limit <integer>];
Default LIMIT is 100. Available operations: =, >, >=, <, <=

CQL - лучший вариант здесь, кажется.Это часть релиза Cassandra 0.8. См. Это .Там вы можете:

CREATE INDEX [index_name] ON <column_family> (column_name);

, а затем

SELECT [FIRST N] [REVERSED]  col_name1, col_name2 FROM <COLUMN FAMILY> 
[USING <CONSISTENCY>] [WHERE <CLAUSE>] [LIMIT N];

См. Полные команды CQL здесь .

0 голосов
/ 20 июля 2011

В этом посте объясняется, как создавать индексы и выполнять запросы, подобные тому, который вам нужен, в Cassandra: http://www.datastax.com/dev/blog/whats-new-cassandra-07-secondary-indexes

...