Cassandra 最佳实践系列(1) - CQL 基本数据类型

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: Cassandra cql基本数据类型介绍

Cassandra最佳实践细节(1)常见CQL使用(1)

数据类型

CQL_TYPE包含如下几类:

  • native type;
  • collection type;
  • user defined type;
  • tuple type;
  • Custom type;

native type

类型 变量可用类型 描述
ascii string ASCII 字符串
bigint integer 64位有符号long
blob blob 任意字节
boolean boolean true、false
counter integer counter 列(64位有符号)
date integer、string 日期常量类型
decimal integer、float 可变精度小数
double integer、float 64位IEEE-754浮点
duration duratio 纳秒精确度的持续时间
float integer、float 32位IEEE-754浮点
inet string IP地址、ipv4或者ipv6,因为没有ip类型,所以用string作为输入
int integer 32位 有符号int
smallint integer 16位有符号int
text string UTF-8编码string
time integer、string 纳秒精度的时间
timestamp integer、string 毫秒时间戳
timeuuid uuid uuid
tinyint integer 8位有符号int
uuid uuid uuid
varchar string UTF8string
varint integer 任意精度证书

使用counter

可以用来定义counter 列,这个列支持2种操作:incrementing 以及decrementing,使用限制是:

  • primary key不可以包含counter 列;
  • 一个表如果包含了counter,那么就只能包含counter,换句话说就是:如果primary key外的列要么全是counter,要么就没有;
  • counter列不支持过期;
  • counter列支持delete,但是只能支持delete一次;
  • counter理论上是不是很理想的,如果超时等可能影响准确性。

使用timestamp

timestamp 类型是64位的有符号的int,代表的是从1970年00:00:00以来的毫秒时间戳。在CQL里面timestamp可以使用integer以及string表示,比如2011年3月21号 04:05:00 AM, GMT;

  • 1299038700000
  • '2011-02-03 04:05+0000'
  • '2011-02-03 04:05:00+0000'
  • '2011-02-03 04:05:00.000+0000'
  • '2011-02-03T04:05+0000'
  • '2011-02-03T04:05:00+0000'
  • '2011-02-03T04:05:00.000+0000'

使用date

date类型的value 可以是string或者integer的类型,基本的表述格式:yyyy-mm-dd

使用时间类型 times

times的类型value是可以是string或者integer,它的使用格式是:hh:mm:ss[.ffffffff],举个例子,可以如下表示一个时间:

  • '08:12:54'
  • '08:12:54.123'
  • '08:12:54.123456'
  • '08:12:54.123456789'

使用duration

duration类型的数据是由3个有符号的integer组成的,第一个表示的是month,第二个表示的是天,第三个表示的是纳秒。duration的的输入可以如下:

  • 时间单元可以比如:12h30m,相关的时间单元可以如下:

    • y:年(12个months)
    • mo:months(1 month)
    • w: weeks(7 days)
    • d:days (1 day)
    • h:hours(3,600,000,000,000纳秒)
    • m:分钟(60,000,000,000 纳秒)
    • s:秒(1,000,000,000纳秒)
    • ms:毫秒(1000,000 纳秒)
    • us: 微妙(1000纳秒)
    • ns:纳秒(1纳秒)
  • ISO 8601 格式: P[n]Y[n]M[n]DT[n]H[n]M[n]S or P[n]W
  • ISO 8601 可选格式: P[YYYY]-[MM]-[DD]T[hh]:[mm]:[ss]

列子:

INSERT INTO RiderResults (rider, race, result) VALUES ('Christopher Froome', 'Tour de France', 89h4m48s);
INSERT INTO RiderResults (rider, race, result) VALUES ('BARDET Romain', 'Tour de France', PT89H8M53S);
INSERT INTO RiderResults (rider, race, result) VALUES ('QUINTANA Nairo', 'Tour de France', P0000-00-00T89:09:09);

注意 : duration的列无法做为primary key,主要原因是因为在没有date类型保序的情况下无法将duration的相关数据进行排序;

Collection type

Cassandra 支持3种集合类型:Maps、Lists、Sets,对于使用这几个类型有一些需要的建议如下:

  • 对于一些有限的排序/denormalizing 的数据,可以使用collection,但是无限的数据不建议用这个类型存;
  • 单个集合内部元素并没有被索引,所以如果需要读取单个集合内部的某个元素会将整个元素都读取出来;
  • 对于sets以及maps的写操作不会引起read-before-write,但是对于list操作来说可能会存在。所以对于有的情况下的list操作并不建议,反之set之类可能更合适。

maps

map是一个以key排序的k-v对,使用方式如下:

CREATE TABLE users (
    id text PRIMARY KEY,
    name text,
    nametoaddress map<text, text> 
);

INSERT INTO users (id, name, favs)
           VALUES ('id1', 'gcc', { 'xl' : 'hz', 'gc' : 'bj' });

UPDATE users SET nametoaddress = { 'xl' : 'china' } WHERE id = 'id1';

map类支持:

  • update 或者insert 单个或者多个元素:
