Подтвердить что ты не робот

Запрос столбцов CompositeType в Cassandra с использованием Hector

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

    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)

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

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

Ответ 1

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

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

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

Итак, предполагая s-композицию из 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. Сложные поисковые термины не дают результаты, как будто обработка вложенных циклов (это то, что я изначально думал), а скорее, поскольку столбцы отсортированы, вы указываете начальные и конечные термины для смежных блок столбцов.

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

Только последний термин должен быть GREATER_THAN_EQUAL, все остальные должны быть 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()) ....