您的位置:首页 > 编程语言 > Java开发

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

2013-05-08 09:40 465 查看



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、代码:

view plaincopy to clipboardprint?

package org.myhbase;

import java.io.IOException;
import java.util.ArrayList;
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.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
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.io.Cell;
import org.apache.hadoop.hbase.util.Bytes;

public class HBaseBasic03 {
private static HBaseConfiguration hbaseConfig=null;
static{
Configuration config=new Configuration();
config.set("hbase.zookeeper.quorum","192.168.10.149,192.168.10.44,192.168.10.49");
config.set("hbase.zookeeper.property.clientPort", "2181");
hbaseConfig=new HBaseConfiguration(config);
}

/**
* get方式,通过rowKey查询
* @param tablename
* @param rowKey
* @throws IOException
*/
public static void selectByRowKey(String tablename,String rowKey) throws IOException{
HTable table=new HTable(hbaseConfig,tablename);
Get g = new Get(Bytes.toBytes(rowKey));
Result r=table.get(g);
for(KeyValue kv:r.raw()){
System.out.println("column: "+new String(kv.getColumn()));
System.out.println("value: "+new String(kv.getValue()));
}
}

/**
* get方式,通过rowKey、column查询
* @param tablename
* @param rowKey
* @param column
* @throws IOException
*/
public static void selectByRowKeyColumn(String tablename,String rowKey,String column) throws IOException{
HTable table=new HTable(hbaseConfig,tablename);
Get g = new Get(Bytes.toBytes(rowKey));
g.addColumn(Bytes.toBytes(column));
Result r=table.get(g);
for(KeyValue kv:r.raw()){
System.out.println("column: "+new String(kv.getColumn()));
System.out.println("value: "+new String(kv.getValue()));
}
}

public static void selectByFilter(String tablename,List<String> arr) throws IOException{
HTable table=new HTable(hbaseConfig,tablename);
FilterList filterList = new FilterList();
Scan s1 = new Scan();
for(String v:arr){ // 各个条件之间是“与”的关系
String [] s=v.split(",");
filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes(s[0]),
Bytes.toBytes(s[1]),
CompareOp.EQUAL,Bytes.toBytes(s[2])
)
);
// 添加下面这一行后,则只返回指定的cell,同一行中的其他cell不返回
// s1.addColumn(Bytes.toBytes(s[0]), Bytes.toBytes(s[1]));
}
s1.setFilter(filterList);
ResultScanner ResultScannerFilterList = table.getScanner(s1);
for(Result rr=ResultScannerFilterList.next();rr!=null;rr=ResultScannerFilterList.next()){
for(KeyValue kv:rr.list()){
System.out.println("row : "+new String(kv.getRow()));
System.out.println("column : "+new String(kv.getColumn()));
System.out.println("value : "+new String(kv.getValue()));
}
}
}

public static void main(String [] args) throws IOException{

// 按rowkey查询,查询Tom行的所有cell
HBaseBasic03.selectByRowKey("scores","Tom");

// 按rokey 和 column 来查询,查询Tom行course列族的所有列值
HBaseBasic03.selectByRowKeyColumn("scores","Tom","course");

// Filter多条件查询,条件:查询 course列族中art列值为97 ,且 course列族中math列值为100的行
List<String> arr=new ArrayList<String>();
arr.add("course,art,97");
arr.add("course,math,100");
HBaseBasic03.selectByFilter("scores",arr);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: