Cassandra Hector API结果对象

时间:2012-05-25 12:09:47

标签: java cassandra hector

我正在尝试在我的cassandra数据库中进行查询。 我想在一个superColumn中的一个Column中检索数据,这是一个superColumn ...有点复杂,但我需要它来建模我的数据库。

我使用了Hector的文档:http://www.datastax.com/sites/default/files/hector-v2-client-doc.pdf

但是,当我尝试阅读单个列时,此doc目的是使用此方法:

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

但是,什么是“结果”?我在谷歌搜索,我发现结果是一个对象结果,但我已经所有的库,没有人知道这个对象。

我用QueryResult替换Result,但是,当我启动我的类main时,我收到了这个错误:

  

me.prettyprint.hector.api.exceptions.HInvalidRequestException:InvalidRequestException(why:supercolumn参数对于超级CF Super2不是可选的)       at me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:45)       at me.prettyprint.cassandra.service.KeyspaceServiceImpl $ 23.execute(KeyspaceServiceImpl.java:851)       at me.prettyprint.cassandra.service.KeyspaceServiceImpl $ 23.execute(KeyspaceServiceImpl.java:1)       at me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation.java:103)       at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:258)       at me.prettyprint.cassandra.service.KeyspaceServiceImpl.operateWithFailover(KeyspaceServiceImpl.java:131)       at me.prettyprint.cassandra.service.KeyspaceServiceImpl.getColumn(KeyspaceServiceImpl.java:857)       at me.prettyprint.cassandra.model.thrift.ThriftColumnQuery $ 1.doInKeyspace(ThriftColumnQuery.java:57)       at me.prettyprint.cassandra.model.thrift.ThriftColumnQuery $ 1.doInKeyspace(ThriftColumnQuery.java:1)       at me.prettyprint.cassandra.model.KeyspaceOperationCallback.doInKeyspaceAndMeasure(KeyspaceOperationCallback.java:20)       at me.prettyprint.cassandra.model.ExecutingKeyspace.doExecute(ExecutingKeyspace.java:85)       at me.prettyprint.cassandra.model.thrift.ThriftColumnQuery.execute(ThriftColumnQuery.java:52)       在com.riptano.cassandra.hector.example.InsertSuperColumn.main(InsertSuperColumn.java:74)   引起:InvalidRequestException(为什么:supercolumn参数对于超级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)       at me.prettyprint.cassandra.service.KeyspaceServiceImpl $ 23.execute(KeyspaceServiceImpl.java:846)       ......还有11个

当我将注意力集中在导致此错误的行时:

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

我用QueryResult替换Result。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

我在这里看到了几个问题......

首先 - &#34;数据位于superColumn中的单个列中,该列位于superColumn&#34;中。你不能这样做。您可以在superColumns中包含列,但只有一个嵌套级别。无论哪种方式,我建议根本不使用superColumns,它们是Cassandra正在逐渐转向复合列的东西。看看您是否可以调整数据模型以改为使用Composites。

现在,转到您的代码。您正在对超级列进行常规列查询...您需要使用SuperColumnQuery。 SuperColumnQuery采用4种类型的参数 - 键,超级列名,列名和值类型。您还可以获取QueryResult对象,而不是Result。在这种情况下,QueryResult对象包含一个SuperColumn,它反过来包含一组Columns。

所以它看起来像......

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

希望这有帮助!