无法删除多行,获取 "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 课程是一个很好的起点,因为您可以快速学习关键概念。这些教程是交互式的,并且 运行 在您的浏览器中,因此您无需安装或配置任何内容。干杯!
我是 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 课程是一个很好的起点,因为您可以快速学习关键概念。这些教程是交互式的,并且 运行 在您的浏览器中,因此您无需安装或配置任何内容。干杯!