(简单易懂)hbase——JavaApi

一、创建maven工程,配置pom.xml

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <hadoop.version>2.7.6</hadoop.version>
    <hbase.version>1.4.6</hbase.version>
<!-- 根据自己的hadoop和hbase版本配置 -->

</properties>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>1.4.6</version>
    </dependency>

</dependencies>

配置完刷新下载就不会报红!

二、DDL

前期准备 


    private static Connection connection=null;
    private static Admin admin = null;

    //关于表的增删改查都要用到admin,所以把这部分代码弄成静态代码块
    static{
        try {
            //1、获取配置文件信息
            Configuration conf = HBaseConfiguration.create();
            conf.set("hbase.zookeeper.quorum","虚拟机的ip");
            conf.set("hbase.zookeeper.property.clientPort","端口号");
            //如果我不加hbase会报错。。不知道为什么,看有些人是可以的
            //2、创建连接对象
            connection = ConnectionFactory.createConnection(conf);
            //3、创建管理员
            admin = connection.getAdmin();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

关闭资源

//关闭资源方法,在最后调用
    public static void close() throws IOException {
        if(admin != null){
            admin.close();
        }
        if(connection != null){
            connection.close();
        }
    }

1、判断表是否存在

    public static boolean isTableExists(String tableName) throws IOException {
        boolean exists = admin.tableExists(TableName.valueOf(tableName));
        return exists;
    }

 2、创建表

public static void createTable(String tableName,String ...cfs) throws IOException {
        //1、判断有无列族信息
        if(cfs.length<=0){
            System.out.println("请添加列族信息");
            return;
        }
        
        //2、判断要创建的表是否已经存在
        if(isTableExists(tableName)){
            System.out.println("该表已经存在");
            return;
        }
        
        //3、创建表描述器
        HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
        //4、循环添加列族信息
        for (String cf : cfs) {
            //5、创建列族描述器
            HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
            //6、添加具体的列族信息
            hTableDescriptor.addFamily(hColumnDescriptor);
        }
        
        //7、创建表
        admin.createTable(hTableDescriptor);
    }

3、删除表

public static void dropTable(String tableName) throws IOException {
        //1、判断表是否存在
        if(!isTableExists(tableName)){
            System.out.println(tableName+"不存在");
        }
        //2、使表禁用
        admin.disableTable(TableName.valueOf(tableName));
        //3、删除表
        admin.deleteTable(TableName.valueOf(tableName));
    }

4、创建命名空间

public static void createNameSpace(String nameSpace){
        //1、获得命名空间描述器
        NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(nameSpace).build();
        try {
            //2、创建命名空间
            admin.createNamespace(namespaceDescriptor);
        } catch(NamespaceExistException e){
            System.out.println(nameSpace+"命名空间已经存在");
            //抓异常NamespaceExistException
            //当命名空间已经存在的条件下,再次创建不会报错,不会影响后序程序的运行
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

5、在指定命名空间创建表

creatTable("20220409:stu","info1","info2");

二、DML

1、put增加数据 

public static void putData(String tableName,String rowKey,String cf,String cn,String value) throws IOException {
        //1、连接表对象
        Table table = connection.getTable(TableName.valueOf(tableName));
        //2、创建put对象
        Put put = new Put(Bytes.toBytes(rowKey));
        //3、为put赋值
        put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn),Bytes.toBytes(value));

        //对同一个rowKey添加数据====>为put赋值多次
        put.addColumn(Bytes.toBytes("info1"),Bytes.toBytes("sex"),Bytes.toBytes("female"));
        put.addColumn(Bytes.toBytes("info1"),Bytes.toBytes("phone"),Bytes.toBytes("13512341234"));

        //添加不同rowKey的值======>
        //①创建多个put对象 ②将put对象放在一个集合list ③table.put(list<>)

        //4、给表put数据
        table.put(put);
        //5、关闭表
        //connection为重处理,不能到左后再关表
        table.close();
    }

 批量导入本机数据student.txt

 public static void putAllData(String tableName,String dataPath) throws IOException {
        //2001,zhangsan,0
        //2002,lisi,1
        //2003,wangwu,1
       //格式   学号,名字,性别 
        Table table = connection.getTable(TableName.valueOf(tableName));
        BufferedReader bf = new BufferedReader(new FileReader(dataPath));
        //dataPath为该txt文件在本机的路径
        String line = null;
        while((line = bf.readLine() )!= null){
            String[] split = line.split(",");
            Put put = new Put(Bytes.toBytes(split[0]));
            put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("name"),Bytes.toBytes(split[1]));
            put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("gender"),Bytes.toBytes(split[2]));
            table.put(put);
        }
        table.close();
    }

2、 get获取数据

