как прочитать все 1000 строк из cassandra CF с помощью astyanax

У нас есть одна CF, в которой всего около 1000 строк. Есть ли способ с astyanax прочитать все 1000 строк? Бережливость даже поддерживает это?

спасибо, Дин


person Dean Hiller    schedule 15.07.2013    source источник


Ответы (1)


Вы можете прочитать все строки с помощью бережливого вызова get_range_slices. Обратите внимание, что он возвращает строки в порядке токенов, а не в порядке ключей. Так что можно читать все строки, но не делать диапазоны между ключами строк.

Вы можете использовать его в Astyanax с функцией getAllRows(). Вот пример кода (скопирован из документации по адресу https://github.com/Netflix/astyanax/wiki/Reading-Data#iterate-all-rows-in-a-column-family)

Rows<String, String>> rows;
try {
    rows = keyspace.prepareQuery("ColumnFamilyName")
        .getAllRows()
        .setBlockSize(10)
        .withColumnRange(new RangeBuilder().setMaxSize(10).build())
        .setExceptionCallback(new ExceptionCallback() {
             @Override
             public boolean onException(ConnectionException e) {
                 try {
                     Thread.sleep(1000);
                 } catch (InterruptedException e1) {
                 }
                 return true;
             }})
        .execute().getResult();
} catch (ConnectionException e) {
}

// This will never throw an exception
for (Row<String, String> row : rows.getResult()) {
    LOG.info("ROW: " + row.getKey() + " " + row.getColumns().size());
}

Это вернет первые 10 столбцов каждой строки партиями по 10 строк. Увеличьте число, переданное в RangeBuilder().setMaxSize, чтобы получить больше (или меньше) столбцов.

person Richard    schedule 15.07.2013
comment
хм, что-то тут непонятно. в то время как это нормально для 1000 строк, скажем, я временно хотел сделать 1 миллион строк, не выдувая память и не выполняя карту/уменьшение (на данный момент). Есть ли способ запросить следующую строку, следующую строку, следующую строку (и он выполняет обычную пакетную обработку, поскольку я устанавливаю query.setRowLimit(200) таким образом, чтобы одновременно загружались только 200? - person Dean Hiller; 16.07.2013
comment
В соответствии с этим: github.com/Netflix/astyanax/issues/53 итератор вернул in rows является ленивым, поэтому он не будет хранить в памяти больше размера страницы за раз. - person Richard; 16.07.2013
comment
Есть еще один способ, который в настоящее время является предпочтительным, с использованием AllRowsReader. Пример кода находится здесь: github.com/Netflix/astyanax/wiki/All-rows -запрос. Вы получаете обратный вызов для каждой строки. - person Richard; 16.07.2013