在.net中使用aquiles访问Cassandra(二)
public class RowMutation
{
public string Key { get; set; } public IList<CellMutation> Mutations { get; set; } public RowMutation()
{ } public RowMutation(string key)
{
Key = key;
} public RowMutation(string key, IList<CellMutation> mutations)
{
Key = key;
Mutations = mutations;
}
} public class CellMutation
{
public string ColumnName { get; set; } public string DataValue { get; set; } public CellMutation()
{ } public CellMutation(string name)
{
ColumnName = name;
} public CellMutation(string name, string value)
{
ColumnName = name;
DataValue = value;
}
}
2.引用aquiles命名空间。
using Aquiles.Helpers.Encoders;
using Aquiles.Cassandra10;
using Aquiles.Core.Cluster;
3.初始化成员变量
        private string _clusterName { get; set; }
        private ConsistencyLevel _consistencyLevel { get; set; }
        private string _keyspaceName { get; set; }
        private ICluster _cluster = null;
        public AquilesDemo()
        {
            _clusterName = "xxxx";
            _consistencyLevel = ConsistencyLevel.LOCAL_QUORUM;
           _keyspaceName = "xxxx";
            _cluster = AquilesHelper.RetrieveCluster(_clusterName);
        }
4.建立一个通用的修改多行多列的方法,其它改变方式可以在此基础上完成调用,如修改一多一列,一行多列等。
public void Mutate(string columnFamily, IList<RowMutation> rowMutations)
{
if (string.IsNullOrWhiteSpace(columnFamily)) throw new ArgumentNullException("columnFamily"); rowMutations = PrepareMutationList(rowMutations);
Dictionary<byte[], Dictionary<string, List<Apache.Cassandra.Mutation>>> mutation_map = new Dictionary<byte[], Dictionary<string, List<Apache.Cassandra.Mutation>>>(); foreach (var rowMutation in rowMutations)
{
byte[] key = ByteEncoderHelper.UTF8Encoder.ToByteArray(rowMutation.Key); Dictionary<string, List<Apache.Cassandra.Mutation>> cfMutation = new Dictionary<string, List<Apache.Cassandra.Mutation>>();
List<Apache.Cassandra.Mutation> mutationList = new List<Apache.Cassandra.Mutation>(); foreach (CellMutation cellMutation in rowMutation.Mutations)
{
if (cellMutation.DataValue == null) continue; Apache.Cassandra.Mutation mutation = new Apache.Cassandra.Mutation()
{
Column_or_supercolumn = new ColumnOrSuperColumn()
{
Column = new Column()
{
Name = ByteEncoderHelper.UTF8Encoder.ToByteArray(cellMutation.ColumnName),
Timestamp = DateTime.Now.ToUnixTimestamp(),
Value = ByteEncoderHelper.UTF8Encoder.ToByteArray(cellMutation.DataValue),
},
},
};
mutationList.Add(mutation);
} if (mutationList.Count > )
{
cfMutation.Add(columnFamily, mutationList);
mutation_map.Add(key, cfMutation);
}
} if (mutation_map.Count == ) return;
_cluster.Execute(new ExecutionBlock(delegate(Apache.Cassandra.Cassandra.Client client)
{
client.batch_mutate(mutation_map, _consistencyLevel);
return null;
}), _keyspaceName); }
5. 由于调用端可能会将同一行的修改分为多个RowMutation传入,所以上面的代码使用PrepareMutationList方法根据RowKey作了聚合处理。
/// <summary>
/// 聚合列表中相同rowkey的项为同一Mutation。
/// </summary>
/// <param name="rowMutations"></param>
/// <returns></returns>
private IList<RowMutation> PrepareMutationList(IList<RowMutation> rowMutations)
{
if (rowMutations == null) return null; //按rowkey分组
var rowMutationGroups = rowMutations.GroupBy(rm => rm.Key); //分组后的总数量相同,则认为rowkey在列表中是唯一的,不用做聚合处理
if (rowMutations.Count == rowMutationGroups.Count()) return rowMutations; //遍历分组结果
IList<RowMutation> result = new List<RowMutation>();
foreach (var rmg in rowMutationGroups)
{
RowMutation rowMutation = new RowMutation();
rowMutation.Key = rmg.Key; //将同一分组的所有CellMutation放在一个列表中
List<CellMutation> cellMutations = new List<CellMutation>();
foreach (var rm in rmg)
{
cellMutations.AddRange(rm.Mutations);
} if (cellMutations.Count() > )
{
rowMutation.Mutations = cellMutations;
result.Add(rowMutation);
}
}
return result;
}
在.net中使用aquiles访问Cassandra(二)的更多相关文章
- 在.net中使用aquiles访问Cassandra(一)
		aquiles是.net下基于Thrift协议访问Cassandra的第三方类库,官方地址是: http://aquiles.codeplex.com/ 1.下载类库文件: http://aqui ... 
