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内实现的,所以不能实现的全局的查询;

时间: 2024-08-30 09:06:06

cassandra CQL 3.0 怎样实现 dynamic column;的相关文章

NoSQL Manager for Cassandra 3.2.0.1 带Key

NoSQL Manager for Cassandra 3.2.0.1 是一个Windows平台下Cassandra 数据库的高级管理工具.请低调使用. NoSQLManagerforCassandra3.2.0.1Patch.part1.rar NoSQLManagerforCassandra3.2.0.1Patch.part2.rar 博客园给的上传文件空间总大小100M,已经用完.官方安装包请到群里面下载.

C# 4.0 新特性dynamic (待学习)

随便翻看了一下dynamic,在网上拷贝了一个例子,先贴出来等有空了再慢慢消化 static void Main(string[] args) { dynamic d = new MyDynamicObject(); d.Mytable = "ojlovecd"; d.ojlovecd = "wang"; Console.WriteLine(d.Mytable);//新加的字段,VS不会自动提示 Console.WriteLine(d.ojlovecd);//新加的

Oracle 12.1.0.2 New Feature翻译学习【In-Memory column store内存列存储】【原创】

翻译没有追求信达雅,不是为了学英语翻译,是为了快速了解新特性,如有语义理解错误可以指正.欢迎加微信12735770或QQ12735770探讨oracle技术问题:) In-Memory Column Store内存列存储 Starting in Oracle Database 12c Release 1 (12.1.0.2), the In-Memory Column Store (IM column store) is an optional, static SGA pool that sto

cassandra 存储list数组

demo如下: CREATE TABLE users3 ( user_id text PRIMARY KEY, first_name text, last_name text, emails list<text> ); INSERT INTO users3 (user_id, first_name, last_name, emails) VALUES('frodo', 'Frodo', 'Baggins', ['[email protected]', '[email protected]'])

低调、奢华、有内涵的敏捷式大数据方案:Flume+Cassandra+Presto+SpagoBI

基于FacebookPresto+Cassandra的敏捷式大数据 目录 1      概述...3 1.1       Cassandra.3 1.1.1        特点...3 1.1.2        系统架构...4 1.2       Presto.4 1.2.1        特点...4 1.2.2        系统架构...5 2      环境准备...5 2.1       主机...5 2.2       用户...5 2.3       程序包...6 2.4   

[Hive - LanguageManual] Alter Table/Partition/Column

Alter Table/Partition/Column Alter Table Rename Table Alter Table Properties Alter Table Comment Add SerDe Properties Alter Table Storage Properties Additional Alter Table Statements Alter Partition Add Partitions Dynamic Partitions Rename Partition

过滤文本文档中的数据并插入Cassandra数据库

代码如下: package com.locationdataprocess; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection;

开源Nosql数据库Cassandra3.0实战-集群部署与插件使用

简介 Cassandra是一套开源分布式NoSQL数据库系统,Cassandra的主要特点是无中心的设计,其分布式集群由一堆数据库节点共同构成一个分布式网络服务,对Cassandra 的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取.对于一个Cassandra群集来说,扩展性能是比较简单的事情,只管在群集里面添加节点就可以了. 随着Nosql的火热,Hbase.Mongodb已然成了NoSQL数据库的代表,而Cassandra在国内的使用却不多(

HBase 官方文档0.90.4

HBase 官方文档0.90.4 Copyright ? 2010 Apache Software Foundation, 盛大游戏-数据仓库团队-颜开(译) Revision History Revision 0.90.4 配置,数据模型使用入门 Abstract 这是 Apache HBase的官方文档, Hbase是一个分布式,版本化(versioned),构建在 Apache Hadoop和 Apache ZooKeeper上的列数据库. 我(译者)熟悉Hbase的源代码,从事Hbase