使用cqlsh访问cassandra
可以在本地或ECS上安装Cassandra,通过cqlsh工具访问云数据库Cassandra。
下载和安装Cassandra
到Apache Cassandra 的官方网站下载最新版本的 Cassandra然后解压,即可完成安装。
$ wget http://mirror.bit.edu.cn/apache/cassandra/3.11.4/apache-cassandra-3.11.4-bin.tar.gz
$ tar -zxf apache-cassandra-3.11.4-bin.tar.gz
$ cd apache-cassandra-3.11.4
启动cqlsh
在云数据cassandra的控制台查看cassandra的地址和端口,然后使用如下命令连接:
bin/cqlsh $host $port -u $username -p $password
如果您需要经常连接到特定节点,您可以将节点的地址和端口信息保存到环境变量 $CQLSH_HOST 和 $CQLSH_PORT 中。更多关于 cqlsh 命令支持的参数可以使用 bin/cqlsh -help。
基本的 cqlsh 命令
cqlsh 支持很多操作 Cassandra 的基本命令,您可以使用 HELP 或 ? 命令查看所有支持的命令:
cqlsh> HELP
Documented shell commands:
===========================
CAPTURE CLS COPY DESCRIBE EXPAND LOGIN SERIAL SOURCE UNICODE
CLEAR CONSISTENCY DESC EXIT HELP PAGING SHOW TRACING
CQL help topics:
================
AGGREGATES CREATE_KEYSPACE DROP_TRIGGER TEXT
ALTER_KEYSPACE CREATE_MATERIALIZED_VIEW DROP_TYPE TIME
ALTER_MATERIALIZED_VIEW CREATE_ROLE DROP_USER TIMESTAMP
ALTER_TABLE CREATE_TABLE FUNCTIONS TRUNCATE
ALTER_TYPE CREATE_TRIGGER GRANT TYPES
ALTER_USER CREATE_TYPE INSERT UPDATE
APPLY CREATE_USER INSERT_JSON USE
ASCII DATE INT UUID
BATCH DELETE JSON
BEGIN DROP_AGGREGATE KEYWORDS
BLOB DROP_COLUMNFAMILY LIST_PERMISSIONS
BOOLEAN DROP_FUNCTION LIST_ROLES
COUNTER DROP_INDEX LIST_USERS
CREATE_AGGREGATE DROP_KEYSPACE PERMISSIONS
CREATE_COLUMNFAMILY DROP_MATERIALIZED_VIEW REVOKE
CREATE_FUNCTION DROP_ROLE SELECT
CREATE_INDEX DROP_TABLE SELECT_JSON
如果需要查看特定命令的帮助,可以使用 HELP 。需要注意的是,很多 cqlsh 命令并不接收相关的参数,当您使用这些命令时,其输出为当前的设置,比如 CONSISTENCY, EXPAND 和 PAGING 命令,如下:
cqlsh> CONSISTENCY
Current consistency level is ONE.
cqlsh> EXPAND
Expanded output is currently disabled. Use EXPAND ON to enable.
cqlsh> PAGING
Query paging is currently enabled. Use PAGING OFF to disable
Page size: 100
在 cqlsh 里面查看环境变量
您可以使用 DESCRIBE 命令,来查看一些集群的一些环境变量的值,例如:
cqlsh> DESCRIBE CLUSTER;
Cluster: Test Cluster
Partitioner: Murmur3Partitioner
DESCRIBE CLUSTER 显示了集群的名字以及采用的 Partitioner ,Cassandra 1.2 版本开始默认为 Murmur3Partitioner,其他可选的 Partitioner 有 RandomPartitioner(Cassandra 1.2 版本之前默认的 Partitioner)、OrderPreservingPartitioner 以及 ByteOrderedPartitioner 等。
如果您需要查看集群里面可用的 keyspaces,可以使用下面命令:
cqlsh> DESCRIBE KEYSPACES;
system_traces system_schema system_auth system system_distributed上面命令将系统自带的 keyspaces 都显示出来了,如果您创建了keyspaces,也会在这里显示。
可以使用下面命令查看 cqlsh、Cassandra 以及 protocol 的版本:
cqlsh> SHOW VERSION;
[cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]
通过 cqlsh 创建 keyspace
Cassandra中的keyspace和关系型数据库中的database概念比较类似,一个 keyspace 可以包含一个或多个 tables 或 column families。当您启动 cqlsh 时没有指定 keyspace,那么命令提示符为 cqlsh>,您可以使用 CREATE KEYSPACE 命令来创建 keyspace,具体如下:
cqlsh> CREATE KEYSPACE test_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
cqlsh>
上面命令创建了名为 test_keyspace 的 keyspace;并且采用 SimpleStrategy 进行副本复制。由于当前的测试集群只有单个节点,所以设置副本因子(replication factor)为 1。如果是生产环境,请勿将副本因子设置为 1,建议将副本因子设置为 3。
创建完 keyspace 之后,您可以使用 DESCRIBE KEYSPACE 命令来查看这个 keyspace:
cqlsh> DESCRIBE KEYSPACE test_keyspace;
CREATE KEYSPACE test_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;
现在您可以使用 USE 命令来切换到这个 keyspace :
cqlsh> USE test_keyspace;
cqlsh:test_keyspace>
通过 cqlsh 创建表
创建表:
cqlsh> use test_keyspace;
cqlsh:test_keyspace> CREATE TABLE test_user (first_name text , last_name text, PRIMARY KEY (first_name)) ;
上述命令表示在 test_keyspace 下面创建了一张名为 test_user 的表。其中包含了 first_name 和 last_name 两个字段,类型都是 text,并且 first_name 是这张表的 PRIMARY KEY。当然,您也可以通过下述命令在 test_keyspace 里面建表:
cqlsh> CREATE TABLE test_keyspace.test_user(first_name text , last_name text, PRIMARY KEY (first_name)) ;
查看建表语句:
cqlsh:test_keyspace> DESCRIBE TABLE test_user;
CREATE TABLE test_keyspace.test_user (
first_name text PRIMARY KEY,
last_name text
) WITH bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99PERCENTILE';
cqlsh:test_keyspace>
DESCRIBE TABLE 命令会将建表语句以格式化的形式显示出来,除了您制定的设置,还包含了许多默认的设置。
通过 cqlsh 读写数据
往表里面插入一些数据:
cqlsh:test_keyspace> INSERT INTO test_user (first_name, last_name) VALUES ('test', 'Hadoop');
cqlsh:test_keyspace> INSERT INTO test_user (first_name, last_name) VALUES ('Zhang', 'San');
cqlsh:test_keyspace> INSERT INTO test_user (first_name) VALUES ('Wu');
上述语句表示往 test_user 表中插入三条数据,其中最后一条数据只指定了 key,last_name 没有值。
您可以使用 SELECT COUNT 语句查看数据是否插入成功。
cqlsh:test_keyspace> SELECT COUNT(*) FROM test_user;
count
-------
3
(1 rows)
Warnings :
Aggregation query used without partition key
通过命令的输出查看已成功插入数据。您还可以使用下述命令查询这条数据:
cqlsh:test_keyspace> SELECT * FROM test_user;
first_name | last_name
------------+-----------
test | Hadoop
Wu | null
Zhang | San
(3 rows)
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name='test';
first_name | last_name
------------+-----------
test | Hadoop
(1 rows)
可以看出,由于first_name 为 Wu 对应的 last_name 没有数据,这里直接显示 null。在 Cassandra 中,null代表对应的列没有数据,在底层存储是不占用空间的,而在常见的关系型数据库里面是占一定空间的。
删除列或行
使用 DELETE 命令删除一些列。例如,删除 last_name 列:
cqlsh:test_keyspace> DELETE last_name FROM test_user WHERE first_name='test';
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name='test';
first_name | last_name
------------+-----------
test | null
(1 rows)
可以看出 last_name 列已经成功被删除。
使用 DELETE 命令删除一整行的数据:
cqlsh:test_keyspace> DELETE FROM test_user WHERE first_name='test';
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name='test';
first_name | last_name
------------+-----------
(0 rows)
cqlsh:test_keyspace>
可以看到 key 为 test 的数据已经成功被删除。
insert/update 相当于 upsert如果您插入数据对应的 key 在 Cassandra 已经存在了,这时候 Cassandra 不会在原来数据位置上修改数据,而是会新写入一份数据,旧的数据会被 Cassandra 删除。
cqlsh:test_keyspace> INSERT INTO test_user (first_name, last_name) VALUES ('Wu', 'Shi');
cqlsh:test_keyspace> SELECT * FROM test_user;
first_name | last_name
------------+-----------
Wu | Shi
Zhang | San
(2 rows)
可以看出,key 为 Wu 的数据对应的 last_name 已经有值了。
如果使用UPDATE命令更新不存在的数据,Cassandra 会插入新的数据,例如:
cqlsh:test_keyspace> SELECT * FROM test_user;
first_name | last_name
------------+-----------
Wu | Shi
Zhang | San
(2 rows)
cqlsh:test_keyspace> UPDATE test_user SET last_name = 'Si' WHERE first_name = 'Li';
cqlsh:test_keyspace> SELECT * FROM test_user;
first_name | last_name
------------+-----------
Wu | Shi
Zhang | San
Li | Si
(3 rows)
cqlsh:test_keyspace>
可以看出,key 为 Li 的数据被插入到表中了,而更新之前该数据不存在。
清空或删除表
如果您需要清空一张表,您可以使用 TRUNCATE 命令或 DROP TABLE 命令,例如:
cqlsh:test_keyspace> TRUNCATE test_user;
cqlsh:test_keyspace> DROP TABLE test_user;
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论