2013-07-15 45 views

回答

3

您可以讀取與節儉呼叫get_range_slices所有行。請注意,它以令牌順序返回行,而不是按鍵順序。因此,讀取所有行,但不要跨行鍵執行範圍是很好的。

您可以在Astyanax中使用getAllRows()。下面是一些示例代碼(在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以獲得更多(或更少)列的數量。

+0

嗯,在這裏沒有什麼意義。雖然這對於1000行很好,但假設我暫時想要做1百萬行而不會出現內存消耗,也沒有執行map/reduce(現在)。有沒有辦法要求下一行,下一行,下一行(和它正常的批處理,因爲我設置query.setRowLimit(200),一次只能加載200個? –

+0

根據這個:https:///github.com/Netflix/astyanax/issues/53行中返回的迭代器是懶惰的,所以它不會同時在內存中存儲多於一頁的大小。 – Richard

+1

還有另外一種方法,現在首選使用AllRowsReader示例代碼在這裏:https://github.com/Netflix/astyanax/wiki/All-rows-query。你得到每一行的回調。 – Richard

相關問題