Cassandra 集合:CQL 中的集合、列表和映射(附示例)
是什么 Cassandra 收藏品?
Cassandra 集合是处理任务的好方法。集合中可以存储多个元素。 Cassandra 集合。
- 集合列单个值不能存储超过 64 KB 的数据。
- 保持集合较小,以避免查询集合带来的开销,因为即使只需要一个元素,也会读取整个集合。
- 存储超过 64 KB 的数据意味着只能查询前 64 KB 的数据,这会导致数据丢失。
- 未冻结的集合大约包含 65,535 个元素,并且每个元素作为一个整体进行读取。
这些限制指向一条规则:集合适合存储与行关联的少量属性,而不是随着使用而不断增长的开放式列表。任何持续增长的内容都应该放在其自身表的聚类列中。
有哪些 Cassandra 系列
主要有三种类型的收藏品 Cassandra 支持:
- 米
- 列表
- 地图
Cassandra 集合集合
集合 (Set) 存储一组元素,查询时返回已排序的元素。
句法
以下是存储教师多个电子邮件地址的 Set 集合的语法。
CREATE TABLE University.Teacher ( id int, Name text, Email set<text>, PRIMARY KEY (id) );
例如:
这是以“电子邮件”列作为集合创建的表“教师”的快照。
这是在集合中插入数据的快照。
INSERT INTO University.Teacher (id, Name, Email) VALUES (1, 'Guru99', {'abc@gmail.com', 'xyz@hotmail.com'});
无需重写整个集合即可添加或删除单个元素,这是保持集合未冻结的主要优势。
UPDATE University.Teacher SET Email = Email + {'new@guru99.com'} WHERE id = 1; UPDATE University.Teacher SET Email = Email - {'xyz@hotmail.com'} WHERE id = 1;
Cassandra 清单集合
当元素的顺序很重要时,使用列表。
例如:
这是在“教师”表中添加列表类型列“课程”的快照。
ALTER TABLE University.Teacher ADD coursenames list<text>;
这是在“coursenames”列中插入数据的快照。
INSERT INTO University.Teacher (id, Name, Email, coursenames) VALUES (2, 'Hamilton', {'hamilton@hotmail.com'}, ['Data Science']);
这是显示插入后当前数据库状态的快照。
元素可以添加到末尾或添加到末尾,但添加末尾和按索引更新都需要 Cassandra 首先读取列表,这使得它们比追加列表慢。
UPDATE University.Teacher SET coursenames = coursenames + ['Machine Learning'] WHERE id = 2; UPDATE University.Teacher SET coursenames = ['Statistics'] + coursenames WHERE id = 2;
Cassandra 地图集
Map 是一种用于存储键值对的集合类型。顾名思义,它将一个事物映射到另一个事物。
例如想将课程名称与其先修课程名称一起保存,可以使用地图集合。
例如:
这是为课程名称及其先修课程名称创建地图类型的快照。
CREATE TABLE University.Course ( id int, prereq map<text, text>, PRIMARY KEY (id) );
这是在地图集合类型中插入数据的快照。
INSERT INTO University.Course (id, prereq) VALUES (1, {'DataScience': 'Database', 'Neural Network': 'Artificial Intelligence'});
只需设置或删除单个条目,而不会影响地图的其他部分。
UPDATE University.Course SET prereq['Robotics'] = 'Linear Algebra' WHERE id = 1; DELETE prereq['DataScience'] FROM University.Course WHERE id = 1;
集合、列表和映射:如何选择集合
这三种类型看起来可以互换,但在订购保证和更新费用方面有所不同。
| 方面 | 米 | 列表 | 地图 |
|---|---|---|---|
| 订购 | 按值排序 | 插入顺序保持不变 | 按键排序 |
| 重复 | 不允许 | 允许 | 独特的钥匙 |
| 更新成本 | 便宜,无需阅读 | 追加操作成本低;前置和索引更新需要读取操作。 | 每把钥匙便宜 |
| 最适合 | 标签、电子邮件地址、唯一标签 | 有序步骤中重复项有意义 | 具有不可预测键的命名属性 |
除非顺序确实至关重要,否则最好使用集合而不是列表,因为列表索引操作会创建墓碑标记,并且在并发写入时可能会产生意想不到的结果。 冻结 三个存储中的任何一个都会将其作为一个不可变值存储,这允许集合出现在主键中,但会移除元素级别的更新。
CREATE TABLE University.Enrolment ( id int, tags frozen<set<text>>, PRIMARY KEY (id, tags) );
当集合中的元素超过几十个时,应将其建模为一个单独的表,并将元素作为聚类列,遵循以下方法: Cassandra 数据模型规则对集合内容进行筛选需要索引,这在……中有所介绍。 创建和删除索引 教程。







