HBASE表操作
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(); } }
传播知识,分享快乐!
作者:IT_BULL
出处:http://www.cnblogs.com/itBulls/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
博客园-博客园。