2013-06-30 3 views
0

저는 수퍼 컬럼을 만들려고 시도하는 카스 산드라와 헤터 &에 상당히 익숙합니다. 나는 이미 많은 연구를했지만 어쨌든, 지금까지 아무 것도 작동하지 않습니다. stackoverflow 내 연구 중에이 질문은 here, 나를 위해 도움이 보였다. 그래서 예제 코드를 삽입하려고했지만 예외가 발생했습니다. 헬기가있는 수퍼 열을 자바로 만들 수 없습니다.

가 (당신이 헥터가있는 경우 /하여 붙여 넣을 사본이어야한다) 내 코드입니다 - SRY가 읽을 완벽하지있을 경우, 여기 요청하기 전에 시도 착오를 많이했다 :

import java.util.Arrays; 
import me.prettyprint.cassandra.serializers.StringSerializer; 
import me.prettyprint.cassandra.service.ThriftKsDef; 
import me.prettyprint.cassandra.service.template.SuperCfTemplate; 
import me.prettyprint.cassandra.service.template.SuperCfUpdater; 
import me.prettyprint.cassandra.service.template.ThriftSuperCfTemplate; 
import me.prettyprint.hector.api.Cluster; 
import me.prettyprint.hector.api.Keyspace; 
import me.prettyprint.hector.api.ddl.ColumnFamilyDefinition; 
import me.prettyprint.hector.api.ddl.ComparatorType; 
import me.prettyprint.hector.api.ddl.KeyspaceDefinition; 
import me.prettyprint.hector.api.factory.HFactory; 

public class DatabaseDataImporter { 

    private Cluster myCluster; 
    private KeyspaceDefinition keyspaceDefinition; 
    private Keyspace keyspace; 
    private SuperCfTemplate<String, String, String> template; 

    final static StringSerializer ss = StringSerializer.get(); 

    public DatabaseDataImporter() { 

     initializeCluster(); 

     SuperCfTemplate<String, String, String> template = new ThriftSuperCfTemplate<String, String, String>(
       keyspace, "Nodes", ss, ss, ss); 
     SuperCfUpdater<String, String, String> updater = template 
       .createUpdater("key", "newcf"); 
     updater.setString("subname", "1"); 
     template.update(updater); 
    } 

    private void initializeCluster() { 
     // get Cluster 
     myCluster = HFactory.getOrCreateCluster("Test Cluster", 
       "localhost:9160"); 

     keyspaceDefinition = myCluster.describeKeyspace("Graphs"); 
     // If keyspace does not exist, the CFs don't exist either. => create 
     // them. 
     if (keyspaceDefinition == null) { 
      createSchema(); 
     } 

     keyspace = HFactory.createKeyspace("Graphs", myCluster); 
    } 

    private void createSchema() { 
     // get Cluster 
     Cluster myCluster = HFactory.getOrCreateCluster("Test Cluster", 
       "localhost:9160"); 

     // add Schema 
     int replicationFactor = 1; 

     ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition(
       "Graphs", "Nodes", ComparatorType.BYTESTYPE); 

     KeyspaceDefinition newKeyspace = HFactory.createKeyspaceDefinition(
       "Graphs", ThriftKsDef.DEF_STRATEGY_CLASS, replicationFactor, 
       Arrays.asList(cfDef)); 
     // Add the schema to the cluster. 
     // "true" as the second param means that Hector will block until all 
     // nodes see the change. 
     myCluster.addKeyspace(newKeyspace, true); 
    } 

    public static void main(String[] args) { 
     new DatabaseDataImporter(); 
    } 

} 

내가 얻을 수는 예외입니다 :

Exception in thread "main" me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException(why:supercolumn parameter is invalid for standard CF Nodes) 
    at me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:52) 
    at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:260) 
    at me.prettyprint.cassandra.model.ExecutingKeyspace.doExecuteOperation(ExecutingKeyspace.java:113) 
    at me.prettyprint.cassandra.model.MutatorImpl.execute(MutatorImpl.java:243) 
    at me.prettyprint.cassandra.service.template.AbstractColumnFamilyTemplate.executeBatch(AbstractColumnFamilyTemplate.java:115) 
    at me.prettyprint.cassandra.service.template.AbstractColumnFamilyTemplate.executeIfNotBatched(AbstractColumnFamilyTemplate.java:159) 
    at me.prettyprint.cassandra.service.template.SuperCfTemplate.update(SuperCfTemplate.java:203) 
    at algorithms.DatabaseDataImporter.<init>(DatabaseDataImporter.java:43) 
    at algorithms.DatabaseDataImporter.main(DatabaseDataImporter.java:87) 
Caused by: InvalidRequestException(why:supercolumn parameter is invalid for standard CF Nodes) 
    at org.apache.cassandra.thrift.Cassandra$batch_mutate_result.read(Cassandra.java:20833) 
    at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78) 
    at org.apache.cassandra.thrift.Cassandra$Client.recv_batch_mutate(Cassandra.java:964) 
    at org.apache.cassandra.thrift.Cassandra$Client.batch_mutate(Cassandra.java:950) 
    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:104) 
    at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:253) 
    ... 7 more 

나는 내가 supercolumninto에게 standardcolumnfamily 삽입을 시행하고 있습니다 때문에 어떻게 든 나쁜 일을 할 수 있음을 이해할 수있다. (출처 : here). 어쩌면이 코드가 생성 중에 모든 것이 손상되는 코드 일 수 있습니다.

ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition(
     "Graphs", "Nodes", ComparatorType.BYTESTYPE); 

그리고 이것이 어떻게 진행해야할지 모릅니다. "SuperColumnFamilyDefinition"클래스를 찾으려고했지만 클래스를 찾을 수 없었습니다. 내 코드를 수정하기 위해 변경해야 할 아이디어 나 제안이 있습니까? 나는 기쁠 것이야.

나와 공유하는 모든 생각에 대해 감사드립니다.

답변

1

내 문제에 대한 답을 찾았으며 (향후 누군가에게 도움이 될 수 있음) 공유하고 싶습니다. 솔루션은 매우 간단하다고 생각 했으므로

ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition(
       "Graphs", "Nodes", ComparatorType.BYTESTYPE); 

ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition(
     "Graphs", "Nodes", ComparatorType.BYTESTYPE); 
// defines it as super column 
((ThriftCfDef) cfDef).setColumnType(ColumnType.SUPER); 
확장 될 필요