Cassandra查询语句CQL的小技巧

数据库
今天我们要讨论的是NoSQL数据库中的Cassandra查询语句CQL小技巧,希望对大家有所帮助。

和SQL(结构化查询语言)类似,Cassandra也即将在未来的发行版本中提供Cassandra查询语句(CQL)。

比如使用Keyspace名称为WebSiteKS,使用CQL表示为:

  1. USE WebSiteKS; 

查询Column Family为Standard1,Key为k的值:

  1. SELECT FROM Standard1 WHERE KEY = "k"

更新Column Family为Standard1,Key为k,Column为c的值:

  1. UPDATE Standard1 WITH ROW("k", COL("c""hello!")); 

更多的有关CQL的语法详细信息可以参考官方的文档:https://svn.apache.org/repos/asf/cassandra/trunk/doc/cql/CQL.html

抛开CQL的语法,深入到Cassandra的内部实现,其也无非是解析CQL的操作类型,然后将其转化为内部的操作接口进行调用。

USE语句实现逻辑:

  1. case USE:   
  2.     clientState.setKeyspace((String)statement.statement); 

这里将Keyspace进行了切换,和直接调用Thrift API的setKeyspace效果一致。

SELECT语句实现逻辑:

  1. case SELECT:   
  2.     SelectStatement select = (SelectStatement)statement.statement;   
  3.     List<CqlRow> avroRows = new ArrayList<CqlRow>();   
  4.     avroResult.type = CqlResultType.ROWS;   
  5.     List<org.apache.cassandra.db.Row> rows = null;   
  6.     if (!select.getKeyPredicates().isRange())   
  7.         rows = multiSlice(keyspace, select);   
  8.     else   
  9.         rows = multiRangeSlice(keyspace, select); 

这与调用Thrift API的mutiSlice或multiRangeSlice效果一致:

UPDATE语句实现逻辑:

  1. case UPDATE:   
  2.     UpdateStatement update = (UpdateStatement)statement.statement;   
  3.     validateColumnFamily(keyspace, update.getColumnFamily());   
  4.     avroResult.type = CqlResultType.VOID;   
  5.     List<RowMutation> rowMutations = new ArrayList<RowMutation>();   
  6.     for (Row row : update.getRows())   
  7.     {   
  8.         validateKey(row.getKey().getByteBuffer());   
  9.         RowMutation rm = new RowMutation(keyspace, row.getKey().getByteBuffer());   
  10.         for (org.apache.cassandra.cql.Column col : row.getColumns())   
  11.         {   
  12.             rm.add(new QueryPath(update.getColumnFamily(), null, col.getName().getByteBuffer()),   
  13.                    col.getValue().getByteBuffer(),   
  14.                    System.currentTimeMillis());   
  15.         }   
  16.         rowMutations.add(rm);   
  17.     }   
  18.     try   
  19.     {   
  20.         StorageProxy.mutate(rowMutations, update.getConsistencyLevel());   
  21.     }   
  22.     catch (org.apache.cassandra.thrift.UnavailableException e)   
  23.     {   
  24.         throw new UnavailableException();   
  25.     }   
  26.     catch (TimeoutException e)   
  27.     {   
  28.         throw new TimedOutException();   
  29.     } 

这与调用Thrift API的batch_mutate效果一致:

虽然现在CQL功能还很弱,但是又向前迈向了一大步。

更多关于Cassandra的文章:http://www.cnblogs.com/gpcuster/tag/Cassandra/

原文链接:http://www.cnblogs.com/gpcuster/archive/2010/11/01/1866668.html

【编辑推荐】

  1. MongoDB CEO谈NoSQL的大数据量处理能力
  2. 抛弃关系数据库 PHP程序员应了解MongoDB的五件事
  3. MongoDB,无模式文档型数据库简介
  4. 关系数据库的末日是否已经来临
  5. 扔掉沉没成本 尝试关系数据库替代品OODBMS
责任编辑:彭凡 来源: 博客园
相关推荐

2023-09-25 13:15:50

SQL数据库

2010-06-01 16:43:07

Cassandra内部

2022-07-04 08:51:43

条件语句JavaScript

2021-02-03 10:46:31

SQL数据库技巧

2018-12-26 09:25:30

SQL ServerSQL语句数据库

2011-03-11 16:25:53

Oracle数据库

2011-03-01 16:30:55

Oracle

2021-11-29 11:11:45

SQL查询技巧

2022-11-16 09:04:36

SQL查询SELECT

2024-01-30 08:43:26

IF 语句JavaScripJS

2010-10-27 16:14:24

Oracle参数查询命

2024-04-12 08:28:38

优化查询语句PostgreSQL索引

2023-10-09 18:13:14

MySQL数据库查询

2021-07-16 10:31:29

MySQLDump技巧

2022-11-03 07:30:41

CQLJPQLHQL

2009-10-09 14:45:00

ccna小技巧ccna

2021-05-13 12:46:54

GNU ScreenLinux

2018-11-28 12:30:58

Python命令行编程语言

2015-02-04 10:32:57

Objective-CSwift

2011-05-03 15:52:29

喷头打印机
点赞
收藏

51CTO技术栈公众号