Hbase API

环境准备

新建maven项目后在 pom.xml 中添加依赖:
在这里插入图片描述

<dependencies>
 <dependency>
 <groupId>org.apache.hbase</groupId>
 <artifactId>hbase-server</artifactId>
 <version>2.4.11</version>
 <exclusions>
 <exclusion>
 <groupId>org.glassfish</groupId>
 <artifactId>javax.el</artifactId>
 </exclusion>
 </exclusions>
 </dependency>
 <dependency>
 <groupId>org.glassfish</groupId>
 <artifactId>javax.el</artifactId>
 <version>3.0.1-b06</version>
 </dependency>
</dependencies>

单线程创建连接

在这里插入图片描述
运行,成功获取连接
在这里插入图片描述

多线程创建连接

在这里插入图片描述

在 resources 文件夹中创建配置文件 hbase-site.xml,添加以下内容

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
 <property>
 <name>hbase.zookeeper.quorum</name>
 <value>hadoop100,hadoop101,hadoop102</value>
 </property>
</configuration>

注意映射和你的集群配置一致
在这里插入图片描述
丢给个main线程跑一下,记得调用关闭连接
在这里插入图片描述

DDL

import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;

import java.io.IOException;

public class HbaseDDL {
    //添加静态属性 connection 指向单例连接
    public static Connection connection = HbaseConnect.connection;

    /**
     * 创建命名空间
     *
     * @param namespace 命名空间名称
     */

    public static void createNamespace(String namespace) throws IOException {
        //1.获取admin
        // admin 的连接是轻量级的 不是线程安全的 不推荐池化或者缓存这个连接
        Admin admin = connection.getAdmin();

        //2.1 创建命名空间builder => 设计师
        NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);

        //2.2 给命名空间添加描述
        builder.addConfiguration("user", "lbw");

        //2.3 使用 builder 构造出对应的添加完参数的对象 完成创建
        // 创建命名空间出现的问题 都属于方法本身的问题 不应该抛出
        try {
            admin.createNamespace(builder.build());
        } catch (IOException e){
            System.out.println("命名空间已经存在");
            e.printStackTrace();
        }

        //3.关闭admin
        admin.close();
    }

    public static void main(String[] args) throws IOException {
        //测试创建命名空间
        createNamespace("myNSpace");

        //提示
        System.out.println("命名空间创建过程已结束");

        //关闭Hbase连接
        HbaseConnect.closeConnection();
    }

}

在这里插入图片描述

测试一下
在这里插入图片描述
在shell上查看命名空间是否成功被创建
在这里插入图片描述
可以看见之前添加的描述(无实际意义,可不添加)
在这里插入图片描述

加上判断表格是否存在的方法

public static boolean isTableExists(String namespace, String tableName) throws IOException {
        //1.获取admin
        Admin admin = connection.getAdmin();

        //2.使用方法判断表格是否存在
        boolean b = false;
        try {
            b = admin.tableExists(TableName.valueOf(namespace, tableName));
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3.关闭admin
        admin.close();

        //3.返回结果
        return b;
    }

在这里插入图片描述

测试一下该方法,可以看见我的bigdata命名空间中是存在一张 student 表格的
在这里插入图片描述

判断是否存在结果为true
在这里插入图片描述

添加创建表格方法

    public static void createTable(String namespace, String tableName, String... columnFamilies) throws IOException {
       //判断是否至少有一个列族
       if (columnFamilies.length == 0) {
           System.out.println("创建表格至少有一个列族");
           return;
       }

       //判断表格是否存在
       if (isTableExists(namespace, tableName)) {
           System.out.println("表格已经存在");
           return;
       }

       //1.获取admin
       Admin admin = connection.getAdmin();

       //2.1创建表格描述的builder
       TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));

       //2.2添加参数
       for (String columnFamily : columnFamilies) {
           //2.3创建列族描述的builder
           ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));

           //2.4对应当前的列族添加参数
           //添加版本参数
           columnFamilyDescriptorBuilder.setMaxVersions(5);

           //2.5 创建添加完参数的列族描述
           tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());
       }

       //2.6创建对应的表格描述
       try {
           admin.createTable(tableDescriptorBuilder.build());
       } catch (IOException e) {
           e.printStackTrace();
       }

       //3.关闭admin
       admin.close();
   }

