【问题标题】:Cassandra Hector API Result objectCassandra Hector API 结果对象
【发布时间】:2012-06-01 00:32:11
【问题描述】:

我正在尝试在我的 cassandra 数据库中进行查询。 我想检索单个列中的数据,该列位于 superColumn 中,该列位于 superColumn 中……有点复杂,但我需要它来对我的数据库进行建模。

我使用了 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 替换了 Result,但是,当我启动我的主类时,我收到了这个错误:

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) 在 me.prettyprint.cassandra.service.KeyspaceServiceImpl $23.execute(KeyspaceServiceImpl.java:846) ... 11 更多

当我关注导致此错误的行时:

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

我将 Result 替换为 QueryResult。

请问我该如何解决?

【问题讨论】:

  • 您似乎正在对超级 CF 运行标准 CF 查询。您的代码显示您正在针对“Standard1”运行查询,但针对“Super2”的查询例外。您确定此代码会产生该异常吗?
  • 我确定,这就是我的代码有问题的原因。 Cassandra 的配置太奇怪了:/
  • 我建议在 Cassandra IRC 频道中提问,因为它可能更适合此类问题。

标签: java cassandra hector


【解决方案1】:

我发现这里有几个问题...

首先——“在一个超级列中的单个列中的数据,它在一个超级列中”。你不能那样做。您可以在 superColumns 中包含列,但只有一层嵌套。无论哪种方式,我都建议不要使用 superColumns,它们是 Cassandra 正在远离的东西,转而支持 Composite Columns。看看您是否可以调整您的数据模型以使用复合材料。

现在,转到您的代码。您正在对超级列进行常规列查询...您需要使用 SuperColumnQuery。 SuperColumnQuery 采用 4 个类型参数——键、超级列名、列名和值类型。您还得到一个 QueryResult 对象,而不是一个结果。本例中的 QueryResult 对象包含一个 SuperColumn,而 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());
        }
    }

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 2015-06-03
    • 1970-01-01
    • 2011-10-15
    • 2012-06-21
    • 2012-05-31
    • 1970-01-01
    • 2012-12-07
    • 2011-11-12
    相关资源
    最近更新 更多