2011-12-07 99 views
17

Tôi đang tìm một ví dụ về mã để truy xuất tất cả các hàng và tất cả các cột của một họ cột. Một cái gì đó như:Cassandra Hector: Làm thế nào để lấy tất cả các dòng của một họ cột?

SELECT * FROM MyTable 

Tôi thấy điều này có thể được thực hiện bằng cách sử dụng một RangeSlicesQuery, nhưng bạn vẫn phải cung cấp một phạm vi nhất định. Và tôi nghĩ bạn cũng phải chỉ định tên cột. Có cách nào sạch sẽ và an toàn để thực hiện việc này không?

Sử dụng Hector 1.0 và Cassandra 1.0.

Trả lời

15

Hãy thử một cái gì đó như thế này:

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

trang chí này thông qua việc gia đình cột trong trang của 100 dòng. Nó sẽ chỉ lấy 10 cột cho mỗi hàng (bạn sẽ muốn trang hàng rất dài quá).

Điều này dành cho một họ cột có các uuids cho khóa hàng, chuỗi cho tên cột và thời lượng cho giá trị. Hy vọng rằng nó sẽ được rõ ràng như thế nào để thay đổi điều này.

+0

Cám ơn câu trả lời của bạn. Nhưng đây là những gì tôi đã làm. Tôi chỉ cần đặt rangeSlicesQuery.setKeys ("", "") và tôi không đặt bất kỳ số hàng nào. Điều này trả về tất cả các hàng trong họ cột. Có vẻ như không cần phải trang qua các cột. –

+0

Để tiếp tục với nhận xét trước đó của tôi, để làm như vậy, tôi cần phải chỉ định tên cột. –

+3

Tôi khá chắc chắn Hector không thực hiện phân trang cho bạn. Mã của bạn sẽ có khả năng thất bại với một thời gian chờ (hoặc tệ hơn, gây ra Cassandra để OOM) khi bạn tập dữ liệu được lớn hơn, như làm những gì bạn đề nghị nguyên nhân Cassandra tải toàn bộ số liệu vào RAM. –

2

Hãy thử điều này:

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

} 
Các vấn đề liên quan