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

简介: 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

目录
相关文章
|
测试技术 数据安全/隐私保护
深入理解与应用软件测试中的边界值分析法
【4月更文挑战第23天】在软件测试的诸多技术中,边界值分析法因其简洁性和高效性而备受青睐。本文旨在探讨边界值分析法的核心原理及其在实际测试场景中的应用。通过对边界条件进行系统的识别、分类和测试,该方法能够有效地发现软件缺陷。我们将详细讨论如何确定边界值,设计测试用例,以及如何处理复杂数据类型的边界情况。此外,文章还将展示通过案例研究来验证边界值分析法在提升测试覆盖率和发现潜在错误方面的实际效益。
|
自然语言处理 NoSQL Redis
短链平台设计
一种生产环境可用的短链生成方法,将长度较长、难以识别的长链转换成长度可控的短链,点击短链再跳转回长链的方法
805 0
|
存储 算法 安全
【Freertos基础入门】队列(queue)的使用
【Freertos基础入门】队列(queue)的使用
1788 0
|
iOS开发
SwiftUI极简教程13:NavigationView导航栏使用
SwiftUI极简教程13:NavigationView导航栏使用
2769 2
SwiftUI极简教程13:NavigationView导航栏使用
|
11月前
|
人工智能 IDE 程序员
通义灵码打造企业专属 AI 程序员
本文介绍了AI辅助编码领域的产品形态与发展趋势,重点分析了通义灵码的功能与优势。作为一款IDE插件,通义灵码经历了三个发展阶段,从行级代码补全到Multi-Agent全流程支持,覆盖个人开发者与企业用户需求。其核心功能包括代码智能辅助、私域知识融合及自定义扩展机制,有效提升了研发效率。此外,文章还展示了通义灵码在智能化工具链建设中的探索,如代码评审智能体,并通过趣味项目演示了AI程序员的多步骤协作能力。
|
机器学习/深度学习 数据采集 人工智能
使用R语言进行机器学习的初学者指南
【4月更文挑战第25天】本文是R语言机器学习初学者指南,介绍了R语言在统计分析和机器学习中的应用。首先,简述R语言的背景及特点,包括其丰富的统计功能和扩展性。接着,指导如何安装和配置R语言及RStudio,以及设置国内R包安装源。然后,讲解R语言的基础知识,如数据类型、变量、数据结构和控制结构。此外,文中还推荐了几个常用的机器学习库,如caret、gbm、RandomForest和xgboost。最后,通过一个线性回归模型实例,展示了使用R语言进行机器学习的基本流程,包括数据准备、预处理、模型训练、评估和预测。
771 2
|
存储 Linux Docker
Centos安装docker和docker compose
Centos安装docker容器化环境
2007 0
|
资源调度 监控 API
在Flink中,通过YARN模式进行峰谷动态并行度扩容缩容可以使用 Flink 自带的动态调优功能
在Flink中,通过YARN模式进行峰谷动态并行度扩容缩容可以使用 Flink 自带的动态调优功能【1月更文挑战第6天】【1月更文挑战第26篇】
662 1
|
机器学习/深度学习 数据可视化 TensorFlow
使用Python实现深度学习模型:智能旅游路线规划
使用Python实现深度学习模型:智能旅游路线规划
508 2
|
移动开发 小程序 视频直播
FFmpeg开发笔记(二十七)解决APP无法访问ZLMediaKit的直播链接问题
本文讲述了在使用ZLMediaKit进行视频直播时,遇到移动端通过ExoPlayer和微信小程序播放HLS直播地址失败的问题。错误源于ZLMediaKit对HTTP地址的Cookie校验导致401无权限响应。通过修改ZLMediaKit源码,注释掉相关鉴权代码并重新编译安装,解决了此问题,使得ExoPlayer和小程序能成功播放HLS视频。详细解决方案及FFmpeg集成可参考《FFmpeg开发实战:从零基础到短视频上线》一书。
1184 3
FFmpeg开发笔记(二十七)解决APP无法访问ZLMediaKit的直播链接问题