hbase 读写遍历
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;
}