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 是表示IPv4IPv6 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
);