2011-12-07 11 views
17

Szukam przykładu kodu, aby pobrać wszystkie wiersze i wszystkie kolumny z rodziny kolumn. Coś jak:Cassandra Hector: Jak odzyskać wszystkie wiersze rodziny kolumn?

SELECT * FROM MyTable 

widzę, że można to zrobić za pomocą RangeSlicesQuery, ale trzeba jeszcze zapewnić pewien zakres. I myślę, że musisz również podać nazwy kolumn. Czy jest to czysty i bezpieczny sposób na zrobienie tego?

Korzystanie z Hectora 1.0 i Cassandry 1.0.

Odpowiedz

15

spróbować czegoś takiego:

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

tej stronie przez rodziny w kolumnie stron 100 wierszy. Będzie pobierał tylko 10 kolumn dla każdego wiersza (będziesz również chciał wysyłać bardzo długie wiersze).

To jest dla rodziny kolumn z kluczami uuids dla kluczy wierszy, łańcuchów dla nazw kolumn i wartości liczbowych dla długich. Mam nadzieję, że powinno to być oczywiste, jak to zmienić.

+0

Dzięki za odpowiedź. Ale to właśnie zrobiłem. Po prostu ustawę rangeSlicesQuery.setKeys ("", "") i nie ustawiam żadnej liczby wierszy. Zwróciło to wszystkie wiersze z rodziny kolumn. Wygląda na to, że nie trzeba przeglądać kolumn. –

+0

Aby kontynuować z moim poprzednim komentarzem, aby to zrobić, musiałem podać nazwy kolumn. –

+3

Jestem pewien, że Hector nie zaimplementuje stronicowania dla ciebie. Twój kod prawdopodobnie zawiedzie z powodu przekroczenia limitu czasu (lub, co gorsza, spowoduje Cassandra w OOM), gdy zbiór danych stanie się większy, ponieważ zrobienie tego, co sugerujesz, spowoduje, że Cassandra załaduje cały zestaw danych do pamięci RAM. –

2

Spróbuj tego:

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

} 
Powiązane problemy