hbase 读写遍历,java实现Hbase中的查询:Filter方式


http://blog.csdn.net/feixiangcq/archive/2010/04/16/5495027.aspx

 

1.连接HBase中的表testtable,用户名:root,密码:root

public void ConnectHBaseTable()
 {
  Configuration conf = new Configuration();       
        conf.set("hadoop.job.ugi", "root,root");     
  HBaseConfiguration config = new HBaseConfiguration();
  try
  {
   table = new HTable(config, "testtable");
  }catch(Exception e){e.printStackTrace();}
 }

2.根据行名name获得一行数据,存入Result.注意HBase中的表数据是字节存储的。

   下面的例子表示获得行名为name的行的famA列族col1列的数据。

      String rowId = "name";
      Get get = new Get(rowId);
      Result result = hTable.get(get);
      byte[] value = result.getValue(famA, col1);
      System.out.println(Bytes.toString(value));

3.向表中存数据

      下面的例子表示写入一行。行名为abcd,famA列族col1列的数据为"hello world!"。

      byte[] rowId = Bytes.toBytes("abcd");
      byte[] famA = Bytes.toBytes("famA");
      byte[] col1 = Bytes.toBytes("col1");
      Put put = new Put(rowId).
         add(famA, col1, Bytes.toBytes("hello world!"));
      hTable.put(put);
     

4.扫描的用法(scan):便于获得自己需要的数据,相当于SQL查询。

      byte[] famA = Bytes.toBytes("famA");
      byte[] col1 = Bytes.toBytes("col1");  

      HTable hTable = new HTable("test");  

      //表示要查询的行名是从a开始,到z结束。
      Scan scan = new Scan(Bytes.toBytes("a"), Bytes.toBytes("z"));
     

      //用scan.setStartRow(Bytes.toBytes(""));设置起始行

      //用scan.setStopRow(Bytes.toBytes(""));设置终止行

 

      //表示查询famA族col1列

      scan.addColumn(famA, col1);  

      //注意,下面是filter的写法。相当于SQL的where子句

      //表示famA族col1列的数据等于"hello world!"
      SingleColumnValueFilter singleColumnValueFilterA = new SingleColumnValueFilter(
           famA, col1, CompareOp.EQUAL, Bytes.toBytes("hello world!"));
      singleColumnValueFilterA.setFilterIfMissing(true);  

      //表示famA族col1列的数据等于"hello hbase!"
      SingleColumnValueFilter singleColumnValueFilterB = new SingleColumnValueFilter(
           famA, col1, CompareOp.EQUAL, Bytes.toBytes("hello hbase!"));
      singleColumnValueFilterB.setFilterIfMissing(true);  
      

      //表示famA族col1列的数据是两者中的一个
      FilterList filter = new FilterList(Operator.MUST_PASS_ONE, Arrays
           .asList((Filter) singleColumnValueFilterA,
                singleColumnValueFilterB));  

      scan.setFilter(filter);  

      ResultScanner scanner = hTable.getScanner(scan);  
      //遍历每个数据
      for (Result result : scanner) {
         System.out.println(Bytes.toString(result.getValue(famA, col1)));
      }

5.上面的代码容易出错的地方在于,需要导入HBase的类所在的包。导入时需要选择包,由于类可能出现在HBase的各个子包中,所以要选择好,下面列出常用的包。尽量用HBase的包

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.filter.FilterList.Operator;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

 

6.下面列出HBase常用的操作

(1)时间戳到时间的转换.单一的时间戳无法给出直观的解释。

public String GetTimeByStamp(String timestamp)
 {

  long datatime= Long.parseLong(timestamp);
     Date date=new Date(datatime);  
     SimpleDateFormat   format=new   SimpleDateFormat("yyyy-MM-dd HH:MM:ss");  
     String timeresult=format.format(date);
     System.out.println("Time : "+timeresult);
     return timeresult;
 }

(2)时间到时间戳的转换。注意时间是字符串格式。字符串与时间的相互转换,此不赘述。

public String GetStampByTime(String time)
 {
  String Stamp="";
  SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  Date date;
  try
  {
   date=sdf.parse(time);
   Stamp=date.getTime()+"000";
   System.out.println(Stamp);
  }catch(Exception e){e.printStackTrace();}
  return Stamp;

 }






http://blog.csdn.net/karen_wang/archive/2011/03/28/6284154.aspx 

1、需要的jar包:

commons-codec-1.4.jar

commons-logging-1.0.4.jar

hadoop-0.20.2-core.jar

hbase-0.20.6.jar

log4j-1.2.15.jar

zookeeper-3.2.2.jar

2、已有表结构:

1、表名:scores

2、列族:

course:art

course:math

grade:

   

3、scan 'scores'的内容:

ROW                          COLUMN+CELL                                                                     
 Jerry                       column=course:art, timestamp=1301294630194, value=80                            
 Jerry                       column=course:math, timestamp=1301294630132, value=100                          
 Jerry                       column=grade:, timestamp=1301294630073, value=2                                 
 Jim                         column=course:art, timestamp=1301294630363, value=97                            
 Jim                         column=course:math, timestamp=1301294630305, value=100                          
 Jim                         column=grade:, timestamp=1301294630247, value=3                                 
 Tom                         column=course:art, timestamp=1301294630015, value=97                            
 Tom                         column=course:math, timestamp=1301294629987, value=87                           
 Tom                         column=grade:, timestamp=1301294629931, value=1

