2013-11-27 21 views
3

我需要你在觸發擴充方法提取列名和值的幫助。卡桑德拉觸發採樣代碼來獲取插入值

表防守力:

  create table dy_data (
            id timeuuid, 
            data_key text, 
            time timestamp, 
            data text,primary key((id,data_key),time) 
            ) with clustering order by (time desc); 

觸發代碼:

public class ArchiveTrigger implements ITrigger { 
    public Collection<RowMutation> augment(ByteBuffer key, ColumnFamily cf) { 
     try { 
      // Below loop only has 2 columns (one is "data" and another one may be "time" but i am not sure, because i cannot get value.   
      for (Column cell : cf) { 
       //Got Exception if I try to get column name 
       String name = ByteBufferUtil.string(cell.name()); 
       //Got only "data" column value and empty value for another column may be "time". If I try ByteBufferUtil.toLong(cell.value()) it throws exception 
       String value = ByteBufferUtil.string(cell.value()); 
       log(" name = " + name); 
       log(" value = " + value); 
      } 
     } catch (Exception e) { 
      logger.warn("Exception ", e); 
     } 
     return null; 
    } 
} 

我盡力搜索示例代碼在谷歌。但失敗了。請幫助我提供示例代碼。提前致謝。

+0

什麼是觸發它的插入? (我假設你只是插入'data_key' /'data'和'time')。 –

+0

號我插入所有的數據[插入dy_data(ID,data_key,時間,數據)值(現在的(), 'TX_BYTES:H',1385447412778, '數據'); ] – rameshj

回答

3

要獲得「身份證」和「data_key」你必須拆分鍵(ByteBuffer的關鍵,以增加第一個參數)。 'time'將在cell.name()的第一部分 - 你仍然需要分割它。 'data'將是cell.value(),不需要做任何分割。

+0

感謝@iamaleksey您的回覆。我該如何拆分key,以及如何獲取cell.name()的第一部分?我試過UUIDType.instance.compose(key),它給出'id'。但我無法獲取data_key。如果我設置位置(16)並嘗試UTF8Type.instance.compose(b))。但它提供了垃圾字符的數據。而且我也無法獲得'時間'。你可以請給出獲取數據的代碼片段?我嘗試了很多可能性,一切都失敗瞭如果你給我代碼片段來分割並獲得'data_key'和'time',那將是非常棒的。感謝您的幫助。 – rameshj

+0

你做錯了。 'key'在這裏是CompositeType(TimeUUIDType,UTF8Type),而不是UUIDType。 cell.name()是CompositeType(TimestampType,UTF8Type)。 – iamaleksey

+0

去獲取類型實例使用ColumnFamily中的CFMetaData對象(cf.metadata)的引用。你應該看看的方法是getKeyValidator()和getComponentComparator()。觸發器目前是一項高級功能,需要一定量的Cassandra內部知識。如果你沒有這些,你可能應該完全遠離它們。 – iamaleksey

3

感謝iamaleksey您的幫助。你的回覆對我很有幫助。

下面是代碼段,這將是觸發用戶是有用的,

public Collection<RowMutation> augment(ByteBuffer key, ColumnFamily cf) { 
     try { 
      ByteBuffer id_bb = CompositeType.extractComponent(key, 0); 
      UUID id=TimeUUIDType.instance.compose(id_bb); 

      ByteBuffer data_key_bb = CompositeType.extractComponent(key, 1); 
      String data_key=UTF8Type.instance.compose(data_key_bb); 


      Iterator col_itr=cf.iterator(); 

      Column ts_col=(Column)col_itr.next(); 
      ByteBuffer time_bb=CompositeType.extractComponent(ts_col.name(),0); 
      long time=(TimestampType.instance.compose(time_bb)).getTime(); 


      Column data_bb=(Column)col_itr.next(); 
      String data=UTF8Type.instance.compose(data_bb.value()); 

      log(" id --> "+id.toString()); 
      log(" data_key-->"+data_key); 
      log(" time == "+time); 
      log(" data == "+data); 
     } catch (Exception e) { 
      logger.warn("Exception ", e); 
     } 
     return null; 
    } 

PS:因爲我知道我的表格式,我硬編碼列比較類型。如果我們想寫通用觸發器代碼,我們可以使用cf.getComponentComparator()/ getKeyValidator()。