Skip to content

Latest commit

 

History

History
257 lines (196 loc) · 8.66 KB

5、HBase-DML-API操作.md

File metadata and controls

257 lines (196 loc) · 8.66 KB

本Blog介绍HBase DML API操作,该部分所有的代码都可以点我直达!,当然我在代码中也添加了大量的注释,读者也完全可以自己看code!

因为HBase的链接是重量级的,所以不建议用的时候再去建立连接,而是直接创建一个单例的连接,用的时候直接去拿,创建连接在上一篇Blog有学习过

在这篇Blog种,主要就是DML操作了,DML操作主要用户HBase Connection的Table实例,本Blog包括以下内容:

向表格种插入数据 put :

public static void putCell(String namespace, String tableName, String rowKey, String columnFamily,
                           String columnName, String value) throws IOException {

    // 0、判断表是否存在
    if (!HBaseDDLTable.isTableExists(namespace, tableName)) {
        System.out.println("表" + namespace + ":" + tableName + "不存在,无法添加数据");
        return;
    }

    // 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();
}

读取某行的某一列 get :

public static void getCells(String namespace, String tableName, String rowKey, String columnFamily,
                            String columnName) throws IOException {
    // 0、判断表是否存在
    if (!HBaseDDLTable.isTableExists(namespace, tableName)) {
        System.out.println("表" + namespace + ":" + tableName + "不存在,无法添加数据");
        return;
    }

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

    // 2、读取对应的一行中的某一列
    // 2.1 创建Get对象
    Get get = new Get(Bytes.toBytes(rowKey));

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

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

    try {
        // 2.3 读取数据得到result对象
        Result result = table.get(get);

        // 2.4 处理数据
        Cell[] cells = result.rawCells();

        // 2.5 测试方法直接把数据打印到控制台
        // 实际开发中,数据应该返回交给额外的方法专门处理数据
        for (Cell cell : cells) {
            // cell存储数据比较底层
            String value = new String(CellUtil.cloneValue(cell));
            System.out.println(value);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

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

扫描表 getScanner :

public static void scanRows(String namespace, String tableName, String startRow,
                            String stopRow) throws IOException {
    // 0、判断表是否存在
    if (!HBaseDDLTable.isTableExists(namespace, tableName)) {
        System.out.println("表" + namespace + ":" + tableName + "不存在,无法扫描数据");
        return;
    }

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

    // 2、扫描表
    // 2.1 创建一个Scan对象
    Scan scan = new Scan();

    // 2.2 设置startRow,默认包含startRow这一行
    // 如果startRow的rowkey不存在,那么从最接近startRow的下一行开始scan
    scan.withStartRow(Bytes.toBytes(startRow));

    // 2.3 设置stopRow,默认不包含stopRow这一行
    scan.withStopRow(Bytes.toBytes(stopRow));

    // 2.4 得到结果
    try {
        ResultScanner scanner = table.getScanner(scan);
        // result来记录一行数据,cell[]
        // ResultScanner来记录多行数据,result[]
        for (Result result : scanner) {
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                String row = new String(CellUtil.cloneRow(cell));   // 行号
                String value = new String(CellUtil.cloneValue(cell));   // 值
                String family = new String(CellUtil.cloneFamily(cell));   // 列族
                String columnName = new String(CellUtil.cloneQualifier(cell));   // 列名
                System.out.print(row + "-" + family + "-" + columnName + "-" + value + "\t");
            }
            System.out.println();   // 换行输出
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

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

带过滤的扫描 getScanner :

public static void filterScan(String namespace, String tableName, String startRow, String stopRow,
                              String columnFamily, String columnName, String value) throws IOException {
    // 0、判断表是否存在
    if (!HBaseDDLTable.isTableExists(namespace, tableName)) {
        System.out.println("表" + namespace + ":" + tableName + "不存在,无法扫描数据");
        return;
    }

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

    // 2、带过滤的扫描
    // 2.1 创建一个scan对象
    Scan scan = new Scan();
    // 2.2 添加扫描的起始参数
    scan.withStartRow(Bytes.toBytes(startRow));
    scan.withStopRow(Bytes.toBytes(stopRow));

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

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

    //        filterList.addFilter(columnValueFilter);

    // (2) 结果保留整行数据,<b>结果同时会保留没用当前要过滤的列的数据</b>
    SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
        Bytes.toBytes(columnFamily),
        Bytes.toBytes(columnName),
        CompareOperator.EQUAL,
        Bytes.toBytes(value)
    );

    filterList.addFilter(singleColumnValueFilter);

    // 2.4 添加过滤器到scan对象
    scan.setFilter(filterList);

    try {
        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                String val = new String(CellUtil.cloneValue(cell));
                String column = new String(CellUtil.cloneQualifier(cell));
                String row = new String(CellUtil.cloneRow(cell));
                String family = new String(CellUtil.cloneFamily(cell));
                System.out.print(row + "-" + family + "-" + column + "-" + val + "\t");
            }
            System.out.println();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    // 3、释放table
    table.close();
}

删除一行中的一列数据 delete :

public static void deleteColumn(String namespace, String tableName, String rowKey, String columnFamily,
                                String columnName) throws IOException {
    // 0、判断表是否存在
    if (!HBaseDDLTable.isTableExists(namespace, tableName)) {
        System.out.println("表" + namespace + ":" + tableName + "不存在,无法删除数据");
        return;
    }

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

    // 2、删除数据
    try {
        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));
        table.delete(delete);
    } catch (IOException e) {
        e.printStackTrace();
    }

    // 3、释放table
    table.close();
}

参考资料