Запрос столбцов CompositeType в Cassandra с помощью Hector - PullRequest
13 голосов
/ 19 января 2012

Вот пример сценария, с которым я столкнулся.Скажем, у меня есть это семейство столбцов:

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

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

 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();

Это работаети если я пойду в cassandra-cli и составлю список, я получу следующее:

$ list CompositeTypeCF;

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

Теперь у меня такой вопрос: как мне выполнить запрос этих данных в Гекторе?По сути, мне нужно запросить его несколькими способами:

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

1 Ответ

13 голосов
/ 19 января 2012

Хорошая начальная учебная точка здесь .

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

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

Итак, если предположить, что в качестве составной из 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"?В терминах начала / конца нет компонентов "C"!что дает?Это все результаты между столбцами A: A: A и B: B: B. Составные поисковые термины не дают результаты, как если бы обработка вложенных циклов (это то, что я изначально думал), а скорее, , поскольку столбцы отсортированы, вы указываетеначальные и конечные термины для непрерывного блока столбцов .

При построении составных записей поиска необходимо указать 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()) ....
...