hbase 读写遍历

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

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

public void ConnectHBaseTable()

{

Configurationconf=newConfiguration();

conf.set("hadoop.job.ugi","root,root");

HBaseConfigurationconfig=newHBaseConfiguration();

try

{

table=newHTable(config,"testtable");

}catch(Exceptione){e.printStackTrace();}

 }

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

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

      String rowId = "name";

Getget=newGet(rowId);

Resultresult=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");

Putput=newPut(rowId).

add(famA,col1,Bytes.toBytes("helloworld!"));

hTable.put(put);

     

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

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

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

HTablehTable=newHTable("test");

      //表示要查询的行名是从a开始,到z结束。

Scanscan=newScan(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!"

SingleColumnValueFiltersingleColumnValueFilterA=newSingleColumnValueFilter(

famA,col1,CompareOp.EQUAL,Bytes.toBytes("helloworld!"));

singleColumnValueFilterA.setFilterIfMissing(true);

      //表示famA族col1列的数据等于"hello hbase!"

SingleColumnValueFiltersingleColumnValueFilterB=newSingleColumnValueFilter(

famA,col1,CompareOp.EQUAL,Bytes.toBytes("hellohbase!"));

singleColumnValueFilterB.setFilterIfMissing(true);

      

      //表示famA族col1列的数据是两者中的一个

FilterListfilter=newFilterList(Operator.MUST_PASS_ONE,Arrays

.asList((Filter)singleColumnValueFilterA,

singleColumnValueFilterB));

scan.setFilter(filter);

ResultScannerscanner=hTable.getScanner(scan);

//遍历每个数据

for(Resultresult:scanner){

System.out.println(Bytes.toString(result.getValue(famA,col1)));

}

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

import org.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.hbase.HBaseConfiguration;

importorg.apache.hadoop.hbase.client.Get;

importorg.apache.hadoop.hbase.client.HTable;

importorg.apache.hadoop.hbase.client.Put;

importorg.apache.hadoop.hbase.client.Result;

importorg.apache.hadoop.hbase.client.ResultScanner;

importorg.apache.hadoop.hbase.client.Scan;

importorg.apache.hadoop.hbase.filter.Filter;

importorg.apache.hadoop.hbase.filter.FilterList;

importorg.apache.hadoop.hbase.filter.SingleColumnValueFilter;

importorg.apache.hadoop.hbase.filter.CompareFilter.CompareOp;

importorg.apache.hadoop.hbase.filter.FilterList.Operator;

import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

importjava.text.SimpleDateFormat;

importjava.util.Arrays;

import java.util.Date;

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

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

public String GetTimeByStamp(String timestamp) {

  long datatime= Long.parseLong(timestamp);

Datedate=newDate(datatime);

SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-ddHH:MM:ss");

Stringtimeresult=format.format(date);

System.out.println("Time:"+timeresult);

returntimeresult;

 }

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

public String GetStampByTime(String time)

{

StringStamp="";

SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");

Datedate;

try

{

date=sdf.parse(time);

Stamp=date.getTime()+"000";

System.out.println(Stamp);

}catch(Exceptione){e.printStackTrace();}

returnStamp;

 }

相关推荐