Hbase的API相关操作

hbase所需的相关maven依赖

<dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>2.1.7</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-common</artifactId>
            <version>2.1.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-mapreduce</artifactId>
            <version>2.1.7</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
        </dependency>
package com.briup.hbase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import java.util.NavigableMap;

/**
 * Created by Intellij IDEA.
 *
 * @author zhudezhong
 * @date 2021/8/10 21:33
 */
public class HbaseOperator {

    private Connection conn;
    private Admin admin;
    private Table table;

    /**
     * 获取hbase连接
     *
     * @throws IOException
     */
    @Before
    public void getConnection() throws IOException {
        //创建hbase的配置对象,他会自动去读取resour ce下的配置信息
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "192.168.10.129:2181");

        //连接hbase客户端
        conn = ConnectionFactory.createConnection(conf);
        //获取admin对象
        admin = conn.getAdmin();
    }

    /**
     * 同步创建命名空间
     *
     * @throws IOException
     */
    @Test
    public void createNS() throws IOException {

        NamespaceDescriptor.Builder nsd = NamespaceDescriptor.create("bd2101");
        nsd.addConfiguration("name", "briup");

        NamespaceDescriptor nd = nsd.build();

        System.out.println("准备创建命名空间。。。");
        admin.createNamespace(nd);
        System.out.println("创建命名空间成功");
    }

    /**
     * 列出所有的命名空间namespace
     *
     * @throws IOException
     */
    public void listNS() throws IOException {
        admin = conn.getAdmin();
        NamespaceDescriptor[] nds = admin.listNamespaceDescriptors();

        for (NamespaceDescriptor nd : nds) {
            System.out.println("namespacce => " + nd.getName());
        }
    }

    /**
     * 获取命名空间下所有的表
     *
     * @throws IOException
     */
    @Test
    public void list_NS_TB() throws IOException {
        admin = conn.getAdmin();

        //获取命名空间下的表对象
        TableName[] tableNames = admin.listTableNamesByNamespace("burup");
        for (TableName tb : tableNames) {
            System.out.println(tb.getName());
        }
    }

    /**
     * 删除命名空间
     *
     * @throws IOException
     */
    @Test
    public void deleteNS() throws IOException {
        admin = conn.getAdmin();
        admin.deleteNamespace("bd2101");
    }

    /**
     * 同步创建表
     *
     * @throws IOException
     */
    @Test
    public void createTB() throws IOException {
        admin = conn.getAdmin();

        //指定命名空间及表名
        TableName tableName = TableName.valueOf("bd2101:emp");

        TableDescriptorBuilder tdb = TableDescriptorBuilder.newBuilder(tableName);

        //指定列族f1
        ColumnFamilyDescriptorBuilder cfdb = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("f1"));
        ColumnFamilyDescriptor cfd = cfdb.build();
        tdb.setColumnFamily(cfd);

        TableDescriptor td = tdb.build();

        admin.createTable(td);
        System.out.println("表创建成功。。。");
    }

    /**
     * 删除表
     *
     * @throws IOException
     */
    @Test
    public void delete_TB() throws IOException {
        admin = conn.getAdmin();

        TableName tableName = TableName.valueOf("bd2101:emp");
        //让表失效
        admin.disableTable(tableName);

        //删除表
        admin.deleteTable(tableName);
        System.out.println("表删除成功。。。");
    }


    /**
     * 往hbase中放入数据
     *
     * @throws IOException
     */
    @Test
    public void put_TB() throws IOException {
        table = conn.getTable(TableName.valueOf("bd2101:emp"));

        //往表中放入10条数据
        for (int i = 0; i < 3; i++) {
            //指定行键rowkey
            Put put = new Put(Bytes.toBytes("40000" + i));
            put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("briup" + i));
            put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes(18 + i));
            put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("gender"), Bytes.toBytes("male"));

            //插入数据
            table.put(put);
        }
    }

    /**
     * 通过get的方式获取数据
     *
     * @throws IOException
     */
    @Test
    public void getTB() throws IOException {
        table = conn.getTable(TableName.valueOf("bd2101:emp"));

        //map<qu,value>
        //map<cf,map<qu,value>>
        //map<rk,map<cf,map<qu,value>>>
        //指定要获取的行键
        Get get = new Get(Bytes.toBytes("100000"));

        //拿到结果对象
        Result result = table.get(get);

        System.out.println(Bytes.toString(result.getRow()));
        //NavigableMap<列族,NavigableMap<表名,NavigableMap<时间版本,值>
        NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();

        showTables(map);
    }

    /**
     * 遍历输出hbase中的表数据
     * 基于列族输出表数据
     *
     * @param map NavigableMap<列族,NavigableMap<表名,NavigableMap<时间版本,值>
     */
    private static void showTables(NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map) {
        for (Map.Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> f : map.entrySet()) {
            System.out.print(" 列族:" + new String(f.getKey()));
            NavigableMap<byte[], NavigableMap<Long, byte[]>> qs = f.getValue();

            for (Map.Entry<byte[], NavigableMap<Long, byte[]>> q : qs.entrySet()) {
                System.out.print(" 表名:" + new String(q.getKey()));
                NavigableMap<Long, byte[]> values = q.getValue();
                for (Map.Entry<Long, byte[]> val : values.entrySet()) {
                    System.out.print(" 版本:" + val.getKey());
                    System.out.print(" 值:" + new String(val.getValue()));
                }
            }
        }
        System.out.println();
    }

    /**
     * 全表扫描 扫描用户已经提交的数据
     *
     * @throws IOException
     */
    @Test
    public void scanTB() throws IOException {
        table = conn.getTable(TableName.valueOf("bd2101:emp"));

        Scan scan = new Scan();

        ResultScanner scanner = table.getScanner(scan);

        for (Result result : scanner) {
            NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
            System.out.print("行键:" + Bytes.toString(result.getRow()));
            showTables(map);
        }
    }

    /**
     * 对扫描结果限制展示数据行
     *
     * @throws IOException
     */
    @Test
    public void scan_limit_TB() throws IOException {
        table = conn.getTable(TableName.valueOf("bd2101:emp"));

        Scan scan = new Scan();
        //限制展示4行数据
        scan.setLimit(4);

        ResultScanner scanner = table.getScanner(scan);

        for (Result result : scanner) {
            NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();

            System.out.println("行键:" + Bytes.toString(result.getRow()));
            showTables(map);
        }
    }

    /**
     * 行键前缀过滤器
     *
     * @throws IOException
     */
    @Test
    public void scan_Filter() throws IOException {
        table = conn.getTable(TableName.valueOf("bd2101:emp"));

        Scan scan = new Scan();

        //行键前缀为20过滤
        PrefixFilter filter = new PrefixFilter(Bytes.toBytes("10"));
        scan.setFilter(filter);

        ResultScanner scanner = table.getScanner(scan);

        for (Result result : scanner) {
            NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
            System.out.print("行键:" + Bytes.toString(result.getRow()));
            showTables(map);
        }
    }

    /**
     * 行键过滤器,不获取值
     *
     * @throws IOException
     */
    @Test
    public void scan_Filter1() throws IOException {
        table = conn.getTable(TableName.valueOf("bd2101:emp"));

        Scan scan = new Scan();

        //行键过滤器,不获取值
        Filter filter = new KeyOnlyFilter();
        scan.setFilter(filter);

        ResultScanner scanner = table.getScanner(scan);

        for (Result result : scanner) {
            NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
            System.out.print("行键:" + Bytes.toString(result.getRow()));
            showTables(map);
        }
    }

    /**
     * 随机行键过滤器
     *
     * @throws IOException
     */
    @Test
    public void scan_Filter2() throws IOException {
        table = conn.getTable(TableName.valueOf("bd2101:emp"));

        Scan scan = new Scan();

        //随机行键过滤器
        RandomRowFilter filter = new RandomRowFilter(0.5f);
        scan.setFilter(filter);

        ResultScanner scanner = table.getScanner(scan);

        for (Result result : scanner) {
            NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
            System.out.print("行键:" + Bytes.toString(result.getRow()));
            showTables(map);
        }
    }

    /**
     * 行键范围过滤器
     * @throws IOException
     */
    @Test
    public void scan_Filter3() throws IOException {
        table = conn.getTable(TableName.valueOf("bd2101:emp"));

        Scan scan = new Scan();

        ArrayList<MultiRowRangeFilter.RowRange> list = new ArrayList<>();
        //行键范围过滤器
        /*
        	有个问题:new MultiRowRangeFilter.RowRange("1000", true, "400", true)中的第二个true参数,表示是否过滤第二个行键“400”,为true表示包含,false表示不包含,但是这里在代码中没有体现出来
        */
        list.add(new MultiRowRangeFilter.RowRange("1000", true, "400", true));

        MultiRowRangeFilter filter = new MultiRowRangeFilter(list);
        scan.setFilter(filter);

        ResultScanner scanner = table.getScanner(scan);

        for (Result result : scanner) {
            NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
            System.out.print("行键:" + Bytes.toString(result.getRow()));
            showTables(map);
        }
    }

    /**
     * 值过滤器,过滤值等于“jake0”的数据
     * @throws IOException
     */
    @Test
    public void scan_Filter4() throws IOException {
        table = conn.getTable(TableName.valueOf("bd2101:emp"));

        Scan scan = new Scan();

        //值范围过滤器, 过滤值等于“jake0”的值
        ValueFilter filter = new ValueFilter(CompareOperator.EQUAL, new BinaryComparator(Bytes.toBytes("jake0")));

        scan.setFilter(filter);

        ResultScanner scanner = table.getScanner(scan);

        for (Result result : scanner) {
            NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
            System.out.print("行键:" + Bytes.toString(result.getRow()));
            showTables(map);
        }
    }

    @Test
    public void scan_Filter5() throws IOException {
        table = conn.getTable(TableName.valueOf("bd2101:emp"));

        Scan scan = new Scan();

        //值范围过滤器, 过滤值包含“ja”的值
        ValueFilter filter = new ValueFilter(CompareOperator.EQUAL, new RegexStringComparator(".*ja.*"));

        scan.setFilter(filter);

        ResultScanner scanner = table.getScanner(scan);

        for (Result result : scanner) {
            NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
            System.out.print("行键:" + Bytes.toString(result.getRow()));
            showTables(map);
        }
    }

    /**
     * 关闭资源
     *
     * @throws IOException
     */
    @After
    public void close() throws IOException {
        if (conn != null) {
            conn.close();
        }
        if (admin != null) {
            admin.close();
        }
        if (table != null) {
            table.close();
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A_Zhong20

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值