准备

按照Cassandra集群部署搭建两台测试机,环境信息如下:

名称 IP 数据中心名称
node-01 192.168.198.130 datacenter1
node-02 192.168.198.131 datacenter1

Keyspace

创建Keyspace

create_keyspace_statement ::=  CREATE KEYSPACE [ IF NOT EXISTS ] keyspace_name WITH options

示例:

## 使用SimpleStrategy复制策略
CREATE KEYSPACE excelsior
WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3}; ## 使用NetworkTopologyStrategy复制策略
# 1. 确认分区名称
$ nodetool status
Datacenter: datacenter1
... # 2. 使用NetworkTopologyStrategy复制策略创建keyspace
CREATE KEYSPACE excalibur
WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1' : 1, 'DC2' : 3}
AND durable_writes = false;

使用Keyspace

use_statement ::=  USE keyspace_name

修改Keyspace(replication factor)

alter_keyspace_statement ::=  ALTER KEYSPACE keyspace_name WITH options

示例:

ALTER KEYSPACE excelsior
WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 4};

查看Keyspace

DESCRIBE KEYSPACE <keyspace name>;

使用该语句查看创建的键空间是否正确:

DESCRIBE KEYSPACE excelsior;

CREATE KEYSPACE excelsior WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3} AND durable_writes = true;

删除Keyspace

drop_keyspace_statement ::=  DROP KEYSPACE [ IF EXISTS ] keyspace_name
DROP KEYSPACE excelsior;
DESCRIBE excelsior; 'excelsior' not found in keyspaces

Table

创建Table

create_table_statement ::=  CREATE TABLE [ IF NOT EXISTS ] table_name
'('
column_definition
( ',' column_definition )*
[ ',' PRIMARY KEY '(' primary_key ')' ]
')' [ WITH table_options ]
column_definition ::= column_name cql_type [ STATIC ] [ PRIMARY KEY]
primary_key ::= partition_key [ ',' clustering_columns ]
partition_key ::= column_name
| '(' column_name ( ',' column_name )* ')'
clustering_columns ::= column_name ( ',' column_name )*
table_options ::= COMPACT STORAGE [ AND table_options ]
| CLUSTERING ORDER BY '(' clustering_order ')' [ AND table_options ]
| options
clustering_order ::= column_name (ASC | DESC) ( ',' column_name (ASC | DESC) )*

创建Table必须指定主键,主键是用于在表中唯一标识某一行,可以是一列或多列。

示例,在excelsior键空间创建一张名为excelsior_alt_stats 的表:

CREATE TABLE excelsior.excelsior_alt_stats (
id UUID PRIMARY KEY,
lastname text,
birthday timestamp,
nationality text,
weight text,
height text
);

cassandra还支持collection(map, set, 或者 list)类型作为列:

CREATE TABLE excelsior.whimsey (
id UUID PRIMARY KEY,
lastname text,
excelsior_teams set<text>,
events list<text>,
teams map<int,text>
);

甚至是嵌套的元组类型(tuple):

CREATE TABLE excelsior.route (
race_id int,
race_name text,
point_id int,
lat_long tuple<text, tuple<float,float>>,
PRIMARY KEY (race_id, point_id)
);

更多数据类型请参阅下一节Cassandra数据结构

静态列

某些列可以在表定义中声明为STATIC。静态的列将由属于同一分区(具有相同分区键)的所有行“共享”。例如:

CREATE TABLE t (
pk int,
t int,
v text,
s text static,
PRIMARY KEY (pk, t)
); INSERT INTO t (pk, t, v, s) VALUES (0, 0, 'val0', 'static0');
INSERT INTO t (pk, t, v, s) VALUES (0, 1, 'val1', 'static1'); SELECT * FROM t;
pk | t | v | s
----+---+--------+-----------
0 | 0 | 'val0' | 'static1'
0 | 1 | 'val1' | 'static1' ## 所有记录中的静态列将永远展示最后一次更新的值

修改Table

alter_table_statement   ::=  ALTER TABLE table_name alter_table_instruction
alter_table_instruction ::= ADD column_name cql_type ( ',' column_name cql_type )*
| DROP column_name ( column_name )*
| WITH options

示例:

ALTER TABLE addamsFamily ADD gravesite varchar;

