【问题标题】:how to read all 1000 rows from cassandra CF with astyanax如何使用 astyanax 从 cassandra CF 读取所有 1000 行
【发布时间】:2013-07-13 19:53:13
【问题描述】:

我们有一个只有大约 1000 行的 CF。 astyanax 有没有办法读取所有 1000 行? thrift 甚至支持吗?

谢谢, 院长

【问题讨论】:

    标签: cassandra astyanax


    【解决方案1】:

    您可以使用 thrift 调用 get_range_slices 读取所有行。请注意,它以标记顺序返回行,而不是键顺序。因此,可以读取所有行,但不能跨行键执行范围。

    您可以通过 getAllRows() 在 Astyanax 中使用它。这是一些示例代码(从https://github.com/Netflix/astyanax/wiki/Reading-Data#iterate-all-rows-in-a-column-family 的文档中复制)

    Rows<String, String>> rows;
    try {
        rows = keyspace.prepareQuery("ColumnFamilyName")
            .getAllRows()
            .setBlockSize(10)
            .withColumnRange(new RangeBuilder().setMaxSize(10).build())
            .setExceptionCallback(new ExceptionCallback() {
                 @Override
                 public boolean onException(ConnectionException e) {
                     try {
                         Thread.sleep(1000);
                     } catch (InterruptedException e1) {
                     }
                     return true;
                 }})
            .execute().getResult();
    } catch (ConnectionException e) {
    }
    
    // This will never throw an exception
    for (Row<String, String> row : rows.getResult()) {
        LOG.info("ROW: " + row.getKey() + " " + row.getColumns().size());
    }
    

    这将返回每行的前 10 列,以 10 行为一组。增加传递给 RangeBuilder().setMaxSize 的数字以获取更多(或更少)列。

    【讨论】:

    • 嗯,这里有些东西没有意义。虽然这对于 1000 行来说很好,但假设我暂时想做 100 万行而不耗尽内存并且不做 map/reduce(现在)。有没有办法要求下一行,下一行,下一行(当我设置 query.setRowLimit(200) 时它会进行正常批处理,以便一次只加载 200 个?
    • 据此:github.com/Netflix/astyanax/issues/53 行中返回的迭代器是惰性的,因此它不会一次在内存中存储超过一个页面大小。
    • 还有另一种方式,现在是首选,使用 AllRowsReader。示例代码在这里:github.com/Netflix/astyanax/wiki/All-rows-query。您会收到每一行的回调。
    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    相关资源
    最近更新 更多