【问题标题】:Delete all the columns and its data except for one columns using Astyanax client?使用 Astyanax 客户端删除除一列之外的所有列及其数据?
【发布时间】:2013-11-02 21:20:32
【问题描述】:

我正在处理一个项目,我需要在其中使用 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 列之外的所有列及其数据。意思是,我想为所有user_id(rowKey) 保留a15 列及其数据,并删除其余列及其数据..

我已经知道如何使用 Astyanax 客户端从 Cassandra 删除特定rowKey的数据-

public void deleteRecord(final String rowKey) {

    try {
        MutationBatch m = AstyanaxConnection.getInstance().getKeyspace().prepareMutationBatch();

        m.withRow(AstyanaxConnection.getInstance().getEmp_cf(), rowKey).delete();

        m.execute();

    } catch (ConnectionException e) {
        // some code
    } catch (Exception e) {
        // some code
    }
}

现在如何删除所有列及其数据,除了所有用户 id 的一列,即我的 rowKey...

有什么想法可以有效地使用 Astyanax 客户端完成吗?

【问题讨论】:

    标签: java cassandra astyanax


    【解决方案1】:

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

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

    我应该注意到,虽然存储引擎和 thrift API 都支持切片删除,但 CQL 还没有明确支持。

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

    【讨论】:

      猜你喜欢
      • 2013-10-04
      • 2020-12-03
      • 2020-11-24
      • 2022-01-16
      • 2017-06-05
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多