- 在.net中使用aquiles访问Cassandra(四)
		数据的持久化我们都已经完成了,和所有应有程序一样,最重要的是要向用户展示数据.下面我们就推出这部分代码,读取任意行任何列: public IList<TRowResult> Execute ... 
- 在.net中使用aquiles访问Cassandra(三)
		之前我们实现了如何修改数据,还需要相应的删除动作.删除方式会有几种情况,以下分别一一介绍. 1.批量删除,适应于多行多列的情况. public void Remove(string columnF ... 
- ArcGIS Engine中的数据访问
		ArcGIS Engine中的数据访问 数据是GIS的基础, 访问数据也是进行任何复杂的空间分析及空间可视化表达的前提.ArcGIS支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异.本文 ... 
- 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。
		今天写ASP.NET程序,在网页后台的c#代码里写了个事务,事务内部对一张表进行批量插入,对另外一张表进行查询与批量插入. 结果第二张表查询后foreach迭代操作时报错:已禁用对分布式事务管理器(M ... 
- 自建目录中jsp页面访问servlet路径出错404
		---恢复内容开始--- 自建目录中jsp页面访问servlet路径出错404 使用eclipse建立的项目,总是会遇到路径问题,比如jsp页面访问servlet,jsp在默认的路径.jsp在自建目录 ... 
- 在KVM虚拟机中使用spice系列之二(USB映射,SSL,密码,多客户端支持)
		在KVM虚拟机中使用spice系列之二(USB映射,SSL,密码,多客户端支持) 发布时间: 2015-02-27 00:16 1.spice的USB重定向 1.1 介绍 使用usb重定向,在clie ... 
- 【java】基础中的杂乱总结(二)
		1 内部类进阶 package package8; //原则:先用内部类写 之后由于内部类匿名无法引用 用其继承的父类或实现的接口名 //再复写所有的抽象方法即可(是所有,否者还是抽象的,无法创建对象 ... 
- Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案
		多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ... 
随机推荐
- 数据类型安全验证都交给TryParse吧
			C# 网站开发中 往往在编写后台代码中遇到从字符类型转换到其他类型.其实无需在单独验证字符串长度,是否为空等工作.直接用Tryparse转换,如果转换失败说明字符串的格式等有误.成功则再进一步验证转换 ... 
- ES6详解
			1.ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. const声明常亮,不可改变 2.变量的解构赋值 (1)数组的解构赋值: 以前,为 ... 
- 基于Django的web开发
			github地址:https://github.com/shirleyandgithub/PythonWeb 
- ContentProvider要点复习
			ContentProvider要点复习 ContentProvider作为四大组件之一,发挥着举足轻重的作用.与之相关联的另外两个类分别是ContentResolver和ContentObserver ... 
- PHP-仿ecshop生成验证码
			<?php /* 生成验证码 */ // 1.创建画布(基于已有图像) $n = mt_rand(1,5); $im = imagecreatefromjpeg('./images/captch ... 
- React Ntive 学习手记
			React使今年来比较热门的前端库,之所以说是库呢,因为React.js是应用于MVC中的V层, 它并不是一个完整的MVC框架,所以,我也不知称之为框架了. 不过这并不影响React的火热. 混合应用 ... 
- 【dubbo】dubbo项目基本结构及provider构建
			dubbo项目基本结构如下,分别部署于不同服务器: 1.provider(接口API 实现) 2.consumer(web) 3.zookeeper 4.DB provider构建 1.api构建 i ... 
- P1906联合权值
			描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的最短距离. ... 
- 【转】Linux 文件夹文件创建与删除
			[转自:Linux文件夹文件创建.删除 - 风生水起 - 博客园] 1. 删除文件夹 rm -rf fileNamede> -删除文件夹实例:rm -rf /var/log/httpd/acc ... 
- Linux Ubuntu12.04下安装OpenCv2.4.10
			参考 http://blog.sina.com.cn/s/blog_53b0956801010lfu.html 捣鼓了一个晚上了,OpenCv还没装好,本来以为看个类似的比如Ubuntu安装OpenC ... 
