【Hbase】hbase java api 增删改查

倖福魔咒の 提交于 2020-02-13 01:02:07

几个主要 Hbase API 类和数据模型之间的对应关系:

java类 HBase 数据模型
Admin 数据库(DataBase)
HBaseConfiguration
Table 表(Table)
HTableDescriptor 列簇(Column Family)
HColumnDescriptor
Put 列修饰符(Column Qualifier)
Get
Delete
Result
Scan
ResultScanner

基本增删除改查demo

package com.study.follow.hbase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * @author: honey
 * @date: 2020/2/8
 */
public class HbaseDemoTest {
    static Configuration conf;
    static Connection connection;
    static Admin admin;
    public static final String ZK_CONNECT_STR="10.211.55.20:2181,10.211.55.21:2181,10.211.55.22:2181";

    static {
        conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum",ZK_CONNECT_STR);
        try {
            connection = ConnectionFactory.createConnection(conf);
            admin = connection.getAdmin();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建表
     * @param tableName 表名
     * @param family 列簇
     * @throws IOException
     */
    private static void createTable(String tableName,String[] family) throws IOException {

        TableName table= TableName.valueOf(tableName);

        if(admin.tableExists(table)){
            System.out.println("table exists:【"+tableName+"】");
        }else {
            HTableDescriptor htableDesc = new HTableDescriptor(table);
            for (int i = 0; i < family.length; i++) {
                htableDesc.addFamily(new HColumnDescriptor(family[i]));
            }
            admin.createTable(htableDesc);
            System.out.println("create table success");
        }
    }

    /**
     * 为表添加数据(适合知道有多少列簇的固定表)
     *
     * @param tableName
     * @param rowKey
     * @param column1 第一个列簇列表
     * @param value1 第一个列的值列表
     * @param column2 第二个列簇列表
     * @param value2 第二个列的值列表
     */
    private static void addData(String tableName, String rowKey, String[] column1, String[] value1, String[] column2, String[] value2) throws IOException {

        // 设置rowkey
        Put put = new Put(Bytes.toBytes(rowKey));

        //Table 负责跟记录(表数据)相关的操作,如增删改查等
        TableName tableName1 = TableName.valueOf(tableName);
        Table table = connection.getTable(tableName1);

        //获取所有列簇
        HColumnDescriptor[] columnFamilies = table.getTableDescriptor().getColumnFamilies();

        for (int i = 0; i < columnFamilies.length ; i++) {
            //获取列簇名
            String familyName = columnFamilies[i].getNameAsString();
            if(familyName.equals("base_info")){
                for (int j = 0; j < column1.length ; j++) {
                    put.addImmutable(Bytes.toBytes(familyName),Bytes.toBytes(column1[i]), Bytes.toBytes(value1[i]));
                }
            }

            if(familyName.equals("extra_info")){
                for (int j = 0; j < column2.length ; j++) {
                    put.addImmutable(Bytes.toBytes(familyName),Bytes.toBytes(column2[i]), Bytes.toBytes(value2[i]));
                }
            }
        }

        table.put(put);
        System.out.println("add data success!");

    }

    /**
     * 根据 rowkey 查询
     * @param tableName
     * @param rowkey
     * @return
     * @throws IOException
     */
    private static Result getResult(String tableName,String rowkey) throws IOException {

        Table table = connection.getTable(TableName.valueOf(tableName));
        Get get = new Get(Bytes.toBytes(rowkey));
        Result result = table.get(get);
        for (Cell cell: result.listCells()){
            printKeyValue(cell);
        }

        return result;
    }

    public static void printKeyValue(Cell cell){

        System.out.println("rowkey:" + Bytes.toString(CellUtil.cloneRow(cell)));
        System.out.println("family:" + Bytes.toString(CellUtil.cloneFamily(cell)));
        System.out.println("qualifier:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
        System.out.println("value:" + Bytes.toString(CellUtil.cloneValue(cell)));
        System.out.println("Timestamp:" + cell.getTimestamp());
        System.out.println("-------------------------------------------");
    }

    /**
     * 遍历查询hbase表
     * @param tableName
     * @throws IOException
     */
    public static void getResultScanner(String tableName) throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableName));
        Scan scan = new Scan();
        ResultScanner resultScanner = null;

        try {
            resultScanner = table.getScanner(scan);
            for (Result r : resultScanner){
                for (Cell cell : r.listCells()){
                    printKeyValue(cell);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            resultScanner.close();
        }
    }

    /**
     * 指定范围遍历查询hbase表,注意:包括下界,不包括上界
     * @param tableName
     * @param start_rowkey
     * @param stop_rowkey
     * @throws IOException
     */
    public static void getResultScan(String tableName, String start_rowkey,String stop_rowkey) throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableName));
        Scan scan = new Scan();
        scan.withStartRow(Bytes.toBytes(start_rowkey));
        scan.withStopRow(Bytes.toBytes(stop_rowkey));
        ResultScanner resultScanner = null;

