首页 > 数据库 > cassandra 学习笔记(4)

cassandra 学习笔记(4)

2010年3月15日
310 views 评论 发表评论

(一)依赖:cassandra.jar

             libthrift.jar

(二)连接:

    //该方法将返回一个Cassandra.Client实例,该实例包含和server端指定节点会话的API

  1.  
  2.      public Cassandra.Client getClient()
  3.     {
  4.         //192.168.0.169为想连接到的某个节点的ip,9160为端口<span id="more-682"></span>
  5.  
  6.         TSocket socket = new TSocket("192.168.0.169", 9160);
  7.  
  8.         TTransport transport_ = socket;
  9.  
  10.         TBinaryProtocol binaryProtocol = new TBinaryProtocol(transport_, false, false);
  11.         Cassandra.Client cassandraClient = new Cassandra.Client(binaryProtocol);
  12.  
  13.         try
  14.         {
  15.             transport_.open();
  16.         }
  17.         catch(Exception e)
  18.         {
  19.             // Should move this to Log4J as well probably…
  20.             System.err.println("Exception " + e.getMessage());          
  21.             e.printStackTrace();
  22.         }
  23.       
  24.         return cassandraClient;
  25.      
  26.     }
  27.  

(三)API

1)该方法向key的指定path插入一个数据,另外想要对key某指定path的数据进行修改也使用这个方法

   代码中的cli是一个Cassandra.Client实例

  1.  
  2.      public void test_insert()
  3.     {
  4.         try {
  5.             String tableName = "Table1";
  6.             String key = "testkey";
  7.             String columnFamily = "Standard1";
  8.             String columnName = "testColumn";
  9.             String value = "testValue";
  10.  
  11.             //对数据进行定位
  12.             String path = columnFamily+":"+columnName;
  13.             //向cassandra中插入一条数据
  14.             cli.insert(tableName,key,path,value.getBytes(),System.currentTimeMillis(),true);
  15.         } catch (InvalidRequestException e) {
  16.             e.printStackTrace();
  17.         } catch (TException e) {
  18.             e.printStackTrace();
  19.         } catch (UnavailableException e) {
  20.             e.printStackTrace();
  21.         }
  22.     }
  23.  

2)该方法试用Cql语句的方式发送请求,有一个问题就是当请求的参数或不正确的时候,方法不会报错,只是返回为空;

   但是在语法出现错误的时候还是会有InvalidRequestException抛出,提示Unresolved compilation problems

   代码中的cli是一个Cassandra.Client实例

  1.  
  2.    public void test_excuteQuery()
  3.     {
  4.         try {
  5.             cli.executeQuery("set Table1.Standard1['testKey2']['testColumn']=’testValue2′");
  6.             CqlResult_t crt = cli.executeQuery("get Table1.Standard1['testKey2']");
  7.             List<Map<String, String>> rs = crt.getResultSet();
  8.             //遍历显示所有column_t中的内容
  9.             if(rs != null){
  10.                 for(int i = 0 ; i < rs.size() ; i++){
  11.                     Map<String , String> map = rs.get(i);
  12.                     for(String key : map.keySet()){
  13.                         System.out.println(key+" : "+map.get(key));
  14.                     }
  15.                 }
  16.             }else{
  17.                 System.out.println("result set is null");
  18.             }
  19.         } catch (TException e) {
  20.             e.printStackTrace();
  21.         }
  22.     }
  23.  

3)根据path信息获取一个column

   path是一个定位信息,standard column family是两层 super column family是三层

   superColumnFamily:superColumn:standardColumn。

  1.  
  2.    public void test_get_column()
  3.     {
  4.         String tableName = "Table1";
  5.         String key = "testKey2";
  6.         String columnFamily = "Standard1";
  7.         String column = "testColumn";
  8.         String path = columnFamily+":"+column;
  9.         try {
  10.             column_t cmt = cli.get_column(tableName, key, path);
  11.             //以下两个是等价的
  12.             System.out.println(cmt.getColumnName());
  13.             System.out.println(cmt.getFieldValue(1));
  14.             //以下两个是等价的
  15.             System.out.println(new String(cmt.getValue(),"UTF-8"));
  16.             System.out.println(new String((byte[]) cmt.getFieldValue(2),"UTF-8"));
  17.             //以下两个是等价的
  18.             System.out.println(cmt.getTimestamp());
  19.             System.out.println(cmt.getFieldValue(3));
  20.           
  21.         } catch (InvalidRequestException e) {
  22.             e.printStackTrace();
  23.         } catch (NotFoundException e) {
  24.             e.printStackTrace();
  25.         } catch (TException e) {
  26.             e.printStackTrace();
  27.         } catch (UnsupportedEncodingException e) {
  28.             e.printStackTrace();
  29.         }
  30.     }

