hbase1.x API操作

环境

jdk1.8:Linux环境和Windows环境均需要

Linux环境先安装好hbase1.x,如果还没安装hbase,可点击这里安装hbase

Windows环境下安装好Maven3.3 +

Windows环境下安装好IDEA或Eclipse,本文使用IDEA2018

 

准备工作

设置idea支持lambda格式

File-->Project Structure-->Modules-->Language level选8 - Lambdas, type annotations etc.

File-->Settings-->Build-->Compiler-->Java Compiler, largest bytecode version选择8

 

maven工程

1.用IDEA新建maven工程

2.修改pom.xml添加hbase客户端依赖,版本需要与服务器安装的hbase版本一致。

    <dependencies>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.3.1</version>
        </dependency>
    </dependencies>

3.配置log4j: 在resources目录下新建log4j.properties文件

### set log levels ###
log4j.rootLogger = INFO,Console
​
###  输出到控制台  ###
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss:SSS}]-%l:%m%n

 

API操作

服务端先打开hadoop和hbase服务

start-all.sh
start-hbase.sh

IDEA项目目录结构:

创建表

HBaseUtils.java

package top.jipson;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;

import java.io.IOException;
import java.util.List;

/**
 * HBASE工具类
 */
public class HBaseUtils {
    private static Connection connection;

