Извлечение записей из заданного диапазона меток времени из Кассандры - PullRequest
2 голосов
/ 27 декабря 2010

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

Я попробовал этот кусок кода.

String columnFamily = "UserColumnFamily";
String keyspace="Enterprise";
final String UTF8 = "UTF8";
String keyUserid="1";
TTransport tr = new TSocket("10.10.10.104", 9160);
TProtocol proto = new TBinaryProtocol(tr);
Cassandra.Client client = new Cassandra.Client(proto);
SlicePredicate predicate = new SlicePredicate();
    SliceRange sliceRange = new SliceRange();
String startkey="1293443184521000";
String finishkey ="1293445102333000";        
sliceRange.setStart(new byte[0]);
        sliceRange.setFinish(new byte[0]);
predicate.setSlice_range(sliceRange);
        ColumnParent parent = new ColumnParent(columnFamily);
       try {
    tr.open();
    List<KeySlice> results=client.get_range_slice(keyspace,parent,predicate,startkey,finishkey,100, ConsistencyLevel.ONE);
      for (KeySlice result : results) {
           Column column = (Column) result.columns;
           System.out.println(new String(column.name,UTF8) + " ->> "
          + new String(column.value,UTF8));
       }
      tr.close();
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} 

Но выдает эту ошибку:

InvalidRequestException(why:start key's md5 sorts after end key's md5.
This is not allowed; you probably should not specify end key at all, under RandomPartitioner 

И если я поставлю finishkey на null, то это говорит:

Required field 'finish_key' was not present! 
  Struct: get_range_slice_args(keyspace:NiidleEnterprise, 
  column_parent:ColumnParent(column_family:UserColumnFamily), 
  predicate:SlicePredicate(slice_range:SliceRange(start:, finish:, reversed:false, count:100)), 
  start_key:1293443184521000, finish_key:null, row_count:100, consistency_level:ONE)"

Я не понимаю, какое значение установить как startkey и finishkey. В приведенном выше коде:

String startkey="1293443184521000";
String finishkey ="1293445102333000"; 

Это значения меток времени. Подскажите, пожалуйста, что мне взять за клавиши начала и окончания?

Ответы [ 4 ]

5 голосов
/ 28 декабря 2010

Пожалуйста, используйте Гектор, клиентскую библиотеку Java для Cassandra или один из других клиентов, доступных здесь: http://wiki.apache.org/cassandra/ClientOptions. Использование raw Thrift - это медленный, сложный и хитрый путь. 1005 *

Но, как правило, вы не можете получить значимый диапазон строк при использовании RandomPartitioner, потому что строки упорядочены по хэшу MD5 их ключей. Вместо этого вам нужно создать свою временную шкалу в строке (или нескольких строках), используя метки времени или TimeUUID для имен столбцов. Это приведет к сортировке ваших столбцов в хронологическом порядке. Затем вы можете либо сохранить данные в виде значений столбцов, либо сохранить ключи для фактических строк данных в качестве значений столбцов.

2 голосов
/ 28 декабря 2010

Временные метки предназначены для разрешения конфликтов для данного столбца. Их там нет для поисков. Если вы хотите осуществлять поиск по метке времени, вам следует поместить метки времени в модель данных (в ключах, именах столбцов или значениях столбцов).

2 голосов
/ 27 декабря 2010
0 голосов
/ 26 января 2011

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

В зависимости от объема генерируемых данных, вы можете выбрать разные варианты. Вы можете решить хранить данные каждого дня в отдельной строке, а данные - в строке, отсортированной по имени столбца, как я уже упоминал. В этом случае, если временной диапазон в вашем запросе охватывает дневную границу, вам нужно будет сделать несколько запросов по одному для каждой строки (т. Е. День в вашем временном диапазоне). По сути, исходный запрос диапазона будет преобразован в несколько запросов диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...