HBase2.x(六)HBase API DML的操作

该博客详细介绍了如何使用 Java API 对 HBase 进行数据的插入、读取、扫描和过滤操作,以及如何删除数据。示例代码展示了在不同场景下如何有效地操作 HBase 表,包括指定命名空间、表格、主键、列族和列名等参数。此外,还提供了带过滤的扫描数据功能,用于精确查询特定条件的数据。
摘要由CSDN通过智能技术生成

创建类 HBaseDML

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


        //读取多行数据,获得scanner
        try {
            ResultScanner scanner = null;
            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();
        }

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

过滤扫描数据

 /**
     * 带过滤的扫描数据
     *
     * @param namespace    命名空间
     * @param tableName    表格名称
     * @param startRow     开始的 row 包含的
     * @param stopRow      结束的 row 不包含
     * @param columnFamily 列族名称
     * @param columnName   列名称
     * @param value        value值
     */
    public static void filterRows(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();

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


        //(2) 结果保留整行数据
        SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
                //列族名称
                Bytes.toBytes(columnFamily),
                //列名
                Bytes.toBytes(columnName),
                //比较关系
                CompareOperator.EQUAL,
                //值
                Bytes.toBytes(value)
        );


//        filterList.addFilter(columnValueFilter);
        filterList.addFilter(singleColumnValueFilter);

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

        //读取多行数据,获得scanner
        try {
            ResultScanner scanner = null;
            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();
        }

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

删除数据

    /**
     * 删除一行中的一列数据
     *
     * @param namespace    命名空间名称
     * @param tableName    表格名称
     * @param rowKey       主键
     * @param columnFamily 列族
     * @param columnName   列名
     */
    public static void deleteColumn(String namespace, String tableName, String rowKey, String columnFamily, String columnName) throws IOException {

        //1. 获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

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

        // 添加列信息
        // addColumn删除一个版本
        delete.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(columnName));

        // addColumns删除所有的版本
        //按照逻辑需要删除所有版本的数据
        //delete.addColumns(Bytes.toBytes(columnFamily),Bytes.toBytes(columnName));

        try {
            table.delete(delete);
        }catch (IOException e){
            e.printStackTrace();
        }

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

DML主程序

public class TheProgramDML {
    public static void main(String[] args) throws IOException {

        //添加数据
//        putCell("bigdata","huanhuan","1001","info","name","欢欢");
//        putCell("bigdata","huanhuan","2001","info","name","欢欢");
//        putCell("bigdata","huanhuan","1001","info","name","呆哥");
//        putCell("bigdata","huanhuan","1001","info","name","昊哥");
//
//
//        //读取数据
//        getCells("bigdata","huanhuan","1001","info","name");
//
//        //扫描数据
//        scanRows("bigdata","huanhuan","1001","1002");
//
//        //测试过滤扫描数据
//        filterRows("bigdata","huanhuan","1001","1002","info","name","欢欢");

        //删除数据
        deleteColumn("bigdata","huanhuan","1001","info","name");

        //测试成功
        System.out.println("测试成功");

        //关闭连接
        HBaseConnection.closeConnection();

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值