2011-12-07 22 views
17

Tüm sütunları ve bir sütun ailesinin tüm sütunlarını almak için bir kod örneği arıyorum. Bir şey gibi:Cassandra Hector: Bir sütun ailesinin tüm satırları nasıl alınır?

SELECT * FROM MyTable 

Bunun bir RangeSlicesQuery kullanılarak yapılabilir görüyoruz, ama yine de belli bir aralığı sağlamak zorunda. Ve sanırım sütun isimlerini de belirtmelisin. Bunu yapmanın temiz ve güvenli bir yolu var mı?

Hector 1.0 ve Cassandra 1.0'ı Kullanma. Böyle

cevap

15

deneyin şey: 100 satır sayfalarında sütun ailesi aracılığıyla

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

Bu irade sayfası. Her bir satır için sadece 10 sütun alır (çok uzun satırlar da sayfalara girmek isteyeceksiniz).

Bu, satır anahtarları için uuidler, sütun adları için dizeler ve değerler için longs içeren bir sütun ailesi içindir. Umarım bunu nasıl değiştireceğimiz açık olmalıdır.

+0

teşekkürler. Ama bu benim yaptığım şey. Ben sadece rangeSlicesQuery.setKeys ("", "") ayarlıyorum ve herhangi bir satır sayısı ayarlamıyorum. Bu sütun ailesindeki tüm satırları döndürdü. Sütunlarda sayfalara bakmaya gerek yok gibi görünüyor. –

+0

Önceki yorumuma devam etmek için böyle yapmak için sütun adlarını belirtmem gerekiyor. –

+3

Eminim Hector sizin için çağrı yapmıyor. Veri kümeniz daha büyük hale geldiğinde kodunuz büyük olasılıkla zaman aşımına uğramayacaktır (ya da daha kötüsü, Cassandra'dan OOM'a). Önerilerinizi yapmak Cassandra'nın tüm veri kümesini RAM'e yüklemesine neden olur. –

2

bu deneyin: Cevabınız için

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

} 
İlgili konular