2012-05-25 59 views
1

我想在我的cassandra分贝中查询。 我想要检索超级列中的单个列中的数据,该超级列在超级列中...有点复杂,但我需要它来模拟我的数据库。Cassandra Hector API结果对象

我用赫克托的文档: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> 

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

我的QueryResult中替换的结果,但是,当我启动我的课主,我得到这个错误:

me.prettyprint.hector.api.exceptions.HInvalidRequestException:InvalidRequestException(原因: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.servic e.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) 在me.prettyprint.cassandra.model.KeyspaceOperationCallback.doInKeyspaceAndMeasure(KeyspaceOperationCallback.java:20) 在me.prettyprint.cassandra.model.ExecutingKeyspace。 doExecute(ExecutingKeyspace.java:85) at me.prettyprint.cassandra.model.thrift.ThriftColumnQuery.execute(ThriftColumnQuery.java:52) at com.riptano.cassandra.hector.example.InsertSuperColumn.main(InsertSuperColumn.java:74) InvalidRequestException(为什么:supercolumn参数对于超级CF Super2不是可选的) at 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();** 

其中I由QueryResult中替换结果。

我该如何解决它?

+0

看来您正在针对超级CF运行标准CF查询。您的代码显示您正在针对“Standard1”运行查询,但该例外是针对“Super2”的查询。你确定这段代码产生这个异常吗? –

+0

我敢肯定,那为什么我的代码存在一些问题。 Cassandra的配置非常奇怪:/ – superstarz

+0

我建议在Cassandra IRC频道中询问这个问题,因为它可能更适合这类问题。 –

回答

1

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

首先 - “位于superColumn中的单个列中的数据,它位于superColumn中”。你不能那样做。你可以在superColumns中有列,但只有一层嵌套。无论哪种方式,我都建议不要使用superColumns,他们是Cassandra正在转而支持Composite列的东西。看看你是否可以调整你的数据模型来代替使用复合材料。

现在,转到您的代码。您正在对超列进行常规列查询...您需要使用SuperColumnQuery。 SuperColumnQuery需要4个类型参数 - 密钥,超级col名称,col名称和值类型。您还返回QueryResult对象,而不是结果。在这种情况下,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()); 
     } 
    } 

希望这有助于!

相关问题