Кассандра плохой результат при обновлении таблицы - PullRequest
0 голосов
/ 31 мая 2018

Я пишу код для обновления всей таблицы в Кассандре.Я использую fetchSize и setPagingState, чтобы прочитать «большую» таблицу на блок (и избежать тайм-аута). Моя проблема в том, что он считает количество строк выше, чем должно.Я полагаю, что когда он обновляет некоторые строки, он изменяет состояние и перечитывает. Есть ли совет, чтобы избежать этого?В моем случае таблица имеет 400 тыс. Строк, и черта найти 85 млн. Строк

в отношении Жан-Люка

          val insertPrepareStmt = userSession.prepare(s"INSERT INTO $table (id, value) VALUES (?, ?)")
       val stmt = userSession.prepare(s"SELECT id,value FROM $table").bind()
       var nextPage:Option[PagingState]=None
       var i:Int=0
       var nbConverted:Int=0
       do {
         nextPage match {
           case Some(p) => stmt. setPagingState(p)
           case _ =>
         }
         val rs= userSession.execute(stmt.setFetchSize(batchSize))
         nextPage=Option(rs.getExecutionInfo.getPagingState)
         // loop on rs
         for (row <- rs.all() )
         {
           val id=row.getString("id")
           val value =row.getByteArray("value")
    // modify value in newAvro
    val newAvrp= f(avro)
            userSession.executeAsync(insertPrepareStmt.bind(id,ByteBuffer.wrap(newAvro)))
            nbConverted+=1
           }
           i+=1
           if (i % 10000==0) logger.error(s"...number lines $i    number converted lines $nbConverted")
         }
       } while (nextPage.isDefined)

1 Ответ

0 голосов
/ 31 мая 2018

После нескольких тестов сначала оператор вставки не мешает разбивке на страницы.Resultset, возвращаемый cassandra, имеет больше строк, чем должно быть. Решение было ограничить набор результатов размером выборки

//for (row <- rs.all() )
for (row <- rs.take(batchSize) )
...