无法删除多行,获取 "Some partition key parts are missing: identifier"

Unable to delete multiple rows, getting "Some partition key parts are missing: identifier"

我是 Cassandra 的新手,我在尝试删除 table 中的多行时遇到了一些问题。我有一个 table 定义如下:

CREATE TABLE aze.isis_users (
  identifier text PRIMARY KEY,
  iteration_count int,
  password_expires_on date,
  passwordword blob,
  roleidentifier text,
  salt blob
) WITH additional_write_policy = '99p'
  AND bloom_filter_fp_chance = 0.01
  AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
  AND cdc = false
  AND comment = ''
  AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
  AND compression = {'chunk_length_in_kb': '16', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
  AND crc_check_chance = 1.0
  AND default_time_to_live = 0
  AND extensions = {}
  AND gc_grace_seconds = 864000
  AND max_index_interval = 2048
  AND memtable_flush_period_in_ms = 0
  AND min_index_interval = 128
  AND read_repair = 'BLOCKING'
  AND speculative_retry = '99p';

我希望能够使用 roleidentifier = lim_user

删除所有行

table

我通过 2 个不同的查询得到了以下 2 个错误:

Error 1

Error 2

在 Cassandra 中不是这样工作的。您需要在 DELETE 命令中指定完整或部分主键。如果要按non-primary/partition键删除,则需要先找到具有该值的行,提取主键,然后按主键删除。

您可以在 中找到执行此操作的方法。

同样的问题在 https://community.datastax.com/questions/13219/ 上被问到,所以我 re-posting 在这里回答是为了后代。


在 Cassandra 中,称为“partitions”的数据库记录随机分布在集群中的节点上。 分区键(传统RDBMS中的行ID)被Cassandra用来确定分区(记录)存储在哪个节点。要删除分区,您需要指定分区键。

了解分区和数据分布方式对于了解 Cassandra 与传统 RDBMS 的不同之处至关重要。 Patrick McFadin explains the concept of partitions in this short video in great detail with examples and diagrams which I highly recommend. It is an extract of the free DS201 Foundations of Apache Cassandra course on DataStax Academy.

关于它的价值,如果您有兴趣,我之前在 https://community.datastax.com/questions/6171/ 中解释了分区键和主键之间的区别。我提供了一些示例,以便更容易理解这些概念。

在您的 table 中,分区键(也恰好是 主键 )是列标识符。您的删除语句:

DELETE FROM isis_users WHERE roleidentifier = "lim_user"

WHERE 子句中不包含 identifier,因此 Cassandra 不知道要删除哪个分区。这就是您收到错误的原因:

Some partition key parts are missing: identifier

无法使用 roleidentifier 进行过滤,因为该列不在主键中。 DELETE 语句只能包含主键中的列。

那么为什么它不像 RDBMS 那样工作呢?简短的回答是,Cassandra 解决了可伸缩性和可用性方面的难题。想象一下,您的集群中有 2000 个节点,table 中有数十亿或数万亿条记录全部分散在节点上。如果 Cassandra 不要求您指定分区键,它将需要对所有 2000 个节点执行完整 table 扫描才能找到您要查找的记录。这适用于传统的关系数据库,因为 (1) 它们不能保存尽可能多的记录,并且 (2) 不像 Cassandra 那样分布在不同的物理位置。

由于您是 Cassandra 的新手,查看 datastax.com/dev. If you scroll down the page, you'll see there are free hands-on tutorials which only take a few minutes to complete. The Cassandra Fundamentals 课程是一个很好的起点,因为您可以快速学习关键概念。这些教程是交互式的,并且 运行 在您的浏览器中,因此您无需安装或配置任何内容。干杯!