import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.regionserver.BloomType;
import org.apache.hadoop.hbase.util.Bytes;
import static org.apache.hadoop.hbase.util.Bytes.toBytes;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
public class HBASEdemo2 {
//hbase 配置对象
private static Configuration conf = HBaseConfiguration.create();
//hbase 连接对象
private static Connection conn = null;
private static void init() throws IOException {
//连接的是zk 主机
conn = ConnectionFactory.createConnection(conf);
}
//创建表
public static void testCreate() throws IOException {
//获取一个表管理器
Admin admin = conn.getAdmin();
//构建表描述器并指定表名
HTableDescriptor tName = new HTableDescriptor(TableName.valueOf("t_user_info_11"));
//构建列族描述器并且指定列名
HColumnDescriptor base_info = new HColumnDescriptor("base_info");
//为该列族设定义个布隆过滤器类型参数/版本数量
base_info.setBloomFilterType(BloomType.ROW ).setVersions(1,3);
HColumnDescriptor extend_info = new HColumnDescriptor("extend_info");
//为该列族设定义个布隆过滤器类型参数/版本数量
extend_info.setBloomFilterType(BloomType.ROW ).setVersions(1,3);
//将列族描述器添加到表描述器中
tName.addFamily(base_info).addFamily(extend_info);
admin.createTable(tName);
admin.close();
conn.close();
}
//删除表
public static void testDrop() throws IOException {
Admin admin = conn.getAdmin();
//先关闭在删除
admin.disableTable(TableName.valueOf("user_info11"));
admin.deleteTable(TableName.valueOf("user_info11"));
System.out.println("删除表成功");
admin.close();
conn.close();
}
//修改表 :把列族名有extra_info 改为 other_info
public static void testModify() throws IOException {
Admin admin = conn.getAdmin();
//修改已经有的colunFamily
HTableDescriptor table = admin.getTableDescriptor(TableName.valueOf("user_info"));
HColumnDescriptor family = table.getFamily("extra_info".getBytes());
//设置过滤器 数据插入时 计算是否已经存储了该行键 的计算算法
family.setBloomFilterType(BloomType.ROWCOL);
//添加新的 colunfFamily
table.addFamily(new HColumnDescriptor("other_info"));
admin.modifyTable(TableName.valueOf("user_info"),table);
admin.close();
conn.close();
}
//添加数据
public static void testPut() throws Exception{
//获取table对象
Table table = conn.getTable(TableName.valueOf("t_user_info"));
//使用list数组实现批量加密
ArrayList<Put> puts = new ArrayList<Put>();
//创建一个put对象 指定其行键
Put put01 = new Put(toBytes("user001"));
put01.addColumn(toBytes("base_info"),toBytes("username"),toBytes("xiaofeng"));
put01.addColumn(toBytes("base_info"),toBytes("skill"),toBytes("xianglongshibazhang"));
Put put02 = new Put(toBytes("user002"));
put02.addColumn(toBytes("base_info"),toBytes("username"),toBytes("morongfu"));
put02.addColumn(toBytes("base_info"),toBytes("skill"),toBytes("douzhuanxinyi"));
Put put03 = new Put(toBytes("user003"));
put03.addColumn(toBytes("base_info"),toBytes("name"),toBytes("xuZhu"));
put03.addColumn(toBytes("base_info"),toBytes("skill"),toBytes("beimingshenggong"));
put03.addColumn(toBytes("base_info"),toBytes("lover"),toBytes("xixiagongZhu"));
Put put05 = new Put(toBytes("user005"));
put05.addColumn(toBytes("base_info"),toBytes("name"),toBytes("jouMoZhi"));
put05.addColumn(toBytes("base_info"),toBytes("skill"),toBytes("xiaowuxiang"));
put05.addColumn(toBytes("base_info"),toBytes("lover"),toBytes("none"));
Put put06 = new Put(toBytes("user006"));
put06.addColumn(toBytes("base_info"),toBytes("name"),toBytes("duanZhengChun"));
put06.addColumn(toBytes("base_info"),toBytes("skill"),toBytes("yiyangz"));
put06.addColumn(toBytes("base_info"),toBytes("lover"),toBytes("more..."));
Put put04 = new Put(toBytes("user004"));
put04.addColumn(toBytes("base_info"),toBytes("skill"),toBytes("lingBoWeiBu"));
put04.addColumn(toBytes("base_info"),toBytes("name"),toBytes("duanyu"));
puts.add(put01);
puts.add(put02);
puts.add(put03);
puts.add(put04);
puts.add(put05);
puts.add(put06);
//添加组装好的数据
table.put(puts);
table.close();
conn.close();
System.out.println("添加元素成功");
}
//读取一行数据
public static void testGet()throws Exception{
Table table = conn.getTable(TableName.valueOf("t_user_info"));
//创建一个get查询参数对象,指定要get的是哪一行
Get get = new Get("user001".getBytes());
Result result = table.get(get);
CellScanner cellScanner = result.cellScanner();
while(cellScanner.advance()){
Cell current = cellScanner.current();
byte[] familyArray = current.getFamilyArray();
byte[] qualifierArray = current.getQualifierArray();
byte[] valueArray = current.getValueArray();
System.out.println("列族名============>"+new String(familyArray,current.getFamilyOffset(),current.getFamilyLength()));
System.out.println("列名=================>"+new String(qualifierArray,current.getQualifierOffset(),current.getQualifierLength()));
System.out.println("列名对应的值===============>"+ new String(valueArray,current.getValueOffset(),current.getValueLength()));
}
table.close();
conn.close();
System.out.println("获取一行数据成功");
}
//删除表中的数据
private static void testDel()throws Exception{
Table table = conn.getTable(TableName.valueOf("t_user_info"));
//获取删除对象
Delete delete = new Delete("user001".getBytes());
//指定删除对象的列族和key
delete.addColumns("base_info".getBytes(),"skill".getBytes());
table.delete(delete);
table.close();
conn.close();
System.out.println("删除指定行指定列族指定key的值成功");
}
//批量查询数据 指定行键范围进行查询
private static void testScan()throws Exception{
Table table = conn.getTable(TableName.valueOf("t_user_info"));
Scan scan = new Scan(toBytes("user003"), toBytes("user006" + "\000"));
ResultScanner scanner = table.getScanner(scan);
Iterator<Result> it = scanner.iterator();
while(it.hasNext()){
Result res = it.next();
CellScanner cellScanner = res.cellScanner();
while (cellScanner.advance()){
Cell c = cellScanner.current();
byte[] familyArray = c.getFamilyArray();
byte[] valueArray = c.getValueArray();
byte[] qualifierArray= c.getQualifierArray();
byte[] rowArray = c.getRowArray();
System.out.println("行键=======>"+new String(rowArray,c.getRowOffset(),c.getRowLength()));
System.out.println("列族名========>"+new String(familyArray,c.getFamilyOffset(),c.getFamilyLength()));
System.out.println("列名-------------->"+new String(qualifierArray,c.getQualifierOffset(),c.getQualifierLength()));
System.out.println("列名对应的值========>"+new String(valueArray,c.getValueOffset(),c.getValueLength()));
}
System.out.println("======================= scan table===================================");
}
}
//过滤器 查询条件
public static void testFilter()throws Exception{
//针对行键的前缀过滤器 查询行键前缀为'user' 的数据
Filter hasUser = new PrefixFilter(toBytes("user"));
// FileterScan(hasUser);
//行过滤器
//查询指定的行user002
RowFilter rf1 = new RowFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(toBytes("user002")));
RowFilter rf2 = new RowFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("00"));
// FileterScan(rf1);
// System.out.println("-------------------xxxxxxxxxxxxxxx-----------------");
// FileterScan(rf2);
// //针对指定一个列的value来过滤 查询不包含 “douzhuanxinyi” 的行键
SingleColumnValueFilter vf = new SingleColumnValueFilter("base_info".getBytes(), "skill".getBytes(), CompareFilter.CompareOp.GREATER, "douzhuanxinyi".getBytes());
vf.setFilterIfMissing(true);//如果指定的列缺失,则也过滤掉
// FileterScan(vf);
//
//正则过滤 查询姓名以 ‘duanZhengChun’ 开头的 行键
RegexStringComparator r1 = new RegexStringComparator("^duanZhengChun");
ByteArrayComparable s11 = new SubstringComparator("iao");
SingleColumnValueFilter rf = new SingleColumnValueFilter("base_info".getBytes(), "name".getBytes(), CompareFilter.CompareOp.EQUAL, r1);
// FileterScan(rf);
//列族名过滤器 返回包含满足条件的列族中的数据
//查询;列名为name的行
FamilyFilter f1 = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(toBytes("name")));
//列名包含base的字段
FamilyFilter f2 = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(toBytes("base")));
// FileterScan(f1);
//针对列名的过滤器
QualifierFilter skill = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(toBytes("skill")));
//查询 列名为name的行
QualifierFilter name = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(toBytes("name")));
// FileterScan(skill);
//与SingleColumnValueFilter 结果不同,只返回符合条件(username)的该列
ColumnPrefixFilter cf = new ColumnPrefixFilter("username".getBytes());
// FileterScan(cf);
//返回列名为 ‘name’的参数
byte[][] bytes = {toBytes("name"), toBytes("duanyu")};
MultipleColumnPrefixFilter mcf = new MultipleColumnPrefixFilter(bytes);
// FileterScan(mcf);
FamilyFilter base = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(toBytes("base")));
ColumnPrefixFilter cff = new ColumnPrefixFilter("xiaowuxiang".getBytes());
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
// filterList.addFilter(base);
// filterList.addFilter(cff);
// FileterScan(filterList);
}
//过滤器扫描
public static void FileterScan(Filter fielt)throws Exception{
Table table = conn.getTable(TableName.valueOf("t_user_info"));
Scan scan = new Scan();
scan.setFilter(fielt);
ResultScanner scanner = table.getScanner(scan);
Iterator<Result> iter = scanner.iterator();
while(iter.hasNext()){
Result it = iter.next();
CellScanner cellScanner = it.cellScanner();
while (cellScanner.advance()){
Cell c = cellScanner.current();
byte[] familyArray = c.getFamilyArray();
byte[] rowArray = c.getRowArray();
byte[] valueArray = c.getValueArray();
byte[] qualifierArray = c.getQualifierArray();
System.out.println("行键:"+new String(rowArray,c.getRowOffset(),c.getRowLength()));
System.out.println("列族:"+new String(familyArray,c.getFamilyOffset(),c.getFamilyLength()));
System.out.println("KEY:"+new String(qualifierArray,c.getQualifierOffset(),c.getQualifierLength()));
System.out.println("VALUE:"+new String(valueArray,c.getValueOffset(),c.getValueLength()));
}
System.out.println("=========扫描 过滤器 =============");
}
}
/**
* 分页查询
*/
public static void pageScan() throws Exception{
final byte[] POSTFIX = new byte[] { 0x00 };
Table table = conn.getTable(TableName.valueOf("t_user_info"));
Filter filter = new PageFilter(3); // 一次需要获取一页的条数
byte[] lastRow = null;
int totalRows = 0;
while (true) {
Scan scan = new Scan();
scan.setFilter(filter);
if(lastRow != null){
byte[] startRow = Bytes.add(lastRow,POSTFIX); //设置本次查询的起始行键
scan.setStartRow(startRow);
}
ResultScanner scanner = table.getScanner(scan);
int localRows = 0;
Result result;
while((result = scanner.next()) != null){
System.out.println("===================分页数据=================");
System.out.println(++localRows + ":" + result);
totalRows ++;
lastRow = result.getRow();
}
scanner.close();
if(localRows == 0) break;
Thread.sleep(2000);
}
System.out.println("total rows:" + totalRows);
}
public static void main(String[] args) throws Exception {
init();
// testCreate();
// testDrop();
// testPut();
// testModify();
// testGet();
// testDel();
// testScan();
// testFilter();
pageScan();
}
}
HBASE表操作
最新推荐文章于 2025-07-29 19:45:28 发布