4)

    //术语解释:每个key都对应一个Row的信息这个Row的信息又按照columnFamliy 分成了很多slice

    //给定table,key和columnFamily的信息,
    //此方法将返回,该key在当前columnFamily的slice中有都少个column元素
    //该例子中key:”testKey2″在columnFamily:”Standard1″中的slice有几个column元素

  1.  
  2.     public void test_get_column_count()
  3.     {
  4.         String tableName = "Table1";
  5.         String keyName = "testKey2";
  6.         String columnFamily = "Standard1";
  7.         try {
  8.             System.out.println(cli.get_column_count(tableName, keyName, columnFamily));
  9.         } catch (InvalidRequestException e) {
  10.             e.printStackTrace();
  11.         } catch (TException e) {
  12.             e.printStackTrace();
  13.         }
  14.     }
  15.  

5) //暂不确定

    //根据给定的时间点,取出以后的对应给定key的一组columns
    //但是好像在时间上有延迟,这个不确定

  1.  
  2.     public void test_get_columns_since()
  3.     {
  4.         String tableName = "Table1";
  5.         String keyName = "testKey2";
  6.         String columnFamily = "Standard1";
  7.         Long sinceTime = System.currentTimeMillis()-5000*1000;//取当前时间之前120秒以内的
  8.         try {
  9.             List<column_t> cmts = cli.get_columns_since(tableName , keyName , columnFamily , sinceTime);
  10.             System.out.println("cmts size : "+cmts.size());
  11.         } catch (InvalidRequestException e) {
  12.             e.printStackTrace();
  13.         } catch (NotFoundException e) {
  14.             e.printStackTrace();
  15.         } catch (TException e) {
  16.             e.printStackTrace();
  17.         } catch (UnsupportedEncodingException e) {
  18.             e.printStackTrace();
  19.         }
  20.     }
  21.  

6)//range queries may only be performed against an order-preserving partitioner
    //如果系统试用的节点定位的RandomPartitioner的话那么这个方法将不能试用,好处是跟均衡的存储

  1.  
  2.     //此方法尚在研究中
  3.     public void test_get_key_range()
  4.     {
  5.         try {
  6.             cli.get_key_range("Table1", "??", "??", 1);
  7.           
  8.         } catch (InvalidRequestException e) {
  9.             e.printStackTrace();
  10.         } catch (TException e) {
  11.             e.printStackTrace();
  12.         }
  13.     }
  14.  

7) //术语解释:每个key都对应一个Row的信息这个Row的信息又按照columnFamliy 分成了很多slice

  1.  
  2.     //每一个columnFamily都存在一个排序,或按照name或按照time
  3.     //该方法将取出对应某个key的一定区间段内的column元素
  4.     public void test_get_slice()
  5.     {
  6.         String tableName = "Table1";
  7.         String keyName = "testKey2";
  8.         String columnFamily = "Standard1";    //想要从哪个columnFamily中获取column
  9.         int start = 0;//起始位置
  10.         int count = 10;//获取数量
  11.         try {
  12.             List<column_t> cmts = cli.get_slice(tableName, keyName, columnFamily, start, count);
  13.             System.out.println("cmts size : "+cmts.size());
  14.         } catch (InvalidRequestException e) {
  15.             e.printStackTrace();
  16.         } catch (NotFoundException e) {
  17.             e.printStackTrace();
  18.         } catch (TException e) {
  19.             e.printStackTrace();
  20.         } catch (UnsupportedEncodingException e) {
  21.             e.printStackTrace();
  22.         }
  23.     }

8) //通过一个column的名字数组来查找相对应的属于给定key的slice(一组column 元素)

  1.  
  2.     public void test_get_slice_by_names()
  3.     {
  4.         String tableName = "Table1";
  5.         String keyName = "testKey";
  6.         String columnFamily = "Standard1";
  7.         List<String> columnNameList = new ArrayList<String>();
  8.         columnNameList.add("testColumn");
  9.         try{
  10.             List<column_t> cmts = cli.get_slice_by_names(tableName, keyName, columnFamily, columnNameList);
  11.         }catch(Exception e){
  12.             e.printStackTrace();
  13.         }
  14.     }
  15.  