4、代码:

 

  1. package org.myhbase;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import org.apache.hadoop.conf.Configuration;  
  8. import org.apache.hadoop.hbase.HBaseConfiguration;  
  9. import org.apache.hadoop.hbase.KeyValue;  
  10. import org.apache.hadoop.hbase.client.Get;  
  11. import org.apache.hadoop.hbase.client.HTable;  
  12. import org.apache.hadoop.hbase.client.Result;  
  13. import org.apache.hadoop.hbase.client.ResultScanner;  
  14. import org.apache.hadoop.hbase.client.Scan;  
  15. import org.apache.hadoop.hbase.filter.FilterList;  
  16. import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;  
  17. import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;  
  18. import org.apache.hadoop.hbase.io.Cell;  
  19. import org.apache.hadoop.hbase.util.Bytes;  
  20.   
  21. public class HBaseBasic03 {  
  22.     private static HBaseConfiguration hbaseConfig=null;  
  23.     static{  
  24.         Configuration config=new Configuration();  
  25.         config.set("hbase.zookeeper.quorum","192.168.10.149,192.168.10.44,192.168.10.49");  
  26.         config.set("hbase.zookeeper.property.clientPort", "2181");  
  27.         hbaseConfig=new HBaseConfiguration(config);  
  28.     }  
  29.       
  30.     /** 
  31.      * get方式,通过rowKey查询 
  32.      * @param tablename 
  33.      * @param rowKey 
  34.      * @throws IOException 
  35.      */  
  36.     public static void selectByRowKey(String tablename,String rowKey) throws IOException{  
  37.         HTable table=new HTable(hbaseConfig,tablename);  
  38.         Get g = new Get(Bytes.toBytes(rowKey));  
  39.         Result r=table.get(g);  
  40.         for(KeyValue kv:r.raw()){  
  41.             System.out.println("column: "+new String(kv.getColumn()));  
  42.             System.out.println("value: "+new String(kv.getValue()));  
  43.         }  
  44.     }  
  45.       
  46.     /** 
  47.      * get方式,通过rowKey、column查询 
  48.      * @param tablename 
  49.      * @param rowKey 
  50.      * @param column 
  51.      * @throws IOException 
  52.      */  
  53.     public static void selectByRowKeyColumn(String tablename,String rowKey,String column) throws IOException{  
  54.         HTable table=new HTable(hbaseConfig,tablename);  
  55.         Get g = new Get(Bytes.toBytes(rowKey));  
  56.         g.addColumn(Bytes.toBytes(column));  
  57.         Result r=table.get(g);  
  58.         for(KeyValue kv:r.raw()){  
  59.             System.out.println("column: "+new String(kv.getColumn()));  
  60.             System.out.println("value: "+new String(kv.getValue()));  
  61.         }  
  62.     }  
  63.       
  64.       
  65.     public static void selectByFilter(String tablename,List<String> arr) throws IOException{  
  66.         HTable table=new HTable(hbaseConfig,tablename);  
  67.         FilterList filterList = new FilterList();  
  68.         Scan s1 = new Scan();  
  69.         for(String v:arr){ // 各个条件之间是“与”的关系  
  70.             String [] s=v.split(",");  
  71.             filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes(s[0]),  
  72.                                                              Bytes.toBytes(s[1]),  
  73.                                                              CompareOp.EQUAL,Bytes.toBytes(s[2])  
  74.                                                              )  
  75.             );  
  76.             // 添加下面这一行后,则只返回指定的cell,同一行中的其他cell不返回  
  77. //          s1.addColumn(Bytes.toBytes(s[0]), Bytes.toBytes(s[1]));  
  78.         }  
  79.         s1.setFilter(filterList);  
  80.         ResultScanner ResultScannerFilterList = table.getScanner(s1);  
  81.         for(Result rr=ResultScannerFilterList.next();rr!=null;rr=ResultScannerFilterList.next()){  
  82.             for(KeyValue kv:rr.list()){  
  83.                 System.out.println("row : "+new String(kv.getRow()));  
  84.                 System.out.println("column : "+new String(kv.getColumn()));  
  85.                 System.out.println("value : "+new String(kv.getValue()));  
  86.             }  
  87.         }  
  88.     }  
  89.       
  90.     public static void main(String [] args) throws IOException{  
  91.           
  92.         // 按rowkey查询,查询Tom行的所有cell  
  93.         HBaseBasic03.selectByRowKey("scores","Tom");  
  94.           
  95.         // 按rokey 和 column 来查询,查询Tom行course列族的所有列值  
  96.         HBaseBasic03.selectByRowKeyColumn("scores","Tom","course");  
  97.           
  98.         // Filter多条件查询,条件:查询 course列族中art列值为97 ,且 course列族中math列值为100的行  
  99.         List<String> arr=new ArrayList<String>();  
  100.         arr.add("course,art,97");  
  101.         arr.add("course,math,100");  
  102.         HBaseBasic03.selectByFilter("scores",arr);  
  103.           
  104.     }  
  105.       
  106. }  

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值