使用Astyanax客户端删除除一列之外的所有列及其数据?

时间:2013-11-02 21:20:33

标签: java cassandra astyanax

我正在开发一个项目,我需要使用Astyanax客户端删除除Cassandra中的一列及其数据之外的所有列及其数据。

我有一个像下面这样的动态列系列,我们已经有几百万条记录进入该列系列。

create column family USER_TEST
with key_validation_class = 'UTF8Type'
and comparator = 'UTF8Type'
and default_validation_class = 'UTF8Type'
and gc_grace = 86400
and column_metadata = [ {column_name : 'lmd', validation_class : DateType}];

我有user_id作为rowKey,我有的其他列是这样的 -

a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,lmd

现在我需要删除除a15列以外的所有列及其数据。这意味着,我想保留所有a15的{​​{1}}列及其数据,并删除其余列及其数据。

我已经知道如何使用Astyanax客户端删除Cassandra中的数据user_id(rowKey) -

rowKey

现在如何删除所有用户ID除了一列以外的所有列及其数据,这是我的rowKey ......

有任何想法如何有效地使用Astyanax客户端做到这一点?

1 个答案:

答案 0 :(得分:2)

Astyanax目前似乎不支持片段删除功能,它是存储引擎和Thrift API的最新成员。如果你看一下thrift API参考:http://wiki.apache.org/cassandra/API10 您会看到删除操作采用SlicePredicate,它可以采用列列表或SliceRange。 SliceRange可以指定大于或小于您想要保留的列的所有列,这样就可以执行两个切片删除操作来删除行中除一个列之外的所有列。

不幸的是,Astyanax只能删除整行或已定义的列列表,并且不能包装完整的SlicePredicate功能。所以看起来你有两个选择: 1)关于发送原始thrift切片删除,绕过Astyanax包装器,或者 2)执行列读取,然后执行行删除,然后执行列写操作。这不是理想的效率,但如果不经常这样做,则不应该过高。 要么 3)读取整行并明确删除除要保留的列之外的所有列。

我应该注意,虽然存储引擎和thrift API都支持切片删除,但CQL尚未明确支持这一点。

我提交了此票以解决最后一个限制: https://issues.apache.org/jira/browse/CASSANDRA-6292