Cassandra 2 Hector: запрос фрагмента диапазона для составного ключа строки возвращает пустые строки

Мы используем ByteOrderedPartitioner для хранения временных рядов для нового проекта, cql3 был для нас приемлемым только на мгновение, затем мы выбираем Гектора, чтобы двигаться дальше, но теперь наш запрос диапазона не работает.

С* версия: 2.0.7

Версия Гектора: 1.0-5

Схема:

        ColumnFamilyDefinition cfd = HFactory.createColumnFamilyDefinition(
                keyspaceName, columnFamilyName,
                ComparatorType.UTF8TYPE);
        cfd.setComparatorTypeAlias("(IntegerType,IntegerType,IntegerType)");
        cfd.setKeyValidationClass("CompositeType(IntegerType,IntegerType,IntegerType)");
        cfd.setDefaultValidationClass(ComparatorType.UTF8TYPE.getClassName());

Ключ строки: 100:20:11

=> (имя = столбец 1, значение = AAL, отметка времени = 1401745673543000)

=> (имя = столбец 2, значение = Нью-Йорк, отметка времени = 1401745673543002)

Ключ строки: 100:20:12

=> (имя = столбец 1, значение = AAL, отметка времени = 1401745673543000)

=> (имя = столбец 2, значение = TXA, отметка времени = 1401745673543002)

И так далее..

Запрос для перебора всех строк семейства столбцов cassandra

    Composite startComposite = new Composite();
    startComposite.addComponent(0,100,EQUAL);
    startComposite.addComponent(1,20,EQUAL);
    startComposite.addComponent(2,11,EQUAL);

    Composite endComposite = new Composite();
    endComposite.addComponent(0,100,EQUAL);
    endComposite.addComponent(1,20, EQUAL);
    endComposite.addComponent(2,18,GREATER_THAN_EQUAL);

    int rowCount = 100;
    RangeSlicesQuery<Composite, String, String> rangeSlicesQuery = HFactory
            .createRangeSlicesQuery(ksp, CompositeSerializer.get(), StringSerializer.get(), StringSerializer.get())
            .setColumnFamily(columnFamilyName)
            .setRange("", "", false, rowCount);

    rangeSlicesQuery.setKeys(startComposite, endComposite);
    QueryResult<OrderedRows<Composite, String, String>> result = rangeSlicesQuery.execute();

    System.out.println(result.get());

Получить пустые строки:

Строки({})


person torukmnk    schedule 03.06.2014    source источник


Ответы (1)


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

В Cassandra есть много хороших примеров моделей данных временных рядов. Вот один из Datastax.

person rs_atl    schedule 04.06.2014
comment
Вы правы, я анализировал новую схему, которая может работать с Murmur3Partitioner, и я получил новый материал, который мы изменим, потому что наши запросы CQL3 используют функцию токена для просмотра всех запрошенных ключей строк: token(year_month, day) ›= token( 201404,20) И токен (год_месяц, день) ‹= токен (201404,22) Если я перейду на Murmur3Partitioner, я получу: InvalidRequestException (почему: токен начального ключа сортируется после токена конечного ключа. это не разрешено; вы, вероятно, не должны указывать end key вообще кроме как с упорядоченным разделителем) А вот по поводу гектора rangeslicequery: Знаете почему не работает? - person torukmnk; 06.06.2014
comment
Прочитайте эту статью о том, как просмотреть все ряды. Вы не можете листать диапазон с помощью случайного разделителя, потому что ключи не упорядочены. Если вы хотите сделать это, вам нужно написать запрос, включающий все известные ключи в диапазоне, используя SELECT * FROM ks.table WHERE mykey IN (v1, v2, v3). Поскольку ваши ключи представляют собой месяц/день/год, это должно быть легко вычислено. - person rs_atl; 06.06.2014