zoukankan      html  css  js  c++  java
  • HBase学习笔记——Java API操作

    1.1.  配置

    HBaseConfiguration

    包:org.apache.hadoop.hbase.HBaseConfiguration

    作用:通过此类可以对HBase进行配置

    用法实例:

    Configuration config = HBaseConfiguration.create();

    说明: HBaseConfiguration.create() 默认会从classpath 中查找 hbase-site.xml 中的配置信息,初始化 Configuration。

    使用方法:

    static Configuration config = null;

    static {

         config = HBaseConfiguration.create();

         config.set("hbase.zookeeper.quorum", "slave1,slave2,slave3");

         config.set("hbase.zookeeper.property.clientPort", "2181");

    }

    1.2.  表管理类

    HBaseAdmin

    包:org.apache.hadoop.hbase.client.HBaseAdmin

    作用:提供接口关系HBase 数据库中的表信息

    用法:

    HBaseAdmin admin = new HBaseAdmin(config);

    1.3.  表描述类

    HTableDescriptor

    包:org.apache.hadoop.hbase.HTableDescriptor

    作用:HTableDescriptor 类包含了表的名字以及表的列族信息

              表的schema(设计)

    用法:

    HTableDescriptor htd =new HTableDescriptor(tablename);

    htd.addFamily(new HColumnDescriptor(“myFamily”));

    1.4.  列族的描述类

    HColumnDescriptor

    包:org.apache.hadoop.hbase.HColumnDescriptor

    作用:HColumnDescriptor 维护列族的信息

    用法:

    htd.addFamily(new HColumnDescriptor(“myFamily”));

    1.5.  创建表的操作

    CreateTable(一般我们用shell创建表)

    static Configuration config = null;

    static {

         config = HBaseConfiguration.create();

         config.set("hbase.zookeeper.quorum", "slave1,slave2,slave3");

         config.set("hbase.zookeeper.property.clientPort", "2181");

    }

    HBaseAdmin admin = new HBaseAdmin(config);

    HTableDescriptor desc = new HTableDescriptor(tableName);

    HColumnDescriptor family1 = new HColumnDescriptor(“f1”);

    HColumnDescriptor family2 = new HColumnDescriptor(“f2”);

    desc.addFamily(family1);

    desc.addFamily(family2);

    admin.createTable(desc);

    1.6.  删除表

    HBaseAdmin admin = new HBaseAdmin(config);

    admin.disableTable(tableName);

    admin.deleteTable(tableName);

    1.7.  创建一个表的类

    HTable

    包:org.apache.hadoop.hbase.client.HTable

    作用:HTable 和 HBase 的表通信

    用法:

    // 普通获取表

     HTable table = new HTable(config,Bytes.toBytes(tablename);

    // 通过连接池获取表

    Connection connection = ConnectionFactory.createConnection(config);

    HTableInterface table = connection.getTable(TableName.valueOf("user"));

    1.8.  单条插入数据

    Put

    包:org.apache.hadoop.hbase.client.Put

    作用:插入数据

    用法:

    Put put = new Put(row);

    p.add(family,qualifier,value);

    说明:向表 tablename 添加 “family,qualifier,value”指定的值。

    示例代码:

    Connection connection = ConnectionFactory.createConnection(config);

    HTableInterface table = connection.getTable(TableName.valueOf("user"));

    Put put = new Put(Bytes.toBytes(rowKey));

    put.add(Bytes.toBytes(family), Bytes.toBytes(qualifier),Bytes.toBytes(value));

    table.put(put);

    1.9.  批量插入

    批量插入

    List<Put> list = new ArrayList<Put>();

    Put put = new Put(Bytes.toBytes(rowKey));//获取put,用于插入

    put.add(Bytes.toBytes(family), Bytes.toBytes(qualifier),Bytes.toBytes(value));//封装信息

    list.add(put);

    table.put(list);//添加记录

    1.10. 删除数据

    Delete

    包:org.apache.hadoop.hbase.client.Delete

    作用:删除给定rowkey的数据

    用法:

    Delete del= new Delete(Bytes.toBytes(rowKey));

    table.delete(del);

    代码实例

    Connection connection = ConnectionFactory.createConnection(config);

    HTableInterface table = connection.getTable(TableName.valueOf("user"));

    Delete del= new Delete(Bytes.toBytes(rowKey));

    table.delete(del);

    1.11. 单条查询

    Get

    包:org.apache.hadoop.hbase.client.Get

    作用:获取单个行的数据

    用法:

    HTable table = new HTable(config,Bytes.toBytes(tablename));

    Get get = new Get(Bytes.toBytes(row));

    Result result = table.get(get);

    说明:获取 tablename 表中 row 行的对应数据

    代码示例:

    Connection connection = ConnectionFactory.createConnection(config);

    HTableInterface table = connection.getTable(TableName.valueOf("user"));

    Get get = new Get(rowKey.getBytes());

    Result row = table.get(get);

    for (KeyValue kv : row.raw()) {

             System.out.print(new String(kv.getRow()) + " ");

             System.out.print(new String(kv.getFamily()) + ":");

             System.out.print(new String(kv.getQualifier()) + " = ");

             System.out.print(new String(kv.getValue()));

             System.out.print(" timestamp = " + kv.getTimestamp() + " ");

    }

    1.12. 批量查询

    ResultScanner

    包:org.apache.hadoop.hbase.client.ResultScanner

    作用:获取值的接口

    用法:

    ResultScanner scanner = table.getScanner(scan);

    For(Result rowResult : scanner){

            Bytes[] str = rowResult.getValue(family,column);

    }

    说明:循环获取行中列值。

    代码示例:

    Connection connection = ConnectionFactory.createConnection(config);

    HTableInterface table = connection.getTable(TableName.valueOf("user"));

    Scan scan = new Scan();

    scan.setStartRow("a1".getBytes());

    scan.setStopRow("a20".getBytes());

    ResultScanner scanner = table.getScanner(scan);

    for (Result row : scanner) {

             System.out.println(" Rowkey: " + new String(row.getRow()));

             for (KeyValue kv : row.raw()) {

                  System.out.print(new String(kv.getRow()) + " ");

                  System.out.print(new String(kv.getFamily()) + ":");

                  System.out.print(new String(kv.getQualifier()) + " = ");

                  System.out.print(new String(kv.getValue()));

                  System.out.print(" timestamp = " + kv.getTimestamp() + " ");

             }

    }

    1.13. hbase过滤器

    1.13.1.   FilterList

    FilterList 代表一个过滤器列表,可以添加多个过滤器进行查询,多个过滤器之间的关系有:

    与关系(符合所有):FilterList.Operator.MUST_PASS_ALL 

    或关系(符合任一):FilterList.Operator.MUST_PASS_ONE               

    使用方法:

    FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);   

    Scan s1 = new Scan();  

     filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes(“f1”),  Bytes.toBytes(“c1”),  CompareOp.EQUAL,Bytes.toBytes(“v1”) )  );  

    filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes(“f1”),  Bytes.toBytes(“c2”),  CompareOp.EQUAL,Bytes.toBytes(“v2”) )  );  

     // 添加下面这一行后,则只返回指定的cell,同一行中的其他cell不返回  

     s1.addColumn(Bytes.toBytes(“f1”), Bytes.toBytes(“c1”));  

     s1.setFilter(filterList);  //设置filter

     ResultScanner ResultScannerFilterList = table.getScanner(s1);  //返回结果列表

    1.13.2.   过滤器的种类

    过滤器的种类:

    列值过滤器—SingleColumnValueFilter

          过滤列植的相等、不等、范围等

    列名前缀过滤器—ColumnPrefixFilter

          过滤指定前缀的列名

    多个列名前缀过滤器—MultipleColumnPrefixFilter

           过滤多个指定前缀的列名

    rowKey过滤器—RowFilter

          通过正则,过滤rowKey值。

    1.13.3.  列值过滤器—SingleColumnValueFilter

    SingleColumnValueFilter 列值判断

    相等 (CompareOp.EQUAL ),

    不等(CompareOp.NOT_EQUAL),

    范围 (e.g., CompareOp.GREATER)…………

    下面示例检查列值和字符串'values' 相等...

    SingleColumnValueFilter f = new  SingleColumnValueFilter(Bytes.toBytes("cFamily") ,Bytes.toBytes("column"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("values"));

    s1.setFilter(f);

    注意:如果过滤器过滤的列在数据表中有的行中不存在,那么这个过滤器对此行无法过滤。

    1.13.4.   列名前缀过滤器—ColumnPrefixFilter

    过滤器—ColumnPrefixFilter

    ColumnPrefixFilter 用于指定列名前缀值相等

    ColumnPrefixFilter f = new ColumnPrefixFilter(Bytes.toBytes("values"));

    s1.setFilter(f);

    1.13.5.   多个列值前缀过滤器—MultipleColumnPrefixFilter

    MultipleColumnPrefixFilter 和 ColumnPrefixFilter 行为差不多,但可以指定多个前缀

    byte[][] prefixes = new byte[][] {Bytes.toBytes("value1"),Bytes.toBytes("value2")};

    Filter f = new MultipleColumnPrefixFilter(prefixes);

    s1.setFilter(f);

    1.13.6.  rowKey过滤器—RowFilter

    RowFilter 是rowkey过滤器

    通常根据rowkey来指定范围时,使用scan扫描器的StartRow和StopRow方法比较好。

    Filter f = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("^1234")); //匹配以1234开头的rowkey

    s1.setFilter(f);

    附录:Java API测试demo:

    package cn.darrenchan.hbase;
    
    import java.util.ArrayList;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.HColumnDescriptor;
    import org.apache.hadoop.hbase.HTableDescriptor;
    import org.apache.hadoop.hbase.MasterNotRunningException;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.ZooKeeperConnectionException;
    import org.apache.hadoop.hbase.client.Connection;
    import org.apache.hadoop.hbase.client.ConnectionFactory;
    import org.apache.hadoop.hbase.client.Delete;
    import org.apache.hadoop.hbase.client.Get;
    import org.apache.hadoop.hbase.client.HBaseAdmin;
    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.client.Table;
    import org.apache.hadoop.hbase.filter.ColumnPrefixFilter;
    import org.apache.hadoop.hbase.filter.CompareFilter;
    import org.apache.hadoop.hbase.filter.FilterList;
    import org.apache.hadoop.hbase.filter.FilterList.Operator;
    import org.apache.hadoop.hbase.filter.RegexStringComparator;
    import org.apache.hadoop.hbase.filter.RowFilter;
    import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
    import org.apache.hadoop.hbase.util.Bytes;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class HbaseTest {
    
        /**
         * 配置ss
         */
        static Configuration config = null;
        private Connection connection = null;
        private Table table = null;
    
        @Before
        public void init() throws Exception {
            config = HBaseConfiguration.create();// 配置
            config.set("hbase.zookeeper.quorum", "weekend05,weekend06,weekend07");// zookeeper地址
            config.set("hbase.zookeeper.property.clientPort", "2181");// zookeeper端口
            connection = ConnectionFactory.createConnection(config);
            table = connection.getTable(TableName.valueOf("user"));
        }
        
        /**
         * 创建一个表
         * 
         * @throws Exception
         */
        @Test
        public void createTable() throws Exception {
            // 创建表管理类
            HBaseAdmin admin = new HBaseAdmin(config); // hbase表管理
            // 创建表描述类
            TableName tableName = TableName.valueOf("test3"); // 表名称
            HTableDescriptor desc = new HTableDescriptor(tableName);
            // 创建列族的描述类
            HColumnDescriptor family = new HColumnDescriptor("info"); // 列族
            // 将列族添加到表中
            desc.addFamily(family);
            HColumnDescriptor family2 = new HColumnDescriptor("info2"); // 列族
            // 将列族添加到表中
            desc.addFamily(family2);
            // 创建表
            admin.createTable(desc); // 创建表
        }
    
        @Test
        @SuppressWarnings("deprecation")
        public void deleteTable() throws MasterNotRunningException,
                ZooKeeperConnectionException, Exception {
            HBaseAdmin admin = new HBaseAdmin(config);
            admin.disableTable("test3");
            admin.deleteTable("test3");
            admin.close();
        }
    
        /**
         * 向hbase中增加数据
         * 
         * @throws Exception
         */
        @Test
        public void insertData() throws Exception {
            table.setAutoFlushTo(false);
            table.setWriteBufferSize(534534534);
            ArrayList<Put> arrayList = new ArrayList<Put>();
            for (int i = 21; i < 50; i++) {
                Put put = new Put(Bytes.toBytes("1234"+i));
                put.add(Bytes.toBytes("info1"), Bytes.toBytes("name"), Bytes.toBytes("wangwu"+i));
                put.add(Bytes.toBytes("info1"), Bytes.toBytes("password"), Bytes.toBytes(1234+i));
                arrayList.add(put);
            }
            
            //插入数据
            table.put(arrayList);
            //提交
            table.flushCommits();
        }
    
        /**
         * 修改数据
         * 修改就是重复覆盖
         * 
         * @throws Exception
         */
        @Test
        public void updateData() throws Exception {
            Put put = new Put(Bytes.toBytes("1234"));
            put.add(Bytes.toBytes("info1"), Bytes.toBytes("col1"), Bytes.toBytes("qq"));
            put.add(Bytes.toBytes("info1"), Bytes.toBytes("col2"), Bytes.toBytes(904000612));
            put.add(Bytes.toBytes("info1"), Bytes.toBytes("col3"), Bytes.toBytes("男"));
            //插入数据
            table.put(put);
            //提交
            table.flushCommits();
        }
    
        /**
         * 删除数据
         * 
         * @throws Exception
         */
        @Test
        public void deleteDate() throws Exception {
            Delete delete = new Delete(Bytes.toBytes("1234"));
            //删除某一个列族
            //delete.addFamily(Bytes.toBytes("info1"));
            //删除某一列
            delete.addColumn(Bytes.toBytes("info1"), Bytes.toBytes("password"));
            table.delete(delete);
            table.flushCommits();
        }
    
        /**
         * 单条查询
         * 
         * @throws Exception
         */
        @Test
        public void queryData() throws Exception {
            Get get = new Get(Bytes.toBytes("1234"));
            // 可以指定查询某一个列
            // get.addColumn(Bytes.toBytes("info2"), Bytes.toBytes("password"));
            // 可以指定查询某一个列族
            // get.addFamily(Bytes.toBytes("info2"));
            Result result = table.get(get);
            System.out.println(Bytes.toInt(result.getValue(Bytes.toBytes("info1"), Bytes.toBytes("password"))));
            System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("info1"), Bytes.toBytes("namessss"))));
            System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("info1"), Bytes.toBytes("sex"))));
        }
    
        /**
         * 全表扫描
         * 
         * @throws Exception
         */
        @Test
        public void scanData() throws Exception {
            //设置全表扫描封装类
            Scan scan = new Scan();
            //scan.addFamily(Bytes.toBytes("info"));
            //scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("password"));
            //scan.setStartRow(Bytes.toBytes("wangsf_0")); //rowkey
            //scan.setStopRow(Bytes.toBytes("wangwu")); //rowkey
            ResultScanner scanner = table.getScanner(scan);
            for (Result result : scanner) {
                System.out.println(Bytes.toInt(result.getValue(Bytes.toBytes("info1"), Bytes.toBytes("password"))));
                System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("info1"), Bytes.toBytes("name"))));
                //System.out.println(Bytes.toInt(result.getValue(Bytes.toBytes("info2"), Bytes.toBytes("password"))));
                //System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("info2"), Bytes.toBytes("name"))));
            }
        }
    
        /**
         * 全表扫描的过滤器
         * 列值过滤器
         * 
         * @throws Exception
         */
        @Test
        public void scanDataByFilter1() throws Exception {
    
            // 创建全表扫描的scan
            Scan scan = new Scan();
            //过滤器:列值过滤器
            SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("info1"),
                    Bytes.toBytes("name"), CompareFilter.CompareOp.EQUAL,
                    Bytes.toBytes("wangwu21"));
            // 设置过滤器
            scan.setFilter(filter);
    
            // 打印结果集
            ResultScanner scanner = table.getScanner(scan);
            for (Result result : scanner) {
                System.out.println(Bytes.toString(result.getRow()));//row key
                System.out.println(Bytes.toInt(result.getValue(Bytes.toBytes("info1"), Bytes.toBytes("password"))));
                System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("info1"), Bytes.toBytes("name"))));
                System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("info1"), Bytes.toBytes("sex"))));
                //System.out.println(Bytes.toInt(result.getValue(Bytes.toBytes("info2"), Bytes.toBytes("password"))));
                //System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("info2"), Bytes.toBytes("name"))));
            }
    
        }
        /**
         * rowkey过滤器
         * @throws Exception
         */
        @Test
        public void scanDataByFilter2() throws Exception {
            
            // 创建全表扫描的scan
            Scan scan = new Scan();
            //匹配rowkey
            RowFilter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("^\d{4}2.$"));
            // 设置过滤器
            scan.setFilter(filter);
            // 打印结果集
            ResultScanner scanner = table.getScanner(scan);
            for (Result result : scanner) {
                System.out.println(Bytes.toString(result.getRow()));
                System.out.println(Bytes.toInt(result.getValue(Bytes.toBytes("info1"), Bytes.toBytes("password"))));
                System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("info1"), Bytes.toBytes("name"))));
                //System.out.println(Bytes.toInt(result.getValue(Bytes.toBytes("info2"), Bytes.toBytes("password"))));
                //System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("info2"), Bytes.toBytes("name"))));
            }
    
            
        }
        
        /**
         * 匹配列名前缀
         * @throws Exception
         */
        @Test
        public void scanDataByFilter3() throws Exception {
            
            // 创建全表扫描的scan
            Scan scan = new Scan();
            //匹配rowkey以wangsenfeng开头的
            ColumnPrefixFilter filter = new ColumnPrefixFilter(Bytes.toBytes("na"));
            // 设置过滤器
            scan.setFilter(filter);
            // 打印结果集
            ResultScanner scanner = table.getScanner(scan);
            for (Result result : scanner) {
                System.out.println("rowkey:" + Bytes.toString(result.getRow()));
                System.out.println("info:name:"
                        + Bytes.toString(result.getValue(Bytes.toBytes("info1"),
                                Bytes.toBytes("name"))));
                // 判断取出来的值是否为空
                if (result.getValue(Bytes.toBytes("info1"), Bytes.toBytes("age")) != null) {
                    System.out.println("info:age:"
                            + Bytes.toInt(result.getValue(Bytes.toBytes("info"),
                                    Bytes.toBytes("age"))));
                }
            }
            
        }
        /**
         * 过滤器集合
         * @throws Exception
         */
        @Test
        public void scanDataByFilter4() throws Exception {
            
            // 创建全表扫描的scan
            Scan scan = new Scan();
            //过滤器集合:MUST_PASS_ALL(and),MUST_PASS_ONE(or)
            FilterList filterList = new FilterList(Operator.MUST_PASS_ONE);
            //匹配rowkey以wangsenfeng开头的
            RowFilter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("^wangsenfeng"));
            //匹配name的值等于wangsenfeng
            SingleColumnValueFilter filter2 = new SingleColumnValueFilter(Bytes.toBytes("info"),
                    Bytes.toBytes("name"), CompareFilter.CompareOp.EQUAL,
                    Bytes.toBytes("zhangsan"));
            filterList.addFilter(filter);
            filterList.addFilter(filter2);
            // 设置过滤器
            scan.setFilter(filterList);
            // 打印结果集
            ResultScanner scanner = table.getScanner(scan);
            for (Result result : scanner) {
                System.out.println("rowkey:" + Bytes.toString(result.getRow()));
                System.out.println("info:name:"
                        + Bytes.toString(result.getValue(Bytes.toBytes("info"),
                                Bytes.toBytes("name"))));
                // 判断取出来的值是否为空
                if (result.getValue(Bytes.toBytes("info"), Bytes.toBytes("age")) != null) {
                    System.out.println("info:age:"
                            + Bytes.toInt(result.getValue(Bytes.toBytes("info"),
                                    Bytes.toBytes("age"))));
                }
                // 判断取出来的值是否为空
                if (result.getValue(Bytes.toBytes("info"), Bytes.toBytes("sex")) != null) {
                    System.out.println("infi:sex:"
                            + Bytes.toInt(result.getValue(Bytes.toBytes("info"),
                                    Bytes.toBytes("sex"))));
                }
                // 判断取出来的值是否为空
                if (result.getValue(Bytes.toBytes("info2"), Bytes.toBytes("name")) != null) {
                    System.out
                    .println("info2:name:"
                            + Bytes.toString(result.getValue(
                                    Bytes.toBytes("info2"),
                                    Bytes.toBytes("name"))));
                }
                // 判断取出来的值是否为空
                if (result.getValue(Bytes.toBytes("info2"), Bytes.toBytes("age")) != null) {
                    System.out.println("info2:age:"
                            + Bytes.toInt(result.getValue(Bytes.toBytes("info2"),
                                    Bytes.toBytes("age"))));
                }
                // 判断取出来的值是否为空
                if (result.getValue(Bytes.toBytes("info2"), Bytes.toBytes("sex")) != null) {
                    System.out.println("info2:sex:"
                            + Bytes.toInt(result.getValue(Bytes.toBytes("info2"),
                                    Bytes.toBytes("sex"))));
                }
            }
            
        }
    
        @After
        public void close() throws Exception {
            table.close();
            connection.close();
        }
    
    }
    View Code
  • 相关阅读:
    【算法】欧几里德算法--求最大公约数
    g++编译器的使用
    How arduino IDE works?
    【算法】反转链表
    判断一个数是否含有相同的数字
    Java集合ArrayList源码解读
    【算法】二分查找
    移动架构-原型模式
    移动架构-单例模式
    移动架构-简单工厂模式
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/6603069.html
Copyright © 2011-2022 走看看