Cassandra学习&命令行实践
准备
按照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可以:
- 向表中添加新列(通过ADD指令)。请注意,无法更改表的主键,因此新添加的列将不会成为主键的一部分。
- 从表中删除列。这会丢弃列及其所有内容。
- 更改一些表选项(通过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 |
true 或false |
counter |
integer |
计数器列(64位有符号值) |
date |
integer , string |
日期(没有相应的时间值) |
decimal |
integer , float |
十进制可变精度 |
double |
integer float |
64位IEEE-754浮点 |
duration |
duration |
持续时间(纳秒精度) |
float |
integer , float |
32位IEEE-754浮点 |
inet |
string |
IP地址,IPv4(4字节长)或IPv6(16字节长) |
int |
integer |
32位无符号整数 |
smallint |
integer |
16位有符号整数 |
text |
string |
UTF8编码的字符串 |
time |
integer , string |
具有纳秒精度的时间(没有相应的日期值) |
timestamp |
integer , string |
时间戳(日期和时间),精度为毫秒 |
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位整数)
- 支持的单位:
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 纳)
- 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);
持续时间列不能作为主键。这是由于无法精确确认持续时间。如果没有日期上下文,实际上不可能知道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学习&命令行实践的更多相关文章
- dos命令行实践
本篇体验使用dos命令行窗口实现各种操作. □ 打开dos命令行窗口 →点击电脑左下角"开始"按钮→点击"运行"→输入"cmd",按回车,来 ...
- MongoDB学习-->命令行增删改查&JAVA驱动操作Mongodb
MongoDB 是一个基于分布式文件存储的数据库. 由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关 ...
- Linux基础学习-命令行与图形界面切换
命令行模式和图形界面模式切换 打开文件 vim /etc/inittab # systemd uses 'targets' instead of runlevels. By default, ther ...
- java 学习 命令行运行java程序
之前学习python,由于公司需要.现在不得已转java. 1.命令运行java程序. 程序名字:input.java code: /** * Created by liumeide on 2017/ ...
- Windows命令行(DOS命令)教程 -1 (转载) http://www.pconline.com.cn/pcedu/rookie/basic/10111/15325.html
一.命令行简介 命令行就是在Windows操作系统中打开DOS窗口,以字符串的形式执行Windows管理程序. 在这里,先解释什么是DOS? DOS--Disk Operation System 磁盘 ...
- ubuntu命令行添加拥有管理员权限新用户
最近买了个服务器,只有一个root用户,天天登录挺不方便的,所以想要新建用户;之前在本地都是用界面话新建的用户,这次记录一下学习命令行新建用户的过程: 第一步 : # sudo adduser zhq ...
- Windows命令行(DOS命令)教程
一.命令行简介 命令行就是在Windows操作系统中打开DOS窗口,以字符串的形式执行Windows管理程序. 在这里,先解释什么是DOS? DOS——Disk Operation System 磁盘 ...
- 学习 Linux,101: Linux 命令行
概述 本教程将简要介绍 bash shell 的一些主要特性,涵盖以下主题: 使用命令行与 shell 和命令交互 使用有效的命令和命令序列 定义.修改.引用和导出环境变量 访问命令历史和编辑工具 调 ...
- 由SecureCRT命令行快捷键谈学习思想
由学习linux SecureCRT命令行常用快捷键开始谈起! 1)老男孩说,抓重点(重点非难点) 任何一个领域.学科,任何一个职位.工作,都有学不完的知识,优秀的学生总能抓住重点去学习,如果泛泛的去 ...
随机推荐
- 《Python学习手册 第五版》 -第11章 赋值、表达式和打印
上一章对Python的语句和语法已经进行了基本的说明,接下来就是每个章节的详细说明,本章的主要内容就是标题中涵盖的三点:赋值语句.表达式语句.打印语句 本章重点内容如下: 1.赋值语句 1)赋值语句的 ...
- SpringProfile轻松切换多环境配置文件
在项目开发的过程中,我们难免会遇到开发.测试.生产等环境的切换,而各个环境的配置肯定是不同的.传统的办法是在项目打包的时候修改配置文件.但人为做的事情难免产生意外.Spring 为我们提供了一种多环境 ...
- Hapi+MySql项目实战数据库操作(四)
数据库访问 下面以Node的ORM框架Sequelize来操作数据库,Mysql为例. 配置数据库连接信息config/db_config.js: //db_config.js module.expo ...
- Springboot 自动装配置
Spring Boot 相对于传统的Spring引入了自动配置功能,简化了项目中繁琐的配置,让开发者利用起来更加的简便.快捷.比如内嵌的tomcat容器等,这些都属于Spring Boot自动配置的范 ...
- [Redis-CentOS7]Redis设置连接密码(九)
设置Redis密码 修改/etc/redis.conf 一定要强密码redis为内存存储 抗暴力破解强 requirepass password 重启服务 systemctl restart redi ...
- IO流之File对象
File类: 用来将文件或者文件夹封装成对象 方便对文件与文件夹的属性等信息进行操作(因为流只能操作文件中的数据) File对象可以作为参考传递给流的构造函数 上下级文件夹之间使用分隔符分开: 在Wi ...
- C# 小游戏-拼图魔方【Game Puzzle】
工作闲暇之余去逛了逛CodeProject,刚好现有项目主要用到就是winform,浏览了下照片,找到上周带着蛋挞打疫苗回家的照片,于是新生一记,如何把这些图片玩起来~ 80后应该都有印象,小时候有种 ...
- Shiro知识初探(更新中)
Shiro 是当下常见的安全框架,主要用于用户验证和授权操作. RBAC 是当下权限系统的设计基础,同时有两种解释:一: Role-Based Access Control,基于角色的访问控制即,你要 ...
- 百度大脑EasyEdge端模型生成部署攻略
EasyEdge是百度基于Paddle Mobile研发的端计算模型生成平台,能够帮助深度学习开发者将自建模型快速部署到设备端.只需上传模型,最快2分种即可生成端计算模型并获取SDK.本文介绍Easy ...
- 学习 Vim 命令总结
学习 Vim 命令总结 可以使用 vscode-vim 扩展,但是要注意一些ctrl+字母的快捷键会无效,必须去掉冲突的快捷键 esc 回到普通模式 i 普通模式进入插入模式 : 进入命令模式 :wa ...