ALTER TABLE addamsFamily
WITH comment = 'A most excellent and useful table';

修改Table可以:

  1. 向表中添加新列(通过ADD指令)。请注意,无法更改表的主键,因此新添加的列将不会成为主键的一部分。
  2. 从表中删除列。这会丢弃列及其所有内容。
  3. 更改一些表选项(通过WITH指令)。支持的选项与创建表时相同(在创建后无法更改的COMPACT STORAGE和CLUSTERING ORDER之外)。

删除Table

drop_table_statement ::=  DROP TABLE [ IF EXISTS ] table_name

截断Table(清空表数据)

truncate_statement ::=  TRUNCATE [ TABLE ] table_name

由于表是唯一可以在当前截断的对象,因此可以省略TABLE关键字。

截断表会永久删除表中的所有现有数据,但不会删除表本身。

Cassandra数据结构

CQL是一种类型化语言,支持丰富的数据类型集,包括本地类型,集合类型,用户定义类型,元组类型和自定义类型:

cql_type ::=  native_type | collection_type | user_defined_type | tuple_type | custom_type

本地类型(Native Types)

类型 常量支持 说明
ascii string ASCII字符串
bigint integer 64位无符号整数
blob blob 任意字节(无验证)
boolean boolean truefalse
counter integer 计数器列(64位有符号值)
date integerstring 日期(没有相应的时间值)
decimal integerfloat 十进制可变精度
double integer float 64位IEEE-754浮点
duration duration 持续时间(纳秒精度)
float integerfloat 32位IEEE-754浮点
inet string IP地址,IPv4(4字节长)或IPv6(16字节长)
int integer 32位无符号整数
smallint integer 16位有符号整数
text string UTF8编码的字符串
time integerstring 具有纳秒精度的时间(没有相应的日期值)
timestamp integerstring 时间戳(日期和时间),精度为毫秒
timeuuid uuid UUID(版本1),通常用作“无冲突”时间戳
tinyint integer 8位有符号整数
uuid uuid 一个UUID(任何版本)
varchar string UTF8编码的字符串
varint integer 任意精度整数

其中需要注意的是时间类型:

timestamps

时间戳类型的值被编码为64位有符号整数,表示自标准基准时间(称为纪元:1970年1月1日格林威治标准时间00:00:00)以来的毫秒数。

  • 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'

例如:

SELECT *
FROM point
WHERE ts = '2018-11-15 00:00:30.557+0000';

或者

SELECT *
FROM point
WHERE ts = 1542211230557;

其中,+0000是RFC 822 4-digit时区规范,+0000指GMT。美国太平洋标准时间为-0800,中国北京标准时间为+8000,官方建议每次插入查询都带上时区,不加的话,默认是使用Cassandra节点配置的时区,可能会出现时区不一致导致的查询失败问题。

dates

日期类型的值被编码为32位无符号整数,表示在该范围的中心处具有“纪元”的天数(2^31)。大纪元是1970年1月1日。

至于时间戳,日期可以作为整数或使用日期字符串输入。在后一种情况下,格式应为yyyy-mm-dd(例如'2011-02-03')。

times

时间类型的值被编码为64位有符号整数,表示自午夜以来的纳秒数。

对于时间戳,可以以整数或表示时间的字符串的形式输入时间。在后一种情况下,格式应为hh:mm:ss [.fffffffff](其中亚秒精度是可选的,如果提供,则可以小于纳秒)。例如,以下是一段时间内的有效输入:

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

durations

持续时间类型的值被编码为3个有符号整数的可变长度。这是因为一个月的天数可以改变,一天可以有23或25小时,具体取决于夏令时。

  • 第一个整数表示月数(32位整数)

  • 第二个表示天数(32位整数)

  • 第三个表示纳秒数(64位整数)

  1. 支持的单位:
  • y: 年(12 月)
  • mo: 月 (1 月)
  • w: 周(7 天)
  • d: 天(1 天)
  • h: 小时(3,600,000,000,000 纳秒)
  • m: 分钟(60,000,000,000 纳)
  • s: 秒(1,000,000,000 纳)
  • ms: 毫秒(1,000,000 纳)
  • us or µs : 微妙(1000 纳)
  • ns: 纳秒(1 纳)
  1. ISO 8601格式:P[n]Y[n]M[n]DT[n]H[n]M[n]S or P[n]W
  2. 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);

