【问题标题】:Cassandra Hector: How to retrieve all rows of a column family?Cassandra Hector:如何检索列族的所有行?
【发布时间】:2012-01-15 03:34:53
【问题描述】:

我正在寻找一个代码示例来检索列族的所有行和所有列。比如:

SELECT * FROM MyTable

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

使用 Hector 1.0 和 Cassandra 1.0。

【问题讨论】:

    标签: cassandra hector


    【解决方案1】:

    试试这样的:

    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 用于行键,字符串用于列名,long 用于值。希望如何改变这一点应该很明显。

    【讨论】:

    • 感谢您的回答。但这就是我所做的。我只是设置 rangeSlicesQuery.setKeys("", "") 并且我没有设置任何行数。这将返回列族中的所有行。似乎不需要逐列分页。
    • 要继续我之前的评论,要这样做,我需要指定列名。
    • 我很确定 Hector 不会为您实现分页。当您的数据集变大时,您的代码可能会因超时而失败(或更糟的是,导致 Cassandra OOM),因为执行您建议的操作会导致 Cassandra 将整个数据集加载到 RAM 中。
    • 这可能仅适用于顺序保留分区程序。那么如何使用 RandomPartitioner 来做到这一点呢?
    • 我们尝试了 100k 行,最终开始超时。
    【解决方案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();
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-05
      • 2013-10-28
      • 2011-11-03
      • 2015-03-15
      • 2012-04-23
      • 1970-01-01
      • 2013-11-01
      • 2014-01-06
      • 2012-03-12
      相关资源
      最近更新 更多