IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Hbase的API相关操作 -> 正文阅读

[大数据]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();
        }
    }

}

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:40:01  更:2021-08-12 16:40:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:55:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码