Cassandra查询语句CQL的小技巧
2023-04-18 15:54:05 时间
和SQL(结构化查询语言)类似,Cassandra也即将在未来的发行版本中提供Cassandra查询语句(CQL)。
比如使用Keyspace名称为WebSiteKS,使用CQL表示为:
- USE WebSiteKS;
查询Column Family为Standard1,Key为k的值:
- SELECT FROM Standard1 WHERE KEY = "k";
更新Column Family为Standard1,Key为k,Column为c的值:
- 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语句实现逻辑:
- case USE:
- clientState.setKeyspace((String)statement.statement);
这里将Keyspace进行了切换,和直接调用Thrift API的setKeyspace效果一致。
SELECT语句实现逻辑:
- case SELECT:
- SelectStatement select = (SelectStatement)statement.statement;
- List<CqlRow> avroRows = new ArrayList<CqlRow>();
- avroResult.type = CqlResultType.ROWS;
- List<org.apache.cassandra.db.Row> rows = null;
- if (!select.getKeyPredicates().isRange())
- rows = multiSlice(keyspace, select);
- else
- rows = multiRangeSlice(keyspace, select);
这与调用Thrift API的mutiSlice或multiRangeSlice效果一致:
UPDATE语句实现逻辑:
- case UPDATE:
- UpdateStatement update = (UpdateStatement)statement.statement;
- validateColumnFamily(keyspace, update.getColumnFamily());
- avroResult.type = CqlResultType.VOID;
- List<RowMutation> rowMutations = new ArrayList<RowMutation>();
- for (Row row : update.getRows())
- {
- validateKey(row.getKey().getByteBuffer());
- RowMutation rm = new RowMutation(keyspace, row.getKey().getByteBuffer());
- for (org.apache.cassandra.cql.Column col : row.getColumns())
- {
- rm.add(new QueryPath(update.getColumnFamily(), null, col.getName().getByteBuffer()),
- col.getValue().getByteBuffer(),
- System.currentTimeMillis());
- }
- rowMutations.add(rm);
- }
- try
- {
- StorageProxy.mutate(rowMutations, update.getConsistencyLevel());
- }
- catch (org.apache.cassandra.thrift.UnavailableException e)
- {
- throw new UnavailableException();
- }
- catch (TimeoutException e)
- {
- throw new TimedOutException();
- }
这与调用Thrift API的batch_mutate效果一致:
虽然现在CQL功能还很弱,但是又向前迈向了一大步。
更多关于Cassandra的文章:http://www.cnblogs.com/gpcuster/tag/Cassandra/
原文链接:http://www.cnblogs.com/gpcuster/archive/2010/11/01/1866668.html
【编辑推荐】
相关文章
- 直接在代码里面对list集合进行分页
- .NET Framework 4.5新特性详解
- 大数据的简要介绍
- 大数据的由来
- 高斯混合模型的自然梯度变量推理
- timing-wheel 仿Kafka实现的时间轮算法
- 使用Navicat软件连接自建数据库(Linux系统)
- 那一天,我被Redis主从架构支配的恐惧
- Redis 深入了解键的过期时间
- C#使用委托调用实现用户端等待闪屏
- 基于流计算 Oceanus 和 Elasticsearch Service 构建百亿级实时监控系统
- GRAND | 转录调控网络预测数据库
- JFreeChart API中文文档
- 临床相关突变查询数据库
- TIGER | 人类胰岛基因变化查询数据库
- 视频边缘计算网关EasyNVR在视频整体监控解决方案中的应用分析
- Apache Arrow - 大数据在数据湖后的下一个风向标
- 常见的电商数据指标体系
- AKShare-艺人数据-艺人流量价值
- MySQL中多表联合查询与子查询的这些区别,你可能不知道!