zoukankan      html  css  js  c++  java
  • cassandra CQL 3.0 怎样实现 dynamic column;

    1. cassandra有一个好的特点是列之间可以按照column key进行排序;这样当rowkey确定以后,对于同一个“行”的范围(range query)查找是很方便的;官方说法,每一个“行”(wide row)可以加入最多20亿个列,虽说如此,据ebay的工程师讲,实践中也没有超过百万个的;同一个row的数据值存在于同一server,不会分开的;

    2. 而且column 的模式不是预先固定的,可以随时增加和删除,这样其实不仅是column value,column key我们也可以利用上,作为存放数据的地方;举一个例子,比方说。我每隔五分钟采集一个服务器的负载值,那么可以将表格设计成如下的样子;

                                     |   hour + minute       |                               |

    -------------------------+-----------------------+-----------------------+-----------------------

    device_name + day    |    load value             |

    就是将 服务器名字 和 天 作为rowkey,小时和分钟作为column key,然后服务器的负载值作为column value;

    3.  CQL 3.0以后,剪标语句更像是传统关心型数据库的sql语句;比如说 建立一个user表,

    CREATE TABLE users (

    user_id int PRIMARY KEY,

    name text,

    company text

    );

    这里其实primary key,user_id 就是cassandra 在实际存储时候的rowkey;

    可以出入一条记录,

    INSERT INTO users (user_id, name, company)

    VALUES (1, 'john', 'taobao');

    4. 从上面来看,这种好像表的schema貌似已经固定了,那原有的dynamic column该怎样实现呢;最简单的方法 用alter table 修改schema,然后添加,但每回都要修改表的结构,繁琐且性能有问题;

    其实CQL 3.0 提供了另一种角度解决问题的办法:

       我们回过头来想想,之所有会有wide row(也就是动态column),是因为想把一个范围内的数据统一组织,方便查询(因为不用定位多个rowkey)也便于理解;同时当需要dynamic column的时候。从业务角度讲,

    其实 rowkey + dynamic columin key 是可以唯一确定的,类似于RDBMS中的primary key;在CQL 3.0 中如果想建立dynamic columin 可以使用下面的建表语句,我们采用第2段落中的例子:

    CREATE TABLE device_load (

    device_and_day, text

    hour_and_minute text,

    load_value float,

    primary key (device_and_day, hour_and_minute)

    );

    就是将 数据模型中要作为rowkey 和 dynamic column key的合在一起作为primary key, primary key 中的第一个元素就是rowkey,后面的元素的元素是column key;

    这种形式,其实cassandra 的底层存储方式可以描述成:

    |   row key         |                             columns                                |
    |-------------------+----------------------|----------------------|----------------------|
    |                   |   0000:"load value"  |   0005:"load value"  |   0010:"load value"  |......
    | device1+20150701  +----------------------|----------------------|----------------------|
    |                   |          1.0         |           2.0        |         5.5          |......
    |-------------------+----------------------|----------------------|----------------------|
    |                   |   0000:"load value"  |   0005:"load value"  |   0010:"load value"  |......
    | device2+20150701  +----------------------|----------------------|----------------------|
    |                   |          2.0         |           3.0        |         10.0         |......
    |-------------------+----------------------|----------------------|----------------------|


    这种情况下,当rowkey确定的时候,仍然可以对column key进行范围查询;用法如:

    select load_value where device_and_day = 'device1+20150701' and hour_and_minute >= '0000' and hour_and_minute <= '1200'; 

    5. cassandra的查询方式可以用法,就是先确定rowkey,然后再在同一行中进行范围查找;rowkey不支持直接的范围查找,只支持 = 和 in,如果要用rowkey进行范围查找需要使用token 函数;

    同时,除了rowkey外,字段也不支持直接的= 查询操作, 需建立二级索引后才能支持,cassandra的索引不是Btree之类的索引,不支持范围查询,类似于hash索引;cassandra的二级索引猜测是在每一个sstable内实现的,所以不能实现的全局的查询;

  • 相关阅读:
    Python——方法
    Python——类和对象(二)
    Python——类和对象(一)
    Python——函数的高级应用
    Python——函数入门(三)
    Python——函数入门(二)
    Python——函数入门(一)
    Python——序列封包与序列解包
    min(T)方法
    max(T)方法
  • 原文地址:https://www.cnblogs.com/yuhan-TB/p/4678017.html
Copyright © 2011-2022 走看看