2013-04-17 40 views
0

我已經在本地設置了一個節點羣集。現在我試圖從卡桑德拉讀取數據。我是Astyanax(Cassandra的Netflix客戶端)的新手。如何使用Astyanax/Netflix客戶端檢索選定列的行?

目前我目前看到的是 - 您可以在rowkey上請求數據基礎。在rowkey上的含義基礎我可以檢索所有不是我想要的列。

但是我正在尋找的是 - 我將有rowkey和少columnNames。因此,根據該rowkey,我只需要檢索這些列。像這樣的東西 -

SELECT colA, colB from table1 where rowkey = "222"; 

以下是我的方法是檢索rowkey上的所有列名基礎。我怎樣才能檢索給定的行鍵選定的列?

public void read(final String userId, final Collection<String> columnNames) { 

    OperationResult<ColumnList<String>> result; 
    try { 
     result = CassandraConnection.getInstance().getKeyspace().prepareQuery(CassandraConnection.getInstance().getEmp_cf()) 
       .getKey(userId) 
       .execute(); 

     ColumnList<String> cols = result.getResult(); 

     for(Iterator<Column<String>> i = cols.iterator(); i.hasNext();) { 
      Column<String> c = i.next(); 
      Object v = null; 
      if(c.getName().endsWith("id")) // type induction hack 
       v = c.getIntegerValue(); 
      else 
       v = c.getStringValue(); 
      System.out.println("- col: '"+c.getName()+"': "+v); 
     } 


    } catch (ConnectionException e) { 
     System.out.println("failed to read from C*" +e); 
     throw new RuntimeException("failed to read from C*", e); 
    } 


} 

在上面的代碼中,Collection<String> columnNames將有幾個列名稱,我想tor請求。

有人能告訴我在上述方法中需要做些什麼改變嗎?

回答

2

要檢索astyanax中的選定列,我們必須使用列分片。

List<String> columns = Arrays.asList(new String[]{"col1","col2","col3"}); 
OperationResult<ColumnList<String>> result = CassandraConnection.getInstance().getKeyspace() 
       .prepareQuery(CassandraConnection.getInstance().getEmp_cf()) 
       .getKey(userId).withColumnSlice(columns) 
       .execute(); 
     ColumnList<String> columnList= result.getResult(); 
     for(String col : columns){ 
      System.out.println(columnList.getColumnByName(col).getStringValue()); 
     } 

我假定所有列文本類型,所以使用getStringValue(),您可以根據您的CF元數據有它。

Cheers

+0

Thanks abhi。得到了那個工作。讚賞你的幫助。 – ferhan

+0

我還有一個類似的問題,但這次是使用Netflix客戶端將Upsert插入Cassandra數據庫。你能幫我嗎?謝謝您的幫助。 – ferhan

+0

@TechGeeky suerly,會嘗試 – abhi

相關問題