cassandra 学习笔记(4)
(一)依赖:cassandra.jar
libthrift.jar
(二)连接:
//该方法将返回一个Cassandra.Client实例,该实例包含和server端指定节点会话的API
-
-
public Cassandra.Client getClient()
-
{
-
//192.168.0.169为想连接到的某个节点的ip,9160为端口<span id="more-682"></span>
-
-
TSocket socket = new TSocket("192.168.0.169", 9160);
-
-
TTransport transport_ = socket;
-
-
TBinaryProtocol binaryProtocol = new TBinaryProtocol(transport_, false, false);
-
Cassandra.Client cassandraClient = new Cassandra.Client(binaryProtocol);
-
-
try
-
{
-
transport_.open();
-
}
-
{
-
// Should move this to Log4J as well probably…
-
e.printStackTrace();
-
}
-
-
return cassandraClient;
-
-
}
-
(三)API
1)该方法向key的指定path插入一个数据,另外想要对key某指定path的数据进行修改也使用这个方法
代码中的cli是一个Cassandra.Client实例
-
-
public void test_insert()
-
{
-
try {
-
String tableName = "Table1";
-
String key = "testkey";
-
String columnFamily = "Standard1";
-
String columnName = "testColumn";
-
String value = "testValue";
-
-
//对数据进行定位
-
String path = columnFamily+":"+columnName;
-
//向cassandra中插入一条数据
-
} catch (InvalidRequestException e) {
-
e.printStackTrace();
-
} catch (TException e) {
-
e.printStackTrace();
-
} catch (UnavailableException e) {
-
e.printStackTrace();
-
}
-
}
-
2)该方法试用Cql语句的方式发送请求,有一个问题就是当请求的参数或不正确的时候,方法不会报错,只是返回为空;
但是在语法出现错误的时候还是会有InvalidRequestException抛出,提示Unresolved compilation problems
代码中的cli是一个Cassandra.Client实例
-
-
public void test_excuteQuery()
-
{
-
try {
-
cli.executeQuery("set Table1.Standard1['testKey2']['testColumn']=’testValue2′");
-
CqlResult_t crt = cli.executeQuery("get Table1.Standard1['testKey2']");
-
List<Map<String, String>> rs = crt.getResultSet();
-
//遍历显示所有column_t中的内容
-
if(rs != null){
-
for(int i = 0 ; i < rs.size() ; i++){
-
Map<String , String> map = rs.get(i);
-
}
-
}
-
}else{
-
}
-
} catch (TException e) {
-
e.printStackTrace();
-
}
-
}
-
3)根据path信息获取一个column
path是一个定位信息,standard column family是两层 super column family是三层
superColumnFamily:superColumn:standardColumn。
-
-
public void test_get_column()
-
{
-
String tableName = "Table1";
-
String key = "testKey2";
-
String columnFamily = "Standard1";
-
String column = "testColumn";
-
String path = columnFamily+":"+column;
-
try {
-
column_t cmt = cli.get_column(tableName, key, path);
-
//以下两个是等价的
-
//以下两个是等价的
-
//以下两个是等价的
-
-
} catch (InvalidRequestException e) {
-
e.printStackTrace();
-
} catch (NotFoundException e) {
-
e.printStackTrace();
-
} catch (TException e) {
-
e.printStackTrace();
-
e.printStackTrace();
-
}
-
}
4)
//术语解释:每个key都对应一个Row的信息这个Row的信息又按照columnFamliy 分成了很多slice
//给定table,key和columnFamily的信息,
//此方法将返回,该key在当前columnFamily的slice中有都少个column元素
//该例子中key:”testKey2″在columnFamily:”Standard1″中的slice有几个column元素
5) //暂不确定
//根据给定的时间点,取出以后的对应给定key的一组columns
//但是好像在时间上有延迟,这个不确定
-
-
public void test_get_columns_since()
-
{
-
String tableName = "Table1";
-
String keyName = "testKey2";
-
String columnFamily = "Standard1";
-
try {
-
List<column_t> cmts = cli.get_columns_since(tableName , keyName , columnFamily , sinceTime);
-
} catch (InvalidRequestException e) {
-
e.printStackTrace();
-
} catch (NotFoundException e) {
-
e.printStackTrace();
-
} catch (TException e) {
-
e.printStackTrace();
-
e.printStackTrace();
-
}
-
}
-
6)//range queries may only be performed against an order-preserving partitioner
//如果系统试用的节点定位的RandomPartitioner的话那么这个方法将不能试用,好处是跟均衡的存储
-
-
//此方法尚在研究中
-
public void test_get_key_range()
-
{
-
try {
-
cli.get_key_range("Table1", "??", "??", 1);
-
-
} catch (InvalidRequestException e) {
-
e.printStackTrace();
-
} catch (TException e) {
-
e.printStackTrace();
-
}
-
}
-
7) //术语解释:每个key都对应一个Row的信息这个Row的信息又按照columnFamliy 分成了很多slice
-
-
//每一个columnFamily都存在一个排序,或按照name或按照time
-
//该方法将取出对应某个key的一定区间段内的column元素
-
public void test_get_slice()
-
{
-
String tableName = "Table1";
-
String keyName = "testKey2";
-
int start = 0;//起始位置
-
int count = 10;//获取数量
-
try {
-
List<column_t> cmts = cli.get_slice(tableName, keyName, columnFamily, start, count);
-
} catch (InvalidRequestException e) {
-
e.printStackTrace();
-
} catch (NotFoundException e) {
-
e.printStackTrace();
-
} catch (TException e) {
-
e.printStackTrace();
-
e.printStackTrace();
-
}
-
}
//通过一个column的名字数组来查找相对应的属于给定key的slice(一组column 元素)
-
-
public void test_get_slice_by_names()
-
{
-
String tableName = "Table1";
-
String keyName = "testKey";
-
String columnFamily = "Standard1";
-
List<String> columnNameList = new ArrayList<String>();
-
columnNameList.add("testColumn");
-
try{
-
List<column_t> cmts = cli.get_slice_by_names(tableName, keyName, columnFamily, columnNameList);
-
e.printStackTrace();
-
}
-
}
-
9)//描述一个table中的各个columnFamily的基本信息
-
-
public void test_describe_table()
-
{
-
try {
-
} catch (TException e) {
-
e.printStackTrace();
-
}
-
}
-
10)//批量的针对一个key插入数据
-
-
public void test_batch_insert()
-
{
-
try{
-
String tableName = "Table1";
-
String keyName = "testkey2";
-
//当下的Map保存了ColumnFamily到他内部的column元素列表的一个映射
-
//所以String 应该保存 对应columnFamily的名字。
-
//column_t(column元素)包含:columnName , value , timestamp 三要素
-
Map<String , List<column_t>> CFmap = new HashMap<String , List<column_t>>();
-
//制作两个column_t实例
-
column_t cmt1 = new column_t("test_column_name_1" , "test_column_value_1".getBytes() , System.currentTimeMillis());
-
column_t cmt2 = new column_t("test_column_name_2" , "test_column_value_2".getBytes() , System.currentTimeMillis());
-
//制作一个column_t的list
-
List<column_t> cList = new ArrayList<column_t>();
-
cList.add(cmt1);
-
cList.add(cmt2);
-
//制作一个将其写入CFmap中
-
String columnFamilyName = "Standard1";
-
CFmap.put(columnFamilyName, cList);//这样在以后的插入操作中,相应的column_t将插入"Docin"这个family中
-
batch_mutation_t bmt = new batch_mutation_t(tableName , keyName , CFmap);//完成插入的key的定位
-
//执行这个针对相应key和colmunFamily的batch_insert
-
cli.batch_insert(bmt, true);
-
-
e.printStackTrace();
-
}
-
}
-
11)//同insert()相对的反向操作
//当我们试图查询一个不存在的column_t元素的时候,会有”NotFoundException”异常被抛出
-
-
public void test_remove()
-
{
-
String tableName = "Table1";
-
String columnFamily = "Standard1";
-
String columnName = "removetest";
-
String keyName = "removetestkey";
-
String value = "removetestvalue";
-
String path = columnFamily+":"+columnName;
-
try{
-
//先将相应的column元素写入
-
//尝试读出信息
-
column_t cmt = cli.get_column(tableName, keyName, path);
-
displayColumn(cmt);
-
//删除这条信息
-
e.printStackTrace();
-
}
-
//尝试读出信息
-
column_t cmt2;
-
try {
-
cmt2 = cli.get_column(tableName, keyName, path);
-
displayColumn(cmt2);
-
} catch (InvalidRequestException e) {
-
e.printStackTrace();
-
} catch (NotFoundException e) {
-
} catch (TException e) {
-
e.printStackTrace();
-
e.printStackTrace();
-
}
-
}
-
12)//插入一个superColumn元素
//不含有内容的superColumn不能同过该方法被创建,会抛出异常
-
-
public void test_batch_insert_super_t()
-
{
-
try {
-
String tableName = "Table1";
-
String keyName = "superkeytest";
-
String superColumnFamilyName = "Super1";
-
//产生1个superColumn元素
-
//首先产生1个column_t的list
-
List<column_t> Clist = new ArrayList<column_t>();
-
//当两个名字一样的时候,先前的会被覆盖
-
Clist.add(new column_t("stardcolumninsuper1","stardcolumn1".getBytes(),System.currentTimeMillis()));
-
Clist.add(new column_t("stardcolumninsuper2","stardcolumn2".getBytes(),System.currentTimeMillis()));
-
//产生一个superColumn元素
-
String superColumnName = "superColumn3";
-
superColumn_t sct = new superColumn_t(superColumnName , Clist);
-
//将这个元素装入到一个superColumn_t的List中
-
List<superColumn_t> SClist = new ArrayList<superColumn_t>();
-
SClist.add(sct);
-
//将这个super_column 的list连同对应的superColumnFamily的名字一起放入一个hashmap中
-
Map<String , List<superColumn_t>> cfmap = new HashMap<String , List<superColumn_t>>();
-
cfmap.put(superColumnFamilyName, SClist);
-
//区别于一般的,这里要求的column元素是superColumn元素
-
//将整理好的信息关联一个key后生成一个mutation
-
batch_mutation_super_t bmst = new batch_mutation_super_t(tableName,keyName,cfmap);
-
boolean block = true;
-
//执行这个mutation的插入操作
-
cli.batch_insert_superColumn(bmst, block);
-
} catch (InvalidRequestException e) {
-
e.printStackTrace();
-
} catch (UnavailableException e) {
-
e.printStackTrace();
-
} catch (TException e) {
-
e.printStackTrace();
-
}
-
}
-
13)//获取一个SuperColumn中的信息
-
-
public void test_get_superColumn()
-
{
-
String tableName = "Table1";
-
String keyName = "superkeytest";
-
String superColumnFamilyName = "Super1";
-
String superColumnName = "superColumn3";
-
String path = superColumnFamilyName+":"+superColumnName;
-
try {
-
superColumn_t sct = cli.get_superColumn(tableName, keyName, path);
-
if(sct != null){
-
List<column_t> clist = sct.getColumns();
-
}else{
-
}
-
} catch (InvalidRequestException e) {
-
e.printStackTrace();
-
} catch (NotFoundException e) {
-
e.printStackTrace();
-
} catch (TException e) {
-
e.printStackTrace();
-
e.printStackTrace();
-
}
-
}
-
14)//尝试向一个superColumn中添加column元素(就是column_t对象)
//注意:想superColumnFamily中添加一般的column元素是不被允许的,所以superColumnFamliy中只能有superColumn,而superColumn中只能有一般的column
//而一般的columnFamily中也只能有一般的column
-
-
public void test_insert_standard_to_super()
-
{
-
String tableName = "Table1";
-
String keyName = "superkeytest";
-
String superColumnFamily = "Super1";
-
String superColumnName = "superColumn1";
-
String columnName = "normal_column";
-
String value = "normal_column_value_add";
-
try {
-
//尝试取出这个元素并显示这个元素
-
column_t cmt = cli.get_column(tableName, keyName, path);
-
if(cmt != null){
-
}else{
-
}
-
} catch (InvalidRequestException e) {
-
e.printStackTrace();
-
} catch (UnavailableException e) {
-
e.printStackTrace();
-
} catch (TException e) {
-
e.printStackTrace();
-
} catch (NotFoundException e) {
-
e.printStackTrace();
-
e.printStackTrace();
-
}
-
}
-
15)//术语解释:每个key都对应一个Row的信息这个Row的信息又按照columnFamliy 或superColumnFamily分成了很多slice
//同针对一般的columnFamliy类似,这个方法是获取给定key的某个superColumnFamily的slice,这个slice中的元素都是superColumn
-
-
public void test_get_slice_super()
-
{
-
String tableName = "Table1";
-
String keyName = "superkeytest";
-
String superColumnFamily = "Super1";
-
try {
-
List<superColumn_t> sct = cli.get_slice_super(tableName, keyName, superColumnFamily, 0, 10);
-
} catch (InvalidRequestException e) {
-
e.printStackTrace();
-
} catch (TException e) {
-
e.printStackTrace();
-
e.printStackTrace();
-
}
-
}
-
16)
//尝试删除一个superColumn节点,和属于该节点的column_t节点
//测试需要通过path来定位这个节点
-
-
public void test_remove_super()
-
{
-
String tableName = "Table1";
-
String keyName = "superkeytest";
-
String superColumnFamily = "Super1";
-
String superColumn = "superColumn3";
-
String columnName = "stardcolumninsuper1";
-
-
try {
-
//先建立一个super_column_family 名字测试的时候是"superColumn3"
-
//产生1个superColumn元素
-
//首先产生1个column_t的list
-
List<column_t> Clist = new ArrayList<column_t>();
-
//当两个名字一样的时候,先前的会被覆盖
-
Clist.add(new column_t("stardcolumninsuper1","stardcolumn1".getBytes(),System.currentTimeMillis()));
-
Clist.add(new column_t("stardcolumninsuper2","stardcolumn2".getBytes(),System.currentTimeMillis()));
-
//产生一个superColumn元素
-
String superColumnName = "superColumn3";
-
superColumn_t sct = new superColumn_t(superColumnName , Clist);
-
//将这个元素装入到一个superColumn_t的List中
-
List<superColumn_t> SClist = new ArrayList<superColumn_t>();
-
SClist.add(sct);
-
//将这个super_column 的list连同对应的superColumnFamily的名字一起放入一个hashmap中
-
Map<String , List<superColumn_t>> cfmap = new HashMap<String , List<superColumn_t>>();
-
cfmap.put(superColumnFamilyName, SClist);
-
//区别于一般的,这里要求的column元素是superColumn元素
-
//将整理好的信息关联一个key后生成一个mutation
-
batch_mutation_super_t bmst = new batch_mutation_super_t(tableName,keyName,cfmap);
-
boolean block = true;
-
//执行这个mutation的插入操作
-
cli.batch_insert_superColumn(bmst, block);
-
-
//尝试删除之
-
} catch (InvalidRequestException e) {
-
e.printStackTrace();
-
} catch (UnavailableException e) {
-
e.printStackTrace();
-
} catch (TException e) {
-
e.printStackTrace();
-
}
-
}
-
17)//这个方法目前还不健全
-
-
public void test_getProperty()
-
{
-
try {
-
//这事一个未健全的方法,现在只能返回对应"tables"的参数,也就是表名
-
List<String> Plist = cli.getStringListProperty("tables");
-
for(int i = 0 ; i < Plist.size() ; i++){
-
}
-
} catch (TException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
//现在只支持如下三个参数
-
try {
-
//会直接把server端的storage_conf.xml读进来,可能用于做进一步的xml分析
-
} catch (TException e) {
-
e.printStackTrace();
-
}
-
}
-
一些注意的:
1)cli的实例还有一些诸如sent_*和recv_*(成对出现)的公共方法,这些方法是供上面罗列的相应方法调用的,一般不用管,
2)sent_*负责想服务器端发送消息
3)recv_*将处理返回的所要的结果或处理错误信息抛出相应异常
4)大部分方法可执行的前提是必须有一个精确的key信息,(describe_table和get_key_range除外)。
5)一个superColumnFamily中只能存放superColumn_t元素而不能存放column_t元素
6)一个columnFamily中只能存放column_t元素
转:http://blog.csdn.net/pakly_9527/archive/2009/08/14/4447359.aspx
最近评论