9)//描述一个table中的各个columnFamily的基本信息

  1.  
  2.     public void test_describe_table()
  3.     {
  4.         try {
  5.             System.out.println(cli.describeTable("Table1"));
  6.         } catch (TException e) {
  7.             e.printStackTrace();
  8.         }
  9.     }
  10.  

10)//批量的针对一个key插入数据

  1.  
  2.     public void test_batch_insert()
  3.     {
  4.         try{
  5.             String tableName = "Table1";
  6.             String keyName = "testkey2";
  7.             //当下的Map保存了ColumnFamily到他内部的column元素列表的一个映射
  8.             //所以String 应该保存 对应columnFamily的名字。
  9.             //column_t(column元素)包含:columnName , value , timestamp 三要素
  10.             Map<String , List<column_t>> CFmap = new HashMap<String , List<column_t>>();
  11.             //制作两个column_t实例
  12.             column_t cmt1 = new column_t("test_column_name_1" , "test_column_value_1".getBytes() , System.currentTimeMillis());
  13.             column_t cmt2 = new column_t("test_column_name_2" , "test_column_value_2".getBytes() , System.currentTimeMillis());
  14.             //制作一个column_t的list
  15.             List<column_t> cList = new ArrayList<column_t>();
  16.             cList.add(cmt1);
  17.             cList.add(cmt2);
  18.             //制作一个将其写入CFmap中
  19.             String columnFamilyName = "Standard1";
  20.             CFmap.put(columnFamilyName, cList);//这样在以后的插入操作中,相应的column_t将插入"Docin"这个family中
  21.             batch_mutation_t bmt = new batch_mutation_t(tableName , keyName , CFmap);//完成插入的key的定位
  22.             //执行这个针对相应key和colmunFamily的batch_insert
  23.             cli.batch_insert(bmt, true);
  24.            
  25.         }catch(Exception e){
  26.             e.printStackTrace();
  27.         }
  28.     }
  29.  

11)//同insert()相对的反向操作
    //当我们试图查询一个不存在的column_t元素的时候,会有”NotFoundException”异常被抛出

  1.  
  2.     public void test_remove()
  3.     {
  4.         String tableName = "Table1";
  5.         String columnFamily = "Standard1";
  6.         String columnName = "removetest";
  7.         String keyName = "removetestkey";
  8.         String value = "removetestvalue";
  9.         String path = columnFamily+":"+columnName;
  10.         try{
  11.             //先将相应的column元素写入
  12.             cli.insert(tableName, keyName, path, value.getBytes(), System.currentTimeMillis(), true);
  13.             //尝试读出信息
  14.             column_t cmt = cli.get_column(tableName, keyName, path);
  15.             displayColumn(cmt);
  16.             //删除这条信息
  17.             cli.remove(tableName, keyName, path, System.currentTimeMillis(), true);
  18.         }catch(Exception e){
  19.             e.printStackTrace();
  20.         }
  21.         //尝试读出信息
  22.         column_t cmt2;
  23.         try {
  24.             cmt2 = cli.get_column(tableName, keyName, path);
  25.             displayColumn(cmt2);
  26.         } catch (InvalidRequestException e) {
  27.             e.printStackTrace();
  28.         } catch (NotFoundException e) {
  29.             System.out.println("NotFoundException 异常抛出,column_元素已经被删除");
  30.         } catch (TException e) {
  31.             e.printStackTrace();
  32.         } catch (UnsupportedEncodingException e) {
  33.             e.printStackTrace();
  34.         }
  35.     }
  36.  