测试
在这里插入图片描述
创建成功
在这里插入图片描述

查看被创建的表格的详情(列族信息、版本数等)
在这里插入图片描述

添加修改表的方法

	/**
     * 修改表格中一个列族的版本数
     *
     * @param namespace    命名空间名称
     * @param tableName    表格名称
     * @param columnFamily 列族名称
     * @param version      版本
     */
public static void modifyTable(String namespace, String tableName, String columnFamily, int version) throws IOException {

        //判断表格是否存在
        if (!isTableExists(namespace, tableName)) {
            System.out.println("表格不存在无法修改");
            return;
        }

        //1.获取admin
        Admin admin = connection.getAdmin();

        try {
            //2.0 获取之前的表格描述
            TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace, tableName));

            //2.1 创建一个表格描述builder
            //如果使用填写 tableName 的方法 相当于创建了一个新的表格描述builder 没有之前的的信息
            //如果想要修改之前的信息 必须调用方法填写一格旧的表格描述
            TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(descriptor);

            //2.2 对应builder进行表格数据修改
            ColumnFamilyDescriptor columnFamily1 = descriptor.getColumnFamily(Bytes.toBytes(columnFamily));

            //创建列族描述builder
            //需要填写旧的列族描述
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(columnFamily1);

            //修改对应的版本
            columnFamilyDescriptorBuilder.setMaxVersions(version);

            tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());

            admin.modifyTable(tableDescriptorBuilder.build());
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3.关闭admin
        admin.close();
    }

测试
在这里插入图片描述

VERSIONS 成功修改为2
在这里插入图片描述

