Кассандра Гектор: Как получить все строки семейства столбцов?

Я ищу пример кода для извлечения всех строк и всех столбцов семейства столбцов. Что-то типа:

SELECT * FROM MyTable

Я вижу, что это можно сделать с помощью RangeSlicesQuery, но вам все равно нужно указать определенный диапазон. И я думаю, что вы также должны указать имена столбцов. Есть ли чистый и безопасный способ сделать это?

Использование Гектора 1.0 и Кассандры 1.0.


person John Volkya    schedule 07.12.2011    source источник


Ответы (2)


Попробуйте что-то вроде этого:

public class Dumper {
    private final Cluster cluster;
    private final Keyspace keyspace;

    public Dumper() {
        this.cluster = HFactory.getOrCreateCluster("Name", "hostname");
        this.keyspace = HFactory.createKeyspace("Keyspace", cluster, new QuorumAllConsistencyLevelPolicy());
    }

    public void run() {
        int row_count = 100;

        RangeSlicesQuery<UUID, String, Long> rangeSlicesQuery = HFactory
            .createRangeSlicesQuery(keyspace, UUIDSerializer.get(), StringSerializer.get(), LongSerializer.get())
            .setColumnFamily("Column Family")
            .setRange(null, null, false, 10)
            .setRowCount(row_count);

        UUID last_key = null;

        while (true) {
            rangeSlicesQuery.setKeys(last_key, null);
            System.out.println(" > " + last_key);

            QueryResult<OrderedRows<UUID, String, Long>> result = rangeSlicesQuery.execute();
            OrderedRows<UUID, String, Long> rows = result.get();
            Iterator<Row<UUID, String, Long>> rowsIterator = rows.iterator();

            // we'll skip this first one, since it is the same as the last one from previous time we executed
            if (last_key != null && rowsIterator != null) rowsIterator.next();   

            while (rowsIterator.hasNext()) {
              Row<UUID, String, Long> row = rowsIterator.next();
              last_key = row.getKey();

              if (row.getColumnSlice().getColumns().isEmpty()) {
                continue;
              }


              System.out.println(row);
            }

            if (rows.getCount() < row_count)
                break;
        }
    }

    public static void main(String[] args) {
        new Dumper().run();
    }
}

Это пролистнет семейство столбцов на страницах по 100 строк. Он будет извлекать только 10 столбцов для каждой строки (вы также захотите просмотреть очень длинные строки).

Это для семейства столбцов с идентификаторами uuid для ключей строк, строками для имен столбцов и длинными значениями. Надеюсь, должно быть очевидно, как это изменить.

person tom.wilkie    schedule 07.12.2011
comment
Спасибо за Ваш ответ. Но это то, что я сделал. Я просто устанавливаю rangeSlicesQuery.setKeys(, ) и не устанавливаю количество строк. Это вернуло все строки в семействе столбцов. Кажется, нет необходимости листать столбцы. - person John Volkya; 07.12.2011
comment
Чтобы продолжить мой предыдущий комментарий, чтобы сделать это так, мне нужно было указать имена столбцов. - person John Volkya; 07.12.2011
comment
Я почти уверен, что Гектор не реализует пейджинг для вас. Ваш код, скорее всего, выйдет из строя с тайм-аутом (или, что еще хуже, приведет к тому, что Cassandra перейдет в OOM), когда ваш набор данных станет больше, поскольку выполнение того, что вы предлагаете, заставляет Cassandra загружать весь набор данных в ОЗУ. - person tom.wilkie; 07.12.2011
comment
Это может работать только с разделителем, сохраняющим порядок. Итак, как вы можете сделать это с помощью RandomPartitioner? - person piotrga; 08.06.2012
comment
Мы попробовали это со 100 000 строк и в конце концов начали тайм-аут. - person Jake Pearson; 25.06.2012

Попробуйте это:

    int rowCount = MAX;
    RangeSlicesQuery<String, String, String> rangeSlicesQuery = HFactory
            .createRangeSlicesQuery(keyspace2, STRINGSERIALIZER,
                    STRINGSERIALIZER, STRINGSERIALIZER)
            .setColumnFamily(columnFamily)
            .setRange(null, null, false, rowCount).setRowCount(rowCount);
    String lastKey = null;
    // Query to iterate over all rows of cassandra Column Family
    rangeSlicesQuery.setKeys(lastKey, null);
    QueryResult<OrderedRows<String, String, String>> result = rangeSlicesQuery
            .execute();
    OrderedRows<String, String, String> rows = result.get();
    for (Row<String, String, String> row : rows) {
        String cassandra_key = row.getKey();
    }

}
person Jimmy    schedule 06.11.2013