2012-04-12 22 views
5

我已經遵循了許多有關將數據插入到Cassandra數據庫的例子,並且每次都會收到有關未配置的列族異常。使用Hector API將數據插入新鮮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,所以當我使用它們時,我會得到「找不到類」或「未找到函數」編譯器錯誤。

回答

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

Hector Unit Tests

1

希望你已經現在能夠做到這一點,但這是我做到的。

我有一個卡桑德拉安裝(使用1.1.4),並假設你擁有所有必要的目錄中創建:

bin/cassandra -f 

我創建了一個名爲簡單的腳本:

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

我用它啓動schema_create.txt:

CREATE KEYSPACE TEST
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));

然後在命令行中,你可以使用自帶的卡桑德拉如下新CQL工具運行此腳本:

bin/cqlsh --cql3 < schema_createt.txt 

這將安裝一個名爲test與testcolumnfamily命名爲Cassandra的一個列族密鑰空間。

從您的Java應用程序中

現在,你可以簡單地創建具有main方法的測試類(我會假設你的開發環境有如果使用maven所有必要的依賴):

嘗試{ 賦值函數賦值函數= 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(); }

現在回到命令行和使用進入卡桑德拉:

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

這將插入一行數據與該鍵iamauser你卡桑德拉數據庫,並將其命名爲約翰·史密斯和你可以使用cqlsh工具進行驗證,如上所示。

希望這會有所幫助。

相關問題