持续时间列不能作为主键。这是由于无法精确确认持续时间。如果没有日期上下文,实际上不可能知道1个月是否大于29天。

1天的持续时间也不等于24h,因为持续时间类型需要支持夏令时。

集合类型(Collections)

cassandra支持三种类型的集合:Maps, Sets and Lists

collection_type ::=  MAP '<' cql_type ',' cql_type '>'
| SET '<' cql_type '>'
| LIST '<' cql_type '>'

可以这样输入集合类型的数据:

collection_literal ::=  map_literal | set_literal | list_literal
map_literal ::= '{' [ term ':' term (',' term : term)* ] '}'
set_literal ::= '{' [ term (',' term)* ] '}'
list_literal ::= '[' [ term (',' term)* ] ']'

Maps

Maps是一组(有序)键值对,其中键是唯一的,并且按其键排序。

CREATE TABLE users (
id text PRIMARY KEY,
name text,
favs map<text, text> // A map of text keys, and text values
); INSERT INTO users (id, name, favs)
VALUES ('jsmith', 'John Smith', { 'fruit' : 'Apple', 'band' : 'Beatles' }); // Replace the existing map entirely.
UPDATE users SET favs = { 'fruit' : 'Banana' } WHERE id = 'jsmith';

另外,Maps还具有一些高级特性:

  • 更新或插入一个或多个元素
UPDATE users SET favs['author'] = 'Ed Poe' WHERE id = 'jsmith';
UPDATE users SET favs = favs + { 'movie' : 'Cassablanca', 'band' : 'ZZ Top' } WHERE id = 'jsmith';
  • 删除一个或多个元素(如果一个元素不存在,删除它是一个无效操作但不会抛出错误)
DELETE favs['author'] FROM users WHERE id = 'jsmith';
UPDATE users SET favs = favs - { 'movie', 'band'} WHERE id = 'jsmith';

Sets

Sets是唯一值的(已排序)集合。

CREATE TABLE users (
id text PRIMARY KEY,
name text,
favs map<text, text> // A map of text keys, and text values
); INSERT INTO users (id, name, favs)
VALUES ('jsmith', 'John Smith', { 'fruit' : 'Apple', 'band' : 'Beatles' }); // Replace the existing map entirely.
UPDATE users SET favs = { 'fruit' : 'Banana' } WHERE id = 'jsmith';

另外,Sets也具有一些高级特性:

  • 添加一个或多个元素(因为这是一个集合,插入一个已存在的元素是一个无效操作)
UPDATE images SET tags = tags + { 'gray', 'cuddly' } WHERE name = 'cat.jpg';
  • 删除一个或多个元素(如果一个元素不存在,删除它是一个无效操作但不会抛出错误)
UPDATE images SET tags = tags - { 'cat' } WHERE name = 'cat.jpg';

Lists

Lists是非唯一值的(已排序)集合,其中元素按列表中的位置排序。它与Sets的区别就在于是否是唯一值。

CREATE TABLE plays (
id text PRIMARY KEY,
game text,
players int,
scores list<int> // A list of integers
) INSERT INTO plays (id, game, players, scores)
VALUES ('123-afde', 'quake', 3, [17, 4, 2]); // Replace the existing list entirely
UPDATE plays SET scores = [ 3, 9, 4] WHERE id = '123-afde';

另外,Lists同样也具有一些高级特性:

  • 在列表头或尾添加元素
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';

