准备

按照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. HDU 6602 Longest Subarray (线段树)

    题意: 1e5的数组,c(1e5)种数字求最长的子串,使得其中每个出现的数字出现的次数为0次或者大于k次 思路: 枚举右端点i,维护当前右端点时,每个左端点的可行元素数量,当且仅当可行元素为c时更新答 ...

  2. 小程序云开发--内容安全审查API云调用

    云调用 云调用是小程序·云开发提供的在云函数中调用微信开放接口的能力,需要在云函数中通过 wx-server-sdk 使用. 接口方法 openapi.security.msgSecCheck 需在 ...

  3. Go语言实现:【剑指offer】矩阵覆盖

    该题目来源于牛客网<剑指offer>专题. 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 先放21,则f(n ...

  4. 快速幂——while理解&&[P1965] 转圈游戏

    快速幂--while理解 \[a^k\] 把k转成2进制 \[k=2^n*p[n]+2^(n-1)*p[n-1]+...+2^1*p[1]+2^0*p[0]\] \[a^k=a^(2^n*p[n]+2 ...

  5. [Python-memcached]Python操作memcached

    安装python-memchached插件 pip install python-memcached Collecting python-memcached Downloading python_me ...

  6. PBFT 算法 java实现(下)

    PBFT 算法的java实现(下) 在上一篇博客中(如果没有看上一篇博客建议去看上一篇博客),我们介绍了使用Java实现PBFT算法中节点的加入,view的同步等操作.在这篇博客中,我将介绍PBFT算 ...

  7. 使用Java, AppleScript对晓黑板进行自动打卡

    使用Java, AppleScript对晓黑板进行自动打卡 由于我们学校要求每天7点起床打卡,但是实在做不到,遂写了这个脚本. 绪论 由于晓黑板不支持网页版,只能使用App进行打卡,所以我使用网易的安 ...

  8. React之虚拟DOM中的Diff算法

    一.React中的setState ( 异步函数,异步获取数据 ) 若操作的时间间隔短,它可以将多个setState结合成一个setState,减少虚拟DOM的比对次数,提高性能 二.同层虚拟DOM对 ...

  9. axios中get请求的params参数中带数组的处理方法

    axios中get请求的params参数中带数组时导致向后台传参失败报错:from origin 'http://localhost:8080' has been blocked by CORS po ...

  10. Vue-20190623点滴

    Vue-20190623点滴 推荐黄奕同学vue的学习方式和过程. https://juejin.im/post/5b18d2d7f265da6e410e0e20 ♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣ ...