2011-12-07 43 views
17

我要寻找一个代码示例检索所有的行和列家族的所有列。像这样:卡桑德拉赫克托:如何检索列家族的所有行?

SELECT * FROM MyTable 

我看到这可以使用RangeSlicesQuery来完成,但你仍然必须提供一定的范围。我想你也必须指定列名称。有没有一种干净而安全的方法来做到这一点?

使用赫1.0和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列(你也会想要分页非常长的行)。

这是一个系列列的UUID的行键,字符串列名,渴望值。希望它应该是显而易见的,如何改变这一点。

+0

谢谢您的回答。但这是我所做的。我只需设置rangeSlicesQuery.setKeys(“”,“”),并且不设置任何行数。这返回了列族中的所有行。看起来没有必要翻阅栏目。 –

+0

要继续我以前的评论,那样做,我需要指定列名。 –

+3

我很确定Hector没有为你实现分页。您的代码可能会失败,超时(或者更糟,导致卡桑德拉到OOM)当你的数据集变得更大,因为这样做你认为是什么原因导致卡桑德拉到整个数据集加载到RAM中。 –

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

} 
相关问题