• CQL操作


    http://docs.datastax.com/en/cql/3.1/pdf/cql31.pdf

    CQL是Cassandra Query Language的缩写,目前作为Cassandra默认并且主要的交互接口。CQL和SQL比较类似,主要的区别是Cassandra不支持join或子查询,除了支持通过Hive进行批处理分析。要说这个Cassandra以前的接口主要是Thrift API,这个没有用过,不做评价。

    Cassandra在CQL语言层面支持多种数据类型[12]

    CQL类型对应Java类型描述
    ascii String ascii字符串
    bigint long 64位整数
    blob ByteBuffer/byte[] 二进制数组
    boolean boolean 布尔
    counter long 计数器,支持原子性的增减,不支持直接赋值
    decimal BigDecimal 高精度小数
    double double 64位浮点数
    float float 32位浮点数
    inet InetAddress ipv4ipv6协议的ip地址
    int int 32位整数
    list List 有序的列表
    map Map 键值对
    set Set 集合
    text String utf-8编码的字符串
    timestamp Date 日期
    uuid UUID UUID类型
    timeuuid UUID 时间相关的UUID
    varchar string text的别名
    varint BigInteger 高精度整型

    cqlsh语法

    cqlsh [options] [host [port]]
    python cqlsh [options] [host [port]] 

    Options

    -C, --color
    Always use color output.
    --debug
    Show additional debugging information.
    --cqlshrc path
    Use an alternative cqlshrc file location, path. (Cassandra 2.1.1)
    -e cql_statement, --execute cql_statement
    Accept and execute a CQL command in Cassandra 2.1 and later. Useful for saving CQL output to a file.
    -f file_name, --file=file_name
    Execute commands from file_name, then exit.
    -h, --help
    Show the online help about these options and exit.
    -k keyspace_name
    Use the given keyspace. Equivalent to issuing a USE keyspace command immediately after starting cqlsh.
    --no-color
    Never use color output.
    -p password
    Authenticate using password. Default = cassandra.
    -t transport_factory_name, --transport=transport_factory_name
    Use the provided Thrift transport factory function.
    -u user_name
    Authenticate as user. Default = cassandra.
    --version
    Show the cqlsh version.

     

    启动CQL命令是cqlsh,我下面的例子是window上的,cassandra版本是2.1.14

    示例:

    #debug
    D:softcassandraapache-cassandra-2.1.14-binin>cqlsh.bat --debug
    Using CQL driver: <module 'cassandra' from 'D:softcassandraapache-cassandra-2.1.14-binin..libcassandra-driver-in
    ternal-only-2.7.2.zipcassandra-driver-2.7.2cassandra\__init__.py'>
    Using connect timeout: 5 seconds
    Connected to Test Cluster at 127.0.0.1:9042.
    [cqlsh 5.0.1 | Cassandra 2.1.14 | CQL spec 3.2.1 | Native protocol v3]
    Use HELP for help.
    WARNING: pyreadline dependency missing.  Install to enable tab completion.
    
    #version
    D:softcassandraapache-cassandra-2.1.14-binin>cqlsh.bat --version
    cqlsh 5.0.1
    #Saving CQL output in a file导出
    D:softcassandraapache-cassandra-2.1.14-binin>cqlsh.bat -e "select * from duansf.users">myoutput.txt

    导出的文件如下:

    D:softcassandraapache-cassandra-2.1.14-binin>cqlsh.bat

    结果:cqlsh Can't detect Python version!

    安装python,我安装的是64位的2.7版本,并配置下环境变量path中增加python的安装根路径。安装好后再执行cqlsh.bat

    D:softcassandraapache-cassandra-2.1.14-binin>cqlsh.bat

    D:softcassandraapache-cassandra-2.1.14-binin>cqlsh.bat
    Connected to Test Cluster at 127.0.0.1:9042.
    [cqlsh 5.0.1 | Cassandra 2.1.14 | CQL spec 3.2.1 | Native protocol v3]
    Use HELP for help.
    WARNING: pyreadline dependency missing.  Install to enable tab completion.

    一、创建keyspace

    作为对照,你可以把keyspace理解成一个SQL数据库实例,当然它们毕竟是不同的:Cassandra的keyspace是用来定义数据是如何在节点间复制的。通常情况下,应该为一个应用程序建立一个keyspace。

    CREATE KEYSPACE IF NOT EXISTS pimin_net
    WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':1};

    上面语句的意思是判断是否存在keyspace,如果不存在则建立keyspace;使用的副本策略是简单策略,复制因子是1。暂时先不管里面深层次的东西,我们先按照简单原则实现。

    二、创建表

    虽然说Cassandra是面向列的分布式数据库,但是它也有表的概念。创建之前先use pimin_net。

    USE pimin_net;
     
    CREATE TABLE users (
    id int,
    user_name varchar,
    PRIMARY KEY (id) );

    这样就建立了一张用户表,为了简单起见,就只有两个字段,看起来和oracle、mysql这些是不是很像?

    三、对表的CRUD

    已经有了一张用户表,我们就向里面插入一些数据,对它进行查询、更新和删除操作。

    INSERT INTO users (id,user_name) VALUES (1,'china');
    INSERT INTO users (id,user_name) VALUES (2,'taiwan');
    SELECT * FROM users;
    结果:
    cqlsh:pimin_net> SELECT * FROM users;
    
     id | user_name
    ----+-----------
    
    (0 rows)
    cqlsh:pimin_net> INSERT INTO users (id,user_name) VALUES (1,'china');
    cqlsh:pimin_net> INSERT INTO users (id,user_name) VALUES (2,'taiwan');
    cqlsh:pimin_net> SELECT * FROM users;
    
     id | user_name
    ----+-----------
      1 |     china
      2 |    taiwan
    
    (2 rows)
    cqlsh:pimin_net>

     

    UPDATE users SET user_name = 'china2014' WHERE id = 1;
    SELECT * FROM users;
    DELETE FROM users WHERE id = 1;
    SELECT * FROM users;

    结果:

    cqlsh:pimin_net> UPDATE users SET user_name = 'china2014' WHERE id = 1;
    cqlsh:pimin_net> SELECT * FROM users;
    
     id | user_name
    ----+-----------
      1 | china2014
      2 |    taiwan
    
    (2 rows)
    cqlsh:pimin_net> DELETE FROM users WHERE id = 1;
    cqlsh:pimin_net> SELECT * FROM users;
    
     id | user_name
    ----+-----------
      2 |    taiwan
    
    (1 rows)
    cqlsh:pimin_net>
     重要:不同于传统的RDBMS,Cassandra不能使用DELETE FROM users;这样的表达式,必须有WHERE条件!

     重要:不同于传统的RDBMS,Cassandra不能使用DELETE FROM users;这样的表达式,必须有WHERE条件!

    示例2:


    cqlsh:usermanager> use duansf

    1.创建keyspace 

    cqlsh:usermanager> create keyspace duansf WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':1};

    创建一个名为duansfkeyspace,副本策略SimpleStrategy,复制因子为1. 

    2.创建Column family 

    cqlsh>use duansf;
    cqlsh:duansf> create columnfamily users(
               key varchar primary key,
               password varchar,
               gender varchar,
               session_token varchar,
               state varchar,
               birth_year bigint);

    创建一个名为userscolumn family 

     ...  KEY varchar PRIMARY KEY,columnfamily下有一个Key

    和5列 

     ...  password varchar, 

    ...  gende rvarchar, 

     ...  session_token varchar, 

    ...  state varchar, 

     ...  birth_year bigint); 

    3.插入和检索Columns 

    cqlsh:duansf> insert into users(key,password) values('jsmith','chadsfl') using ttl 86400;

    向passwod这一列插入数据

    cqlsh:duansf> select * from users where key='jsmith';
    
     key    | birth_year | gender | password | session_token | state
    --------+------------+--------+----------+---------------+-------
     jsmith |       null |   null |  chadsfl |          null |  null
    
    (1 rows)
    cqlsh:duansf>

    向session_token这一列插入数据

    cqlsh:duansf> insert into users(key,session_token) values('jsmith','test') using ttl 86400;
    cqlsh:duansf> select * from users where key='jsmith';
    
     key    | birth_year | gender | password | session_token | state
    --------+------------+--------+----------+---------------+-------
     jsmith |       null |   null |  chadsfl |          test |  null

    3.Column family中增加Column 

    cqlsh:duansf> alter table user add coupon_code varchar;

    注意:其他已经存在的列不会进行更新。

    4. 更改Column的元数据

    cqlsh:duansf> alter table users alter coupon_code type int;
    ConfigurationException: <ErrorMessage code=2300 [Query invalid because of configuration issue] message="Cannot change co
    upon_code from type text to type int: types are incompatible.">

    注意:已经存在的数据不会转成此类型,新插入的数据才是该类型的。

    5.使用TTL属性设置列的到期时间 

    cqlsh:duansf> update users using ttl 432000 set password='asldkjsfsdf' where key = 'jsmith';

    更新密码列的到期时间为5天。

    6.删除列元数据 

    cqlsh:duansf> alter table users drop coupon_code;

    7.索引Column 

    cqlsh:duansf> create index state_key on users(state);
    cqlsh:duansf> create index birth_year_key on users(birth_year);

    8.删除列或者行 

    cqlsh:duansf> delete session_token from users where key='jsmith';  //删除session_token列
    cqlsh:duansf> select * from users;
    
     key    | birth_year | gender | password    | session_token | state
    --------+------------+--------+-------------+---------------+-------
     jsmith |       null |   null | asldkjsfsdf |          null |  null
    
    (1 rows)
    cqlsh:duansf> delete from users where key='jsmith';  //删除key=jsmith的行
    cqlsh:duansf> select * from users;
    
     key | birth_year | gender | password | session_token | state
    -----+------------+--------+----------+---------------+-------
    
    (0 rows)
    cqlsh:duansf>

    9. 删除columnfamily和keyspace 

    cqlsh:duansf> drop columnfamily users;
    cqlsh:duansf> insert into users(key,password) values('jsmith','chadsfl') using ttl 86400;
    InvalidRequest: code=2200 [Invalid query] message="unconfigured columnfamily users"
    cqlsh:duansf>

    删除keyspace

    cqlsh:duansf> drop keyspace duansf;
    cqlsh:duansf> use duansf;
    InvalidRequest: code=2200 [Invalid query] message="Keyspace 'duansf' does not exist"
    cqlsh:duansf>

    10.查看结构信息

    cqlsh:usermanager> desc users;
    
    CREATE TABLE usermanager.users (
        key blob PRIMARY KEY,
        age text,
        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'}
        AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
        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 = '99.0PERCENTILE';

     

     

     

     

  • 相关阅读:
    3.约束及修改数据表
    RSA总结
    消息队列面试官爱问的问题(一)
    Maven模块化开发
    系统初始化脚本和检查初始化结果脚本(centos7)
    kubectl 命令自动补全
    Kubernetes1.13.1部署Kuberneted-dashboard v1.10.1
    python实现连接MySQL、Redis并获取数据
    shell 脚本实现退点输出
    理论经典:TCP协议的3次握手与4次挥手过程详解
  • 原文地址:https://www.cnblogs.com/duanxz/p/5507013.html
Copyright © 2020-2023  润新知