12)//插入一个superColumn元素
    //不含有内容的superColumn不能同过该方法被创建,会抛出异常

  1.  
  2.     public void test_batch_insert_super_t()
  3.     {
  4.         try {
  5.             String tableName    = "Table1";
  6.             String keyName        = "superkeytest";
  7.             String superColumnFamilyName = "Super1";
  8.             //产生1个superColumn元素
  9.             //首先产生1个column_t的list
  10.             List<column_t> Clist = new ArrayList<column_t>();
  11.             //当两个名字一样的时候,先前的会被覆盖
  12.             Clist.add(new column_t("stardcolumninsuper1","stardcolumn1".getBytes(),System.currentTimeMillis()));
  13.             Clist.add(new column_t("stardcolumninsuper2","stardcolumn2".getBytes(),System.currentTimeMillis()));
  14.             //产生一个superColumn元素
  15.             String superColumnName = "superColumn3";
  16.             superColumn_t sct = new superColumn_t(superColumnName , Clist);
  17.             //将这个元素装入到一个superColumn_t的List中
  18.             List<superColumn_t> SClist = new ArrayList<superColumn_t>();
  19.             SClist.add(sct);
  20.             //将这个super_column 的list连同对应的superColumnFamily的名字一起放入一个hashmap中
  21.             Map<String , List<superColumn_t>> cfmap = new HashMap<String , List<superColumn_t>>();
  22.             cfmap.put(superColumnFamilyName, SClist);
  23.             //区别于一般的,这里要求的column元素是superColumn元素
  24.             //将整理好的信息关联一个key后生成一个mutation
  25.             batch_mutation_super_t bmst = new batch_mutation_super_t(tableName,keyName,cfmap);
  26.             boolean block = true;
  27.             //执行这个mutation的插入操作
  28.             cli.batch_insert_superColumn(bmst, block);
  29.         } catch (InvalidRequestException e) {
  30.             e.printStackTrace();
  31.         } catch (UnavailableException e) {
  32.             e.printStackTrace();
  33.         } catch (TException e) {
  34.             e.printStackTrace();
  35.         }
  36.     }
  37.  

13)//获取一个SuperColumn中的信息

  1.  
  2.     public void test_get_superColumn()
  3.     {
  4.         String tableName = "Table1";
  5.         String keyName = "superkeytest";
  6.         String superColumnFamilyName = "Super1";
  7.         String superColumnName = "superColumn3";
  8.         String path = superColumnFamilyName+":"+superColumnName;
  9.         try {
  10.             superColumn_t sct = cli.get_superColumn(tableName, keyName, path);
  11.             if(sct != null){
  12.                 System.out.println("Super Name : "+sct.getName());
  13.                 System.out.println("Size : "+sct.getColumnsSize());
  14.                 List<column_t> clist = sct.getColumns();
  15.             }else{
  16.                 System.out.println("super column is empty");
  17.             }
  18.         } catch (InvalidRequestException e) {
  19.             e.printStackTrace();
  20.         } catch (NotFoundException e) {
  21.             e.printStackTrace();
  22.         } catch (TException e) {
  23.             e.printStackTrace();
  24.         } catch (UnsupportedEncodingException e) {
  25.             e.printStackTrace();
  26.         }
  27.     }
  28.  

14)//尝试向一个superColumn中添加column元素(就是column_t对象)
   //注意:想superColumnFamily中添加一般的column元素是不被允许的,所以superColumnFamliy中只能有superColumn,而superColumn中只能有一般的column
   //而一般的columnFamily中也只能有一般的column

  1.  
  2.     public void test_insert_standard_to_super()
  3.     {
  4.         String tableName = "Table1";
  5.         String keyName = "superkeytest";
  6.         String superColumnFamily = "Super1";
  7.         String superColumnName = "superColumn1";
  8.         String columnName = "normal_column";
  9.         String value = "normal_column_value_add";
  10.         String path = superColumnFamily+":"+superColumnName+":"+columnName;
  11.         try {
  12.             cli.insert(tableName, keyName, path, value.getBytes(),System.currentTimeMillis(), true);
  13.             //尝试取出这个元素并显示这个元素
  14.             column_t cmt = cli.get_column(tableName, keyName, path);
  15.             if(cmt != null){
  16.                 System.out.println("column name : "+cmt.getColumnName());
  17.                 System.out.println("column value: "+new String(cmt.getValue(),"UTF-8"));
  18.                 System.out.println("column time : "+cmt.getTimestamp()+"\n");
  19.             }else{
  20.                 System.out.println("column is empty");
  21.             }
  22.         } catch (InvalidRequestException e) {
  23.             e.printStackTrace();
  24.         } catch (UnavailableException e) {
  25.             e.printStackTrace();
  26.         } catch (TException e) {
  27.             e.printStackTrace();
  28.         } catch (NotFoundException e) {
  29.             e.printStackTrace();
  30.         } catch (UnsupportedEncodingException e) {
  31.             e.printStackTrace();
  32.         }
  33.     }
  34.  

