Объект результата API Cassandra Hector

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

Я использовал документацию Гектора: http://www.datastax.com/sites/default/files/hector-v2-client-doc.pdf

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

    <code>ColumnQuery<String, String, String> columnQuery =
HFactory.createStringColumnQuery(keyspace);
columnQuery.setColumnFamily("Standard1").setKey("jsmith").setName("first");
Result<HColumn<String, String>> result = columnQuery.execute(); </code>

но что такое "Результат"? Я ищу в гугле, я нашел, что результатом является объект Result, но у меня есть все библиотеки и никто не знает этот объект.

Я заменяю Result на QueryResult, но когда я запускаю свой основной класс, я получаю эту ошибку:

me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException (почему: параметр supercolumn не является обязательным для super CF Super2) в me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:45) в me.prettyprint. cassandra.service.KeyspaceServiceImpl$23.execute(KeyspaceServiceImpl.java:851) в me.prettyprint.cassandra.service.KeyspaceServiceImpl$23.execute(KeyspaceServiceImpl.java:1) в me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation. java:103) в me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:258) в me.prettyprint.cassandra.service.KeyspaceServiceImpl.operateWithFailover(KeyspaceServiceImpl.java:131) в me.prettyprint.cassandra.service .KeyspaceServiceImpl.getColumn(KeyspaceServiceImpl.java:857) в me.prettyprint.cassandra.model.thrift.ThriftColumnQuery$1.doInKeyspace(ThriftColumnQuery.java:57) в me.prettyprint.cassandra.model.thrift.ThriftColumnQuery$1.doInKeyspace(ThriftColumnQuery.java:1) в me.prettyprint.cassandra.model.KeyspaceOperationCallback.doInKeyspaceAndMeasure(KeyspaceOperationCallback.java:20) в me.prettyprint.cassandra.model.ExecutingKeyspace .doExecute(ExecutingKeyspace.java:85) в me.prettyprint.cassandra.model.thrift.ThriftColumnQuery.execute(ThriftColumnQuery.java:52) в com.riptano.cassandra.hector.example.InsertSuperColumn.main(InsertSuperColumn.java:74) ) Вызвано: InvalidRequestException (почему: параметр supercolumn не является необязательным для super CF Super2) в org.apache.cassandra.thrift.Cassandra$get_result.read(Cassandra.java:5930) в org.apache.thrift.TServiceClient.receiveBase( TServiceClient.java:78) на org.apache.cassandra.thrift.Cassandra$Client.recv_get(Cassandra.java:505) на org.apache.cassandra.thrift.Cassandra$Client.get(Cassandra.java:490) на меня .prettyprint.cassandra.service.KeyspaceServiceImpl$23. execute(KeyspaceServiceImpl.java:846) ... еще 11

когда я фокусируюсь на строке, которая вызывает эту ошибку, это строка:

**QueryResult<HColumn<String, String>> result5 = result3.execute();**

где я заменяю Result на QueryResult.

Как я могу решить это, пожалуйста?


person superstarz    schedule 25.05.2012    source источник
comment
Похоже, вы выполняете стандартный запрос CF против супер CF. Ваш код показывает, что вы выполняете запрос к Standard1, но исключение составляет запрос к Super2. Вы уверены, что этот код создает это исключение?   -  person rs_atl    schedule 25.05.2012
comment
я уверен, поэтому у меня есть проблемы с моим кодом. Конфигурация Cassandra такая странная :/   -  person superstarz    schedule 28.05.2012
comment
Я бы посоветовал задать этот вопрос на IRC-канале Cassandra, так как он, вероятно, лучше подходит для такого типа вопросов.   -  person rs_atl    schedule 29.05.2012


Ответы (1)


Я вижу здесь несколько проблем...

Во-первых, «данные в одном столбце, который находится в суперстолбце, который находится в суперстолбце». Вы не можете этого сделать. У вас могут быть столбцы в суперстолбцах, но есть только один уровень вложенности. В любом случае, я бы рекомендовал вообще не использовать суперстолбцы, от них Cassandra отказывается в пользу составных столбцов. Посмотрите, можете ли вы настроить свою модель данных, чтобы вместо этого использовать Composites.

Теперь перейдем к вашему коду. Вы выполняете обычный запрос столбца в суперстолбце... вам нужно использовать SuperColumnQuery. SuperColumnQuery принимает 4 параметра типа — ключ, имя суперстолбца, имя столбца и типы значений. Вы также возвращаете объект QueryResult, а не Result. В этом случае объект QueryResult содержит SuperColumn, который, в свою очередь, содержит набор столбцов.

Так что это похоже на что-то...

    SuperColumnQuery<String, String, String, String> superColumnQuery = 
    HFactory.createSuperColumnQuery(ksp);
    superColumnQuery.setColumnFamily("Standard1").setKey("jsmith").setSuperName("first");
    QueryResult<HSuperColumn<String, String, String>> queryResult = superColumnQuery.execute();

    if (queryResult != null && queryResult.get() != null) {
        List<HColumn<String, String>> resultCols = queryResult.get().getColumns();
        for (HColumn<String, String> col : resultCols) {
            doSomething(col.getValue());
        }
    }

Надеюсь это поможет!

person Eugene Feingold    schedule 29.05.2012