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();
    }
}

 

posted @ 2018-07-17 21:42  马鞍山  阅读(321)  评论(0编辑  收藏  举报