【问题标题】:cassandra-spring ingest command doesn't workcassandra-spring 摄取命令不起作用
【发布时间】:2017-11-01 06:52:22
【问题描述】:

我已经建立了一个 cassandra 集群并使用 spring-cassandra 框架 1.53。 (http://docs.spring.io/spring-data/cassandra/docs/1.5.3.RELEASE/reference/html/)

我想将数百万个数据集写入我的 cassandra 集群。使用 executeAsync 的解决方案效果很好,但来自 spring 框架的“摄取”命令听起来也很有趣。

摄取方法利用静态 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)`

我的编码与 spring-cassandra doku 中的完全一样。我不知道如何将我的对象的值映射到 cassandra 期望的值?!

【问题讨论】:

    标签: java spring cassandra cql3


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-18
      • 2013-02-15
      • 2021-02-07
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      相关资源
      最近更新 更多