HBASE Java API 操作

HBASE Java API 有 1.x 和 2.x, 有一定差距, 本文基于 2.x 的 Java 操作, 对 hbase 表的基本的 增删查改操作.

注意点:

Put, Get, Delete 都都可以使用 addColumn 来对指定的 列 进行相关操作.
Scan 可以通过添加 filters 来进行条件过滤, 其中 Filter 是过滤条件, 拥有许多预定义的 Filter 类, 其都是 BaseFilter 的子类, 如 ColumnValueFilter, ColumnPrefixFilter 等等.

API 的基本规律为:

对表的操作,都需要获取 admin, 然后才可以进行相关操作, 其中删除表前需要先禁用表.
对表数据的操作, 都需要通过 connection 获取 Table 对象, 然后才使用 get, put, delete, scan 对象进行 crud 操作.


import com.sun.istack.Nullable;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;

import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
import java.util.function.Consumer;

/**
 * @author djh on  2020/1/7 11:36
 * @E-Mail 1544579459@qq.com
 */
public class CrudDemo {
    private static final String TABLE_NAME = "djhTable";
    public static final String COLUMN_FAMILY_ATTRIBUTE = "attribute";
    public static final String COLUMN_FAMILY_HOBBY = "hobby";

    public static void main(String[] args) throws IOException {

        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "hadoop1-host:2181,hadoop2-host:2181,hadoop3-host:2181,hadoop4-host:2181,hadoop5-host:2181");


        Connection connection = ConnectionFactory.createConnection(conf);

        // 创建表.
        //createTable(TABLE_NAME, connection);

        // 插入数据
        putData(TABLE_NAME, "row_1", COLUMN_FAMILY_ATTRIBUTE, "age", "22岁", connection);
        putData(TABLE_NAME, "row_2", COLUMN_FAMILY_ATTRIBUTE, "age", "23岁", connection);
        putData(TABLE_NAME, "row_3", COLUMN_FAMILY_ATTRIBUTE, "age", "24岁", connection);
        putData(TABLE_NAME, "row_5", COLUMN_FAMILY_ATTRIBUTE, "age", "24岁", connection);
        putData(TABLE_NAME, "row_7", COLUMN_FAMILY_ATTRIBUTE, "age", "24岁", connection);
        putData(TABLE_NAME, "row_88", COLUMN_FAMILY_ATTRIBUTE, "age", "55岁", connection);
        putData(TABLE_NAME, "row_99", COLUMN_FAMILY_ATTRIBUTE, "age", "66岁", connection);

        // 获取数据
        System.out.println("获取单行数据:");
        getData(TABLE_NAME, "row_1", connection);

        // 扫描表
        System.out.println("扫描表:");
        scannerTable(TABLE_NAME, connection);

        ColumnValueFilter columnValueFilter =
                new ColumnValueFilter(COLUMN_FAMILY_ATTRIBUTE.getBytes(), "age".getBytes(), CompareOperator.GREATER_OR_EQUAL, "24岁".getBytes());

        // 根据条件扫描
        System.out.println("根据条件扫描表:");
        FilterList filterList = new FilterList(columnValueFilter);
        filterTable(TABLE_NAME, null, null, filterList, connection);

    }


    private static void createTable(String tableName, Connection connection) throws IOException {
        Admin admin = connection.getAdmin();

        // 1. 创建表描述
        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName));

        // 2. 创建列族描述
        ColumnFamilyDescriptor columnFamilyOne = ColumnFamilyDescriptorBuilder.of(COLUMN_FAMILY_ATTRIBUTE);

        // 3. 为表指定列族描述
        tableDescriptorBuilder.setColumnFamily(columnFamilyOne);

        // 4. 创建表
        admin.createTable(tableDescriptorBuilder.build());
    }

    private static void deleteTable(String tableName, Connection connection) throws IOException {
        Admin admin = connection.getAdmin();

        // 删除表前需要先禁用.
        admin.disableTable(TableName.valueOf(tableName));
        admin.deleteTable(TableName.valueOf(tableName));
    }

    private static void putData(String tableName, String rowKey, String columnFamily, String column, String data, Connection connection) throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableName));

        // 1. 指定行键
        Put put = new Put(rowKey.getBytes());
        // 2. 指定列和要插入的数据.
        put.addColumn(columnFamily.getBytes(), column.getBytes(), data.getBytes());

        // 3. 插入
        table.put(put);

        // 4. 释放资源
        table.close();
    }

    private static void getData(String tableName, String rowKey, Connection connection) throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableName));

        Get get = new Get(rowKey.getBytes());

        Result result = table.get(get);


        if (result.containsColumn(COLUMN_FAMILY_ATTRIBUTE.getBytes(), "age".getBytes())) {
            byte[] value = result.value();
            String s = new String(value);
            System.out.println(s);
        }

        table.close();
    }

    private static void scannerTable(String tableName, Connection connection) throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableName));

        Scan scan = new Scan();

        ResultScanner scanner = table.getScanner(scan);

        scanner.iterator().forEachRemaining(result -> System.out.println(new String(result.value())));
    }

    /**
     * 根据条件扫描 table 指定的行.
     */
    private static void filterTable(String tableName, @Nullable String startRowKey, @Nullable String endRowKey, FilterList filterList, Connection connection) throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableName));

        Scan scan = new Scan();
        if (startRowKey != null && endRowKey != null) {
            scan.withStartRow(startRowKey.getBytes());
            scan.withStopRow(endRowKey.getBytes());
        }
        scan.setFilter(filterList);

        ResultScanner scanner = table.getScanner(scan);

        scanner.iterator().forEachRemaining(result -> System.out.println(new String(result.value())));
    }

    private static void deleteData(String tableName, String rowKey, Connection connection) throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableName));

        Delete delete = new Delete(rowKey.getBytes());
        delete.addColumn(COLUMN_FAMILY_ATTRIBUTE.getBytes(), "age".getBytes());

        table.delete(delete);

        table.close();
    }
}

运行结果:

获取单行数据:
22岁
扫描表:
22岁
23岁
24岁
24岁
24岁
55岁
66岁
根据条件扫描表:
24岁
24岁
24岁
55岁
66岁

Process finished with exit code 0

参考博文:

https://juejin.im/post/5d85938ce51d453b8b5fa6a8

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值