【问题标题】:Cassandra Sample Trigger Code to get inserted valueCassandra 示例触发代码以获取插入值
【发布时间】:2016-06-21 23:12:01
【问题描述】:

我需要您的帮助来提取触发器扩充方法中的列名和值。

表定义:

           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;
    }
}

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

【问题讨论】:

  • 触发它的插入是什么? (我假设您只插入 data_key/datatime)。
  • 没有。我插入了所有数据 [ 插入 dy_data(id,data_key,time,data) 值( now(),'TX_BYTES:H',1385447412778,'data') ; ]

标签: java triggers cassandra


【解决方案1】:

感谢 iamaleksey 的帮助。您的回复对我很有帮助。

下面是对触发用户有用的代码sn-p,

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()。

【讨论】:

    【解决方案2】:

    要获得“id”和“data_key”,您必须拆分密钥(ByteBuffer 密钥,第一个要扩充的参数)。 'time' 将在 cell.name() 的第一部分 - 你仍然需要拆分它。 'data' 将是 cell.value(),无需进行任何拆分。

    【讨论】:

    • 感谢@iamaleksey 的回复。如何拆分密钥以及如何获得 cell.name() 的第一部分?我尝试了 UUIDType.instance.compose(key) 并给出了“id”。但我无法获得 data_key。如果我设置 position(16) 并尝试 UTF8Type.instance.compose(b))。但它提供带有垃圾字符的数据。而且我也无法获得“时间”。你能提供代码 sn-p 来获取数据吗?我尝试了很多可能性,但一切都失败了。如果您给我代码 sn-p 来拆分并获取“data_key”和“时间”,那就太好了。提前感谢您的帮助。
    • 你做错了。 'key' 在这里是 CompositeType(TimeUUIDType, UTF8Type),而不是 UUIDType。并且 cell.name() 是 CompositeType(TimestampType, UTF8Type)。
    • 获取类型实例使用对 ColumnFamily (cf.metadata) 中的 CFMetaData 对象的引用。您应该研究的方法是 getKeyValidator() 和 getComponentComparator()。触发器目前是一项高级功能,需要一定数量的 Cassandra 内部知识。如果你没有这些,你可能应该完全远离它们。
    猜你喜欢
    • 2015-11-21
    • 2015-10-21
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多