我已经关注了很多关于将数据插入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,因此当我使用它们时,我得到“找不到类”或“找不到函数”编译器错误。
答案 0 :(得分: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
)
答案 1 :(得分: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的简单脚本:
创建关键空间测试
WITH strategy_class ='org.apache.cassandra.locator.SimpleStrategy' AND strategy_options:replication_factor ='1'; 使用TEST; CREATE COLUMNFAMILY TestColumnFamily( userid varchar, firstname varchar, lastname varchar, PRIMARY KEY(userid));
然后,从命令行,您可以使用cassandra附带的新CQL工具运行此脚本,如下所示:
bin/cqlsh --cql3 < schema_createt.txt
这将安装一个名为test的密钥空间,其中包含一个名为testcolumnfamily的列系列到cassandra中。
现在,从您的Java应用程序中,您可以简单地创建一个具有main方法的测试类(我假设您的开发环境具有所有必要的依赖关系,如果使用maven):
尝试{ 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(); } finally {cluster.getConnectionManger()。shutdown(); }
现在返回命令行并使用以下命令进入cassandra:
$bin/cqlsh --cql3
use test;
select * from testcolumnfamily;
这将使用密钥iamauser将一行数据插入到您的cassandra数据库中,并命名为John Smith,您可以使用cqlsh工具验证如上所示。
希望这有帮助。