//获取表数据 至少要有两个参数 tableName,rowKey
//测试一:两个参数tableName,rowKey
public static void getData(String tableName,String rowKey) throws IOException {
    //1、连接table表
    Table table = connection.getTable(TableName.valueOf(tableName));
    //2、创建get对象
    Get get = new Get(Bytes.toBytes(rowKey));
    //3、获取rowKey对应数据
    Result result = table.get(get);
    //4、解析result
    for (Cell cell : result.rawCells()) {
        //5、打印输出各部分
        System.out.println("rowKey="+Bytes.toString(CellUtil.cloneRow(cell))
                           +",列族="+Bytes.toString(CellUtil.cloneFamily(cell))
                           +",列名="+ Bytes.toString(CellUtil.cloneQualifier(cell))
                           +",value="+Bytes.toString(CellUtil.cloneValue(cell)));
    }
    //6、关闭表
    table.close();
}

//测试二:三个参数 tableName,rowKey,cf
public static void getData(String tableName,String rowKey,String cf) throws IOException {
    Table table = connection.getTable(TableName.valueOf(tableName));
    Get get = new Get(Bytes.toBytes(rowKey));

    //指定获取的列族
    get.addFamily(Bytes.toBytes(cf));

    Result result = table.get(get);
    for (Cell cell : result.rawCells()) {
        System.out.println("rowKey="+Bytes.toString(CellUtil.cloneRow(cell))
                           +",列族="+Bytes.toString(CellUtil.cloneFamily(cell))
                           +",列名="+ Bytes.toString(CellUtil.cloneQualifier(cell))
                           +",value="+Bytes.toString(CellUtil.cloneValue(cell)));
    }
    table.close();
}

//测试三:四个参数 tableName,rowKey,cf,cn
public static void getData(String tableName,String rowKey,String cf,String cn) throws IOException {
    Table table = connection.getTable(TableName.valueOf(tableName));
    Get get = new Get(Bytes.toBytes(rowKey));

    //指定要获取的列族和列,获取列必须要获取列族,所以有两个参数
    get.addColumn(Bytes.toBytes(cf),Bytes.toBytes(cn));

    Result result = table.get(get);
    for (Cell cell : result.rawCells()) {
        System.out.println("rowKey="+Bytes.toString(CellUtil.cloneRow(cell))
                           +",列族="+Bytes.toString(CellUtil.cloneFamily(cell))
                           +",列名="+ Bytes.toString(CellUtil.cloneQualifier(cell))
                           +",value="+Bytes.toString(CellUtil.cloneValue(cell)));
    }
    table.close();
}

3、get获取数据时指定版本数

public static void getData(String tableName,String rowKey,String cf,String cn) throws IOException {
    Table table = connection.getTable(TableName.valueOf(tableName));
    Get get = new Get(Bytes.toBytes(rowKey));

    //设置获取数据的版本数
    get.setMaxVersions(3);
    //如果创建表时没有指定版本数,则默认版本数为1
    //在这里不管get.setMaxVersions(n)的n为多大,dou只能输出一条(最新)数据
    //所以要在shell修改版本数 alter 'stu',{NAME=>'info1',VERSIONS=>num}
    //这样就可以输出多条数据
    //1、n>num输出num条
    //2、n<num输出n条
    //3、前提是修改了num次数据

    get.addColumn(Bytes.toBytes(cf),Bytes.toBytes(cn));
    Result result = table.get(get);
    for (Cell cell : result.rawCells()) {
        System.out.println("rowKey="+Bytes.toString(CellUtil.cloneRow(cell))
                           +",列族="+Bytes.toString(CellUtil.cloneFamily(cell))
                           +",列名="+ Bytes.toString(CellUtil.cloneQualifier(cell))
                           +",value="+Bytes.toString(CellUtil.cloneValue(cell)));
    }
    table.close();
}

4、scan扫描数据

public static void scanData(String tableName) throws IOException {
        //1、获取表对象
        Table table = connection.getTable(TableName.valueOf(tableName));
        //2、创建Scan对象
        Scan scan = new Scan();
        //Scan scan = new Scan(Bytes.toBytes("1001"),Bytes.toBytes("1003"));
        //左闭右开,只显示1001和1002的数据

        //3、扫描表
        ResultScanner scanner = table.getScanner(scan);
        //4、解析resultScanner
        for (Result result : scanner) {
            //5、解析result并打印
            for (Cell cell : result.rawCells()) {
                System.out.println("rowKey="+Bytes.toString(CellUtil.cloneRow(cell))
                        +",列族="+Bytes.toString(CellUtil.cloneFamily(cell))
                        +",列名="+ Bytes.toString(CellUtil.cloneQualifier(cell))
                        +",value="+Bytes.toString(CellUtil.cloneValue(cell)));
            }
        }
        //6、关闭表连接
        table.close();
    }

5、delete删除数据

