2017-05-31 6 views
0

J'ai mis en place un cluster Cassandra et je travaille avec le framework Spring-Cassandra 1.53. (http://docs.spring.io/spring-data/cassandra/docs/1.5.3.RELEASE/reference/html/)La commande Cassandra-Spring Ingest ne fonctionne pas

Je veux écrire des millions de jeux de données dans ma grappe de cassandra. La solution avec executeAsync fonctionne bien mais la commande "ingest" de la structure du ressort semble intéressante.

La méthode ingest tire parti des PreparedStatements statiques qui ne sont préparés qu'une seule fois pour les performances. Chaque enregistrement de votre ensemble de données est lié au même PreparedStatement, puis exécuté de manière asynchrone pour des performances élevées.

Mon code:

List<List<?>> session_time_ingest = new ArrayList<List<?>>(); 
for (Long tokenid: listTokenID) { 
List<Session_Time_Table> tempListSessionTimeTable = repo_session_time.listFetchAggregationResultMinMaxTime(tokenid); 
session_time_ingest.add(tempListSessionTimeTable); 
} 

cassandraTemplate.ingest("INSERT into session_time (sessionid, username, eserviceid, contextroot," + 
       " application_type, min_processingtime, max_processingtime, min_requesttime, max_requesttime)" + 
       " VALUES(?,?,?,?,?,?,?,?,?)", session_time_ingest); 

throws Exception:

`Exception in thread "main" com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [varchar <-> ...tracking.Tables.Session_Time_Table] 
at com.datastax.driver.core.CodecRegistry.notFound(CodecRegistry.java:679) 
at com.datastax.driver.core.CodecRegistry.createCodec(CodecRegistry.java:540) 
at com.datastax.driver.core.CodecRegistry.findCodec(CodecRegistry.java:520) 
at com.datastax.driver.core.CodecRegistry.codecFor(CodecRegistry.java:470) 
at com.datastax.driver.core.AbstractGettableByIndexData.codecFor(AbstractGettableByIndexData.java:77) 
at com.datastax.driver.core.BoundStatement.bind(BoundStatement.java:201) 
at com.datastax.driver.core.DefaultPreparedStatement.bind(DefaultPreparedStatement.java:126) 
at org.springframework.cassandra.core.CqlTemplate.ingest(CqlTemplate.java:1057) 
at org.springframework.cassandra.core.CqlTemplate.ingest(CqlTemplate.java:1077) 
at org.springframework.cassandra.core.CqlTemplate.ingest(CqlTemplate.java:1068) 
at ...tracking.SessionAggregationApplication.main(SessionAggregationApplication.java:68)` 

exactement comme je codé dans le Doku printemps-cassandra .. Je ne sais pas comment associer les valeurs de ma objecter aux valeurs attendues par Cassandra ?!

Répondre

1

Votre classe Session_Time_Table est probablement un POJO mappé, mais les méthodes d'ingestion n'utilisent pas le mappage POJO.

Au lieu de cela, vous devez fournir une matrice où chaque ligne contient autant d'arguments que il y a des variables à lier dans votre déclaration préparée, quelque chose le long des lignes de:

List<List<?>> rows = new ArrayList<List<?>>(); 

for (Long tokenid: listTokenID) { 
    Session_Time_Table obj = ... // obtain a Session_Time_Table instance 
    List<Object> row = new ArrayList<Object>(); 
    row.add(obj.sessionid); 
    row.add(obj.username); 
    row.add(obj.eserviceid); 
    // etc. for all bound variables 
    rows.add(row); 
} 

cassandraTemplate.ingest(
    "INSERT into session_time (sessionid, username, eserviceid, " + 
    "contextroot, application_type, min_processingtime, " + 
    "max_processingtime, min_requesttime, max_requesttime) " + 
    "VALUES(?,?,?,?,?,?,?,?,?)", rows); 
+0

Merci! Fonctionne parfaitement –