UPDATE users SET nametoaddress['gc'] = 'earth' WHERE id = 'id1';
UPDATE users SET nametoaddress = nametoaddress + { 'll' : 'sh', 'nn' : 'sz' } WHERE id = 'id1';
  • 删除单个或者多个元素:
DELETE nametoaddress['xl'] FROM users WHERE id = 'id1';
UPDATE users SET nametoaddress = nametoaddress - { 'xl', 'll'} WHERE id = 'id1';
  • 支持TTL操作

sets

set是有序的值排序,类似我们常见的set集合类型:

CREATE TABLE images (
    name text PRIMARY KEY,
    owner text,
    tags set<text>  
);

INSERT INTO images (name, owner, tags)
            VALUES ('cat.jpg', 'gcc', { 'pet', 'cute' });

UPDATE images SET tags = { 'kitten', 'cat', 'lol' } WHERE name = 'cat.jpg';

set操作支持下面:

  • 给集合添加以及删除一个或者多个元素:
UPDATE images SET tags = tags + { 'gray', 'cuddly' } WHERE name = 'cat.jpg';
UPDATE images SET tags = tags - { 'cat' } WHERE name = 'cat.jpg';

lists

list和我们常见的理解的list集合类型类似:

CREATE TABLE plays (
    id text PRIMARY KEY,
    game text,
    players int,
    scores list<int>  
)

INSERT INTO plays (id, game, players, scores)
           VALUES ('123-afde', 'quake', 3, [17, 4, 2]);

UPDATE plays SET scores = [ 3, 9, 4] WHERE id = '123-afde';

list支持下面操作:

  • 将值添加到列表:
UPDATE plays SET players = 5, scores = scores + [ 14, 21 ] WHERE id = '123-afde';
UPDATE plays SET players = 6, scores = [ 3 ] + scores WHERE id = '123-afde';
  • 设置list中某个特定位置的值:
UPDATE plays SET scores[1] = 7 WHERE id = '123-afde';
  • 删除某个特定位置上的值:
DELETE scores[1] FROM plays WHERE id = '123-afde';
  • 删除相关存在的值:
UPDATE plays SET scores = scores - [ 12, 21 ] WHERE id = '123-afde';

UDT (user-defined-type)

支持用户自定义的类型,这个需要指定特定的keyspace下面进行对应的create 操作,对于udt,支持create、alter、drop等操作。

create udt

一定要在一个具体的keyspace下面使用,参考:
udt

此外还支持alter以及drop操作。

注意:如果一个udt被一个具体的表使用,如果想drop这个udt,那么需要对应的表也要drop;

tuple

使用参考下面的列子:
tuple

目录
相关文章
|
6月前
|
存储 关系型数据库 MySQL
TiDB中的数据类型详解
【2月更文挑战第29天】TiDB支持多种数据类型:整数(TINYINT到BIGINT)、浮点(FLOAT, DOUBLE)、定点(DECIMAL)、字符串(CHAR, VARCHAR, TEXT)、日期时间(DATE, TIME, DATETIME, TIMESTAMP)、二进制(BINARY, VARBINARY, BLOB)以及枚举和集合(ENUM, SET)。正确选择数据类型对存储、查询和性能至关重要。
1059 1
|
6月前
|
存储 NoSQL 分布式数据库
分布式NoSQL列存储数据库Hbase Java API(四)
分布式NoSQL列存储数据库Hbase Java API(四)
68 0
|
6月前
|
存储 NoSQL 分布式数据库
分布式NoSQL列存储数据库Hbase Java API(三)
分布式NoSQL列存储数据库Hbase Java API(三)
62 0
|
存储 分布式计算 NoSQL
分布式数据库HBase的基本概念和架构之基本数据模型的Column
HBase是一个分布式数据库系统,基于Google的Bigtable和Apache Hadoop的HDFS构建而成。
279 0
|
存储 分布式计算 NoSQL
分布式数据库HBase的基本概念和架构之基本数据模型的Table
HBase是一个分布式数据库系统,基于Google的Bigtable和Apache Hadoop的HDFS构建而成。
|
存储 NoSQL 关系型数据库
【Cassandra从入门到放弃系列 三】Cassandra的数据模型设计
【Cassandra从入门到放弃系列 三】Cassandra的数据模型设计
439 0
|
存储 消息中间件 缓存
【Cassandra从入门到放弃系列 一】概述及基本架构
【Cassandra从入门到放弃系列 一】概述及基本架构
2227 0
|
SQL 存储 JSON
Cassandra CQL语法 以及功能介绍
内容摘要: 一、Cassandra简单介绍 ·Cassandra的历史和基本架构 二、Cassandra CQL介绍 ·如何使用CQL语言操作Cassandra
4124 0
Cassandra CQL语法 以及功能介绍
|
存储 SQL 缓存
NoSQL概述
NoSQL概述
257 1
NoSQL概述
|
存储 自然语言处理 搜索推荐
Elasticsearch支持哪些不同的数据类型?底层原理是什么?
Elasticsearch支持哪些不同的数据类型?底层原理是什么?
142 0