15)//术语解释:每个key都对应一个Row的信息这个Row的信息又按照columnFamliy 或superColumnFamily分成了很多slice
    //同针对一般的columnFamliy类似,这个方法是获取给定key的某个superColumnFamily的slice,这个slice中的元素都是superColumn

  1.  
  2.     public void test_get_slice_super()
  3.     {
  4.         String tableName = "Table1";
  5.         String keyName = "superkeytest";
  6.         String superColumnFamily = "Super1";
  7.         try {
  8.             List<superColumn_t> sct = cli.get_slice_super(tableName, keyName, superColumnFamily, 0, 10);
  9.         } catch (InvalidRequestException e) {
  10.             e.printStackTrace();
  11.         } catch (TException e) {
  12.             e.printStackTrace();
  13.         } catch (UnsupportedEncodingException e) {
  14.             e.printStackTrace();
  15.         }
  16.     }
  17.  

16)
//尝试删除一个superColumn节点,和属于该节点的column_t节点
    //测试需要通过path来定位这个节点

  1.  
  2.     public void test_remove_super()
  3.     {
  4.         String tableName = "Table1";
  5.         String keyName = "superkeytest";
  6.         String superColumnFamily = "Super1";
  7.         String superColumn = "superColumn3";
  8.         String columnName = "stardcolumninsuper1";
  9.         String path = superColumnFamily+":"+superColumn+":"+columnName;
  10.        
  11.         try {
  12.             //先建立一个super_column_family 名字测试的时候是"superColumn3"
  13.             //产生1个superColumn元素
  14.             //首先产生1个column_t的list
  15.             List<column_t> Clist = new ArrayList<column_t>();
  16.             //当两个名字一样的时候,先前的会被覆盖
  17.             Clist.add(new column_t("stardcolumninsuper1","stardcolumn1".getBytes(),System.currentTimeMillis()));
  18.             Clist.add(new column_t("stardcolumninsuper2","stardcolumn2".getBytes(),System.currentTimeMillis()));
  19.             //产生一个superColumn元素
  20.             String superColumnName = "superColumn3";
  21.             superColumn_t sct = new superColumn_t(superColumnName , Clist);
  22.             //将这个元素装入到一个superColumn_t的List中
  23.             List<superColumn_t> SClist = new ArrayList<superColumn_t>();
  24.             SClist.add(sct);
  25.             //将这个super_column 的list连同对应的superColumnFamily的名字一起放入一个hashmap中
  26.             Map<String , List<superColumn_t>> cfmap = new HashMap<String , List<superColumn_t>>();
  27.             cfmap.put(superColumnFamilyName, SClist);
  28.             //区别于一般的,这里要求的column元素是superColumn元素
  29.             //将整理好的信息关联一个key后生成一个mutation
  30.             batch_mutation_super_t bmst = new batch_mutation_super_t(tableName,keyName,cfmap);
  31.             boolean block = true;
  32.             //执行这个mutation的插入操作
  33.             cli.batch_insert_superColumn(bmst, block);
  34.        
  35.             //尝试删除之
  36.             cli.remove(tableName, keyName, path, System.currentTimeMillis(), true);
  37.         } catch (InvalidRequestException e) {
  38.             e.printStackTrace();
  39.         } catch (UnavailableException e) {
  40.             e.printStackTrace();
  41.         } catch (TException e) {
  42.             e.printStackTrace();
  43.         }
  44.     }
  45.  

17)//这个方法目前还不健全

  1.  
  2.     public void test_getProperty()
  3.     {
  4.         try {
  5.             //这事一个未健全的方法,现在只能返回对应"tables"的参数,也就是表名
  6.             List<String> Plist = cli.getStringListProperty("tables");
  7.             for(int i = 0 ; i < Plist.size() ; i++){
  8.                 System.out.println(Plist.get(i));
  9.             }
  10.         } catch (TException e) {
  11.             // TODO Auto-generated catch block
  12.             e.printStackTrace();
  13.         }
  14.         //现在只支持如下三个参数
  15.         try {
  16.             System.out.println(cli.getStringProperty("cluster name"));
  17.             //会直接把server端的storage_conf.xml读进来,可能用于做进一步的xml分析
  18.             System.out.println(cli.getStringProperty("config file"));
  19.             System.out.println(cli.getStringProperty("version"));
  20.         } catch (TException e) {
  21.             e.printStackTrace();
  22.         }
  23.     }
  24.  

一些注意的:
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

纯净水 数据库 , , ,

  1. 目前还没有任何评论.
  1. 目前还没有任何 trackbacks 和 pingbacks.
  • 粤ICP备09032914号