Cassandra表操作教程介绍
Cassandra 是一种用于处理NoSQL 数据库的开源分布式数据库软件。该软件使用CQL(Cassandra 查询语言)作为通信的基础。CQL 将数据保存在排列在一组行中的表中,其中的列包含键值对。
CQL 表在 Cassandra中称为键空间的数据容器中分组。存储在一个键空间中的数据与集群中的其他数据无关。因此,你可以在集群中的不同键空间中拥有用于多种不同目的的表,并且数据不会重合。
如何使用Cassandra?在本指南中,你将学习如何为几个不同的目的创建 Cassandra 表,以及如何使用 Cassandra shell 更改、删除或截断表,包括Cassandra表操作用法示例。
注意:在我们的Cassandra 与 MongoDB 比较文章中了解 Cassandra 的工作原理。
先决条件
- 系统上安装的 Cassandra 数据库软件
- 访问终端或命令行工具以加载cqlsh
- 具有执行命令所需权限的用户
为 Cassandra 表选择键空间
在开始添加表之前,你需要确定要在其中创建表的键空间。有两种选择可以做到这一点。
选项 1:USE 命令
运行该USE
命令以选择所有命令将应用到的键空间。为此,在 cqlsh shell 中键入:
USE keyspace_name;
然后,你可以开始添加表。
选项 2:在查询中指定键空间名称
第二个选项是在查询中指定用于表创建的键空间名称。命令的第一部分,在列名和选项之前,如下所示:
CREATE TABLE keyspace_name.table_name
这样,你可以立即在你定义的键空间中创建一个表。
创建 Cassandra 表的基本语法
使用 CQL 创建表看起来类似于 SQL 查询。在本节中,我们将向你展示在 Cassandra 中创建表的基本语法。
创建表的基本语法如下所示:
CREATE TABLE tableName (
columnName1 dataType,
columnName2 dataType,
columnName2 datatype
PRIMARY KEY (columnName)
);
或者,你可以使用WITH
以下方法定义其他表属性和值:
WITH propertyName=propertyValue;
例如,使用它来定义如何将数据存储在磁盘上或是否使用压缩。
Cassandra表操作教程:Cassandra 主键类型
如何使用Cassandra?Cassandra 中的每个表都需要有一个主键,这使得一行是唯一的。使用主键,你可以确定哪个节点存储数据以及它如何对其进行分区。
有两种类型的主键:
- 简单的主键。仅包含一个列名作为分区键,以确定哪些节点将存储数据。
- 复合主键。使用一个分区键和多个集群列来定义数据的存储位置以及如何在分区上对其进行排序。
- 复合分区键。在这种情况下,有几个列决定了数据的存储位置。通过这种方式,你可以将数据分成更小的部分,以将其分布在多个分区中以避免热点。
如何创建 Cassandra 表
以下部分说明如何创建具有不同类型主键的表。首先,选择要在其中创建表的键空间。在我们的例子中:
USE businesinfo;
每个表都包含列和每个条目的Cassandra 数据类型。
用简单的主键创建表
第一个示例是带有供应商的基本表。ID对于每个供应商都是唯一的,它将作为主键。
Cassandra表操作用法示例:CQL 查询如下所示:
CREATE TABLE suppliers (
supp_id int PRIMARY KEY,
supp_city text,
supp_email text,
supp_fee int,
supp_name text,
supp_phone int
);
此查询创建了一个名为供应商的表,并将其supp_id
作为该表的主键。当你使用以列名作为分区键的简单主键时,你可以将其放在查询的开头(将作为主键的列旁边)或底部,然后指定列名:
CREATE TABLE suppliers (
supp_id int,
supp_city text,
supp_email text,
supp_fee int,
supp_name text,
supp_phone int
PRIMARY KEY(supp_id)
);
要查看表是否在键空间中,请输入:
DESCRIBE TABLES;
输出列出了该键空间中的所有表以及你创建的表。
要显示表的内容,请输入:
SELECT * FROM suppliers;
输出显示创建表时定义的所有列。
查看表详细信息的另一种方法是使用DESCRIBE
并指定表名:
DESCRIBE suppliers;
输出显示表的列和默认设置。
Cassandra表操作教程:使用复合主键创建表
要查询并获取按特定顺序排序的结果,请创建一个具有复合主键的表。
例如,为供应商及其提供的所有产品创建一个表。由于每个供应商的产品可能不是唯一的,因此你需要在主键中添加一个或多个集群列以使其唯一。
Cassandra表操作用法示例:表架构如下所示:
CREATE TABLE suppliers_by_product (
supp_product text,
supp_id int,
supp_product_quantity text,
PRIMARY KEY(supp_product, supp_id)
);
在这种情况下,我们使用supp_product
和supp_id
来创建唯一的复合键。在这里,第一个条目brackets supp_product
是分区键。它决定了数据的存储位置,即系统如何对数据进行分区。
下一个条目是聚类列,它确定 Cassandra 如何对数据进行排序,在我们的例子中是按supp_id
。
上图显示表创建成功。要检查表详细信息,请运行DESCRIBE TABLE
新表的查询:
DESCRIBE TABLE suppliers_by_product;
聚类顺序的默认设置是升序 (ASC)。你可以通过在主键后添加以下语句来更改为降序 (DESC):
WITH CLUSTERING ORDER BY (supp_id DESC);
我们在分区键后指定了一个集群列。如果你需要使用两列对数据进行排序,请在主键括号内追加另一列。
使用复合分区键创建表
当一个节点存储大量数据并且你希望将负载分摊到多个节点上时,创建带有复合分区键的表会很有帮助。
在这种情况下,使用由多列组成的分区键定义主键。你需要使用双括号。然后,像之前一样添加聚类列以创建唯一的主键。
例如:
CREATE TABLE suppliers_by_product_type (
supp_product_consume text,
supp_product_stock text,
supp_id int,
supp_name text,
PRIMARY KEY((supp_product_consume, supp_product_stock), supp_id)
);
在上面的示例中,我们将数据分为两类,供应商消耗品和库存产品,并使用复合分区键分发数据。
注意:通过这种分区,每个产品类别都存储在一个单独的节点上,而不是将所有产品都放在一个分区上。
如果你使用带有简单分区键和多个集群列的复合主键,那么一个节点将处理按多列排序的所有数据。
Cassandra删除表
如何使用Cassandra?要删除 Cassandra 中的表,请使用该DROP TABLE
语句。要选择要删除的表,请输入:
DESCRIBE TABLES;
Cassandra表操作用法示例:找到要删除的表。使用表名将其删除:
DROP TABLE suppliers_by_product_type;
DESCRIBE TABLES
再次运行查询以验证你已成功删除表。
Cassandra表操作教程:Cassandra更改表
Cassandra CQL 允许你在表中添加或删除列。使用该ALTER TABLE
命令对表进行更改。
向表中添加列
在向表中添加列之前,我们建议你查看表的内容以验证列名是否已存在。
验证后,使用ALTER TABLE
此格式的查询添加一列:
ALTER TABLE suppliers_by_product
ADD supp_name text;
描述表确认列出现在列表中。
从表中删除列
与添加列类似,你可以从表中删除列。使用DESCRIBE TABLES
查询找到要删除的列。
然后输入:
ALTER TABLE suppliers_by_product
DROP supp_product_quantity;
注意:当你要从表中删除该列时,请勿指定该列的数据类型。如果你这样做会发生错误:“SyntaxException:第 1:48 行不匹配的输入‘文本’需要 EOF(ALTER TABLE supply_by_product DROP supp_name [text]...)”
Cassandra 截断表
如果不想删除整个表,但需要删除所有行,请使用该TRUNCATE
命令。
Cassandra表操作用法示例:例如,要从表providers 中删除所有行,请输入:
TRUNCATE suppliers;
要验证表中不再有行,请使用该SELECT
语句。
截断表后,更改将是永久性的,因此在使用此查询时要小心。
Cassandra表操作教程结论
如何使用Cassandra?本教程向你展示了如何使用简单和复合主键在 Cassandra 中创建用于不同目的的表。这些示例还包括使用复合分区键在节点之间分发数据。
我们还介绍了如何在 Cassandra 中删除、更改和截断表。确保你正在删除或更改正确的表以避免潜在问题。