Contents

Cassandra 数据类型

1. 概述

在本教程中,我们将展示 Apache Cassandra 数据库的一些不同数据类型。Apache Cassandra 支持丰富的数据类型集,包括集合类型、本机类型、元组类型和用户定义类型。

Cassandra 查询语言 (CQL) 是结构化查询语言 (SQL) 的简单替代方案。它是一种声明性语言,旨在提供与其数据库的通信。与 SQL 类似,CQL 也将数据存储在表中,并将数据组织成行和列。

2. Cassandra 数据库配置

让我们使用 docker映像 创建一个数据库,并使用cqlsh将其连接到数据库。接下来,我们应该创建一个KEYSPACE:

CREATE KEYSPACE blogdemo WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 1};

出于本教程的目的,我们创建了一个只有一个数据副本的KEYSPACE 。现在,让我们将客户端会话连接到一个KEYSPACE:

USE <code class="language-shell">blogdemo;

3. 内置数据类型

CQL 支持一组丰富的原生数据类型。这些数据类型是预定义的,我们可以直接引用它们中的任何一个。

3.1. 数值类型

数值类型类似于 Java 和其他语言中的标准类型,例如具有不同范围的整数或浮点数:

/uploads/cassandra_data_types/1.png

让我们创建一个包含所有这些数据类型的表:

CREATE TABLE numeric_types
(
    type1 int PRIMARY KEY,
    type2 bigint,
    type3 smallint,
    type4 tinyint,
    type5 varint,
    type6 float,
    type7 double,
    type8 decimal
);

3.2. 文本类型

CQL 提供了两种数据类型来表示文本。我们可以使用 text 或 varchar 来创建一个 UTF-8 字符串。UTF-8 是更新和广泛使用的文本标准,支持国际化。

还有 ascii 类型可以创建 ASCII 字符串。如果我们处理的是 ASCII 格式的遗留数据,ascii 类型最有用。文本值的大小受列的最大大小限制。单列值大小为 2 GB,但建议仅为 1 MB。

让我们创建一个包含所有这些数据类型的表:

CREATE TABLE text_types
(
    primaryKey int PRIMARY KEY,
    type2      text,
    type3      varchar,
    type4      ascii
);

3.3. 日期类型

现在,让我们谈谈日期类型。Cassandra 提供了几种类型,它们在定义唯一分区键或定义普通列时非常有用:

/uploads/cassandra_data_types/3.png

time did 由UUID 版本 表示。我们可以在 CQL 时间戳、时间和日期中输入整数或字符串。持续时间类型的值被编码为 3 个有符号整数。

第一个整数表示月数,第二个整数表示天数,第三个整数表示纳秒数。

让我们看一个CREATE TABLE命令的示例:

CREATE TABLE date_types
(
    primaryKey int PRIMARY KEY,
    type1      timestamp,
    type2      time,
    type3      date,
    type4      timeuuid,
    type5      duration
);

3.4. 计数器类型

**计数器类型用于定义counter列。**计数器列是其值为 64 位有符号整数的列。我们只能对计数器列执行两个操作——递增和递减。

因此,我们不能将值设置为计数器。我们可以使用计数器来跟踪统计信息,例如页面浏览量、推文、日志消息等。我们不能将计数器类型与其他类型混合。

让我们看一个例子:

CREATE TABLE counter_type
(
    primaryKey uuid PRIMARY KEY,
    type1      counter
);

3.5. 其他数据类型

  • 布尔值是一个简单的真/假值
  • uuid 是一个Type 4 UUID,它完全基于随机数。我们可以使用破折号分隔的十六进制数字序列来输入 UUID
  • 二进制大对象 (blob) 是用于任意字节数组的通俗计算术语。CQL blob 类型存储媒体或其他二进制文件类型。最大 blob 大小为 2 GB,但建议小于 1 MB。
  • inet 是表示IPv4或IPv6 Internet 地址的类型

同样,让我们创建一个具有这些类型的表:

CREATE TABLE other_types
(
    primaryKey int PRIMARY KEY,
    type1      boolean,
    type2      uuid,
    type3      blob,
    type4      inet
);

4. 集合数据类型

有时我们希望存储相同类型的数据而不生成新列。集合可以存储多个值。CQL 提供了三种集合类型来帮助我们,例如列表、集合和映射。

例如,我们可以创建一个包含文本元素列表、整数列表或其他一些元素类型列表的表格。

4.1. Set

**我们可以使用 set 数据类型存储多个唯一值。**同样,在 Java 中,元素不是按顺序存储的。

让我们创建一个集合:

CREATE TABLE collection_types
(
    primaryKey int PRIMARY KEY,
    email      set<text>
);

4.2. List

**在这种数据类型中,值以列表的形式存储。**我们不能改变元素的顺序。将值存储在列表中后,元素将获得特定的索引。我们可以使用这些索引来检索数据。

与集合不同,列表可以存储重复值。让我们在表中添加一个列表:

ALTER TABLE collection_types
    ADD scores list<text>;

4.3. Map

使用 Cassandra ,我们可以使用 map 数据类型将数据存储在键值对集合中。键是唯一的。因此,我们可以按它们的键对映射进行排序。

让我们在表中添加另一列:

ALTER TABLE collection_types
    ADD address map<uuid, text>;

5. Tuples

元组是一组不同类型的元素。这些集合具有固定长度:

CREATE TABLE tuple_type
(
    primaryKey int PRIMARY KEY,
    type1 tuple<int, text, float>
);

6. 用户定义的数据类型

Cassandra 提供了创建我们自己的数据类型的可能性。我们可以创建、修改和删除这些数据类型。首先,让我们创建自己的类型:

CREATE TYPE user_defined_type (
    type1 timestamp,
    type2 text,
    type3 text,
    type4 text);

所以,现在我们可以使用我们的类型创建一个表:

CREATE TABLE user_type
(
    primaryKey int PRIMARY KEY,
    our_type   user_defined_type
);