2012-01-18 3 views
13

Вот пример сценария, с которым я сталкиваюсь. Скажем, у меня есть эта колонка семья:Запрос столбцов CompositeType в Cassandra с использованием Hector

create column family CompositeTypeCF 
    with comparator = 'CompositeType(IntegerType,UTF8Type)' 
    and key_validation_class = 'UTF8Type' 
    and default_validation_class = 'UTF8Type' 

Вот некоторые примеры Java кода с использованием Гектора о том, как я бы идти о вставке некоторых данных в этой колонке семьи:

Cluster cluster = HFactory.getOrCreateCluster("Test Cluster", "192.168.1.6:9160"); 
Keyspace keyspaceOperator = HFactory.createKeyspace("CompositeTesting", cluster); 
Composite colKey1 = new Composite(); 
colKey1.addComponent(1, IntegerSerializer.get()); 
colKey1.addComponent("test1", StringSerializer.get()); 
Mutator<String> mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get()); 
Mutator<String> addInsertion = mutator.addInsertion("rowkey1", "CompositeTypeCF", 
    HFactory.createColumn(colKey1, "Some Data", new CompositeSerializer(), StringSerializer.get())); 
mutator.execute(); 

Это работает, и если я перейти к Кассандре-кли и сделать список, я получаю это:

$ list CompositeTypeCF; 

Using default limit of 100 
------------------- 
RowKey: rowkey1 
=> (column=1:test1, value=Some Data, timestamp=1326916937547000) 

Мой вопрос теперь заключается в следующем: Как я могу идти о запросе эти данные в Гектора? В основном я должен был бы запросить его несколькими способами:

  1. Дайте мне всю строку, в которой строка Key = «rowkey1»
  2. Дайте мне данные колонки, где первая часть имени столбца = некоторое целое значение
  3. Дайте мне все столбцы, где первая часть имени столбца находится в пределах определенного диапазона

ответ

13

Хорошая отправная точка учебник here.

Но, наконец, после необходимости использования составного компонента и попыток записи запросов к данным я выяснил несколько вещей, которые хотел бы разделить.

При поиске составных столбцов результаты будут непрерывными блоками столбцов.

Таким образом, если предположить, как композит 3 струнных, и мои столбцы выглядеть следующим образом:

A:A:A 
A:B:B 
A:B:C 
A:C:B 
B:A:A 
B:B:A 
B:B:B 
C:A:B 

Для поиска из A: A: A до B: B: B, результаты будут

A:A:A 
A:B:B 
A:B:C 
A:C:B 
B:A:A 
B:B:A 
B:B:B 

Обратите внимание, что компоненты «C»? В начальных и конечных условиях нет компонентов «С»! что дает? Это все результаты между столбцами A: A: A и B: B: B. Сложные условия поиска do дают результаты, как будто обработка вложенных циклов (это то, что я изначально думал), а, скорее, , поскольку столбцы отсортированы, вы указываете начальное и конечное значения для смежного блока столбцы.

При построении композитных записей поиска, необходимо указать ComponentEquality

Только последний член должен быть GREATER_THAN_EQUAL, все остальные должны быть равны. например для выше

Composite start = new Composite(); 
start.addComponent(0, "A", Composite.ComponentEquality.EQUAL); 
start.addComponent(1, "A", Composite.ComponentEquality.EQUAL); 
start.addComponent(2, "A", Composite.ComponentEquality.EQUAL); 

Composite end = new Composite(); 
end.addComponent(0, "B", Composite.ComponentEquality.EQUAL); 
end.addComponent(1, "B", Composite.ComponentEquality.EQUAL); 
end.addComponent(2, "B", Composite.ComponentEquality.GREATER_THAN_EQUAL); 

SliceQuery<String, Composite, String> sliceQuery = HFactory.createSliceQuery(keyspace, se, ce, se); 
sliceQuery.setColumnFamily("CF").setKey(myKey); 
ColumnSliceIterator<String, Composite, String> csIterator = new ColumnSliceIterator<String, Composite, String>(sliceQuery, start, end, false); 

while (csIterator.hasNext()) .... 
+1

Вы можете уточнить, почему нам нужен GREATER_THAN_EQUAL в последнем компоненте? Я просмотрел статью, но все еще неясно. –

+0

Я задал этот вопрос как отдельный вопрос, чтобы я мог вознаградить u очков! –

+0

Я не знаю, я экспериментировал с некоторым примером кода, чтобы убедить себя, что он работает для того, что мне нужно. – libjack

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