Cassandra学习&命令行实践的更多相关文章

  1. dos命令行实践

    本篇体验使用dos命令行窗口实现各种操作. □ 打开dos命令行窗口 →点击电脑左下角"开始"按钮→点击"运行"→输入"cmd",按回车,来 ...

  2. MongoDB学习-->命令行增删改查&JAVA驱动操作Mongodb

    MongoDB 是一个基于分布式文件存储的数据库. 由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关 ...

  3. Linux基础学习-命令行与图形界面切换

    命令行模式和图形界面模式切换 打开文件 vim /etc/inittab # systemd uses 'targets' instead of runlevels. By default, ther ...

  4. java 学习 命令行运行java程序

    之前学习python,由于公司需要.现在不得已转java. 1.命令运行java程序. 程序名字:input.java code: /** * Created by liumeide on 2017/ ...

  5. Windows命令行(DOS命令)教程 -1 (转载) http://www.pconline.com.cn/pcedu/rookie/basic/10111/15325.html

    一.命令行简介 命令行就是在Windows操作系统中打开DOS窗口,以字符串的形式执行Windows管理程序. 在这里,先解释什么是DOS? DOS--Disk Operation System 磁盘 ...

  6. ubuntu命令行添加拥有管理员权限新用户

    最近买了个服务器,只有一个root用户,天天登录挺不方便的,所以想要新建用户;之前在本地都是用界面话新建的用户,这次记录一下学习命令行新建用户的过程: 第一步 : # sudo adduser zhq ...

  7. Windows命令行(DOS命令)教程

    一.命令行简介 命令行就是在Windows操作系统中打开DOS窗口,以字符串的形式执行Windows管理程序. 在这里,先解释什么是DOS? DOS——Disk Operation System 磁盘 ...

  8. 学习 Linux,101: Linux 命令行

    概述 本教程将简要介绍 bash shell 的一些主要特性,涵盖以下主题: 使用命令行与 shell 和命令交互 使用有效的命令和命令序列 定义.修改.引用和导出环境变量 访问命令历史和编辑工具 调 ...

  9. 由SecureCRT命令行快捷键谈学习思想

    由学习linux SecureCRT命令行常用快捷键开始谈起! 1)老男孩说,抓重点(重点非难点) 任何一个领域.学科,任何一个职位.工作,都有学不完的知识,优秀的学生总能抓住重点去学习,如果泛泛的去 ...

随机推荐

  1. 《Python学习手册 第五版》 -第5章 数值类型

    本章是承接第四章整体说明之后,将对”数值类型“展开详细的说明 数值类型这一章主要通过一下几个内容来讲解: 1.数值类型有哪些? 2.表达式运算符:有哪些?有什么规范? 3.数值的显示格式 接下来,从第 ...

  2. LeetCode 127. Word Ladder 单词接龙(C++/Java)

    题目: Given two words (beginWord and endWord), and a dictionary's word list, find the length of shorte ...

  3. python学习(9)字典的基本应用

    字典是一种通过名字或者关键字引用的得数据结构,其键可以是数字.字符串.元组,这种结构类型也称之为映射.字典类型是Python中唯一內建的映射类型.字典可以理解为列表的升级版. dict是无序的 key ...

  4. 给 iTerm 终端设置代理

    本文介绍如何为自己的终端设置代理,从而实现在命令行中访问Google. 1. 背景 当你使用SS FQ时,大部分浏览器都可以成功访问Google,但是在命令行下执行curl https://www.g ...

  5. web测试和app测试

    web测试是b/s结构,app是c/s结构,因此会有很多测试点需要注意: 1.兼容性:web测试需要考虑多个浏览器内核测试,app主要是各种手机(iOS和Android各个型号)不同手机的分辨率.不同 ...

  6. JMeter接口测试-如何循环使用接口返回的多值?

    前言 在用JMeter做接口测试的时候,经常会遇到这样一种情况:一个接口请求返回了多个值,然后下一个接口想循环使用前一个接口的返回值:第二种情况:只想循环请求前一个接口返回值中的随机不定长度的某一些值 ...

  7. Vue使用v-for显示列表时,数组里的item数据更新,视图中列表不同步更新的解决方法

    由于初始化类型错误导致的不更新,代码是这样的: <!DOCTYPE html> <html lang="en"> <head> <meta ...

  8. 刷题94. Binary Tree Inorder Traversal

    一.题目说明 题目94. Binary Tree Inorder Traversal,给一个二叉树,返回中序遍历序列.题目难度是Medium! 二.我的解答 用递归遍历,学过数据结构的应该都可以实现. ...

  9. 【C#】写文件时如何去掉编码前缀

    我们都知道,文件有不同的编码,例如我们常用的中文编码有:UTF8.GK2312 等. Windows 操作系统中,新建的文件会在起始部分加入几个字符的前缀,来识别编码. 例如,新建文本文件,写入单词 ...

  10. 【React Native错误集】* What went wrong: Execution failed for task ':app:installDebug'.

    错误1:* What went wrong: Execution failed for task ':app:installDebug'. > com.android.builder.testi ...