添加删除表的方法

    /**
     * 删除表格
     *
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @return true 表示删除成功
     */
    public static boolean deleteTable(String namespace, String tableName) throws IOException {
        //1.判断表格是否存在
        if (!isTableExists(namespace, tableName)) {
            System.out.println("表格不存在 无法删除");
            return false;
        }

        //2.获取admin
        Admin admin = connection.getAdmin();

        //3.调用相关的方法删除表格
        try {
            // HBase 删除表格之前 一定要先标记表格为不可用
            TableName tableName1 = TableName.valueOf(namespace, tableName);
            admin.disableTable(tableName1);
            admin.deleteTable(tableName1);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //4.关闭admin
        admin.close();

        return true;
    }

测试
在这里插入图片描述

order表删除成功
在这里插入图片描述

DDL完整版,需要什么功能调什么方法就行

import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class HbaseDDL {
    //添加静态属性 connection 指向单例连接
    public static Connection connection = HbaseConnect.connection;

    /**
     * 创建命名空间
     *
     * @param namespace 命名空间名称
     */

    public static void createNamespace(String namespace) throws IOException {
        //1.获取admin
        // admin 的连接是轻量级的 不是线程安全的 不推荐池化或者缓存这个连接
        Admin admin = connection.getAdmin();

        //2.1 创建命名空间builder => 设计师
        NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);

        //2.2 给命名空间添加描述
        builder.addConfiguration("user", "lbw");

        //2.3 使用 builder 构造出对应的添加完参数的对象 完成创建
        // 创建命名空间出现的问题 都属于方法本身的问题 不应该抛出
        try {
            admin.createNamespace(builder.build());
        } catch (IOException e) {
            System.out.println("命名空间已经存在");
            e.printStackTrace();
        }

        //3.关闭admin
        admin.close();
    }

    /**
     * 判断表格是否存在
     *
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @return ture 表示存在
     */
    public static boolean isTableExists(String namespace, String tableName) throws IOException {
        //1.获取admin
        Admin admin = connection.getAdmin();

        //2.使用方法判断表格是否存在
        boolean b = false;
        try {
            b = admin.tableExists(TableName.valueOf(namespace, tableName));
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3.关闭admin
        admin.close();

        //3.返回结果
        return b;
    }

    /**
     * 创建表格
     *
     * @param namespace      命名空间名称
     * @param tableName      表格名称
     * @param columnFamilies 列族名称 可以有多个
     */
    public static void createTable(String namespace, String tableName, String... columnFamilies) throws IOException {
        //判断是否至少有一个列族
        if (columnFamilies.length == 0) {
            System.out.println("创建表格至少有一个列族");
            return;
        }

        //判断表格是否存在
        if (isTableExists(namespace, tableName)) {
            System.out.println("表格已经存在");
            return;
        }

        //1.获取admin
        Admin admin = connection.getAdmin();

        //2.1创建表格描述的builder
        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));

        //2.2添加参数
        for (String columnFamily : columnFamilies) {
            //2.3创建列族描述的builder
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));

            //2.4对应当前的列族添加参数
            //添加版本参数
            columnFamilyDescriptorBuilder.setMaxVersions(5);

            //2.5 创建添加完参数的列族描述
            tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());
        }

        //2.6创建对应的表格描述
        try {
            admin.createTable(tableDescriptorBuilder.build());
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3.关闭admin
        admin.close();
    }

    /**
     * 修改表格中一个列族的版本
     *
     * @param namespace    命名空间名称
     * @param tableName    表格名称
     * @param columnFamily 列族名称
     * @param version      版本
     */
    public static void modifyTable(String namespace, String tableName, String columnFamily, int version) throws IOException {

        //判断表格是否存在
        if (!isTableExists(namespace, tableName)) {
            System.out.println("表格不存在无法修改");
            return;
        }

        //1.获取admin
        Admin admin = connection.getAdmin();

        try {
            //2.0 获取之前的表格描述
            TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace, tableName));

            //2.1 创建一个表格描述builder
            //如果使用填写 tableName 的方法 相当于创建了一个新的表格描述builder 没有之前的的信息
            //如果想要修改之前的信息 必须调用方法填写一格旧的表格描述
            TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(descriptor);

            //2.2 对应builder进行表格数据修改
            ColumnFamilyDescriptor columnFamily1 = descriptor.getColumnFamily(Bytes.toBytes(columnFamily));

            //创建列族描述builder
            //需要填写旧的列族描述
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(columnFamily1);

            //修改对应的版本
            columnFamilyDescriptorBuilder.setMaxVersions(version);

            tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());

            admin.modifyTable(tableDescriptorBuilder.build());
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3.关闭admin
        admin.close();
    }

    /**
     * 删除表格
     *
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @return true 表示删除成功
     */
    public static boolean deleteTable(String namespace, String tableName) throws IOException {
        //1.判断表格是否存在
        if (!isTableExists(namespace, tableName)) {
            System.out.println("表格不存在 无法删除");
            return false;
        }

        //2.获取admin
        Admin admin = connection.getAdmin();

        //3.调用相关的方法删除表格
        try {
            // HBase 删除表格之前 一定要先标记表格为不可用
            TableName tableName1 = TableName.valueOf(namespace, tableName);
            admin.disableTable(tableName1);
            admin.deleteTable(tableName1);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //4.关闭admin
        admin.close();

        return true;
    }


    public static void main(String[] args) throws IOException {
        //需要什么调用什么方法
        

        //关闭连接
        HbaseConnect.closeConnection();
    }

}

DML

插入数据

import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class HBaseDML {

    //添加静态属性connection指向单例连接
    public static Connection connection = HbaseConnect.connection;

    /**
     * 插入数据
     *
     * @param namespace    命名空间名称
     * @param tableName    表格名称
     * @param rowKey       主键
     * @param columnFamily 列族名称
     * @param columnName   列名
     * @param value        值
     */
    public static void putCell(String namespace, String tableName, String rowKey, String columnFamily, String columnName, String value) throws IOException {
        //1.获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

        //2. 调用相关方法插入数据
        //2.1 创建put对象
        Put put = new Put(Bytes.toBytes(rowKey));

        //2.2 给put对象添加数据
        put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName), Bytes.toBytes(value));

        //2.3 给put对象添加数据
        try {
            table.put(put);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3.关闭table
        table.close();
    }

}

测试
在这里插入图片描述

数据插入成功
在这里插入图片描述

