2017-05-31 54 views
0

我建立了一個cassandra集羣,並使用spring-cassandra框架1.53。 (http://docs.spring.io/spring-data/cassandra/docs/1.5.3.RELEASE/reference/html/cassandra-spring ingest命令不起作用

我想將數百萬數據集寫入我的cassandra集羣。 executeAsync的解決方案效果很好,但spring框架中的「攝取」命令聽起來也很有趣。

攝取方法利用靜態的PreparedStatements,這些靜態PreparedStatements僅爲性能準備一次。數據集中的每條記錄都綁定到相同的PreparedStatement,然後異步執行以獲得高性能。

我的代碼:

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); 

拋出異常:

`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)` 

我的編碼完全一樣的彈簧卡珊德拉數獨..我不知道怎麼的值映射我反對卡桑德拉期待的價值觀?

回答

1

您的Session_Time_Table類可能是映射的POJO,但攝取方法不使用POJO映射。

相反,你需要提供其中每行都包含儘可能多的爭論,因爲有在你準備好的聲明中綁定變量的矩陣來,沿着線的東西:

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

謝謝!完美的作品 –