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 avroRows = new ArrayList(); 
  4.     avroResult.type = CqlResultType.ROWS; 
  5.     List 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 rowMutations = new ArrayList(); 
  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/

网页标题:Cassandra查询语句CQL的小技巧
URL标题:http://www.shufengxianlan.com/qtweb/news23/266923.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联