HBase:实现Scan查询所有、get根据rowkey查询一行或一列数据

查询整体过程:
1.client访问zk,查找-ROOT-表,获取.META.表信息
2.从.META.表查找,获取存放数据的region信息(找到region sever)
3.最后通过RegionServer获取查找的数据


了解ROOT表和META表的结构:

META表里面包含了region的信息(一行),region信息包括:region name(对应row_key),还有region sever(就是哪个sever管理这个region的)等信息

META存放了太多的region信息了,可能太大,会被分成多个region的,那么,META表的region怎么管理呢?就让ROOT表来管理吧,ROOT表也是同样的结构,只是管理的是META表的region信息而已。当然,ROOT表不可能会非常大的,不需要其它表来管理了

也就是:META表管理的是实际创建的表的region信息,ROOT表管理的是META表的region信息。
所以先client--->root---->meta--->region sever这个顺序。

看看什么是RegionServer

数据的读写操作,都是在RegionServer上操作的,RegionServer它一方面维护region的状态,提供对region的管理和服务(增删改查等),一方面跟Master交换,上传region的负载信息,参与Master的分布式协调管理(就是要负载均衡)
最后查找还得是通过RegionServer来操作,到这里,client--->root---->meta--->region sever----->获取数据 整个流程就打通了。
其实,最后在查询数据的时候,会先查menstore,没有再查block cach,最后才查hfile的。

你可以看看HBase-Region详解

https://blog.csdn.net/wypersist/article/details/79820715


代码实现:

Scan查询所有、get根据rowkey查询一行或一列数据

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.HTablePool;
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.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;

/***
 * 从表student查询数据
 * 查询所有
 * 根据主键查询一行
 * 根据主键和列族查询列族/某一列
 * 
 */
public class ShowRecord {
 
 private static Configuration hbaseconfig = null;
 static{
  Configuration conf = new Configuration();
  conf.set("hbase.zookeeper.quorum","*.*.*.*");
  conf.set("hbase.zookeeper.property.clientPort","2181");
  
  hbaseconfig = HBaseConfiguration.create(conf);
 }
 
 public static void main(String[] args) {
 //注意字段查询区分大小写

  /***
   * 查询表student
   */
  //查询所有
  //ShowRecord.showAllRecords("student"); 
  
  //根据主键rowKey查询一行数据
  //ShowRecord.showOneRecordByRowKey("student", "200977100709");
  
  //根据主键查询某行中的一列
  //ShowRecord.showOneRecordByRowKey_cloumn("student", "200977100709","name");
  //ShowRecord.showOneRecordByRowKey_cloumn("student", "200977100709","info:age");

 }
 /****
  * 使用scan查询所有数据
  * @param tableName
  */
 public static void showAllRecords(String tableName)
 {
  System.out.println("start==============show All Records=============");
  
  HTablePool pool = new HTablePool(hbaseconfig,1000);
  //创建table对象
  HTable table = (HTable) pool.getTable(tableName);
  
  try {
   //Scan所有数据
   Scan scan = new Scan();
   ResultScanner rss = table.getScanner(scan);
   
   for(Result r:rss){
    System.out.println("\n row: "+new String(r.getRow()));
    
    for(KeyValue kv:r.raw()){
     
     System.out.println("family=>"+new String(kv.getFamily(),"utf-8")
           +"  value=>"+new String(kv.getValue(),"utf-8")
     +"  qualifer=>"+new String(kv.getQualifier(),"utf-8")
     +"  timestamp=>"+kv.getTimestamp());    
    }
   }
   rss.close();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }  
  System.out.println("\n end==============show All Records=============");
 }
 
 /***
  * 根据主键rowKey查询一行数据
  * get 'student','010'
  */
 public static void showOneRecordByRowKey(String tableName,String rowkey)
 {
  HTablePool pool = new HTablePool(hbaseconfig,1000);
  HTable table = (HTable) pool.getTable(tableName);
    
  try {
   Get get = new Get(rowkey.getBytes()); //根据主键查询
   Result r = table.get(get);
   System.out.println("start===showOneRecordByRowKey==row: "+"\n");
   System.out.println("row: "+new String(r.getRow(),"utf-8"));
   
   for(KeyValue kv:r.raw()){
    //时间戳转换成日期格式
    String timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss").format(new Date(kv.getTimestamp()));
       //System.out.println("===:"+timestampFormat+"  ==timestamp: "+kv.getTimestamp());
    System.out.println("\nKeyValue: "+kv);
    System.out.println("key: "+kv.getKeyString());
    
    System.out.println("family=>"+new String(kv.getFamily(),"utf-8")
          +"  value=>"+new String(kv.getValue(),"utf-8")
    +"  qualifer=>"+new String(kv.getQualifier(),"utf-8")
    +"  timestamp=>"+timestampFormat);
 
   }
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  System.out.println("end===========showOneRecordByRowKey");
 }
 
 /**
  * 根据rowkey,一行中的某一列簇查询一条数据
  * get 'student','010','info'  
  * student sid是010的info列簇(info:age,info:birthday)
  * 
  * get 'student','010','info:age'  
  * student sid是010的info:age列,quafilier是age
  */
 //public static void showOneRecordByRowKey_cloumn(String tableName,String rowkey,String column,String quafilier)
 public static void showOneRecordByRowKey_cloumn(String tableName,String rowkey,String column)
 {
  System.out.println("start===根据主键查询某列簇showOneRecordByRowKey_cloumn");
  
  HTablePool pool = new HTablePool(hbaseconfig,1000);
  HTable table = (HTable) pool.getTable(tableName);
    
  try {
   Get get = new Get(rowkey.getBytes()); 
   get.addFamily(column.getBytes()); //根据主键查询某列簇   
   //get.addColumn(Bytes.toBytes(column),Bytes.toBytes(quafilier)); ////根据主键查询某列簇中的quafilier列
   Result r = table.get(get);
   
   for(KeyValue kv:r.raw()){
    System.out.println("KeyValue---"+kv);
    System.out.println("row=>"+new String(kv.getRow()));
    System.out.println("family=>"+new String(kv.getFamily(),"utf-8")+": "+new String(kv.getValue(),"utf-8"));
    System.out.println("qualifier=>"+new String(kv.getQualifier())+"\n");
 
   }
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  System.out.println("end===========showOneRecordByRowKey_cloumn");
 }
  
 //(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; 
 }

}

猜你喜欢

转载自blog.csdn.net/WYpersist/article/details/80220652