2013-06-09 5 views
0

Как подсчитать количество столбцов в разных строках семейства столбцов?Как подсчитать столбцы из нескольких строк

Я новичок в Cassandra. Я не знаю отправной точки. Единственный вариант, который у меня есть, - это сделать выборку данных для каждой строки за раз. Мне это не кажется правильным. Я использую Гектор для подключения к Кассандре.

ответ

0

Предположим, что у вас есть широкий ряд (Позволяет создать его с помощью CLI)

create column family cf3 
with column_type = 'Standard' and 
comparator = 'TimeUUIDType' and 
key_validation_class = 'UTF8Type' and 
default_validation_class = 'UTF8Type'; 

Это то, что я вижу в CQL3:

cqlsh:ks> desc table cf3; 

CREATE TABLE cf3 (
    key text, 
    column1 timeuuid, 
    value text, 
    PRIMARY KEY (key, column1) 
) 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'}; 

Я вставил некоторые значения из CQL3, что заставляет вас чувствовать себя как хороший оле»MySQL

cqlsh:ks> insert into cf3 (key, column1, value) values ('user1', now(), 'time5'); 
cqlsh:ks> select * from cf3; 

key | column1        | value 
-------+--------------------------------------+------- 
user1 | f0c687b0-d114-11e2-8002-2f4261da0d90 | time1 
user1 | fb9fa130-d114-11e2-8002-2f4261da0d90 | time2 
user1 | 09512f10-d115-11e2-8002-2f4261da0d90 | time3 
user1 | 0f5c93e0-d115-11e2-8002-2f4261da0d90 | time4 
user1 | 21155220-d115-11e2-8002-2f4261da0d90 | time5 

Но это ваш широкий ряд (как видно из CLI)

[[email protected]] list cf3; 
Using default limit of 100 
Using default column limit of 100 
------------------- 
RowKey: user1 
=> (column=f0c687b0-d114-11e2-8002-2f4261da0d90, value=time1, timestamp=1370789864363000) 
=> (column=fb9fa130-d114-11e2-8002-2f4261da0d90, value=time2, timestamp=1370789882563000) 
=> (column=09512f10-d115-11e2-8002-2f4261da0d90, value=time3, timestamp=1370789905537000) 
=> (column=0f5c93e0-d115-11e2-8002-2f4261da0d90, value=time4, timestamp=1370789915678000) 
=> (column=21155220-d115-11e2-8002-2f4261da0d90, value=time5, timestamp=1370789945410000) 

1 Row Returned. 
Elapsed time: 105 msec(s). 

Теперь вы хотели бы подсчитать количество столбцов, начиная с заданного времени и далее. Правильно? Для этого здесь CQL3.

cqlsh:ks> select count(*) from cf3 where key = 'user1' and column1 >= 09512f10-d115-11e2-8002-2f4261da0d90 ; 

count 
------- 
    3 

Теперь я несколько сомневаюсь, что происходит ниже. Но, моя интуиция говорит, что фактически все столбцы получаются на узле координатора и подсчитываются в памяти. Скорее всего, это похоже на то, что вы планировали вручную на клиентской машине.

Кроме того, я не знаю, может ли cassandra-cli предоставить такую ​​функциональность, но вы упомянули, что используете Гектор. Таким образом, вы можете использовать get_count или CountQuery, как упомянуто here, за исключением того, что null в качестве дальности и большого значения счета. Как это:

CountQuery<String, String> cq = HFactory.createCountQuery(keyspace, StringSerializer.get(), TimeUUIDSerializer.get()); 
cq.setColumnFamily(cf).setKey("user1"); 
cq.setRange(timestamp, null, Integer.MAX_VALUE); 
QueryResult<Integer> r = cq.execute(); 

(Неоткомпилированная код выше)

HTH


Старый ответ:

См Hector documentation:

CQL:

CqlQuery<String,String,Long> cqlQuery = new CqlQuery<String,String,Long>(keyspace, se, se, le); 
cqlQuery.setQuery("SELECT COUNT(*) FROM StandardLong1 WHERE KEY = 'cqlQueryTest_key1'"); 
QueryResult<CqlRows<String,String,Long>> result = cqlQuery.execute(); 
assertEquals(2, result.get().getAsCount()); 

Вы можете просто пропуститьWHERE условие и использовать LIMIT, чтобы решить вашу задачу.

+0

Это работает для одной строки. мне нужно, чтобы подсчитывать столбцы, начиная с определенного имени столбца для каждой строки с одним запросом. например, если ключ строки - это имя пользователя, а имена столбцов - это отметки времени, заданные 100 имен пользователей и 100 временных меток, каждый из которых соответствует имени пользователя, как мне получить количество столбцов для каждой строки, начинающейся с данной отметки времени? – qualebs

+0

Хотите ли вы подсчитать количество строк или один счетчик для всех строк? – Richard

+0

@ Richard Я хотел сделать то, что сделал Нишант, но для нескольких строк.Что-то вроде «multigetcountslicequery», если было что-то подобное. Но теперь это не имеет значения, потому что я обнаружил, что эти запросы счетчика медленны, поэтому я решил использовать столбец счетчика, который я сбросил, чтобы начать подсчет с определенного времени. – qualebs

1

это, как вы получите общее количество столбцов, в частности RowKey

sliceQuery.setColumnFamily("**your column family**"); 
sliceQuery.setKey("**your row key**"); 
sliceQuery.setRange(null, null, false, Integer.MAX_VALUE); 

QueryResult<ColumnSlice<String, String>> result = sliceQuery.execute(); 
ColumnSlice<String, String> cs = result.get(); 

long noOfColumnInRowKey=result.get().getColumns().size(); 

 Смежные вопросы

  • Нет связанных вопросов^_^