5

我已经遵循了许多将数据插入 Cassandra 数据库的示例,并且每次我遇到有关未配置列族的异常时。

Exception in thread "main" me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException(why:unconfigured columnfamily TestColumnFamily)
    at me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:45)
    at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:252)
    at me.prettyprint.cassandra.model.ExecutingKeyspace.doExecuteOperation(ExecutingKeyspace.java:97)
    at me.prettyprint.cassandra.model.MutatorImpl.execute(MutatorImpl.java:243)
    at me.prettyprint.cassandra.model.MutatorImpl.insert(MutatorImpl.java:69)
    at CassandraInterface.main(CassandraInterface.java:101)
Caused by: InvalidRequestException(why:unconfigured columnfamily TestColumnFamily)
    at org.apache.cassandra.thrift.Cassandra$batch_mutate_result.read(Cassandra.java:19477)
    at org.apache.cassandra.thrift.Cassandra$Client.recv_batch_mutate(Cassandra.java:1035)
    at org.apache.cassandra.thrift.Cassandra$Client.batch_mutate(Cassandra.java:1009)
    at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:246)
    at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:243)
    at me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation.java:103)
    at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:246)
    ... 4 more

所以我查找了如何配置它们并发现

    BasicColumnFamilyDefinition cfdef = new BasicColumnFamilyDefinition();
    cfdef.setKeyspaceName(keyspaceName);
    cfdef.setName(columnFamilyName);
    cfdef.setKeyValidationClass(ComparatorType.UTF8TYPE.getClassName());
    cfdef.setComparatorType(ComparatorType.UTF8TYPE);

那没有配置列族。

我发现的所有示例都是没有任何上下文的片段,所以我不知道要导入或设置什么。此外,一些示例似乎混合了 Hector API v2 和原始的 Hector API,所以当我使用它们时,会出现“找不到类”或“找不到函数”编译器错误。

4

2 回答 2

3

Hector CassandraClusterTest.java

 @Test
 public void testAddDropColumnFamily() throws Exception {
      ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition("Keyspace1", "DynCf");
      cassandraCluster.addColumnFamily(cfDef);
      String cfid2 = cassandraCluster.dropColumnFamily("Keyspace1", "DynCf");
      assertNotNull(cfid2);

      // Let's wait for agreement
      cassandraCluster.addColumnFamily(cfDef, true);
      cfid2 = cassandraCluster.dropColumnFamily("Keyspace1", "DynCf", true);
      assertNotNull(cfid2);
 }

长话短说,在您尝试将数据插入其中之前,键空间和列族需要存在。你可以在你的代码中管理它,检查它们是否存在,使用上面的例子作为一个很好的参考——或者通过命令行界面(cassandra-cli)修改

赫克托单元测试

于 2012-04-12T20:58:37.027 回答
1

希望你现在已经能够做到这一点,但我就是这样做的。

我有一个 cassandra 安装(使用 1.1.4)并假设您创建了所有必要的目录:

/var/lib/cassandra
/var/lib/casandra/data
/var/lib/cassnadra/commitlogs
/var/lib/cassandra/saved_caches

我开始使用:

bin/cassandra -f

我创建了一个名为 schema_create.txt 的简单脚本:


使用 strategy_class = 'org.apache.cassandra.locator.SimpleStrategy' AND strategy_options:replication_factor='1'创建密钥空间测试;使用测试;CREATE COLUMFAMILY TestColumnFamily(userid varchar, firstname varchar, lastname varchar, PRIMARY KEY (userid));

然后,您可以从命令行使用 cassandra 附带的新 CQL 工具运行此脚本,如下所示:

bin/cqlsh --cql3 < schema_createt.txt

这将在 cassandra 中安装一个名为 test 的键空间,其中包含一个名为 testcolumnfamily 的列族。

现在,在您的 java 应用程序中,您可以简单地创建一个具有 main 方法的测试类(如果使用 maven,我将假设您的开发环境具有所有必要的依赖项):

try{ Mutator mutator = HFactory.createMutator(kweyspace, stringSerializer.get()); mutator.addInsertion("iamauser", "tescolumnfamily", HFactory.createStringColumn("firstname", "John")); mutator.addInsertion("iamauser", "testcolumnfamily", HFactory.createStringColumn("lastname", "Smith")); mutator.execute(); } catch(HectorException Hex){ Hex.printStackTrace(); } 最后{ cluster.getConnectionManger().shutdown(); }

现在返回命令行并使用以下命令进入 cassandra:

$bin/cqlsh --cql3
use test;
select * from testcolumnfamily;

这将使用密钥 iamauser 将一行数据插入到您的 cassandra db 中,并将其命名为 John Smith,您可以使用 cqlsh 工具进行验证,如上所示。

希望这可以帮助。

于 2012-09-21T12:31:57.927 回答