添加读取数据方法

    /**
     * 读取数据 读取对应的一行中的某一列
     *
     * @param namespace    命名空间名称
     * @param tableName    表格名称
     * @param rowKey       主键
     * @param columnFamily 列族名称
     * @param columnName   列名
     */
    public static void getCells(String namespace, String tableName, String rowKey, String columnFamily, String columnName) throws IOException {
        //1.获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

        //2.创建get对象
        Get get = new Get(Bytes.toBytes(rowKey));

        //如果直接调用get方法读取数据 此时读一整行数据
        //如果想读取某一列的数据 需要添加对应的参数
        get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));

        //设置读取数据的版本
        get.readAllVersions();

        try {
            //读取数据 得到result对象
            Result result = table.get(get);
            //处理数据
            Cell[] cells = result.rawCells();

            //测试方法: 直接把读取的数据打印到控制台
            //如果是实际开发 需要再额外写方法 对应处理数据
            for (Cell cell : cells) {
                // cell 存储数据比较底层
                String value = new String(CellUtil.cloneValue(cell));
                System.out.println(value);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        //关闭table
        table.close();
    }

测试
在这里插入图片描述

添加扫描数据方法

    /**
     * 扫描数据
     *
     * @param namespace 命名空间
     * @param tableName 表格名称
     * @param startRow  开始的 row 包含的
     * @param stopRow   结束的 row 不包含
     */
    public static void scanRows(String namespace, String tableName, String startRow, String stopRow) throws IOException {
        //1.获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

        //2.创建scan对象
        Scan scan = new Scan();
        //如果此时直接调用 会直接扫描整张表

        //添加参数 来控制扫描的数据
        //默认包含
        scan.withStartRow(Bytes.toBytes(startRow));
        //默认不包含
        scan.withStopRow(Bytes.toBytes(stopRow));

        try {
            // 读取多行数据 获得scanner
            ResultScanner scanner = table.getScanner(scan);
            // result 来记录一行数据   cell数组
            // ResultScanner 来记录多行数据 result 的数组
            for (Result result : scanner) {
                Cell[] cells = result.rawCells();

                for (Cell cell : cells) {
                    System.out.println(
                            new String(CellUtil.cloneRow(cell)) + "-" +
                                    new String(CellUtil.cloneFamily(cell)) + "-" +
                                    new String(CellUtil.cloneQualifier(cell)) + "-" +
                                    new String(CellUtil.cloneValue(cell)) + "\t");
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3.关闭table
        table.close();
    }

测试
在这里插入图片描述

添加带过滤的扫描方法

    /**
     * 带过滤的扫描
     *
     * @param namespace    命名空间
     * @param tableName    表格名称
     * @param startRow     开始 row
     * @param stopRow      结束 row
     * @param columnFamily 列族名称
     * @param columnName   列名
     * @param value        value 值
     */
    public static void filterScan(String namespace, String tableName, String startRow, String stopRow, String columnFamily, String columnName, String value) throws IOException {
        //1.获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

        //2.创建scan对象
        Scan scan = new Scan();

        //如果此时直接调用 会直接扫描整张表

        //添加参数 来控制扫描的数据
        //默认包含
        scan.withStartRow(Bytes.toBytes(startRow));
        //默认不包含
        scan.withStopRow(Bytes.toBytes(stopRow));

        //可以添加多个过滤
        FilterList filterList = new FilterList();

        //创建过滤器
        //结果只保留当前列的数据
        ColumnValueFilter columnValueFilter = new ColumnValueFilter(
                //列族名称
                Bytes.toBytes(columnFamily),
                //列名
                Bytes.toBytes(columnName),
                //比较关系
                CompareOperator.EQUAL,
                //值
                Bytes.toBytes(value)
        );

        //结果保留整行数据
        //结果同时会保留没有当前列的数据
        SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
                //列族名称
                Bytes.toBytes(columnFamily),
                //列名
                Bytes.toBytes(columnName),
                //比较关系
                CompareOperator.EQUAL,
                //值
                Bytes.toBytes(value)
        );

        //本身可以添加多个过滤器
        filterList.addFilter(singleColumnValueFilter);

        //添加过滤
        scan.setFilter(filterList);

        try {
            //读取多行数据 获得scanner
            ResultScanner scanner = table.getScanner(scan);
            //result 来记录一行数据    cell数组
            //ResultScanner 来记录多行数据 result 的数组
            for (Result result : scanner) {
                Cell[] cells = result.rawCells();

                for (Cell cell : cells) {
                    System.out.print(new
                            String(CellUtil.cloneRow(cell)) + "-" + new
                            String(CellUtil.cloneFamily(cell)) + "-" + new
                            String(CellUtil.cloneQualifier(cell)) + "-" + new
                            String(CellUtil.cloneValue(cell)) + "\t");
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3.关闭table
        table.close();

    }

看似好像没过滤成功
在这里插入图片描述

其实是过滤器策略如此
在这里插入图片描述

换个过滤器策略就行了
在这里插入图片描述

没毛病
在这里插入图片描述

添加删除数据的方法

这里只删除一个版本,需要删除全部版本或者列族把对应的注释去掉就行了

    /**
     * 删除 column 数据
     *
     * @param nameSpace
     * @param tableName
     * @param rowKey
     * @param family
     * @param column
     * @throws IOException
     */
    public static void deleteColumn(String nameSpace, String tableName, String rowKey, String family, String column) throws IOException {
        //1.获取table
        Table table = connection.getTable(TableName.valueOf(nameSpace, tableName));

        //2.创建Delete对象
        Delete delete = new Delete(Bytes.toBytes(rowKey));

        //3.添加删除信息
        //3.1删除单个版本
        delete.addColumn(Bytes.toBytes(family), Bytes.toBytes(column));
        //3.2删除所有版本
//        delete.addColumns(Bytes.toBytes(family),Bytes.toBytes(column));
        //3.3删除列族
//        delete.addFamily(Bytes.toBytes(family));

        //4.删除数据
        table.delete(delete);

        //5.关闭资源
        table.close();
    }

测试
在这里插入图片描述

可见 列族为msg 列名为address 的那条数据被删掉了

在这里插入图片描述

DML完整版

对删除数据方法中删掉的东西和带过滤的扫描中的过滤策略可以稍做修改达到不同的效果

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class HBaseDML {

    //添加静态属性connection指向单例连接
    public static Connection connection = HbaseConnect.connection;

    /**
     * 插入数据
     *
     * @param namespace    命名空间名称
     * @param tableName    表格名称
     * @param rowKey       主键
     * @param columnFamily 列族名称
     * @param columnName   列名
     * @param value        值
     */
    public static void putCell(String namespace, String tableName, String rowKey, String columnFamily, String columnName, String value) throws IOException {
        //1.获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

        //2. 调用相关方法插入数据
        //2.1 创建put对象
        Put put = new Put(Bytes.toBytes(rowKey));

        //2.2 给put对象添加数据
        put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName), Bytes.toBytes(value));

        //2.3 给put对象添加数据
        try {
            table.put(put);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3.关闭table
        table.close();
    }

    /**
     * 读取数据 读取对应的一行中的某一列
     *
     * @param namespace    命名空间名称
     * @param tableName    表格名称
     * @param rowKey       主键
     * @param columnFamily 列族名称
     * @param columnName   列名
     */
    public static void getCells(String namespace, String tableName, String rowKey, String columnFamily, String columnName) throws IOException {
        //1.获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

        //2.创建get对象
        Get get = new Get(Bytes.toBytes(rowKey));

        //如果直接调用get方法读取数据 此时读一整行数据
        //如果想读取某一列的数据 需要添加对应的参数
        get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));

        //设置读取数据的版本
        get.readAllVersions();

        try {
            //读取数据 得到result对象
            Result result = table.get(get);
            //处理数据
            Cell[] cells = result.rawCells();

            //测试方法: 直接把读取的数据打印到控制台
            //如果是实际开发 需要再额外写方法 对应处理数据
            for (Cell cell : cells) {
                // cell 存储数据比较底层
                String value = new String(CellUtil.cloneValue(cell));
                System.out.println(value);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        //关闭table
        table.close();
    }

    /**
     * 扫描数据
     *
     * @param namespace 命名空间
     * @param tableName 表格名称
     * @param startRow  开始的 row 包含的
     * @param stopRow   结束的 row 不包含
     */
    public static void scanRows(String namespace, String tableName, String startRow, String stopRow) throws IOException {
        //1.获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

        //2.创建scan对象
        Scan scan = new Scan();
        //如果此时直接调用 会直接扫描整张表

        //添加参数 来控制扫描的数据
        //默认包含
        scan.withStartRow(Bytes.toBytes(startRow));
        //默认不包含
        scan.withStopRow(Bytes.toBytes(stopRow));

        try {
            // 读取多行数据 获得scanner
            ResultScanner scanner = table.getScanner(scan);
            // result 来记录一行数据   cell数组
            // ResultScanner 来记录多行数据 result 的数组
            for (Result result : scanner) {
                Cell[] cells = result.rawCells();

                for (Cell cell : cells) {
                    System.out.println(new
                            String(CellUtil.cloneRow(cell)) + "-" + new
                            String(CellUtil.cloneFamily(cell)) + "-" + new
                            String(CellUtil.cloneQualifier(cell)) + "-" + new
                            String(CellUtil.cloneValue(cell)) + "\t");
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3.关闭table
        table.close();
    }

    /**
     * 带过滤的扫描
     *
     * @param namespace    命名空间
     * @param tableName    表格名称
     * @param startRow     开始 row
     * @param stopRow      结束 row
     * @param columnFamily 列族名称
     * @param columnName   列名
     * @param value        value 值
     */
    public static void filterScan(String namespace, String tableName, String startRow, String stopRow, String columnFamily, String columnName, String value) throws IOException {
        //1.获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

        //2.创建scan对象
        Scan scan = new Scan();

        //如果此时直接调用 会直接扫描整张表

        //添加参数 来控制扫描的数据
        //默认包含
        scan.withStartRow(Bytes.toBytes(startRow));
        //默认不包含
        scan.withStopRow(Bytes.toBytes(stopRow));

        //可以添加多个过滤
        FilterList filterList = new FilterList();

        //创建过滤器
        //结果只保留当前列的数据
        ColumnValueFilter columnValueFilter = new ColumnValueFilter(
                //列族名称
                Bytes.toBytes(columnFamily),
                //列名
                Bytes.toBytes(columnName),
                //比较关系
                CompareOperator.EQUAL,
                //值
                Bytes.toBytes(value)
        );

        //结果保留整行数据
        //结果同时会保留没有当前列的数据
        SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
                //列族名称
                Bytes.toBytes(columnFamily),
                //列名
                Bytes.toBytes(columnName),
                //比较关系
                CompareOperator.EQUAL,
                //值
                Bytes.toBytes(value)
        );

        //本身可以添加多个过滤器
        filterList.addFilter(columnValueFilter);

        //添加过滤
        scan.setFilter(filterList);

        try {
            //读取多行数据 获得scanner
            ResultScanner scanner = table.getScanner(scan);
            //result 来记录一行数据    cell数组
            //ResultScanner 来记录多行数据 result 的数组
            for (Result result : scanner) {
                Cell[] cells = result.rawCells();

                for (Cell cell : cells) {
                    System.out.print(new
                            String(CellUtil.cloneRow(cell)) + "-" + new
                            String(CellUtil.cloneFamily(cell)) + "-" + new
                            String(CellUtil.cloneQualifier(cell)) + "-" + new
                            String(CellUtil.cloneValue(cell)) + "\t");
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3.关闭table
        table.close();

    }

    /**
     * 删除 column 数据
     *
     * @param nameSpace
     * @param tableName
     * @param rowKey
     * @param family
     * @param column
     * @throws IOException
     */
    public static void deleteColumn(String nameSpace, String tableName, String rowKey, String family, String column) throws IOException {
        //1.获取table
        Table table = connection.getTable(TableName.valueOf(nameSpace, tableName));

        //2.创建Delete对象
        Delete delete = new Delete(Bytes.toBytes(rowKey));

        //3.添加删除信息
        //3.1删除单个版本
        delete.addColumn(Bytes.toBytes(family), Bytes.toBytes(column));
        //3.2删除所有版本
//        delete.addColumns(Bytes.toBytes(family),Bytes.toBytes(column));
        //3.3删除列族
//        delete.addFamily(Bytes.toBytes(family));

        //4.删除数据
        table.delete(delete);

        //5.关闭资源
        table.close();
    }


    public static void main(String[] args) throws IOException {
        //需要什么调什么方法
        

        //关闭连接
        HbaseConnect.closeConnection();
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值