zoukankan      html  css  js  c++  java
  • CQL语句

    CQL中默认忽略大小写,若需要大小写敏感,可使用双引号将对象包起来,引用的时候也要用双引号包住

    tips: 使用CQL需要预装Python环境

    Ⅰ、基本知识点

    1.1 数据类型

    这边和关系型数据库相近的就不列出来了,只列出Cassandra特色的,重要的

    CQL类型 常用类型 说明
    list(T) n/a 有序集合,T可以是任意分集合CQL数据类型,例如,int,text等
    map(K,V) n/a 哈希表,K和V可以是任意非集合CQL数据类型,例如,int,text等
    set(T) n/a 无序集合,T可以是任意分集合CQL数据类型,例如,int,text等

    1.2 命名规则

    字母或数字开头,满足正则表达式[a-zA-Z0-9_]*

    1.3 注释

    • 单行注释://或者-
    • 多行注释:/** xxx **/

    1.4 关键字和保留字

    定义column和keyspace时候不能使用关键字和保留字,一定要用可以使用双引号包起来,但不建议这么用

    具体的关键字和保留字见官网表格

    Ⅱ、数据定义语句

    2.1 KeySpace

    语法:create keyspace (if not exists)? <identifier> with <properties>;
    注意:identifier长度需要小于等于32,默认大小写不敏感,可以使用双引号让它对大小写敏感
    create keyspace test 
    with replication = {'class':'SimpleStrategy', 'replication_factor': 3} 
    and durable_writes = true;
    
    查看当前所有KeySpace
    desc keyspaces;
    
    查看KeySpace的创建语句
    desc <identifier>;
    
    修改KeySpace
    alter keyspace <identifier> with <properties>;
    
    切换KeySpace
    use <identifier>;
    
    删除名为teset的KeySpace
    drop keyspace (if exsits)? <identifier>;
    

    create keyspace的两个属性

    • replication

    复制策略(SimpleStrategy(单一数据中心,测试用),NetworkTopologyStrategy(默认,强烈推荐,方便数据扩展),OldNetworkTopologyStrategy(官方已弃用))
    这个属性是强制的,至少包括class属性,其他属性依class改变,replication决定了多节点的情况下,新写入的数据如何在节点之间复制保存
    replication_factor属性,他是SimpleStrategy这种策略的一个属性,叫做副本因子,决定了每个row有多少个副本,这个值不可以超过节点数

    • durable_writes

    是否使用commit log持久化写入,默认为true

    2.2 Column Family

    语法:create (table|columnfamily) (if not exists)? <tablename>
    	'('<column-definition>(','<column-definiton>)*')'
    	(with<option>(and <option>)*)?;
    
    一般把第一个column作为primary key,当作行的标识,也就是row key,也可以指定多个列组成复合键
    
    create table timeline(
    	userid uuid,
    	posted_month int,
    	poster_time uuid,
    	body text,
    	poster_by text,
    	primary key(userid, posted_month, posted_time)
    )with compaction = {'class':'LeveldCompactionStrategy'};
    
    查看column family的创建语句
    desc <tablename>;
    
    修改column family
    alter (table|columnfamily)<tablename><instruction>;
    
    alter table table_name
    add columnname varchar;
    
    alter table table_name
    drop columnname;
    
    alter table table_name
    with comment = 'xxx'
    and read_repair_chance = 0.2;
    
    alter table table_name
    rename old_column_name to new_column_name;
    
    下面这种修改column数据类型的语法新版本已不再支持
    alter table table_name
    alter column_name type uuid;
    
    删除column family
    drop table (if exists)? <tablename>;
    
    清空column family
    truncate <tablename>;
    

    column family的属性

    接在with后面,了解即可

    属性 说明
    commnet 对column family的描述信息
    bloom_filter_fp_chance 指定bloom_filter算法的容错率,一般设置为0.01或者0.1
    caching 设置缓存方案
    compactioin 数据压缩策略
    compression 数据压缩算法
    default_time_to_live 存活时间,单位是秒,默认0(永久存活)
    memtable_flush_period_in_ms 内存数据刷新时间间隔
    read_repair_chance 0-1之间的数值,与数据一致性有关

    注意

    • create table也可以写成create columnfamily,但建议使用前者
    • 可使用if not exists规避错误
    • 名字和keyspace一样不能超过32个字符
    • 可使用create table keyspace.tablename在指定keyspace中创建,不指定则代表在当前keyspace创建

    2.3 create index

    语法:create (custom)? index (if not exists)? (<indexname>)?
    	on <tablename> '('<index-identifier>')'
    	(using<string>(with options=<map-literal>)?)?;
    	
    create index idx_name on columnfamily_name(column_name);
    create index on columnfamily_name(column_name); 给一个默认idx_name
    create index on columnfamily_name(keys(column_name)); 针对map类型column的键值进行索引
    create custom index on columnfamily_name(column_name) using 'path.to.the.IndexClass';
    create custom index on columnfamily_name(column_name) using 'path.to.the.IndexClass' with options = {'storage':'/mnt/ssd/indexes'};
    
    删除index
    drop index(if exsists)?(<keyspace>'.')?<identifier>;
    

    2.4 create type

    语法:create type (if not exists)? <typename>
    	'('<field-definition>(',' <field-definiton>)*')';
    	
    修改type
    alter type <typename> <instruction>;
    
    alter type type_name alter zip type varint;
    alter type type_name add xxx text;
    alter type type_name rename old_name to new_name and old2_name to new2_name;
    
    查看当前所有自定义type
    desc types;
    
    查看指定type信息
    desc type type_name;
    
    删除type
    drop type (if exsists)? <typename>;
    注意:如果type还在使用,drop会报错
    

    Ⅲ、数据操作语句

    3.1 增删改

    INSERT
    insert into <tablename>
    '('<identifier>(',' <identifier>)*')'
    values '('<term-or-literal>(',' <term-or-literal>)*')'
    (if not exists)?
    (using <option> (AND <option>)*)?
    
    using ttl 86400	表示这行数据过了86400秒自动删除
    cassandra中没有duplicate,插入数据的主键已经存在,则会将老数据直接覆盖
    
    UPDATE
    update <tablename>
    (using <option> (AND <option>*))?
    set <assignment> (',' <assignment>)*
    where <where-clause>
    (if <condition> (AND condition)*)?
    
    update的using语句是放在set之前,不在最后,这点要和insert区别
    
    DELETE
    delete (<selection> (',' <selection>)*)?
    from <tablename>
    (using timestamp <integer>)?
    where <where-clause>
    (if (exists|(<condition> (AND <condition>)*)))?
    
    delete from column_family_name where column_name = xxx;
    delete column_name from column_family_name where column_name = xxx;
    
    BATCH 批量操作,要么全部成功,要么全部失败
    begin (unlogged|counter) batch
    (using <option> (and <options>)*)?
    <modification_statement> (';' <modification_statement>)* 
    apply batch
    

    3.2 查询

    语法:
    select <select-clause>
    from <tablename>
    (where <where-clause>)?
    (order by <order-by>)?
    (limit <integer>)?
    (allow filtering)?
    
    select column_name from column_family_name where column_name in (xxx,xxx,xxx);
    select column_name as xxx from column_family_name;
    select column_name from column_family_name where column_name = 'xxx' and column_name > 'xxx';
    select count(*) from column_family_name;
    select count(*) as xxx from column_family_name;
    

    select注意点

    • 可以使用count计算函数,目前唯一一个函数
    • 可以使用limit关键字限制返回行数
    • where中出现的column必须是primary key中的第一个列,或者是建立了索引的column,若两者都不满足,则须在结尾加上allow filtering关键字
    • 通常primary key中指定的第一个column叫parition key,它对数据在节点上的分布起关键作用
    • where中对于类型为set/list的column可以使用contains关键字,对于类型为map的column可以使用contains key关键字,对于partition key可以用in关键字
    • 集合类型不能用作primary key,但是可以create index
  • 相关阅读:
    解决了一个java服务线程退出的问题
    怎么实现软件注册码功能?
    数据挖掘学习笔记
    IP网段拆分出多个IP
    Java list分割批量处理
    pyecharts import Bar后找不到Bar,或报错AttributeError: 'str' object has no attribute 'get'
    SqlServer 按日、周、月、季、年统计SQL语句
    Redis知识点
    js对类似Excel表头数据排序:A1,A10,A11,B1
    Elasticsearch面试题
  • 原文地址:https://www.cnblogs.com/---wunian/p/10763047.html
Copyright © 2011-2022 走看看