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学习手册 第五版》 -第5章 数值类型
本章是承接第四章整体说明之后,将对”数值类型“展开详细的说明 数值类型这一章主要通过一下几个内容来讲解: 1.数值类型有哪些? 2.表达式运算符:有哪些?有什么规范? 3.数值的显示格式 接下来,从第 ...
- LeetCode 127. Word Ladder 单词接龙(C++/Java)
题目: Given two words (beginWord and endWord), and a dictionary's word list, find the length of shorte ...
- python学习(9)字典的基本应用
字典是一种通过名字或者关键字引用的得数据结构,其键可以是数字.字符串.元组,这种结构类型也称之为映射.字典类型是Python中唯一內建的映射类型.字典可以理解为列表的升级版. dict是无序的 key ...
- 给 iTerm 终端设置代理
本文介绍如何为自己的终端设置代理,从而实现在命令行中访问Google. 1. 背景 当你使用SS FQ时,大部分浏览器都可以成功访问Google,但是在命令行下执行curl https://www.g ...
- web测试和app测试
web测试是b/s结构,app是c/s结构,因此会有很多测试点需要注意: 1.兼容性:web测试需要考虑多个浏览器内核测试,app主要是各种手机(iOS和Android各个型号)不同手机的分辨率.不同 ...
- JMeter接口测试-如何循环使用接口返回的多值?
前言 在用JMeter做接口测试的时候,经常会遇到这样一种情况:一个接口请求返回了多个值,然后下一个接口想循环使用前一个接口的返回值:第二种情况:只想循环请求前一个接口返回值中的随机不定长度的某一些值 ...
- Vue使用v-for显示列表时,数组里的item数据更新,视图中列表不同步更新的解决方法
由于初始化类型错误导致的不更新,代码是这样的: <!DOCTYPE html> <html lang="en"> <head> <meta ...
- 刷题94. Binary Tree Inorder Traversal
一.题目说明 题目94. Binary Tree Inorder Traversal,给一个二叉树,返回中序遍历序列.题目难度是Medium! 二.我的解答 用递归遍历,学过数据结构的应该都可以实现. ...
- 【C#】写文件时如何去掉编码前缀
我们都知道,文件有不同的编码,例如我们常用的中文编码有:UTF8.GK2312 等. Windows 操作系统中,新建的文件会在起始部分加入几个字符的前缀,来识别编码. 例如,新建文本文件,写入单词 ...
- 【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 ...