2012-05-25 2 views
1

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

Я использовал документацию Hector: 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> 

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

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

me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException (почему: параметр суперстолбцев не опционально для супер CF Super2) в me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate (ExceptionsTranslatorImpl.java:45) в me.prettyprint.cassandra.service.KeyspaceServiceImpl $ 23.execute (KeyspaceServiceImpl.java:851) у меня .prettyprint.cassandra.service.KeyspaceServiceImpl $ 23.execute (KeyspaceServiceImpl.java:1) at me.prettyprint.cassandra.servic e.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 (почему: параметр суперколонки не является обязательным для супер CF Super2) на org.apache.cassandra.thrift.Cassandra $ get_result.read (Cassandra.java:5930) at 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();** 

где я заменить Результат по QueryResult.

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

+0

Похоже, вы используете стандартный запрос CF для супер CF. Ваш код показывает, что вы выполняете запрос с «Standard1», но исключение - для запроса против «Super2». Вы уверены, что этот код создает это исключение? –

+0

Я уверен, что у меня есть некоторые проблемы с моим кодом. Конфигурация Cassandra настолько странная:/ – superstarz

+0

Я бы предложил просить об этом в канале IRC Кассандры, так как это, вероятно, лучше подходит для такого типа вопросов. –

ответ

1

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

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

Теперь перейдем к вашему коду. Вы делаете регулярный запрос столбца на суперколонне ... вам нужно использовать SuperColumnQuery. SuperColumnQuery принимает 4 параметра типа - ключ, имя суперколла, имя столбца и типы значений. Вы также возвращаете объект QueryResult, а не результат. Объект 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()); 
     } 
    } 

Надеется, что это помогает!

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