2011-12-07 2 views
17

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

SELECT * FROM MyTable 

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

Использование Hector 1.0 и Cassandra 1.0.

ответ

15

попробовать что-то вроде этого:

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 столбцов для каждой строки (вам также понадобится страница с очень длинными строками).

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

+0

Спасибо за ваш ответ. Но это то, что я сделал. Я просто устанавливаю rangeSlicesQuery.setKeys ("", ""), и я не устанавливаю количество строк. Это вернуло все строки в семействе столбцов. Кажется, нет необходимости переходить по столбцам. –

+0

Чтобы продолжить мой предыдущий комментарий, для этого мне нужно было указать имена столбцов. –

+3

Я довольно уверен, что Гектор не реализует подкачку для вас. Вероятно, ваш код будет терпеть неудачу с тайм-аутом (или, что еще хуже, причиной Cassandra для OOM), когда ваш набор данных станет больше, поскольку выполнение того, что вы предлагаете, заставляет Cassandra загружать весь набор данных в оперативную память. –

2

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

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

} 
Смежные вопросы