• Cassandra docker 使用记录


    环境介绍:

    docker 安装 cassandra 3.11.1 , 然后进入docker 的终端,输入 > cqlsh , 即可使用Cassandra了,详细介绍如下:

    查看表空间describe keyspaces;

    查看已有表:describe tables;

    查看表结构:describe table table_name;

    key spaces

    describe keyspaces; 
    describe keyspace {keyspace}; 
    use {keyspace}; 
    select * from system.schema_keyspaces;

    Column Families

    describe tables; 
    describe columnfamily {table}; 
    select * from system.schema_columnfamilies;

    describe tables table;



    参考:datastax documention : CQL for cassandra 2.x
    Cassandra 提供collection 用于处理某些特殊类型的需求,如单用户记录的多个邮件地址,此处翻译为 集合类型。
    Cassandra 提供了三种集合类型,分别是Set,List,Map。

    基本概念与操作

    一、Set

    Set存储了一组类型相同的不重复元素,当被查询时会返回排好序的结果,但是内部构成是无序的值,应该是在查询时对结果进行了排序。
    使用示例:

    1.创建带有Set类型列的表

    CREATE TABLE users (
      user_id text PRIMARY KEY,
      first_name text,
      last_name text,
      emails set<text>
    );

    2.插入数据

    INSERT INTO users (user_id, first_name, last_name, emails) VALUES('frodo', 'Frodo', 'Baggins', {'f@baggins.com', 'baggins@gmail.com'});

    3.使用UPDATE命令和‘+’操作符向set列添加一个元素。

    UPDATE users SET emails = emails + {'fb@friendsofmordor.org'} WHERE user_id = 'frodo';

    4.查询

    SELECT user_id, emails FROM users WHERE user_id = 'frodo';
    结果如下
     user_id | emails
    ---------+-------------------------------------------------------------------
     frodo   | {"baggins@caramail.com","f@baggins.com","fb@friendsofmordor.org"}
    注: Cassandra   会按照set内数据类型进行排序返回 查询结果,如果希望按照插入序返回结果,请使用list.

    5.删除一个元素

    UPDATE users SET emails = emails - {'fb@friendsofmordor.org'} WHERE user_id = 'frodo';

    6.删除所有元素

    可以使用UPDATA或DELETE命令
    UPDATE users SET emails = {} WHERE user_id = 'frodo'; DELETE emails FROM users WHERE user_id = 'frodo';
    一般来说,Set,list和Map要求最少有一个元素,否则Cassandra无法把其同一个空值区分。

    二、List

    list查询时会按照元素在list中的index顺序来返回结果,可以存储多个重复的值。
    操作示例:

    1.向users表添加一个list列

    ALTER TABLE users ADD top_places list<text>;

    2.使用UPDATA命令向list插入值。

    UPDATE users SET top_places = [ 'rivendell', 'rohan' ] WHERE user_id = 'frodo';

    3.在list前面插入值

    UPDATE users SET top_places = [ 'the shire' ] + top_places WHERE user_id = 'frodo';

    4.在list后面插入值

    UPDATE users SET top_places = top_places + [ 'mordor' ] WHERE user_id = 'frodo';

    5.使用列表索引设置特定位置的值

    UPDATE users SET top_places[2] = 'riddermark' WHERE user_id = 'frodo';
    原先的值会被覆盖,这种操作会读入整个list,效率比3,4低

    6.使用DELETE命令和索引删除某个特定位置的值。

    DELETE top_places[3] FROM users WHERE user_id = 'frodo';

    7.使用UPDATE命令和‘-’移除list中所有的特定值。

    UPDATE users SET top_places = top_places - ['riddermark'] WHERE user_id = 'frodo';
    6和7相比,推荐使用7,因为6操作是非线程安全的,如果在操作时其它线程在前面添加了一个元素,会导致移除错误的元素。使用7不会有此问题。

    三、Map

    Map提供了名字到值的映射,Map可以存储时间戳相关的信息,每一个元素在内部作为一列存储,可以修改,替换,删除和查询,拥有一个单独的TTL值。
    操作示例:

    1.添加Map列

    ALTER TABLE users ADD todo map<timestamp, text>;

    2.使用Insert或Update命令,设置或更新数据。

    UPDATE users SET todo =
      { '2012-9-24' : 'enter mordor', '2014-10-2 12:00' : 'throw ring into mount doom' } WHERE user_id = 'frodo';

    3.使用UPDATE命令设置指定元素的value

    UPDATE users SET todo['2014-10-2 12:00'] = 'throw my precious into mount doom' WHERE user_id = 'frodo';

    4.使用INSERT命令设置指定行的map数据。

    INSERT INTO users (user_id, todo) VALUES ('frodo', { '2013-9-22 12:01' : 'birthday wishes to Bilbo', '2013-10-1 18:00': 'Check into Inn of Pracing Pony'}) ;
    旧的MAP数据会被覆盖。
        在 Cassandra  2.1.1后,可以使用如下语法增加map元素。如果key已存在,value会被覆盖,不存在则插入。
    UPDATE users SET todo = todo + { '2013-9-22 12:01' : 'birthday wishes to Bilbo', '2013-10-1 18:00': 'Check into Inn of Pracing Pony'} WHERE user_id='frodo';

    5.删除元素。

    DELETE todo['2013-9-22 12:01'] FROM users WHERE user_id = 'frodo';
    
    
    UPDATE users SET todo=todo - {'2013-9-22 12:01','2013-10-01 18:00:00-0700'} WHERE user_id='frodo';

    6.查询元素。

    SELECT user_id, todo FROM users WHERE user_id = 'frodo';
    map输出顺序取决于map类型。

    7.使用TTL

    UPDATE users USING TTL <computed_ttl> SET todo['2012-10-1'] = 'find water' WHERE user_id = 'frodo';
    INSERT INTO users (user_name, password) VALUES ('cbrown', 'ch@ngem4a') USING TTL 86400;
    在设定的computed_ttl数值秒后,数据会自动删除。
     
    使用集合类型要注意:
    1.集合的每一项最大是64K。
    2.保持集合内的数据不要太大,免得Cassandra 查询延时过长,只因Cassandra 查询时会读出整个集合内的数据,集合在内部不会进行分页,集合的目的是存储小量数据。
    3.不要向集合插入大于64K的数据,否则只有查询到前64K数据,其它部分会丢失。
     

    高级应用

    一、给集合添加索引

    从 Cassandra  2.1起,可以给集合添加索引。
    示例:
    CREATE INDEX ON users(emails); CREATE INDEX mymapvalues ON users(todo);
    索引名字可以不指定。
    上面第二个语句使用Map列的列名在其values上创建了索引,也可以在其keys上创建索引,如下:
    DROP INDEX mymapvalues; CREATE INDEX mymapkeys ON playlists (KEYS(todo));
     

    二、过滤集合中的数据

    假设已经给集合添加了索引,就可以使用where子句的CONTAINS条件按照给定的值进行过滤。
    SELECT user_id FROM users WHERE emails CONTAINS 'baggins@gmail.com';
    注意给定的值是集合项的一项,短于集合某项不会进行模糊匹配。
    对于MAP,可以使用key或value进行过滤。
    SELECT user_id FROM users WHERE todo CONTAINS 'birthday wishes to Bilbo';
    SELECT user_id FROM users WHERE todo CONTAINS KEY '2013-09-23 12:01:00-0700';
  • 相关阅读:
    如何获取汉字对应的拼音
    php each()函数和list()函数
    php list()函数
    addslashes给预定义字符前面加上反斜杠
    array_filter() 过滤数组中的空白元素
    用.htaccess文件实现URL重写
    xml中实体引用
    onsubmit阻止表单提交
    php获取当前文件绝对路径
    array_merge() 函数的用法
  • 原文地址:https://www.cnblogs.com/logo-fox/p/8074946.html
Copyright © 2020-2023  润新知