    static {
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.property.clientPort","2181");
        configuration.set("hbase.zookeeper.quorum","192.168.134.128");//注意修改ip为hbase所在机器的ip或主机名
        try {
            connection = ConnectionFactory.createConnection(configuration);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

     /**
     * 创建表
     * @param tableName
     * @param columnFamilies
     * @return
     */
    public static boolean createTable(String tableName, List<String> columnFamilies){
        try {
            HBaseAdmin  admin = (HBaseAdmin)connection.getAdmin();
            if(admin.tableExists(tableName)){
                return false;
            }
            HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
            // 注意设置ide支持lambda格式
            columnFamilies.forEach(columnFamily -> {
                HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(columnFamily);
                hColumnDescriptor.setMaxVersions(1);
                hTableDescriptor.addFamily(hColumnDescriptor);
            });
            admin.createTable(hTableDescriptor);

        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }
}

提示:configuration.set("hbase.zookeeper.quorum","192.168.134.128");//注意修改ip为hbase所在机器的ip或主机名

 

测试:

HBaseUtilsTest.java

package top.jipson;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;

/**
 * HBASE测试类
 */
public class HBaseUtilsTest {
    private static final String TABLE_NAME = "class1";
    private static final String TEACHER = "teacher1";
    private static final String STUDENT = "student1";

    @Test
    public void createTable(){
        List<String> columnFamilies = Arrays.asList(TEACHER, STUDENT);
        boolean table = HBaseUtils.createTable(TABLE_NAME, columnFamilies);
        System.out.println("表创建结果:"+ table);
    }
}

运行createTable方法,看到控制台数据表创建结果为true

进入hbase shell命令查看

能看到class1表,说明API创建表成功了。

 

插入表数据

HBaseUtils.java

    /**
     * 插入数据
     * @param tableName
     * @param rowKey
     * @param columnFamilyName
     * @param pairList
     * @return
     */
    public static boolean putRow(String tableName, String rowKey, String columnFamilyName, List<Pair<String, String>> pairList){
        try {
            Table table = connection.getTable(TableName.valueOf(tableName));
            Put put = new Put(Bytes.toBytes(rowKey));
            pairList.forEach(pair -> put.addColumn(Bytes.toBytes(columnFamilyName), Bytes.toBytes(pair.getFirst()), Bytes.toBytes(pair.getSecond())));
            table.put(put);
            table.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }

HBaseUtilsTest.java

    /**
     * 测试插入数据
     */
    @Test
    public void insData(){
        List<Pair<String, String>> pairs1 = Arrays.asList(
                new Pair<>("name", "Jack"),
                new Pair<>("age", "19"),
                new Pair<>("gender","2"));
        HBaseUtils.putRow(TABLE_NAME, "rowkey1", STUDENT, pairs1);
    }

这里如果需要更多测试数据,可以修改测试数据,多次执行得到多条数据,例如

HBaseUtilsTest.java

    /**
     * 测试插入数据
     */
    @Test
    public void insData(){
        List<Pair<String, String>> pairs1 = Arrays.asList(
                new Pair<>("name", "Rose"),
                new Pair<>("age", "18"),
                new Pair<>("gender","1"));
        HBaseUtils.putRow(TABLE_NAME, "rowkey2", STUDENT, pairs1);
    }

 

获取一行数据

HBaseUtils.java

	/**
     * 获取表的一行数据
     * @param tableName
     * @param rowKey
     * @return
     */
    public static Result getRow(String tableName, String rowKey){
        try {
            Table table = connection.getTable(TableName.valueOf(tableName));
            Get get = new Get(Bytes.toBytes(rowKey));
            return table.get(get);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

HBaseUtilsTest.java

@Test
    public void getRow(){
        Result rowkey1 = HBaseUtils.getRow(TABLE_NAME, "rowkey1");
        if(rowkey1 != null){
            System.out.println(Bytes.toString(
                    rowkey1.getValue(
                            Bytes.toBytes(STUDENT),
                            Bytes.toBytes("name")
                    )));
        }
    }

 

获取某行某列族某列的值

HBaseUtils.java

    /**
     * 获取指定行指定列 (cell) 的最新版本的数据
     * @param tableName
     * @param rowKey
     * @param columnFamily
     * @param qualifier 列标识,实际就是column(具体某列)
     * @return
     */
    public static String getCell(String tableName, String rowKey, String columnFamily, String qualifier){
        try {
            Table table = connection.getTable(TableName.valueOf(tableName));
            Get get = new Get(Bytes.toBytes(rowKey));
            if(!get.isCheckExistenceOnly()){
                get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(qualifier));
                Result result = table.get(get);
                byte[] resultValue = result.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(qualifier));
                return Bytes.toString(resultValue);
            }else {
                return null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

HBaseUtilsTest.java

	@Test
    public void getCell(){
        String cell = HBaseUtils.getCell(TABLE_NAME, "rowkey2", STUDENT, "age");
        System.out.println("cell age:" + cell);
    }

 

查看表内容

HBaseUtils.java

    /**
     * 检索全表
     * @param tableName
     * @return
     */
    public static ResultScanner getScanner(String tableName){
        try {
            Table table = connection.getTable(TableName.valueOf(tableName));
            Scan scan = new Scan();
            return table.getScanner(scan);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

HBaseUtilsTest.java

    @Test
    public void getScanner(){
        ResultScanner scanner = HBaseUtils.getScanner(TABLE_NAME);
        if(scanner != null){
            scanner.forEach(result -> System.out.println(Bytes.toString(result.getRow())+"->"+Bytes.toString(result.getValue(Bytes.toBytes(STUDENT),Bytes.toBytes("name")))));
            scanner.close();
        }
    }

 

按条件过滤器检索表

HBaseUtils.java

    /**
     * 按条件过滤器检索表
     * @param tableName
     * @param filterList
     * @return
     */
    public static ResultScanner getScanner(String tableName, FilterList filterList){
        try {
            Table table = connection.getTable(TableName.valueOf(tableName));
            Scan scan = new Scan();
            scan.setFilter(filterList);
            return table.getScanner(scan);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

HBaseUtilsTest.java

    @Test
    public void getScannerWithFilter(){
        FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
        SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes(STUDENT),
                Bytes.toBytes("name"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("Jack"));
        filterList.addFilter(nameFilter);
        ResultScanner scanner = HBaseUtils.getScanner(TABLE_NAME, filterList);
        if(scanner != null){
            scanner.forEach(result -> System.out.println(Bytes.toString(result.getRow())+"->"+Bytes.toString(result.getValue(Bytes.toBytes(STUDENT),Bytes.toBytes("name")))));
            scanner.close();
        }
    }

 

包含起始行和结束行的查询

HBaseUtils.java

/**
     * 条件查询
     * @param tableName
     * @param startRowKey 起始RowKey
     * @param endRowKey 终止RowKey
     * @param filterList
     * @return
     */
    public static ResultScanner getScanner(String tableName, String startRowKey, String endRowKey,FilterList filterList){
        try {
            Table table = connection.getTable(TableName.valueOf(tableName));
            Scan scan = new Scan();
            scan.setStartRow(Bytes.toBytes(startRowKey));
            scan.setStopRow(Bytes.toBytes(endRowKey));
            scan.setFilter(filterList);
            return table.getScanner(scan);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

HBaseUtilsTest.java

 @Test
    public void getScannerWithStartEndRowFilter(){
        FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
        SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes(STUDENT),
                Bytes.toBytes("name"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("Tom"));
        filterList.addFilter(nameFilter);
        // 包含起始行,不包含结束行
        ResultScanner scanner = HBaseUtils.getScanner(TABLE_NAME, "rowkey1", "rowkey2",filterList);
        if(scanner != null){
            scanner.forEach(result -> System.out.println(Bytes.toString(result.getRow())+"->"+Bytes.toString(result.getValue(Bytes.toBytes(STUDENT),Bytes.toBytes("name")))));
            scanner.close();
        }
    }

 

按rowkey来删除行数据

HBaseUtils.java

    /**
     * 按rowKey来删除行数据
     * @param tableName
     * @param rowKey
     * @return
     */
    public static boolean deleteRow(String tableName, String rowKey){
        try {
            Table table = connection.getTable(TableName.valueOf(tableName));
            Delete delete = new Delete(Bytes.toBytes(rowKey));
            table.delete(delete);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }

HBaseUtilsTest.java

    @Test
    public void deleteRow(){
        boolean res = HBaseUtils.deleteRow(TABLE_NAME, "rowkey2");
        System.out.println("删除结果:"+ res);
    }

 

删除某行某列族某列的数据

HBaseUtils.java

    /**
     * 删除某行某列族某列的数据
     * @param tableName
     * @param rowKey
     * @param familyName
     * @param qualifier
     * @return
     */
    public static boolean deleteColumn(String tableName, String rowKey, String familyName, String qualifier){
        try {
            Table table = connection.getTable(TableName.valueOf(tableName));
            Delete delete = new Delete(Bytes.toBytes(rowKey));
            delete.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(qualifier));
            table.delete(delete);
            table.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }

HBaseUtilsTest.java

    @Test
    public void deleteColumn(){
        boolean b = HBaseUtils.deleteColumn(TABLE_NAME, "rowkey1", STUDENT, "age");
        System.out.println("删除结果:"+ b);
    }

 

删除表

HBaseUtils.java

	/**
     * 删除表
     * @param tableName
     * @return
     */
    public static boolean deleteTable(String tableName){
        try {
            HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
            admin.disableTable(tableName);//禁用表
            admin.deleteTable(tableName);//删除表
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }

HBaseUtilsTest.java

	/**
     * 测试删除表
     */
    @Test
    public void deleteTable(){
        boolean res = HBaseUtils.deleteTable(TABLE_NAME);
        System.out.println("删除结果:"+res);
    }

 

参考:https://github.com/heibaiying/BigData-Notes/blob/master/notes/Hbase_Java_API.md

 

 

完成!enjoy it!

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值