        try {
            resultScanner = table.getScanner(scan);
            printResultScanner(resultScanner);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            resultScanner.close();
        }

    }

    private static void printResultScanner(ResultScanner resultScanner) {
        for (Result result:resultScanner){
            for (Cell cell:result.listCells()){
                printKeyValue(cell);
            }
        }
    }

    /**
     * 查询表中的某一列
     * @param tableName
     * @param rowkey
     * @param familyName
     * @param columnName
     * @throws IOException
     */
    public static void getResultByColumn(String tableName,String rowkey,String familyName, String columnName) throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableName));
        Get get = new Get(Bytes.toBytes(rowkey));
        get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));

        Result result = table.get(get);
        for (Cell cell:result.listCells()){
            printKeyValue(cell);
        }
    }

    /**
     * 更新表中的某一列
     * @param tableName
     * @param rowkey
     * @param familyName
     * @param columnName
     * @param value
     */
    public static void updateTable(String tableName, String rowkey,String familyName,String columnName,String value) throws IOException {

        Table table = connection.getTable(TableName.valueOf(tableName));
        Put put = new Put(Bytes.toBytes(rowkey));
        put.addImmutable(Bytes.toBytes(familyName), Bytes.toBytes(columnName), Bytes.toBytes(value));
        table.put(put);
        System.out.println("update table success");
    }

    /**
     * 查询某列数据的多个版本
     * @param tableName
     * @param rowkey
     * @param familyName
     * @param columnName
     */
    public static void getResultByVersion(String tableName,String rowkey,String familyName,String columnName) throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableName));
        Get get = new Get(Bytes.toBytes(rowkey));
        get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
        get.setMaxVersions(3);
        Result result = table.get(get);
        for (Cell cell:result.listCells()){
            printKeyValue(cell);
        }
    }

    /**
     * 删除指定的列
     * @param tableName
     * @param rowkey
     * @param familyName
     * @param columnName
     */
    public static void deleteColumn(String tableName,String rowkey, String familyName,String columnName) throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableName));
        Delete delete = new Delete(Bytes.toBytes(rowkey));
        delete.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
        table.delete(delete);
        System.out.println(familyName + ":" + columnName + "is deleted");
    }

    /**
     * 删除指定行的所有列
     * @param tableName
     * @param rowkey
     */
    public static void deleteAllColumn(String tableName,String rowkey) throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableName));
        Delete delete = new Delete(Bytes.toBytes(rowkey));
        table.delete(delete);
        System.out.println("all columns of "+rowkey+" are deleted");
    }

    /**
     * 删除表
     * @param tableName
     * @throws IOException
     */
    public static void deleteTable(String tableName) throws IOException {
        TableName tableName1 = TableName.valueOf(tableName);
        admin.disableTable(tableName1);
        admin.deleteTable(tableName1);
        System.out.println(tableName + "is deleted!");
    }


    public static void main(String[] args) throws IOException {
        String tableName="test";
        String[] family = {"base_info","extra_info"};

        // 1. create table
        // HbaseDemoTest.createTable(tableName,family);

        // 2. add data
        // String[] column1={"name","age"};
        // String[] value1={"ZhangSan","18"};
        //
        // String[] column2={"Hobbies","Country"};
        // String[] value2={"basketball","China"};

        // HbaseDemoTest.addData(tableName,"rk0001",column1,value1,column2,value2);
        // HbaseDemoTest.addData(tableName,"rk0002",column1,value1,column2,value2);

        // 3. 根据rolwkey查询
        // HbaseDemoTest.getResult(tableName,"rk0001");

        // 4.遍历查询 hbase 表
        // HbaseDemoTest.getResultScanner(tableName);

        // 5. 指定范围遍历查询hbase表,注意:包括下界,不包括上界
        // HbaseDemoTest.getResultScan(tableName,"rk0001","rk0002");

        // 6. 查询表中的某一列
        // HbaseDemoTest.getResultByColumn(tableName,"rk0002","base_info","name");

        // 7. 更新表中的某一列
        // HbaseDemoTest.updateTable(tableName,"rk0002","base_info","name","LiSi");

        // 8. 查询某列数据的多个版本
        // HbaseDemoTest.getResultByVersion(tableName,"rk0002","base_info","name");


        // 9. 删除指定列
        // HbaseDemoTest.deleteColumn(tableName,"rk0001","extra_info","Hobbies");

        // 10. 删除指定行的所有列
        // HbaseDemoTest.deleteAllColumn(tableName,"rk0001");

        // 11. 删除表
        // HbaseDemoTest.deleteTable(tableName);
    }

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!