hbase java操作api - 同步put,异步put,checkAndPut,checkAndDelete,清空表所有记录等api

代码示例

有很多的代码是重复的,只是为形成记忆,见谅,
另外需要将 hbase-site.xml,hdfs-site.xml,core-site.xml三个文件放到Resources上目录中

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.client.coprocessor.Batch;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.io.compress.Compression;
import org.apache.hadoop.hbase.util.Bytes;
import java.util.ArrayList;
import java.util.List;

public class HbaseApi_test_1 {
    private static Connection hbaseConn;
    private static Configuration hbaseConf;
    //HBaseAdmin 提供了一个接口来管理 HBase 数据库的表信息
    private static Admin hbaseAdmin;

    /*** 静态构造,在调用静态方法前运行,  初始化连接对象  * */
    static {
        hbaseConf = HBaseConfiguration.create();
        try {
            hbaseConn = ConnectionFactory.createConnection(hbaseConf);
            System.out.println("连接上了?" + !hbaseConn.isClosed());
            hbaseAdmin = hbaseConn.getAdmin();
        } catch (java.lang.Exception e) {
            e.printStackTrace();
        }
    }

//****************************put记录 - 添加一行****************************
    public static void put_oneRow() throws java.lang.Exception {
        TableName tableName = TableName.valueOf("ns1:mytest_4");
        //取得一个要操作的表
        Table table = hbaseConn.getTable(tableName);
        //设置rowkey
        Put zhangshan = new Put(Bytes.toBytes("zhangshan"));
        //为列赋值,要为字符型,否则读出来会乱码
        //参数1:列族 ,参数2:列,参数3:值,(这里的时间戳会自动生成)
        zhangshan.addColumn(Bytes.toBytes("course"), Bytes.toBytes("yuwen"), Bytes.toBytes("30"));
        //参数1:列族 ,参数2:列,参数3:时间戳,参数4:值
        //zhangshan.addColumn(Bytes.toBytes("course"), Bytes.toBytes("english"), 1, Bytes.toBytes("31"));
        zhangshan.addColumn(Bytes.toBytes("grade"), Bytes.toBytes(""), Bytes.toBytes("three"));

        //设置过期时间(毫秒),一旦达到到期时间,HBase 将自动删除行
        //zhangshan.setTTL(5000);

/**
 * 对于相对不太重要的数据,可以在Put/Delete操作时,通过调用Put.setWriteToWAL(false)或Delete.setWriteToWAL(false)函数,放弃写WAL日志,从而提高数据写入的性能。
 * 值得注意的是:谨慎选择关闭WAL日志,因为这样的话,一旦RegionServer宕机,Put/Delete的数据将会无法根据WAL日志进行恢复。
 */
        zhangshan.setWriteToWAL(false);

        table.put(zhangshan);

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


    //****************************put记录 - 添加多行****************************
    public static void put_MultiRow() throws java.lang.Exception {
        TableName tableName = TableName.valueOf("ns1:mytest_4");
        //取得一个要操作的表
        Table table = hbaseConn.getTable(tableName);
        //put的集合
        ArrayList<Put> puts = new ArrayList<>();
        //设置rowkey
        Put lishi = new Put(Bytes.toBytes("lishi"));
        //为列赋值,要为字符型,否则读出来会乱码
        lishi.addColumn(Bytes.toBytes("course"), Bytes.toBytes("yuwen"), Bytes.toBytes("100"));
        lishi.addColumn(Bytes.toBytes("course"), Bytes.toBytes("shuxue"), Bytes.toBytes("99"));
        lishi.addColumn(Bytes.toBytes("course"), Bytes.toBytes("english"), Bytes.toBytes("98"));
        lishi.addColumn(Bytes.toBytes("grade"), Bytes.toBytes(""), Bytes.toBytes("very good"));

        Put wangwu = new Put(Bytes.toBytes("wangwu"));
        wangwu.addColumn(Bytes.toBytes("course"), Bytes.toBytes("yuwen"), Bytes.toBytes("500"));
        wangwu.addColumn(Bytes.toBytes("course"), Bytes.toBytes("shuxue"), Bytes.toBytes("499"));
        wangwu.addColumn(Bytes.toBytes("course"), Bytes.toBytes("english"), Bytes.toBytes("498"));
        wangwu.addColumn(Bytes.toBytes("grade"), Bytes.toBytes(""), Bytes.toBytes("very very good"));

        puts.add(lishi);
        puts.add(wangwu);
        //一次添加多行
        table.put(puts);

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


    //****************************批量put记录****************************
    public static void put_MultiRow_batch() throws java.lang.Exception {
        long begin = System.currentTimeMillis();

        TableName tableName = TableName.valueOf("ns1:mytest_4");
        //取得一个要操作的表
        Table table = hbaseConn.getTable(tableName);
        //put的集合
        ArrayList<Put> puts = new ArrayList<>();

        for (int i = 1; i < 100000; i++) {
            Put put = new Put(Bytes.toBytes("person-" + i));
            put.addColumn(Bytes.toBytes("grade"), Bytes.toBytes(""), Bytes.toBytes("good"));
            put.addColumn(Bytes.toBytes("course"), Bytes.toBytes("yuwen"), Bytes.toBytes(i + ""));
            put.addColumn(Bytes.toBytes("course"), Bytes.toBytes("shuxue"), Bytes.toBytes(i + 1 + ""));
            put.addColumn(Bytes.toBytes("course"), Bytes.toBytes("english"), Bytes.toBytes(i + 2 + ""));
            puts.add(put);
        }
        table.put(puts);
        //写入hdfs中,不写也可以,hbase会自动处理的
        hbaseAdmin.flush(tableName);

        long end = System.currentTimeMillis();
        System.out.println("运行时间:" + (end - begin));
        //关闭资源
        table.close();
        //hbaseConn.close();
    }


    //****************************BufferedMutator主要用来异步批量的将数据写入一个hbase表,通过Connection获取一个实例。****************************
    public static void put_MultiRow_batch_bufferedMutator() throws java.lang.Exception
    {
        long begin = System.currentTimeMillis();

        TableName tableName = TableName.valueOf("ns1:mytest_4");
        BufferedMutator bufferedMutator = hbaseConn.getBufferedMutator(tableName);
        List<Put> puts = new ArrayList<>();
        for (int i = 1; i < 100000; i++) {
            Put put = new Put(Bytes.toBytes("person-" + i));
            put.addColumn(Bytes.toBytes("grade"), Bytes.toBytes(""), Bytes.toBytes("good"));
            put.addColumn(Bytes.toBytes("course"), Bytes.toBytes("yuwen"), Bytes.toBytes(i + ""));
            put.addColumn(Bytes.toBytes("course"), Bytes.toBytes("shuxue"), Bytes.toBytes(i + 1 + ""));
            put.addColumn(Bytes.toBytes("course"), Bytes.toBytes("english"), Bytes.toBytes(i + 2 + ""));
            puts.add(put);
        }
        //异步写入
        bufferedMutator.mutate(puts);

        bufferedMutator.flush();

        long end = System.currentTimeMillis();
        System.out.println("运行时间:" + (end - begin));

        //关闭资源
        bufferedMutator.close();
        //hbaseConn.close();
    }


    //****************************删除记录 - 一次删一行****************************
    public static void delete_oneRow() throws java.lang.Exception {
        TableName tableName = TableName.valueOf("ns1:mytest_4");
        //取得一个要操作的表
        Table table = hbaseConn.getTable(tableName);
        //设置要删除的行的rowkey
        Delete delete = new Delete(Bytes.toBytes("lishi"));
        //根据family删,可同时删除多个列
        delete.addFamily(Bytes.toBytes("grade"));
        //删除一个列
        delete.addColumn(Bytes.toBytes("course"), Bytes.toBytes("yuwen"));
        //删除一个列,并指定删除哪个时间戳的数据
        //delete.addColumn(Bytes.toBytes("course"), Bytes.toBytes("yuwen"),1);
        //删除一行
        table.delete(delete);

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

    //****************************删除记录 - 一次删多行****************************
    public static void delete_MultiRow() throws java.lang.Exception {
        TableName tableName = TableName.valueOf("ns1:mytest_4");
        //取得一个要操作的表
        Table table = hbaseConn.getTable(tableName);
        //要删除的行的列表
        ArrayList<Delete> deleteList = new ArrayList<>();
        //设置要删除的行的rowkey
        Delete del_1 = new Delete(Bytes.toBytes("lishi"));
        del_1.addColumn(Bytes.toBytes("course"), Bytes.toBytes("english"));

        Delete del_2 = new Delete(Bytes.toBytes("wangwu"));
        del_2.addColumn(Bytes.toBytes("course"), Bytes.toBytes("yuwen"));
        del_2.addFamily(Bytes.toBytes("grade"));

        deleteList.add(del_1);
        deleteList.add(del_2);
        table.delete(deleteList);

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

    //****************************先经过某些条件的验证,只有满足条件的才put或delete****************************
    public static void putAndCheck() throws java.lang.Exception {
        TableName tableName = TableName.valueOf("ns1:mytest_4");
        //取得一个要操作的表
        Table table = hbaseConn.getTable(tableName);
        //设置rowkey
        Put lishi = new Put(Bytes.toBytes("lishi"));
        //为列赋值,要为字符型,否则读出来会乱码
        lishi.addColumn(Bytes.toBytes("course"), Bytes.toBytes("yuwen"), Bytes.toBytes("50"));
        lishi.addColumn(Bytes.toBytes("course"), Bytes.toBytes("shuxue"), Bytes.toBytes("40"));
        lishi.addColumn(Bytes.toBytes("course"), Bytes.toBytes("english"), Bytes.toBytes("30"));
        lishi.addColumn(Bytes.toBytes("grade"), Bytes.toBytes(""), Bytes.toBytes("bujige"));

        /**
         * 个人理解:前面4个参数为查询条件,通过 rowkey,列族,列,最新的时间戳,值 到hbase中查找,如果查询的条件匹配,就执行相应的命令,否则不执行
         * 如 table.checkAndPut(Bytes.toBytes("lishi"), Bytes.toBytes("grade"), Bytes.toBytes(""), null, lishi);
         * 先检查 rowkey为lishi,列族grade,没有值的时候,才能put
         * 另外注意,如果想查询的条件中,只有列族,没有列,看第3个参数要这样写 Bytes.toBytes("")
         */
        boolean b = table.checkAndPut(Bytes.toBytes("lishi"), Bytes.toBytes("grade"), Bytes.toBytes(""), Bytes.toBytes("chunhuo"), lishi);
        System.out.println(b);

        //先检查再delete
        Delete del_1 = new Delete(Bytes.toBytes("xiaoming"));
        boolean b1 = table.checkAndDelete(Bytes.toBytes("xiaoming"), Bytes.toBytes("grade"), Bytes.toBytes(""), CompareFilter.CompareOp.EQUAL,Bytes.toBytes("chunhuo"), del_1);
        System.out.println(b1);

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

    //****************************一次清空表的所有记录****************************
    public static void truncate_table() throws java.lang.Exception {
        TableName tableName = TableName.valueOf("ns1:mytest_4");

        //禁用表
        hbaseAdmin.disableTable(tableName);
        //清空表,参数1 表名,参数2,是否保留拆分
        //保留拆分的话,hbase库的meta表,还是有些信息,hdfs的region目录也有
        hbaseAdmin.truncateTable(tableName, false);

        hbaseAdmin.close();
    }

}

 

### 回答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、付费专栏及课程。

余额充值