public static void deleteData(String tableName,String rowKey,String cf,String cn) throws IOException {
        //1、获取表对象
        Table table = connection.getTable(TableName.valueOf(tableName));
        //2、创建delete对象
        Delete delete = new Delete(Bytes.toBytes(rowKey));
        //只传rowKey相当于命令行的deleteAll
        //标记:DeleteFamily 删除所有版本

        //2.1指定到列族的删除(只会把这个列族的数据都删除)
       // delete.addFamily(Bytes.toBytes(cf));
        //标记:DeleteFamily 删除所有版本

        //2.2指定到列的删除
        //2.2.1 delete.addColumn( , )
        //delete.addColumn(Bytes.toBytes(cf),Bytes.toBytes(cn));
        //删除这个列的最新时间戳版本
        //删除了最新的一条数据,scan后会显示前一条被覆盖的数据
        //标记:Delete (如果指定时间戳,就只删除这个时间戳的版本

        //2.2.2 delete.addColumns( , )
        //delete.addColumns(Bytes.toBytes(cf),Bytes.toBytes(cn));
        //删除这个列的所有时间戳版本
        //标记:DeleteColumn (如果加了时间戳,就删除小于等于这个时间戳的所有版本

        //3、执行删除操作
        table.delete(delete);
        //4、关闭表连接
        table.close();
    }
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HBase-Java API 是一种用于管理 HBase 的编程接口。使用 HBase-Java API,开发人员可以编写 Java 代码来创建、删除、修改和查询 HBase HBase-Java API 提供了一系列类和方法,可以让开发人员轻松地与 HBase 进行交互。例如,可以使用 HBaseAdmin 类来管理 HBase ,使用 HTable 类来访问 HBase 中的数据,使用 Put 类来插入数据,使用 Get 类来获取数据,等等。总之,HBase-Java APIHBase 的重要组成部分,它为开发人员提供了强大的工具来管理和操作 HBase 。 ### 回答2: HBase是一个分布式的列式存储数据库,在很多大数据应用中得到广泛的使用。它采用Hadoop作为其底层基础框架,同时提供了Java API供开发人员使用。HBaseJava API为开发人员提供了一个管理的接口,使得开发人员可以对HBase数据库中的进行创建、读取、修改和删除等基本操作。 首先,我们需要用Java API创建一个HBase数据库中的。使用HBaseJava API创建的流程如下: 1. 首先需要获取HBase Configuration对象,并设置HBase连接参数以连接HBase数据库。 2. 接下来,需要获取HBase Admin对象,以便在操作HBase数据库之前检查是否存在,如果不存在,需要创建该。 3. 通过HBaseJava API创建时,需要指定名、列族的名称以及版本数等属性。 4. 创建时需要考虑的region的分配问题,可以对的region进行手动或自动分片,以此来控制HBase的负载均衡。 创建了HBase数据库中的之后,我们可以使用Java API进行读写操作。在进行读写操作时,需要使用HBaseJava API提供的Get的方法来获取中的数据、Scan方法来扫描整个、以及Put方法来向中插入数据。此外,在进行操作时还需要设置一些常见的数据操作参数,例如版本数、时间戳等。 在使用HBaseJava API时,还需要注意一些性能优化的问题,例如何时启用缓存、何时触发分区策略以及如何优化HBase的大小等。这些优化措施能够在HBase的性能以及数据读写时的延迟方面提供很好的支持和帮助。 总的来说,HBaseJava API提供的管理接口为开发人员提供了非常方便和快捷的方式来操作HBase数据库中的。通过使用这些API,开发人员可以创建、读取、修改和删除的数据,并且能够充分应用HBase的分布式特性来优化数据管理和性能提升。 ### 回答3: HBase是一个开源、分布式、非系型数据库,它可以存储和处理大规模结构化、半结构化和非结构化数据。HBase Java APIHBase的官方API,它提供了对HBase的管理和操作功能,让开发人员可以通过Java代码轻松地连接到HBase数据库。 在使用HBase Java API管理时,首先需要创建一个HBaseConfiguration对象,它包含了连接HBase数据库所需的配置信息,如Zookeeper地址、HBase根目录等。然后,可以使用HBaseAdmin类创建、删除、修改,以及列族等操作。例如,创建一个可以通过以下代码实现: ``` HBaseAdmin admin = new HBaseAdmin(HBaseConfiguration.create()); HTableDescriptor tableDescriptor = new HTableDescriptor("table_name"); HColumnDescriptor columnDescriptor = new HColumnDescriptor("column_family"); tableDescriptor.addFamily(columnDescriptor); admin.createTable(tableDescriptor); ``` 创建时,需要先通过HTableDescriptor类定义名称,然后通过HColumnDescriptor类定义列族名称。可以通过addFamily()方法将列族添加到描述中,最后通过HBaseAdmin的createTable()方法创建。 除了创建之外,HBase Java API还提供了许多其他的操作,如获取信息、获取所有列表、删除等。同时,HBase Java API还提供了对数据的CRUD操作,包括put、get、scan、delete等方法,让开发人员可以方便地进行数据操作。 总之,HBase Java API是一个非常强大的工具,它可以使开发人员轻松地管理HBase数据库,并实现数据的高效存储和处理。但是,在使用HBase Java API时,需要了解HBase的基本知识和API的用法,才能更好地发挥其功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值