Java 获取插入值的Cassandra示例触发器代码

Java 获取插入值的Cassandra示例触发器代码,java,triggers,cassandra,Java,Triggers,Cassandra,我需要您帮助在触发器增强方法中提取列名和值 表Def: create table dy_data ( id timeuuid, data_key text, time timestamp,

我需要您帮助在触发器增强方法中提取列名和值

表Def:

           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;
    }
}
public类ArchiveTrigger实现ITrigger{
公共集合扩充(ByteBuffer键,ColumnFamily cf){
试一试{
//下面的循环只有两列(一列是“数据”,另一列可能是“时间”),但我不确定,因为我无法获得值。
for(列单元格:cf){
//如果我尝试获取列名,则出现异常
String name=ByteBufferUtil.String(cell.name());
//只获取了“data”列值,另一列的空值可能是“time”。若我尝试使用ByteBufferUtil.toLong(cell.value()),它会引发异常
String value=ByteBufferUtil.String(cell.value());
日志(“name=”+name);
日志(“值=”+值);
}
}捕获(例外e){
logger.warn(“异常”,e);
}
返回null;
}
}

我尽力在google中搜索示例代码。但失败了。请帮助我获取示例代码。提前谢谢。

要获取“id”和“data\u key”,您必须拆分该键(ByteBuffer key,第一个要增加的参数)。“time”将位于cell.name()的第一部分-您仍然需要拆分。“data”将是cell.value(),无需进行任何拆分。

谢谢我的帮助。您的回复对我帮助很大

下面是对触发器用户有用的代码片段

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;
    }
公共集合扩充(ByteBuffer键,ColumnFamily cf){
试一试{
ByteBuffer id_bb=CompositeType.extractComponent(键,0);
UUID id=TimeUUIDType.instance.compose(id\u bb);
ByteBuffer data_key_bb=CompositeType.extractComponent(key,1);
字符串data\u key=UTF8Type.instance.compose(data\u key\u bb);
迭代器col_itr=cf.Iterator();
列ts_col=(列)col_itr.next();
ByteBuffer time_bb=CompositeType.extractComponent(ts_col.name(),0);
longtime=(TimestampType.instance.compose(time_bb)).getTime();
列数据_bb=(列)col_itr.next();
String data=UTF8Type.instance.compose(data_bb.value());
日志(“id-->”+id.toString());
日志(“数据密钥-->”+数据密钥);
日志(“时间=”+时间);
日志(“数据==”+数据);
}捕获(例外e){
logger.warn(“异常”,e);
}
返回null;
}

PS:因为我知道我的表格式,所以我硬编码了列比较器类型。如果我们想编写通用触发代码,我们可以使用cf.getComponentComparator()/getKeyValidator()。

触发它的插入是什么?(我假设您只插入
数据\u键
/
数据
时间
)。不,我插入了所有数据[插入到dy_数据(id,data_key,time,data)值(now(),'TX_BYTES:H',1385447412778,'data');]感谢@iamaleksey的回复。我如何拆分键以及如何获取单元格的第一部分。name()?我尝试了UUIDType.instance.compose(键)并给出了“id”。但我无法获取数据_键。如果我设置了位置(16)并尝试了UTF8Type.instance.compose(b))。但它提供了带有垃圾字符的数据。而且我也无法获得“时间”。你能提供获取数据的代码段吗?我尝试了许多可能性,但都失败了。如果你给我代码段进行拆分并获得“数据键”和“时间”,那将非常好。提前感谢你的帮助。你做得不对。“键”是复合类型的(TimeUUIDType,UTF8Type)这里不是UUIDType。cell.name()是CompositeType(TimestampType,UTF8Type)。获取类型实例使用ColumnFamily(cf.metadata)中的CFMetaData对象的引用。应该查看的方法是getKeyValidator()和getComponentComparator().触发器目前是一项高级功能,需要一定的Cassandra内部知识。如果您没有这些知识,您可能应该完全远离它们。